Виведіть наступну кана


21

Японські символи кана відповідають одному звуку японської мови. За винятком ん ( n ), кожен інший канал складається з приголосної частини та голосної частини. Існує природне впорядкування японської кани, свого роду "алфавітний порядок", який зазвичай розташований у таблиці 10 на 5:

   |   a    i    u    e    o
-----------------------------
*  |   a    i    u    e    o
k  |  ka   ki   ku   ke   ko
s  |  sa   si   su   se   so
t  |  ta   ti   tu   te   to
n  |  na   ni   nu   ne   no
h  |  ha   hi   hu   he   ho
m  |  ma   mi   mu   me   mo
y  |  ya        yu        yo
r  |  ra   ri   ru   re   ro
w  |  wa                  wo

Таке впорядкування називається gojuuon , або "п’ятдесят звуків", хоча деякі з п'ятдесяти комірок у таблиці насправді порожні.

Змагання

Вхід буде будь-яким із перерахованих вище кана, за винятком wo . Ваша програма або функція повинна виводити наступну каналу в порядку зчитування зліва направо, зверху вниз, наприклад:

Input       Output
------------------
a     ->    i
i     ->    u
o     ->    ka
ke    ->    ko
so    ->    ta
ni    ->    nu
ya    ->    yu
yu    ->    yo
wa    ->    wo
wo    ->    (undefined behaviour)

За винятком необов'язкового одиничного останнього рядка, у виході не повинно бути провідної чи кінцевої пробілів.

Це , тому мета - мінімізувати розмір програми в байтах.

Додаткові нотатки


3
Думаю, було б набагато веселіше використовувати винятки Хепберна і робити woперетворення, до nяких циклів слід a.
Jan

Відповіді:


16

Сітківка , 54 53 байти

T`au`ie`y.
wa
we
T`\oeuia`ao
T`ko`stn\hmyr\w`.a
^a
ka

Спробуйте в Інтернеті.

Пояснення

Wooo, демонструючи ще більше можливостей від сьогоднішнього випуску 0.7.2. :) ( Випуск передує цьому виклику близько 7 годин.)

T`au`ie`y.

Це транслітерація, яка замінює aна iі uз e, але тільки в матчах y.. Метою цього є лікування yaі yuподобається, yiі yeвідповідно, щоб пропустити прогалини.

wa
we

Замініть waна, weщоб також пропустити цей проміжок.

T`\oeuia`ao

Ось нова функція. При обертанні наборів символів набір "від" і "до" в транслітерації зазвичай майже однаковий. Отже, тепер у нас o(без зворотної косої риски) посилатися на інший набір, що дозволяє нам позбутися деякого дублювання. \oПросто варто за літерал oв цьому випадку. Отже, два набори розширюються до:

oeuia
aoeuia

Стороннє aу другому наборі ігнорується, а голосні замінюються циклічно, як очікувалося.

T`ko`stn\hmyr\w`.a

Це робить те ж саме для приголосних, але використовуючи oв першому наборі (тільки тому, що ми можемо ...). hі wпотрібно втекти, оскільки це класи персонажів. Розширені набори:

kstnhmyrw
stnhmyrw

У .aобмежує цю операцію на склади, що закінчуються a, тобто ті , які обгортають до наступного рядка таблиці.

^a
ka

Нарешті, ми замінюємо одиницю aна ka, оскільки цей випадок не може бути оброблений попередньою транслітерацією.


Якщо використання версії вашої мови, опублікованої після публікації виклику, не дискваліфікує ваш запис від змагань ? (Здогадайтесь, чому я запитав про це в тому іншому місці ?;)
Олексій

@Alex Я випустив цю версію до того, як цей виклик був опублікований.
Мартін Ендер

Гаразд. Мої вибачення. У вашій редакції це відображалось інакше. Я щойно перевірив ваш список випусків (мабуть, це слід було зробити, перш ніж викидати звинувачення).
Олексій

5

Рубі, 105

->n{a=['wo','wa']
'rymhntsk '.chars{|c|a+='*o *e *u *i *a'.tr(?*,c).split}
a[8..10]='yu'
a[a.index(n)-1]}

Прокоментував тестову програму

