Wypisz następną kana


21

Japońskie znaki kana odpowiadają jednemu dźwiękowi w języku japońskim. Z wyjątkiem ん ( n ), każda inna kana składa się z części spółgłosek i samogłoski. Istnieje naturalna kolejność w japońskiej kanie, rodzaj „porządku alfabetycznego”, który zazwyczaj jest ułożony w tabeli 10 na 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

Ta kolejność nazywa się gojuuon lub „pięćdziesięcioma dźwiękami”, nawet jeśli niektóre z pięćdziesięciu komórek w tabeli są w rzeczywistości puste.

Wyzwanie

Wejściowy będzie dowolny z wymienionych powyżej kana, z wyjątkiem wo . Twój program lub funkcja powinna wypisać następny kana w kolejności od lewej do prawej, od góry do dołu, np .:

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

Z wyjątkiem opcjonalnego pojedynczego końcowego znaku nowej linii, na wyjściu nie powinno być żadnych początkowych ani końcowych białych znaków.

To jest , więc celem jest zminimalizowanie wielkości programu w bajtach.

Dodatkowe uwagi

  • Aby uprościć sprawę , w tym wyzwaniu zastosowano romanizację Nihon-shiki .Romanizacja Hepburn jest bardziej powszechna, ale ma kilka załamań, które sprawiają, że golf jest bardziej denerwujący (np. Si staje się shi , hu staje się fu ).

  • Kana zrobić istnieją dla pustych miejsc (patrz japoński SE ), ale były też niestandardowe lub są już nieaktualne.


3
Myślę, że znacznie fajniej byłoby skorzystać z wyjątków Hepburn i dokonać wotransformacji, do nktórej pętle a.
Jan

Odpowiedzi:


16

Retina , 54 53 bajty

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

Wypróbuj online.

Wyjaśnienie

Wooo, pokazując jeszcze więcej funkcji z dzisiejszej wersji 0.7.2. :) ( Wydanie poprzedza to wyzwanie o około 7 godzin.)

