Bir sonraki kana çıktısı


21

Japonca kana karakterleri, Japonca dilinde tek bir sese karşılık gelir. ん ( n ) hariç, diğer her bir kana ünsüz bir kısımdan ve ünlü bir kısımdan oluşur. Genellikle 10'a 5'lik bir tabloda düzenlenen bir tür "alfabetik sıra" olan Japon kanalarına doğal bir düzen vardır:

   |   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

Tablodaki elli hücreden bazıları aslında boş olsa da, bu sıralamaya gojuuon veya "elli ses" denir .

Meydan okuma

Girdi, wo hariç, yukarıda listelenen kanalardan biri olacaktır . Programınız veya işleviniz bir sonraki kana soldan sağa, yukarıdan aşağıya okuma sırasına göre çıkarmalıdır, örneğin:

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

İsteğe bağlı tek izleyen bir yeni satır dışında, çıktıda hiçbir satır ya da sonda boşluk olmamalıdır.

Bu , bu yüzden hedef bayt cinsinden program boyutunu küçültmektir.

Ek Notlar

  • Her şeyi basit tutmak için, bu zorluk Nihon-shiki romanizasyonunu kullanıyor . Hepburn Romanizasyon (örneğin daha sık görülür, ancak golf için işleri daha rahatsız edici hale Bazı sorunları vardır si olur shi , hu olur fu ).

  • Kana do boş noktalar için var (bkz Japon SE ), ama onlar da standart dışı olduğunu ya artık geçersizdir.


3
Ben Hepburn istisnaları kullanmak ve yapmak çok daha eğlenceli olacağını düşünüyorum wodönüşümü niçin döngüler hangi a.
Jan

Yanıtlar:


16

Retina , 54 53 bayt

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

Çevrimiçi deneyin.

açıklama

Wooo, bugünün 0.7.2 sürümünden daha da fazla özellik gösteriyor. :) ( Bu sürüm yaklaşık 7 saat öncesinden başlıyor .)

