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.