เอาท์พุทคะนะต่อไป


21

ตัวอักษรคะนะของญี่ปุ่นสอดคล้องกับเสียงเดียวในภาษาญี่ปุ่น ยกเว้นん ( n ) kana อื่น ๆ ประกอบด้วยส่วนพยัญชนะและส่วนของสระ มีคำสั่งตามธรรมชาติเป็นภาษาญี่ปุ่นคะนะเรียงลำดับตามตัวอักษรซึ่งมักจัดเรียงในตาราง 10 คูณ 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

คำสั่งนี้เรียกว่าโกจูอุนหรือ "ห้าสิบเสียง" แม้ว่าบางส่วนของเซลล์ห้าสิบในตารางจะว่างเปล่า

ความท้าทาย

การป้อนข้อมูลจะเป็นใด ๆ คะที่ระบุไว้ข้างต้นมีข้อยกเว้นสำหรับwo โปรแกรมหรือฟังก์ชั่นของคุณควรส่ง kana ตัวถัดไปตามลำดับจากซ้ายไปขวา, จากบนลงล่างเพื่ออ่านเช่น:

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

ด้วยข้อยกเว้นของบรรทัดใหม่ต่อท้ายเดี่ยวที่เป็นทางเลือกไม่ควรมีช่องว่างนำหน้าหรือต่อท้ายในเอาต์พุต

นี่คือดังนั้นเป้าหมายคือเพื่อลดขนาดโปรแกรมเป็นไบต์

หมายเหตุเพิ่มเติม

  • เพื่อที่จะให้สิ่งที่ง่าย, ความท้าทายนี้ใช้romanisation Nihon ชิกิ เฮปเบิร์ romanisationเป็นเรื่องธรรมดามากขึ้น แต่มีข้อบกพร่องไม่กี่ที่ทำให้สิ่งที่น่ารำคาญมากขึ้นสำหรับการเล่นกอล์ฟ (เช่นsiกลายเป็นชิ , Huกลายเป็นฟู )

  • Kana ทำอยู่สำหรับจุดที่ว่างเปล่า (ดูญี่ปุ่น SE ) แต่พวกเขามีทั้งที่ไม่ได้มาตรฐานหรืออยู่ในขณะนี้ล้าสมัย


3
ฉันคิดว่ามันจะสนุกมากขึ้นที่จะใช้ข้อยกเว้น Hepburn และให้woเปลี่ยนไปที่ลูปn a
Jan

คำตอบ:


16

เรติน่า54 54ไบต์

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

ลองออนไลน์

คำอธิบาย

Wooo แสดงคุณสมบัติเพิ่มเติมจากรุ่นปัจจุบัน 0.7.2 :) ( การเปิดตัวจะมาถึงความท้าทายนี้ประมาณ 7 ชั่วโมง)

