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


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 ), но они были либо нестандартными или устарели.


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]

Вы можете сохранить несколько байтов с 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.

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


Вау, этот язык сумасшедший!
Просто ученик

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

Баш + Сед, 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()))


@ Sp3000 Жаль, вы должны упомянуть, что эти лишние (конечные / ведущие) пробелы не допускаются.
Никель

@nicael Я не вижу ничего в спецификации, подразумевающей, что они в настоящее время разрешены.
Мартин Эндер

@ Sp3000 фиксированный интервал.
Никель

1

Japt, 75 70 68 байт

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

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


Довольно мило! Я пытался увеличить это, но я мог только отрубить 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

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


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)))

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


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.