Вывести следующую кана

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

Этот порядок называется годзюон , или «пятьдесят звуков», хотя некоторые из пятидесяти ячеек в таблице фактически пусты.

Соревнование

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

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

За исключением необязательного одиночного завершающего символа новой строки, в выводе не должно быть начальных или конечных пробелов.

Это , поэтому цель состоит в том, чтобы минимизировать размер программы в байтах.

Дополнительные замечания

  • Для простоты в этом вызове используется романизация Nihon-shiki . Романизация Хепберна более распространена, но имеет несколько изломов, которые делают вещи более раздражающими для гольфа (например, Си становится Ши , Ху становится Фу ).

  • Kana делать существует пустые места (см японского SE ), но они были либо нестандартными или устарели.

Sp3000
источник
3
Я думаю, что было бы гораздо интереснее использовать исключения Хепберна и выполнить woпреобразование, для nкоторого выполняется цикл a.
Jan

Ответы:

16

Retina , 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

Вот новая функция. При повороте наборов символов набор «from» и «to» в транслитерации обычно практически идентичен. Так что теперь у нас есть o(без обратной косой черты) ссылка на другой набор, который позволяет нам избавиться от некоторого дублирования. \oПросто стоит за литерал oв этом случае. Таким образом, два набора расширяются до:

oeuia
aoeuia

Посторонние aво втором наборе игнорируются, и гласные заменяются циклически, как и ожидалось.

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

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

kstnhmyrw
stnhmyrw

Эта .aоперация ограничивается только aтеми слогами, которые заканчиваются , т. Е. Теми, которые переносятся на следующую строку таблицы.

^a
ka

Наконец, мы заменяем один aна ka, потому что этот случай не может быть обработан предыдущей транслитерацией.

Мартин Эндер
источник
Разве использование версии вашего языка, выпущенной после публикации заявки, не лишает вас права участвовать в конкурсе ? (Угадайте, почему я спросил об этом в этом другом месте?;)
Алекс
@ Алекс Я выпустил эту версию до того, как эта проблема была опубликована.
Мартин Эндер
Хорошо. Мои извенения. Ваше изменение заставило это появиться иначе. Я только что проверил ваш список релизов (вероятно, следовало сделать это, прежде чем выдвигать обвинения).
Алекс
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]
Уровень реки St
источник
Вы можете сохранить несколько байтов с 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

Ой, это начинает выглядеть как ответ Retina @ Martin (но, конечно, дольше).

Цифровая травма
источник
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.

Попробуй это здесь .

lirtosiast
источник
Вау, этот язык сумасшедший!
Просто ученик
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"
Kaz
источник
1

Баш + Сед, 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/ .*//"
  • Расширение скобок для создания полной таблицы в одну строку
  • седь к:
    • удалить 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()))

nicael
источник
@ Sp3000 Жаль, вы должны упомянуть, что эти лишние (конечные / ведущие) пробелы не допускаются.
Никель
@nicael Я не вижу ничего в спецификации, подразумевающей, что они в настоящее время разрешены.
Мартин Эндер
@ Sp3000 фиксированный интервал.
Никель
1

Japt, 75 70 68 байт

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

Попробуйте онлайн!

nicael
источник
Довольно мило! Я пытался увеличить это, но я мог только отрубить 3 байта:X=" kstnhmyrw"£"aiueo"mZ{X+Z} } r" |yi|ye|wiwuwe"P f"[^aiueo]?.")g1+XbU
ETHproductions
@ Да, а также у вас есть лишний пробел } }:)
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"]это список всех кан, включая "дыры". Я разбиваю список на части перед входным каном и от входного кана до конца. Из второй части я выбираю второй элемент. Исключения вокруг «дыр» уловлены ранее отдельными случаями.

Редактировать: @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

Тестовое задание

user81655
источник
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)]}
bb94
источник
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)))

Ungolfed:

(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 отправлено, появляется сообщение об ошибке.

rnso
источник
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

o79y
источник