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.


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.


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]

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


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 .


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"

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

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


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


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.


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.


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


0

Perl 6, 96 bytes

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


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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.