T`au`ie`y.

Jest to transliteracja która zastępuje asię ii uz e, ale tylko w meczach y.. Ma to na celu leczenie yai yupolubienie yioraz ye, odpowiednio, pominięcie luk.

wa
we

Wymień wasię wepominąć tę lukę, jak również.

T`\oeuia`ao

Oto nowa funkcja. Podczas obracania zestawów znaków „od” i „do” w transliteracji są zwykle prawie identyczne. Teraz mamy o(bez odwrotnego ukośnika) odniesienie do drugiego zestawu, który pozwala nam pozbyć się powielania. W tym przypadku \ooznacza tylko literał o. Dwa zestawy rozwijają się do:

oeuia
aoeuia

Obce aw drugim zestawie są ignorowane, a samogłoski są wymieniane cyklicznie zgodnie z oczekiwaniami.

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

To samo robi w przypadku spółgłosek, ale używa ow pierwszym zestawie (tylko dlatego, że możemy ...). hi wpotrzebuję ucieczki, ponieważ są to klasy postaci. Rozszerzone zestawy to:

kstnhmyrw
stnhmyrw

W .aOgranicza to operacja sylab, które kończą się a, to znaczy te, które owijają się do następnego wiersza tabeli.

^a
ka

Wreszcie możemy zastąpić jeden az ka, dlatego, że sprawa nie może być obsługiwane przez poprzedni transliteracji.


Czy używanie wersji Twojego języka wydanej po opublikowaniu wyzwania nie dyskwalifikuje Twojego zgłoszenia do udziału w konkursie ? (Zgadnij, dlaczego pytałem o to w tym innym miejscu
Alex

@Alex Wydałem tę wersję przed opublikowaniem tego wyzwania.
Martin Ender

W porządku. Przepraszam. Twoja edycja spowodowała, że ​​wyglądało inaczej. Właśnie zweryfikowałem twoją listę wydań (prawdopodobnie powinienem to zrobić przed rzuceniem oskarżeń).
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]}

Skomentowane w programie testowym

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]

Możesz zapisać kilka bajtów za pomocą a=%w{wo wa}.
Jordan

Ponadto: "rymhntsk ".chars{|c|"oeuia".chars{|d|a<<c+d}}chociaż mam podejrzenia, że ​​można dalej grać w golfa.
Jordan

5

GNU sed, 65

Komentarze nieuwzględnione w wyniku:

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

Oy, zaczyna to przypominać odpowiedź Retina @ Martina (oczywiście dłuższą).


5

Pyth, 42 40 38 bajtów

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

To przenosi iloczyn zewnętrzny między samogłosek i spółgłosek i usuwa elementy na rzędach każdej liczby w $&./0. Następnie wyprowadza element po wejściu.

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

Wypróbuj tutaj .


Wow, ten język jest szalony!
Tylko uczeń

3

TXR Lisp, 135 127 124 91 bajtów

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

Biegać:

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/ .*//"
  • Rozwinięcie nawiasu klamrowego, aby utworzyć pełny stół w jednym wierszu
  • sed do:
    • usunąć yi, ye,wi , wuiwe
    • usuń wszystko do wpisu włącznie (ale nie następny wpis)
    • usuń wszystko po następnym wpisie

1

JavaScript, 145 162 131 118 bajtów

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

Przyznaj się, nie wyobrażasz sobie bardziej śmiesznego rozwiązania tego problemu;) OK, zrobiłem to w bardziej interesujący sposób.

Próbny:

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 Och, szkoda, powinieneś wspomnieć, że te nadmiarowe (końcowe / wiodące) spacje są niedozwolone.
nicael

@nicael Nie widzę nic w specyfikacji sugerującej, że one obecnie dozwolone.
Martin Ender

@ Sp3000 ustalone odstępy.
nicael

1

Japt, 75 70 68 bajtów

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

Wypróbuj online!


Nieźle! Spróbowałem bardziej X=" kstnhmyrw"£"aiueo"mZ{X+Z} } r" |yi|ye|wiwuwe"P f"[^aiueo]?.")g1+XbU
pograć

@Eth tak, a także masz nadmiar miejsca w } }:)
nicael

Ohhhh racja, zapomniałem, że zostało automatycznie dodane :)
ETHproductions

@Eth spójrz, możemy uzyskać dwa bajty krótsze dzięki twoim magicznym skrótom: D
nicael

Zaraz, to naprawdę działa? Fajnie, wygraliście mnie;)
ETHprodukcje

1

Haskell, 114 96 bajtów

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"]to lista wszystkich kanas, w tym „dziur”. Rozbijam listę na część przed wejściowym kana i od wejściowego kana do końca. Z drugiej części wybieram drugi element. Wyjątki wokół „dziur” zostały wcześniej złapane przez osobne przypadki.

Edycja: @xnor wpadł na pomysł wykorzystania, spanktóra pozwoliła zaoszczędzić 18 bajtów.


Czy coś takiego (snd$span(/=x)k)!!1nie zadziała podczas wyszukiwania?
xnor

@xnor: teraz to widzę, to oczywiste. Dzięki wielkie!
nimi

0

Perl 6, 105 bajtów

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

To jest tak krótkie, jak tylko mogę, za pierwszym razem, mogę mieć kolejny crack, ale czuję się z tym całkiem dobrze.


0

JavaScript (ES6), 127 bajtów

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

Wyjaśnienie

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

Test


0

Perl 6, 96 bajtów

{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 bajtów

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

Oczekuje 'he'na przykład danych wejściowych ujętych w cudzysłów


0

Rakieta 151 bajtów

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

Nie golfowany:

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

Testowanie:

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

Wydajność:

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

Jeśli komunikat „wo” zostanie wysłany, pojawi się komunikat o błędzie.


0

C, 138 135 bajtów

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.