T`au`ie`y.

นี่คือการทับศัพท์ที่แทนที่aด้วยiและuด้วยeแต่จะเป็นการจับคู่y.เท่านั้น จุดประสงค์ของการทำแบบนี้คือการปฏิบัติyaและyuชอบyiและyeตามลำดับเพื่อข้ามช่องว่าง

wa
we

แทนที่waด้วยweเพื่อข้ามช่องว่างนั้นเช่นกัน

T`\oeuia`ao

นี่คือคุณสมบัติใหม่ เมื่อหมุนชุดอักขระชุด "จาก" และ "เป็น" ในการทับศัพท์มักจะเหมือนกันเกือบทั้งหมด ดังนั้นตอนนี้เรามีo(ไม่มีแบ็กสแลช) เพื่ออ้างถึงชุดอื่นซึ่งช่วยให้เราสามารถกำจัดการซ้ำซ้อนได้ \oเพียงย่อมาจากอักษรoในกรณีที่ ดังนั้นทั้งสองชุดจึงขยายเป็น:

oeuia
aoeuia

สิ่งที่ไม่เกี่ยวข้องaในชุดที่สองจะถูกละเว้นและสระจะถูกแทนที่ด้วยวงจรตามที่คาดไว้

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

สิ่งนี้ทำสิ่งเดียวกันสำหรับพยัญชนะ แต่ใช้oในชุดแรก (เพียงเพราะเราทำได้ ... ) hและwต้องการหลบหนีเนื่องจากเป็นคลาสอักขระ ชุดที่ขยายคือ:

kstnhmyrw
stnhmyrw

การ.aจำกัด การดำเนินการนี้เป็นพยางค์ที่ลงท้ายaด้วยเช่นที่อยู่ในบรรทัดถัดไปของตาราง

^a
ka

ในที่สุดเราแทนที่หนึ่งaด้วยkaเพราะกรณีดังกล่าวไม่สามารถจัดการได้โดยการทับศัพท์ก่อนหน้า


ไม่ได้ใช้เวอร์ชันภาษาของคุณที่วางจำหน่ายหลังจากการโพสต์คำถามถูกตัดสิทธิ์ไม่ให้เข้าร่วมการแข่งขันใช่หรือไม่ (เดาว่าทำไมฉันถามเรื่องนี้ในสถานที่อื่น?;)
อเล็กซ์

@Alex ฉันเปิดตัวเวอร์ชันนั้นก่อนที่ความท้าทายนี้จะโพสต์
Martin Ender

ถูก ขอโทษด้วย. การแก้ไขของคุณทำให้เป็นอย่างอื่น ฉันเพิ่งตรวจสอบรายการรุ่นของคุณ (อาจเป็นไปได้ว่าควรจะทำก่อนที่จะทำการกล่าวหา)
Alex

5

ทับทิม, 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]}

แสดงความคิดเห็นในโปรแกรมทดสอบ

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]

a=%w{wo wa}คุณสามารถบันทึกไม่กี่ไบต์ด้วย
Jordan

นอกจากนี้: "rymhntsk ".chars{|c|"oeuia".chars{|d|a<<c+d}}แม้ว่าฉันมีความสงสัยที่ด้อมมันสามารถตีกอล์ฟต่อไปได้
จอร์แดน

5

GNU sed, 65

ความคิดเห็นไม่รวมอยู่ในคะแนน:

:                        # 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 นี่เป็นจุดเริ่มต้นที่ดูเหมือนคำตอบจอประสาทตาของ @ Martin (แต่นานกว่านั้น)


5

Pyth, 42 40 38 ไบต์

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

นี้จะใช้เวลานอกสินค้าระหว่างสระและพยัญชนะและองค์ประกอบที่เอา ords $&./0ของจำนวนในแต่ละ จากนั้นมันจะออกองค์ประกอบหลังจากอินพุต

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

ลองมันนี่


ว้าวภาษานี้มันบ้าไปแล้ว!
เพียงผู้เรียน

3

TXR Lisp, 135 127 124 91 ไบต์

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

วิ่ง:

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/ .*//"
  • รั้งส่วนขยายเพื่อสร้างตารางเต็มในหนึ่งบรรทัด
  • ใจจดใจจ่อที่:
    • ลบyi, ye, wi, wuและwe
    • ลบทุกอย่างจนถึงและรวมถึงรายการอินพุต (แต่ไม่ใช่รายการถัดไป)
    • ลบทุกอย่างหลังจากรายการถัดไป

1

JavaScript, 145 162 131 118 ไบต์

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

ยอมรับว่าคุณไม่สามารถจินตนาการถึงวิธีแก้ปัญหาที่ไร้สาระมากขึ้นในการแก้ปัญหานี้)ตกลงทำสิ่งนี้ด้วยวิธีที่น่าสนใจยิ่งขึ้น

การสาธิต:

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 โอ้น่าเสียดายคุณควรพูดถึงว่าช่องว่างส่วนเกิน (ต่อท้าย / นำ) เหล่านี้ไม่ได้รับอนุญาต
nicael

@nicael ฉันไม่เห็นอะไรในข้อมูลจำเพาะหมายความว่าพวกเขาจะได้รับอนุญาตให้อยู่ในปัจจุบัน
Martin Ender

@ Sp3000 ระยะห่างคงที่
nicael

1

Japt, 75 70 68 ไบต์

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

ลองออนไลน์!


ค่อนข้างดี! ฉันพยายามตีกอล์ฟลงมากกว่านี้ แต่ฉันสามารถตัดให้เหลือเพียง 3 ไบต์:X=" kstnhmyrw"£"aiueo"mZ{X+Z} } r" |yi|ye|wiwuwe"P f"[^aiueo]?.")g1+XbU
ETHproductions

@ ใช่แล้วคุณมีพื้นที่เหลือใน} }:)
nicael

ถูกต้องแล้วฉันลืมไปว่ามันถูกเพิ่มเข้ามาโดยอัตโนมัติ :)
ETHproductions

@ รูปลักษณ์เราสามารถทำให้มันสั้นลงสองไบต์ด้วยทางลัดวิเศษของคุณ: D
nicael

เดี๋ยวก่อนมันใช้งานได้จริงเหรอ? นีซคุณได้ดีกว่าฉัน;)
ETHproductions

1

Haskell, 114 96 ไบต์

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"]คือรายการของ kanas ทั้งหมดรวมถึง "หลุม" ฉันแบ่งรายการออกเป็นส่วนหนึ่งก่อนที่จะใส่อินพุต kana และจากอินพุต kana จนถึงจุดสิ้นสุด จากส่วนที่ 2 ฉันเลือกองค์ประกอบที่สอง ข้อยกเว้นรอบ "หลุม" ที่จับมาก่อนโดยกรณีที่แยกต่างหาก

แก้ไข: @xnor เกิดแนวคิดการใช้spanที่บันทึกไว้ 18 ไบต์


มีบางอย่างที่(snd$span(/=x)k)!!1ไม่เหมาะกับการค้นหาหรือไม่
xnor

@ xnor: ตอนนี้ฉันเห็นแล้วมันชัดเจน ขอบคุณมาก!
nimi

0

Perl 6, 105 ไบต์

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

นี่เป็นระยะสั้นที่สุดเท่าที่ฉันสามารถหาได้ในครั้งแรกของฉันฉันอาจมีรอยแตกอีกครั้งในภายหลัง แต่ฉันรู้สึกดีเกี่ยวกับเรื่องนี้


0

JavaScript (ES6), 127 ไบต์

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

คำอธิบาย

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

ทดสอบ



0

Python 2, 107 ไบต์

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'ตัวอย่างเช่น


0

แร็กเก็ต 151 ไบต์

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

การทดสอบ:

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

เอาท์พุท:

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

มีข้อความแสดงข้อผิดพลาดหากมีการส่ง 'wo


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.