T`au`ie`y.

Bu yerini tercümesidir aile ive uile edeğil sadece maçlarda, y.. Bunun amacı, tedavi etmektir yave yubenzeri yive yeboşlukları geçmek amacıyla, sırasıyla.

wa
we

Bu boşluğu da atlamak için waile değiştirin we.

T`\oeuia`ao

İşte yeni özellik. Karakter kümelerini döndürürken, bir harf çevirisi içindeki "ve" ile "arasındaki" genellikle hemen hemen aynıdır. Öyleyse şimdi o(ters eğik çizgi olmadan) diğer sete atıfta bulunacağız, bu da bazı kopyalardan kurtulmamızı sağlıyor. \oSadece bir hazır demektir obu durumda. Böylece iki set genişler:

oeuia
aoeuia

aİkinci setteki yabancı madde yoksayılır ve sesli harfler beklendiği gibi çevrimsel olarak değiştirilir.

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

Bu ünsüzler için de aynı şeyi yapar, ancak oilk sette kullanmak (sadece yapabildiğimiz için ...). hve wkarakter karakterleri oldukları için kaçma ihtiyacı var. Genişletilmiş kümeler:

kstnhmyrw
stnhmyrw

.aKısıtlar hece bu operasyonun bu uç a, yani bu o tablonun sonraki satıra sarma.

^a
ka

Son olarak, biz tek yerine asahip kabu durumda önceki transliteration tarafından ele alınamaz, çünkü.


Dilinizi yayınladıktan sonra yayımlanan bir sürümünü kullanmak , girişinizi rekabet etmekten diskalifiye etmiyor mu ? (Neden bunu başka bir yerde sordum sanırım
Alex

@Alex Bu meydan okuma yayınlanmadan önce o sürümü yayınladım.
Martin Ender

Tamam. Özür dilerim. Düzenlemeniz başka türlü görünmesini sağladı. Bültenlerinizin listesini doğruladım (muhtemelen bunu suçlamadan önce yapmalıydım).
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]}

Test programında yorum yaptı

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]

İle birkaç byte kaydedebilirsiniz a=%w{wo wa}.
Jordan,

Ayrıca: "rymhntsk ".chars{|c|"oeuia".chars{|d|a<<c+d}}Sinsi bir şüphem olsa da daha fazla golf oynayabilirdi.
Ürdün

5

GNU sed, 65

Yorumlar rakama dahil edilmedi:

:                        # 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, bu @ Martin Retina'nın cevabı gibi görünmeye başlıyor (ama elbette daha uzun).


5

Pyth, 42 40 38 bayt

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

Bu, dış ürünü ünlüler ile ünsüzler arasında alır ve her sayının ortasındaki öğeleri kaldırır $&./0. Sonra girişten sonra elemanı çıkarır.

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

Burada dene .


Vay, bu dil çılgın!
Sadece bir öğrenci

3

TXR Lisp, 135 127 124 91 bayt

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

Koşmak:

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/ .*//"
  • Tek satırda tam tablo oluşturmak için küme genişletme
  • -e doğru:
    • remove yi, ye, wi, wuvewe
    • giriş girişine kadar olanları da dahil olmak üzere her şeyi kaldır
    • bir sonraki girişten sonra her şeyi kaldır

1

JavaScript, 145 162 131 118 bayt

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

Kabul et, bu sorunu çözmek için daha saçma bir çözüm hayal edemezsin;) Tamam, bunu daha ilginç bir şekilde yaptım.

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 Ah, bu üzücü, o zaman bu aşırı (izleyen / giden) alanlara izin verilmediğinden bahsetmelisiniz.
nicael

Ben o Spec ima şey görmüyorum @nicael edilir anda izin verdi.
Martin Ender

@ Sp3000 sabit aralık.
nicael

1

Japt, 75 70 68 bayt

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

Çevrimiçi deneyin!


Bayağı güzel! Bunu daha çok golf oynamaya çalıştım, ancak yalnızca 3 bayt X=" kstnhmyrw"£"aiueo"mZ{X+Z} } r" |yi|ye|wiwuwe"P f"[^aiueo]?.")g1+XbU
kesebildim

@Evet evet, ayrıca fazladan yeriniz var } }:)
nicael

Ohhhh sağ, otomatik olarak eklendiğini unuttum :)
ETHproductions

@Bakın, sihirli kısayollarınızla daha kısa iki bayt alabiliriz: D
nicael

Bekle, gerçekten işe yarıyor mu? Güzel, beni çok kızdırdın;)
ETHproductions 7:16

1

Haskell, 114 96 bayt

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"]"delikler" dahil tüm kanasların bir listesidir. Listeyi, giriş kanasından önce ve giriş kanasından sonuna kadar parçalara bölerim. İkinci kısımdan ikinci elemanı seçiyorum. "Delik" etrafındaki istisnalar, daha önce ayrı davalar tarafından yakalandı.

Düzenleme: @xnor, span18 baytlık kaydedilenin kullanılması fikrini ortaya koydu .


Bir şey aramak (snd$span(/=x)k)!!1için işe yaramazsa ister misiniz ?
xnor

@ xnor: Şimdi onu görüyorum, çok açık. Çok teşekkürler!
nimi

0

Perl 6, 105 bayt

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

Bu benim ilk seferinde başarabildiğim kadar kısa, daha sonra başka bir çatlak olabilir ama bu konuda kendimi çok iyi hissediyorum.


0

JavaScript (ES6), 127 bayt

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

açıklama

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

Ölçek


0

Perl 6, 96 bayt

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

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'Örneğin , tırnak içine alınmış girişi bekler.


0

Raket 151 bayt

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

Test yapmak:

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

Çıktı:

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

Gönderilirse bir hata mesajı var.


0

C, 138 135 bayt

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.