ตัวแปลภาษา TUT


10

ข้อความอาจถูกแปลเป็นภาษา TUTรุ่นที่เป็นลายลักษณ์อักษรโดยการแทนที่ตัวอักษรแต่ละตัวด้วยคำว่า "TUT" ที่เกี่ยวข้องตามที่กำหนดในตารางต่อไปนี้ (ดัดแปลงจากบทความที่เชื่อมโยง) * :

a  e        h  hash     o  o        u  yu
b  bub      i  ay       p  pup      v  vuv
c  kut      j  jag      q  kwak     w  waks
d  dud      k  kak      r  rut      x  eks
e  i        l  lul      s  sus      y  yak
f  fuf      m  mum      t  tut      z  zuz
g  jug      n  nun            

* Exceptions: 
(1) Upper case letters have corresponding TUT words in upper case.
(2) A doubled letter becomes 'skwer' ('SKWER') followed by the TUT word for that letter.
    - An n-fold letter is treated as a number of doubles, followed by a single if needed.
    - To be considered a double or n-fold letter, the letters must be in the same case.
(3) 'rut' ('RUT') is replaced by 'rud' ('RUD') if immediately followed by 'dud' ('DUD'). 

เขียนโปรแกรมด้วยพฤติกรรม i / o ต่อไปนี้:

การป้อนข้อมูล (จาก stdin): เป็นไบนารี (0/1) ตัวบ่งชี้ที่ฉันและสตริง ASCII s

  • ถ้าi = 0 ดังนั้นsอาจมีข้อความ ASCII ใด ๆ
  • หากi = 1 ดังนั้นsต้องเป็นเอาต์พุตภาษา TUT สำหรับอินพุตที่ถูกต้อง

เอาท์พุท (ที่ stdout): เป็นไบนารี (0/1) ตัวบ่งชี้Jและสตริง ASCII ที

  • ถ้าi = 0 ดังนั้นj = 1 และtคือการแปลของs เป็นภาษา TUT
  • ถ้าi = 1 ดังนั้นj = 0 และtคือการแปลของs จากภาษา TUT
  • สำหรับอินพุตที่ถูกต้องใด ๆ การใช้โปรแกรมกับเอาต์พุตของตัวเองต้องทำซ้ำอินพุตต้นฉบับอย่างแน่นอน เช่นโปรแกรม ( โปรแกรม ( i , s )) = ( i , s ) อินพุตและเอาต์พุตต้องมีรูปแบบที่แน่นอน

การให้คะแนน : คะแนนคือจำนวนตัวอักษรในโปรแกรม - คะแนนต่ำสุดชนะ

ตัวอย่าง

(ก)

(0, 'Look for the birds.')
(1, 'LULskwerokak fuforut tuthashi bubayruddudsus.')

(ข)

(0, '"Mrs. Hogwallop up and R-U-N-N-O-F-T."')
(1, '"MUMrutsus. HASHojugwakseskwerlulopup yupup enundud RUT-YU-NUN-NUN-O-FUF-TUT."')

( c )

(0, 'QWX WWW Rrrrd deeeeep')
(1, 'KWAKWAKSEKS SKWERWAKSWAKS RUTskwerrutruddud dudskweriskweriipup')

( d )