f=->n{a=['wo','wa']                     #initialize array to last line of table, begin to build table backwards                                
  'rymhntsk '.chars{|c|                 #for each consonant, 
    a+='*o *e *u *i *a'.tr(?*,c).split  #perform a sustitution to get that line of table in string form,  
  }                                     #then split into array at spaces and append to a
  a[8..10]='yu'                         #substitute 3 elements ye yu yi with 1 element yu
  a[a.index(n)-1]                       #return element before argument (array is backwards.)
}

puts f[gets.chop]

Ви можете зберегти кілька байтів за допомогою a=%w{wo wa}.
Йорданія

Також:, "rymhntsk ".chars{|c|"oeuia".chars{|d|a<<c+d}}хоча у мене є підозрілість, це може бути ще гольф.
Йорданія

5

GNU sed, 65

Коментарі, що не включені в бал:

:                        # Define unnamed label
y/aiueo/iueoa/           # Rotate vowels
/a/y/kstnhmyr/stnhmyrw/  # If at end of row, rotate consonants
s/^a/ka/                 # If at end of 1st row, prefix a "k"
/[yw][ie]\|wu/b          # If one of the invalid values, jump back to label and redo

Ой, це починає виглядати дуже схоже на відповідь @ Martina Retina (але, звичайно, довше).


5

Pyth, 42 40 38 байт

s.r]z.DrR6*" kstnhmyrw""aiueo"CM"$&./0

Це займає зовнішній твір між голосними та приголосними та видаляє елементи в порядках кожного числа в $&./0. Потім він виводить елемент після введення.

@J.DrR6*" kstnhmyrw""aiueo"CM"$&./0"hxJz    Implicit: z=input()
       *" kstnhmyrw""aiueo"                 Outer product: [' a',...,' o','ka',...]
    rR6                                     Strip each string—'a'~'o' now single letters
                           CM"$&./0"        Map ord onto the string: [36,38,46,47,48]
  .D                                        Remove elements at those indices.
 J                                          That's the list of kana; assign it to J
                                     xJz    Find the index (x) of z in J,
                                    h       add one,
@J                                          and access J at that index.

Спробуйте тут .


Ого, ця мова божевільна!
Просто учень

3

TXR Lisp, 135 127 124 91 байт

(ret[(memqual @1(diff(maprod(op trim-str`@1@2`)" kstnhmyrw""aiueo")'#"yi ye wi wu we"))1])

Виконати:

1> (ret[(memqual @1(diff(maprod(op trim-str`@1@2`)" kstnhmyrw""aiueo")'#"yi ye wi wu we"))1])
#<interpreted fun: lambda (#:arg-1-0208 . #:arg-rest-0207)>
2> [*1 "a"]
"i"
3> [*1 "o"]
"ka"
4> [*1 "ki"]
"ku"
5> [*1 "mu"]
"me"
6> [*1 "ya"]
"yu"
7> [*1 "yo"]
"ra"
8> [*1 "wa"]
"wo"

1

Bash + sed, 83

echo {,k,s,t,n,h,m,y,r,w}{a,i,u,e,o}|sed -E "s/[yw][ie]|wu//g;s/.*\b$1 +//;s/ .*//"
  • Розширення дужок для створення повної таблиці в одному рядку
  • sed до:
    • видалити yi, ye, wi, wuіwe
    • видаліть усе, включаючи вхідний запис (але не наступний запис)
    • видаліть усе після наступного запису

1

JavaScript, 145 162 131 118 байт

x=>(d=" kstnhmyrw".replace(/./g,"$&a$&i$&u$&e$&o").replace(/ |yi|ye|wiwuwe/g,"").match(/[^aiueo]?./g))[d.indexOf(x)+1]

Зізнайтеся, ви не могли уявити собі більш смішне рішення для вирішення цієї проблеми;) Ок, зробили це більш цікавим чином.

Демонстрація:

function p(x) {
  return (d=" kstnhmyrw".replace(/./g,"$&a$&i$&u$&e$&o") //build the sequence of kana, regex rulez!
        .replace(/ |yi|ye|wiwuwe/g,"")                   //remove the spaces and excess kana
        .match(/[^aiueo]?./g))[d.indexOf(x)+1]           //split it into array using regex and get the index of input in it
}

alert(p(prompt()))


@ Sp3000 О, це шкода, тоді ви повинні згадати, що ці зайві (проміжні / провідні) пробіли заборонені.
nicael

@nicael Я не бачу нічого в специфікації , що має на увазі , що вони є в даний час дозволені.
Мартін Ендер

@ Sp3000 фіксований інтервал.
nicael

1

Japt, 75 70 68 байт

X=" kstnhmyrw"£"aiueo"®+X w} r" |yi|ye|wiwuwe"P f"[^aiueo]?.")g1+XbU

Спробуйте в Інтернеті!


Дуже приємно! Я спробував ще більше X=" kstnhmyrw"£"aiueo"mZ{X+Z} } r" |yi|ye|wiwuwe"P f"[^aiueo]?.")g1+XbU
пограти

@Eth так, а також у вас є зайвий простір в } }:)
nicael

