Saída do próximo kana

21

Os caracteres kana japoneses correspondem a um único som no idioma japonês. Com exceção de ん ( n ), todos os outros kana consistem em uma parte consoante e uma parte da vogal. Há uma ordem natural para o kana japonês, uma espécie de "ordem alfabética", que geralmente é organizada em uma tabela de 10 por 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

Essa ordem é chamada gojuuon , ou "cinquenta sons", mesmo que algumas das cinquenta células da tabela estejam de fato vazias.

O desafio

A entrada será qualquer um dos kana listados acima, com exceção de wo . Seu programa ou função deve produzir o próximo kana na ordem de leitura da esquerda para a direita e de cima para baixo, por exemplo:

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

Com exceção de uma nova linha opcional à direita, não deve haver espaço em branco à esquerda ou à esquerda na saída.

Isso é , então o objetivo é minimizar o tamanho do programa, em bytes.

Notas Adicionais

  • Para manter as coisas simples, esse desafio usa a romanização de Nihon-shiki . A romanização de Hepburn é mais comum, mas tem algumas torções que tornam as coisas mais irritantes para o golfe (por exemplo, si se torna shi , hu se torna fu ).

  • Kana fazer existir para os espaços vazios (ver Japanese SE ), mas eles ou eram não-padrão ou são agora obsoleto.

Sp3000
fonte
3
Eu acho que seria muito mais divertido usar as exceções de Hepburn e fazer a wotransformação para nqual loop a.
Jan

Respostas:

16

Retina , 54 53 bytes

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

Experimente online.

Explicação

Wooo, mostrando ainda mais recursos da versão 0.7.2 de hoje. :) ( O lançamento antecede esse desafio em cerca de 7 horas.)

T`au`ie`y.

Esta é uma transliteração que substitui apor ie ucom e, mas apenas em correspondências de y.. O objetivo disso é tratar yae yugostar yie ye, respectivamente, a fim de eliminar as lacunas.

wa
we

Substitua wapor wepara ignorar essa lacuna também.

T`\oeuia`ao

Aqui está o novo recurso. Ao girar conjuntos de caracteres, os "de" e "para" definidos em uma transliteração são geralmente quase idênticos. Então agora temos o(sem uma barra invertida) para nos referirmos ao outro conjunto, o que nos permite livrar-nos de alguma duplicação. O \ojust significa literal onesse caso. Portanto, os dois conjuntos se expandem para:

oeuia
aoeuia

O estranho ano segundo conjunto é ignorado e as vogais são substituídas ciclicamente conforme o esperado.

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

Isso faz o mesmo com as consoantes, mas usando ono primeiro conjunto (apenas porque podemos ...). he wprecisam escapar porque são classes de personagens. Os conjuntos expandidos são:

kstnhmyrw
stnhmyrw

Os .arestringe esta operação para sílabas que terminam em a, ou seja, aqueles que são moldados para a próxima linha da tabela.

^a
ka

Por fim, substituímos um único apor ka, porque esse caso não pode ser tratado pela transliteração anterior.

Martin Ender
fonte
O uso de uma versão do seu idioma lançada após a publicação do desafio desqualifica sua participação na competição ? (Acho que por isso que eu perguntei sobre isso nesse outro lugar;?)
Alex
@Alex Lancei essa versão antes deste desafio ser publicado.
Martin Ender
OK. Me desculpe. Sua edição fez parecer diferente. Acabei de verificar sua lista de lançamentos (provavelmente deveria ter feito isso antes de lançar acusações).
Alex
5

Ruby, 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]}

Comentado no programa de teste

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]
Level River St
fonte
Você pode salvar alguns bytes com a=%w{wo wa}.
Jordânia
Além disso: "rymhntsk ".chars{|c|"oeuia".chars{|d|a<<c+d}}embora eu tenha uma suspeita furtiva, ele pode ser jogado ainda mais.
Jordânia
5

GNU sed, 65

Comentários não incluídos na pontuação:

:                        # 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

Oi, isso está começando a se parecer muito com a resposta Retina de Martin (mas mais longa, é claro).

Trauma Digital
fonte
5

Pitão, 42 40 38 bytes

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

Isso pega o produto externo entre vogais e consoantes e remove elementos nas ordenações de cada número em $&./0. Em seguida, ele gera o elemento após a entrada.

@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.

Experimente aqui .

lirtosiast
fonte
Uau, essa linguagem é louca!
Apenas um aluno
3

TXR Lisp, 135 127 124 91 bytes

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

Corre:

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
fonte
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/ .*//"
  • Prepare a expansão para criar uma tabela completa em uma linha
  • sed para:
    • remove yi, ye, wi, wuewe
    • remova tudo até e incluindo a entrada de entrada (mas não a próxima entrada)
    • remova tudo após a próxima entrada
Trauma Digital
fonte
1

JavaScript, 145 162 131 118 bytes

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

Admita, você não poderia imaginar uma solução mais ridícula para resolver esse problema;) ok, fiz isso de uma maneira mais interessante.

Demo:

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
fonte
@ Sp3000 Oh, que pena, você deve mencionar que esses espaços em excesso (à direita / à esquerda) não são permitidos.
Nicael
@nicael Não vejo nada na especificação que implique que eles sejam permitidos no momento.
Martin Ender
@ Sp3000 espaçamento fixo.
Nicael
1

Japt, 75 70 68 bytes

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

Experimente online!

nicael
fonte
Muito bom! Eu tentei jogar mais isso, mas só consegui cortar 3 bytes:X=" kstnhmyrw"£"aiueo"mZ{X+Z} } r" |yi|ye|wiwuwe"P f"[^aiueo]?.")g1+XbU
ETHproductions
@Eth sim, e também você tem um excesso de espaço em } }:)
nicael
Ohhhh certo, eu esqueci que foi adicionado automaticamente :)
ETHproductions
@Eth olhar, podemos obtê-lo dois bytes mais curto com seus atalhos mágicos: D
nicael
Espere, isso realmente funciona? Bom, você me outgolfed;)
ETHproductions
1

Haskell, 114 96 bytes

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"]é uma lista de todos os kanas, incluindo os "buracos". Eu divido a lista na parte antes do kana de entrada e do kana de entrada até o fim. Na segunda parte, eu escolho o segundo elemento. As exceções em torno dos "buracos" já foram capturados por casos separados.

Edit: @xnor surgiu com a idéia de usar o spanque salvou 18 bytes.

nimi
fonte
Algo como (snd$span(/=x)k)!!1não funcionaria para a pesquisa?
Xnor
@ xnor: agora que eu vejo, é óbvio. Muito obrigado!
N
0

Perl 6, 105 bytes

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

Isso é o mais curto que posso conseguir na primeira vez, posso ter uma outra chance mais tarde, mas me sinto muito bem com isso.

Teclas de atalho
fonte
0

JavaScript (ES6), 127 bytes

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

Explicação

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

Teste

user81655
fonte
0

Perl 6, 96 bytes

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

Python 2, 107 bytes

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

Espera entrada entre aspas, 'he'por exemplo

Karl Napf
fonte
0

Raquete 151 bytes

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

Teste:

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

Saída:

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

Há uma mensagem de erro se 'wo for enviado.

rnso
fonte
0

C, 138 135 bytes

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
fonte