(0, 'aa AA aA Aa rd RD rD Rd')
(1, 'skwere SKWERE eE Ee ruddud RUDDUD rutDUD RUTdud)

(((นอกเหนือเกี่ยวกับการออกเสียงที่: TUT คำสำหรับสระ ( e, i, ay, o, yu) ที่ควรจะเป็นตัวแทนของเสียงปกติของ (A, E, I, O, U) เมื่อท่องตัวอักษร - คือบทกวีที่มี (พฤษภาคม ฉันของฉัน, ตัด, เหมียว) ในสามหรือมากกว่าตัวอักษรคำ TUT สัญลักษณ์ (. u, a, e) ที่ควรจะเป็นในเสียง ( แต่ค้างคาวเดิมพัน) ตามลำดับ - เหล่านี้เป็น ASCII ทดแทนสำหรับ ( ʌ æ ɛ) ในบทความที่เชื่อมโยง)))


1
เราต้องสนับสนุนตัวพิมพ์ใหญ่สองเท่าหรือไม่ มีอะไรแปลจุ๊ของAA, SKWEREหรือskwerE? สิ่งที่เกี่ยวกับตัวอักษรสามเท่า? มันwakswakswaks, skwerwakswaks, waksskwerwaksหรือแม้กระทั่งkyubwaksหรือเราอาจเลือก?
John Dvorak

1
rrdควรแปลเป็นskwerruddud; เราได้รับอนุญาตให้ทิ้งskwerrutdudหรือไม่
John Dvorak

@JanDvorak - ใช่มันควรจัดการกับตัวอักษรสองเท่าโดยไม่คำนึงถึงกรณี อินพุต (0, 'AA SKWERE skwerE') ควรมีเอาต์พุต (1, 'ee SUSKAKWAKSIRUTI suskakwaksirutI') อินพุต (1, 'AA') และ (1, 'skwerE') ไม่ถูกต้องเพราะ 'AA' และ 'skwerE' ไม่เกิดขึ้นเนื่องจากเอาต์พุตของอินพุตที่ถูกต้องใด ๆ อินพุต (1, 'SKWERE') ควรมีเอาต์พุต (0, 'EE') สตริงของตัวอักษรสามตัวขึ้นไปควรถูกพิจารณาว่าเป็นจำนวนคู่ผสมบางตัวตามด้วยอักษรเดี่ยว อินพุต (0, 'rrd') ควรมีเอาต์พุต (1, 'skwerruddud')
res

เอ่อ ... 0,"AA"แปลยัง1,"ee"ไงดี? สำหรับ1,"SKWERE"ผมถือว่าคุณหมายถึงไม่ได้0,"AA" 0,"EE"
John Dvorak

1
@psxls - ฉันตั้งใจ (0, rd_RD_rD_Rd) -> (1, ruddud_RUDDUD_rutDUD_RUTdud) และ (0, aa_AA_aA_Aa) -> (1, skwere_SKWERE_eE_Ee) กฎ (3) ใช้กับคำว่า TUT 'skwere' และ "SKWERE '
res

คำตอบ:


6

ทับทิม, 310 311 ตัวอักษร

h=Hash[(?a..?z).zip %w{e bub kut dud i fuf jug hash ay jag kak lul mum nun o pup kwak rut sus tut yu vuv waks eks yak zuz}]
h["rd"]="ruddud"
h.keys.each{|k|h[k[0]+k]="skwer"+h[k]}
h.keys.each{|k|h[k.upcase]=h[k].upcase}
h=h.invert if b=getc==?1
i=gets
print b ?0:1;(k=i;k=k.chop until h[k]||!k[1];$><<(h[k]||k);i[k]="")until i==""

จัดการอย่างถูกต้อง:

  • ตัวพิมพ์ใหญ่กำลังสอง (unfix โดยการรวมการวนซ้ำได้รับ 18 อักขระ)
    • หากAAควรเปลี่ยนให้skwerEสลับบรรทัด # 3 และ # 4
    • ฉันยังสมมติaAและAaควรเปลี่ยนเป็นeEและEeตามลำดับ
  • rrd แปลเป็น `skwerruddud (unfix ได้รับ 3 ตัวอักษร)
  • ในลูกบาศก์คู่แรกจะถูกรายงานเป็นสี่เหลี่ยม จะกลายเป็นrrrd กลายเป็นskwerrutruddudrrrrdskwerrutskwerruddud
  • ตอนนี้เอาต์พุตเป็นอินพุตที่ถูกต้อง เป็นจริงตามที่กำหนดโดยสเป็ค
  • ใช้การขึ้นบรรทัดใหม่เป็นตัวยุติอินพุต

อินพุตต้องไม่มีการขึ้นบรรทัดใหม่ระหว่างตัวบ่งชี้และสตริงเอาต์พุตวางไว้ที่นั่น (แก้ไข: 1 อักขระ)เอาต์พุตคอนโซลถูกระงับ ณ จุดนี้เพื่อป้องกันการผสมกับ STDIN เปิดไฟล์ฟรีมันน่าเกลียดไปหน่อย

อินพุตตัวอย่าง:

0Hello

เอาท์พุท:

1
HASHiskwerlulo

ฉันลังเลว่าต้องการให้อินพุตและเอาต์พุตมีรูปแบบที่เหมือนกันหรือไม่ แต่คำถามยังไม่ชัดเจนดังนั้น ... คำตอบนี้ดูดีสำหรับฉัน (จนถึงตอนนี้ - ฉันจะทำการทดสอบเพื่อหาคำตอบในไม่ช้า )
res

ฉันไม่รู้ว่าทำไม แต่โปรแกรมของคุณทำงานสำหรับฉัน - ทั้งออนไลน์และออฟ - เฉพาะถ้าgetcมีคำนำหน้าด้วยSTDIN.(อักขระเพิ่มอีกหกตัว)
res

ฉันใช้ jRuby IRB 1.7.5 (2.0.0) และแสดงให้ฉันเห็นเพียงคำเตือน คุณใช้ verion อะไร
John Dvorak

ฉันชอบจดชวเลขเพื่อสร้างแผนที่ ฉันเพิ่งรวมมันอย่างสมบูรณ์ ซึ่งทำให้มันไม่น่าเป็นไปได้ที่ฉันจะเอาชนะมัน
โยฮันเนสคุห์น

1
@res ฉันเชื่อว่าข้อกำหนดอินพุต / เอาต์พุตมีความชัดเจน: For any valid input, applying the program to its own output must exactly reproduce the original input; i.e., program (program (i, s)) = (i, s).แต่จะมีค่าใช้จ่ายเพียง 1 ตัวอักษรเท่านั้นที่จะแก้ไขได้
โยฮันน์คุห์น

3

Perl, 453 443 309 307 303 299

($x,$_)=split//,<>,2;@x{a..z,rd}=(e,bub,kut,dud,i,fuf,jug,hash,ay,jag,kak,lul,mum,nun,o,pup,kwak,rut,sus,tut,yu,vuv,waks,eks,yak,zuz,ruddud);$x{$_ x2}=skwer.$x{$_}for a..z;$x{uc$_}=uc$x{$_}for keys%x;%x=reverse%x if$x;$z=join"|",sort{length$b<=>length$a}keys%x;s/\G(.*?)($z)/$1$x{$2}/g;print!$x+0,$_

กรณีทดสอบ:

ฉันได้ทดสอบกรณีทดสอบ (a), (b), (c) และ (d) ที่ให้ไว้ใน OP เรียบร้อยแล้ว

A * ค่อนข้าง * รุ่นที่อ่านได้มากขึ้น:

($x,$_)=split//,<>,2;
@x{a..z,rd}=(e,bub,kut,dud,i,fuf,jug,hash,ay,jag,kak,lul,mum,nun,o,pup,kwak,rut,sus,tut,yu,vuv,waks,eks,yak,zuz,ruddud);
$x{$_ x2}=skwer.$x{$_}for a..z;
$x{uc$_}=uc$x{$_}for keys%x;
%x=reverse%x if$x;
$z=join"|",sort{length$b<=>length$a}keys%x;
s/\G(.*?)($z)/$1$x{$2}/g;
print!$x+0,$_

1
ดี! บางกรณีทดสอบที่ดีในการตรวจสอบดูเหมือนว่าฉันมีงานต้องทำมากมาย! ฉันได้ดูของคุณอย่างรวดเร็วและฉันคิดว่าคุณสามารถเคาะสองสามไบต์โดยใช้ barewords แทน qw (เปลี่ยนqw(bub kut ... yak zuz)เป็น(bub,kut ... yak,zuz)) คุณยังสามารถแทนที่keys%xด้วย@b(เนื่องจากคุณรู้ว่าปุ่มใดเป็นเพราะ$x) การเปลี่ยนแปลงขนาดเล็กเพื่อประหยัดอีกสามคือการ$1eq uc($1) uc$1eq$1คุณสามารถดรอป+ก่อนการ!พิมพ์สำหรับไบต์พิเศษนั้นเพื่อนำคุณไปยัง 443 หวังว่าทั้งหมดนั้นใช้ได้แล้วฉันได้ทดสอบกรณีทดสอบที่ จำกัด !
Dom Hastings

อืมuc$1eq$1อาจจะต้องมีuc$1 eq$1แต่ฉันไม่แน่ใจ ... ขออภัยถ้ามันผิด!
Dom Hastings

ขอบคุณ Dom สำหรับคำแนะนำ! คุณบันทึก 10 ตัวอักษร ยังคงมีห้องพักสำหรับการปรับปรุงฉันจะกลับไปทำงาน .. :)
psxls

2

APL (Dyalog) (372)

คุณสามารถบอกได้ว่า APL ไม่มีฟังก์ชันการจัดการสตริงในตัว (ยกเว้นสำหรับอาร์เรย์ทั่วไป) ฉันต้องเขียนของตัวเองtolower(มันL) เช่นเดียวกับ Multiline Dyalog APL ในการทดสอบวางลงในหน้าต่างแก้ไขแล้วเรียกมัน ( T)

T
Q←⎕UCS
L←{Q(Q⍵)+32×⍵∊⎕A}
Z←{⎕←⊃z,.⍺⍺1⌽z←⍵,' '}
w←L¨W←1↓¨W⊂⍨' '=W←' E BUB KUT DUD I FUF JUG HASH AY JAG KAK LUL MUM NUN O PUP KWAK RUT SUS TUT YU VUV WAKS EKS YAK ZUZ RUD SKWER'
⍞{⎕←~⍵:{U←L⍣(l←⍺∊L⎕A)
~l∨⍺∊⎕A:⍺
⍺=⍵:U⊃⌽W
'rd'≡L¨⍺⍵:U'RUD'
U⊃W[96-⍨Q+L⍺]}Z⍺
{'rR'∊⍨v←⊃⍺:v
(⊃⌽w)≡m←L⍺:⍵∇⍬
~w∊⍨⊂m:⍺
L⍣(⍺≡L⍺)⍨⎕A/⍨26↑≡∘m¨w}Z{~×⍴⍵:''
∨/H←⊃¨⍷∘(L⍵)¨w:(⊂l↑⍵),∇⍵↓⍨l←⍴⊃H/W
(⊂⊃⍵),∇1↓⍵}⍺}⎕

การใช้งาน:

      T
⎕:
0
"Mrs. Hogwallop up and R-U-N-N-O-F-T."     
1
"MUMrutsus. HASHojugwakseskwerlulopup yupup enundud RUT-YU-NUN-NUN-O-FUF-TUT."      
      T
⎕:
1
"MUMrutsus. HASHojugwakseskwerlulopup yupup enundud RUT-YU-NUN-NUN-O-FUF-TUT."      
0
"Mrs. Hogwallop up and R-U-N-N-O-F-T."       

2

Tcl, 395 394 392

set m { rd ruddud a e h hash o o u yu b bub i ay p pup v vuv c kut j jag q kwak w waks d dud k kak r rut x eks e i l lul s sus y yak f fuf m mum t tut z zuz g jug n nun ঙ skwer}
set m $m[string tou $m]
if [read stdin 1] {puts 0[regsub -all ঙ(.) [string map [lreverse $m] [gets stdin]] {\1\1}]} {puts 1[string map $m [regsub -all (.)\\1 [gets stdin] ঙ\\1]]}

หมายเหตุ:

  • ใช้สำหรับskwerruddudrrd
  • skwereskwereeaaaaaสำหรับ

อินพุตตัวอย่าง:

0Hello

เอาท์พุท:

1HASHiskwerlulo

มันทำงานอย่างไร:

  • m อยู่ที่จุดเริ่มต้นสตริง
  • ฉันประสานกับแผนที่ตัวพิมพ์ใหญ่
  • [แผนที่สตริง] ทำสิ่งต่าง ๆ ให้ฉัน (ใช้รายการดังนั้นทุกอย่างที่เป็นรายการที่ถูกต้อง ... )
  • regexp สำหรับตัวละครคู่ ใช้อักขระการแทนที่พิเศษ ( )

ชาวเบงกาลี Abugida คุณเลือกตัวละครนั้นอย่างไร
Kaya

\ufffiirc ไม่สำคัญหรอก อักขระที่ไม่ใช่ ASCII ใด ๆ ที่จะทำ
โยฮันน์คุห์น

\u999มันเป็น อย่างที่ฉันพูดไปสิ่งสำคัญเพียงอย่างเดียวคือ: ไม่ใช่ตัวละครแอส
โยฮันน์คุห์น

@JohannesKuhn มันล้มเหลวตัวอย่าง (ค) 1KWAKWAKSEKS skwerWAKSWAKS RUTskwerrutruddud dudskweriskweriipupผลตอบแทน
psxls

@psxls ซึ่งเป็นที่ถูกต้อง: ไม่มีการเอ่ยถึงA doubled letter is replaced by `skwer` followed by the TUT word for that letter. SKWER
Johannes Kuhn

2

Perl 385

$t=e0bub0kut0dud0i0fuf0jug0hash0ay0jag0kak0lul0mum0nun0o0pup0kwak0rut0sus0tut0yu0vuv0waks0eks0yak0zuz;@t=split 0,$t."0\U$t";@s=(a..z,A..Z);while(<>){($-,$_)=split/ /,$_,2;@l{$-?@t:@s}=$-?@s:@t;if($-){for$@(@t){s/skwer$@/$@$@/gi}for$@(@t){s/$@/$l{$@}/g}s/(r)ud/$1/gi}else{s/(.)/$l{$1}||$1/ge;for$@(@t){$r=lc$@eq$@?"skwer":"SKWER";s/$@$@/$r$@/g}s/(ru)t(d)/$1$2$2/gi}$-=!$-;print"$- $_"}

เครื่องมือเน้นข้อความจะเกลียดสิ่งนี้ ...

ต้องการอินพุตใน STDIN รูปแบบคือ0 (or 1) String to convert here.:

0 Hello! # input
1 HASHiskwerlulo! # output

1 HASHiskwerlulo!
0 Hello!

0 Look for the birds.
1 LULskwerokak fuforut tuthashi bubayruddudsus.

1 LULskwerokak fuforut tuthashi bubayruddudsus.
0 Look for the birds.

0 "Mrs. Hogwallop up and R-U-N-N-O-F-T."
1 "MUMrutsus. HASHojugwaksaskwerlulopup yupup anundud RUT-YU-NUN-NUN-O-FUF-TUT."

1 "MUMrutsus. HASHojugwaksaskwerlulopup yupup anundud RUT-YU-NUN-NUN-O-FUF-TUT."
0 "Mrs. Hogwallop up and R-U-N-N-O-F-T."

แก้ไข : ฉันสังเกตเห็นปัญหาของการแปล X (กลายเป็น 'aks' ในการพลิกกลับฉันจะดูในภายหลังนี้อาจต้องสั่งแฮชอีกครั้ง :(


1
นอกเหนือจาก X มันล้มเหลวในตัวอย่างของ OP (b), (c) และตรวจสอบในคำตอบของฉันกรณีทดสอบ (e) & (g)
psxls

นี่คือความจริงมากกลับไปที่กระดานวาดภาพ!
Dom Hastings

2

GNU Sed, 514

s/$/\n@a!e@b!bub@c!kut@d!dud@e!i@f!fuf@g!jug@h!hash@i!ay@k!kak@l!lul@m!mum@n!nun@o!o@p!pup@q!kwak@r!rud@r!rut@s!sus@t!tut@u!yu@v!vuv@w!waks@x!eks@y!yak@z!zuz/
s/.*\n\(.*\)/&\U\1@/
ta
:a
s/^1/0\v/
td
s/^0/1\v/
:t
/\v\n/bf
s/\v\([^a-z]\)/\1\v/i
tt
s/\v\([a-z]\)\1/skwer\v\1/
s/\v\([A-Z]\)\1/SKWER\v\1/
s/\v\(.*\)\(.*\n.*@\1!\(\w\+\)@\)/\3\v\2/
s/rut\vd/rud\vd/
s/RUT\vD/RUD\vD/
bt
:d
/\v\n/bf
s/\v\([^a-z]\)/\1\v/i
td
s/\v\(skwer\)/\1\v/i
s/\v\(.*\)\(.*\n.*@\(.\)!\1@\)/\3\v\2/
s/skwer\(.\)\v/\1\1\v/
bd
:f
s/\v.*//

อาจจะสั้นลง แต่ตอนนี้ฉันทำไปแล้ว

ใช้ตารางการค้นหาเพื่อจัดการกับการแปลงในทั้งสองทิศทางควรจัดการกับข้อยกเว้นทั้งหมดรวมถึงตัวเรือน skwer และ ruddud / RUDDUD อย่างถูกต้อง

อินพุตที่ใช้ในแต่ละบรรทัดเป็น 0/1 ตามด้วยสตริง ใช้\v(แท็บแนวตั้ง) เป็นเคอร์เซอร์

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