Ой, правда, я забув, що було додано автоматично :)
ETHproductions

@ Подивіться, ми можемо отримати його на два байти коротше за допомогою ваших чарівних ярликів: D
nicael

Зачекайте, що насправді працює? Приємно, ти перевершив мене;)
ETHproductions

1

Haskell, 114 96 байт

f"ya"="yu"
f"yu"="yo"
f"wa"="wo"
f x=snd(span(/=x)[words[a,b]!!0|a<-" kstnhmyrw",b<-"aiueo"])!!1

[words[a,b]!!0|a<-" kstnhmyrw",b<-"aiueo"]- це список усіх канав, включаючи «дірки». Я розбиваю список на частину перед вхідною канаю і від вхідної кани до кінця. З 2-ї частини підбираю другий елемент. Винятки навколо "дірок", що траплялися раніше окремими випадками.

Редагувати: @xnor придумав ідею використання, spanяка зберегла 18 байт.


Чи щось на кшталт (snd$span(/=x)k)!!1не працює для пошуку?
xnor

@xnor: тепер, коли я це бачу, це очевидно. Дуже дякую!
німі

0

Perl 6, 105 байт

.[.first(@*ARGS[0],:k)+1].say with (" kstnhmyrw".comb X~ <a e i o u>).grep(* !~~/[y|w][i|e]|wu/)».trim

Це так коротко, як я можу отримати його в перший раз, я можу мати ще одну тріщину на це пізніше, але я відчуваю себе досить добре з цього приводу.


0

JavaScript (ES6), 127 байт

s=>s>"yt"?"yo":s=="ya"?"yu":s=="wa"?"wo":(m=[].concat(...["",..."kstnhmyrw"].map(c=>[..."aiueo"].map(v=>c+v))),m[m.indexOf(s)+1])

Пояснення

s=>

  // Hardcode "yu", "ya" and "wa"
  s>"yt"?"yo":
  s=="ya"?"yu":
  s=="wa"?"wo":

  // Generate table
  (m=[].concat(...                                   // flatten the array of arrays
    ["",                                             // first consonant is blank
    ..."kstnhmyrw"].map(c=>[..."aiueo"].map(v=>c+v)) // combine each consonant and vowel
  ))[m.indexOf(s)+1]                                 // return the next sound

Тест


0

Perl 6, 96 байт

{my @a=(" kstnhmyrw".comb X~ <a i u e o>).grep({!/[y|w][e|i]|wu/})>>.trim;@a[1+@a.first($_,:k)]}

0

Python 2, 107 байт

L=[(x+y).lstrip()for x in' kstnhmyrw'for y in'aiueo'if x+y not in'yiyewiwuwe']
print L[L.index(input())+1]

Очікує введення, 'he'наприклад, в лапках


0

Ракетка 151 байт

(second(member s '(a i u e o ka ki ku ke ko sa si su se so ta ti tu te to na
ni nu ne no ha hi hu he ho ma mi mu me mo ya yu yo ra ri ru re ro wa wo)))

Безголівки:

(define (f s)
  (second
   (member s
           '(a i u e o ka ki ku ke ko sa si su se so ta ti tu te to na ni nu ne
               no ha hi hu he ho ma mi mu me mo ya yu yo ra ri ru re ro wa wo))))

Тестування:

(f 'a)
(f 'i)
(f 'o)
(f 'ke)
(f 'so)
(f 'ni)
(f 'ya)
(f 'yu)
(f 'wa)

Вихід:

'i
'u
'ka
'ko
'ta
'nu
'yu
'yo
'wo

Існує повідомлення про помилку, якщо 'wo надіслано.


0

C, 138 135 байт

char*s="aiueokstnhmyrw";i,j;k(*v){j=strchr(s,*v>>8)-s;i=strchr(s,*v)-s;j=i<4?i++:j<4?j-~(2520%i&3):!++i;printf("%c%c",s[i],i<5?:s[j]);}

Wandbox

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.