TUT penerjemah bahasa

10

Teks dapat diterjemahkan ke versi tertulis dari bahasa TUT dengan mengganti setiap huruf dengan "TUT word" yang sesuai, seperti yang diberikan dalam tabel berikut (diadaptasi dari artikel tertaut) * :

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'). 

Tulis program dengan perilaku i / o berikut:

Input (dari stdin): Indikator biner (0/1) i dan string ASCII s .

  • Jika i = 0 maka s dapat berisi teks ASCII.
  • Jika i = 1 maka s harus menjadi output Bahasa TUT untuk beberapa input yang valid.

Output (to stdout): Indikator biner (0/1) j dan string ASCII t .

  • Jika i = 0 maka j = 1 dan t adalah terjemahan dari s ke Bahasa TUT.
  • Jika i = 1 maka j = 0 dan t adalah terjemahan s dari Bahasa TUT.
  • Untuk setiap input yang valid, menerapkan program ke output sendiri harus persis mereproduksi input asli; yaitu, program ( program ( i , s )) = ( i , s ). Input dan output harus memiliki format yang persis sama.

Penilaian : Skor adalah jumlah karakter dalam program - skor terendah menang.

Contohnya

(Sebuah)

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

(b)

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

(((Selain tentang pengucapan: The TUT kata untuk vokal ( e, i, ay, o, yu) dianggap mewakili suara biasa (a, e, i, o, u) ketika membaca alfabet - yaitu, berima dengan (mungkin , saya, saya, memotong, mew) dalam kata-kata TUT tiga atau-lebih huruf, simbol (. u, a, e) seharusnya suara seperti dalam (tapi, kelelawar, bet) masing - ini adalah pengganti ASCII untuk ( ʌ æ ɛ) dalam artikel tertaut.)))

res
sumber
1
apakah kita harus mendukung huruf besar dua kali lipat? Apa terjemahan tut AA, SKWEREatau skwerE? Bagaimana dengan surat tiga kali lipat? apakah wakswakswaks, skwerwakswaks, waksskwerwaks, atau bahkan kyubwaks, atau kita dapat memilih?
John Dvorak
1
rrdharus diterjemahkan ke skwerruddud; Apakah kita diizinkan meninggalkannya skwerrutdud?
John Dvorak
@ JanDvorak - Ya, itu harus menangani huruf ganda, terlepas dari kasusnya. Input (0, 'AA SKWERE skwerE') harus memiliki output (1, 'ee SUSKAKWAKSIRUTI suskakwaksirutI'). Input (1, 'AA') dan (1, 'skwerE') tidak valid karena 'AA' dan 'skwerE' tidak muncul sebagai output dari input yang valid. Input (1, 'SKWERE') harus memiliki output (0, 'EE'). Untaian tiga atau lebih huruf harus dianggap sebagai jumlah ganda, mungkin diikuti oleh satu. Input (0, 'rrd') harus memiliki output (1, 'skwerruddud').
res
eh ... bagaimana cara 0,"AA"menerjemahkannya 1,"ee"? Adapun 1,"SKWERE", saya menganggap Anda maksud 0,"AA", bukan 0,"EE".
John Dvorak
1
@psxls - Maksud saya (0, rd_RD_rD_Rd) -> (1, ruddud_RUDDUD_rutDUD_RUTdud) dan (0, aa_AA_aA_Aa) -> (1, skwere_SKWERE_eE_Ee). Aturan (3) berlaku untuk kata TUT 'skwere' dan "SKWERE '
res

Jawaban:

6

Rubi, 310 311 karakter

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==""

Menangani dengan benar:

  • huruf besar kuadrat (unfix dengan menggabungkan iterasi memperoleh 18 karakter)
    • jika AAharus berubah menjadi skwerE, tukar baris # 3 dan # 4
    • Saya juga berasumsi aAdan Aaharus berubah menjadi eEdan Eemasing - masing
  • rrd diterjemahkan menjadi `skwerruddud (unfix gain 3 karakter)
  • dalam kubus pasangan pertama dilaporkan sebagai kotak. rrrdberubah menjadi skwerrutruddud. rrrrdmenjadiskwerrutskwerruddud
  • output sekarang menjadi input yang valid. Ini memang dibutuhkan oleh spec
  • menggunakan baris baru sebagai terminator input

Input membutuhkan tidak ada baris baru antara indikator dan string, output meletakkannya di sana (fix: 1 karakter).Output konsol ditekan pada titik ini untuk mencegah pencampuran dengan STDIN. Unfix gratis, hanya sedikit lebih jelek.

Input contoh:

0Hello

Keluaran:

1
HASHiskwerlulo
John Dvorak
sumber
Saya bimbang tentang apakah akan meminta input & output untuk memiliki format yang identik , tetapi tidak jelas dalam pertanyaan, jadi ... jawaban ini terlihat baik bagi saya (sejauh ini - saya akan menjalankan beberapa tes pada jawaban segera ).
res
Saya tidak tahu mengapa, tetapi program Anda berjalan untuk saya - baik online maupun off - hanya jika getcdiawali dengan STDIN.(enam karakter lagi).
res
Saya menggunakan jRuby IRB 1.7.5 (2.0.0) dan itu menunjukkan saya hanya peringatan. Verion apa yang Anda gunakan?
John Dvorak
Saya suka tulisan cepat untuk membuat peta. Saya hanya memasukkannya sepenuhnya. Yang membuatnya tidak mungkin aku mengalahkan itu.
Johannes Kuhn
1
@res Saya percaya bahwa persyaratan input / output sudah jelas: 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).Tetapi hanya akan dikenakan biaya 1 karakter untuk memperbaikinya.
Johannes Kuhn
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,$_

Kasus uji:

Saya telah berhasil menguji kasus uji (a), (b), (c) dan (d) yang disediakan dalam OP.

Versi * agak * lebih mudah dibaca:

($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,$_
psxls
sumber
1
Bagus! Beberapa test case bagus untuk diperiksa, sepertinya saya punya banyak pekerjaan yang harus dilakukan! Saya sudah melihat sekilas milik Anda dan saya pikir Anda dapat menjatuhkan beberapa byte menggunakan barewords alih-alih qw (ubah qw(bub kut ... yak zuz)ke (bub,kut ... yak,zuz)), juga Anda dapat menggantinya keys%xdengan @b(karena Anda tahu apa kuncinya karena $x). Perubahan kecil untuk menyimpan tiga lainnya adalah $1eq uc($1)untuk uc$1eq$1. Anda juga dapat menjatuhkan +sebelum !cetak untuk byte tambahan untuk membawa Anda ke 443. Semoga itu semua valid, saya sudah menguji kasus uji terbatas!
Dom Hastings
Hmmm, uc$1eq$1mungkin harus begitu uc$1 eq$1, tapi saya tidak yakin ... Maaf kalau itu salah!
Dom Hastings
Terima kasih Dom atas tipnya! Anda menyelamatkan saya 10 karakter. Masih ada ruang untuk perbaikan, saya akan kembali bekerja .. :)
psxls
2

APL (Dyalog) (372)

Anda dapat benar-benar memberi tahu APL tidak memiliki fungsi penanganan string bawaan (kecuali untuk yang array generik). Aku harus menulis saya sendiri tolower(itu L). Seperti biasa dengan multiline Dyalog APL, untuk mengujinya, tempel di jendela edit lalu panggil ( 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↓⍵}⍺}⎕

Pemakaian:

      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."       
marinus
sumber
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]]}

Catatan:

  • Penggunaan skwerrudduduntuk rrd.
  • skwereskwereeuntuk aaaaa.

Input contoh:

0Hello

Keluaran:

1HASHiskwerlulo

Bagaimana itu bekerja:

  • m pada awalnya adalah sebuah string.
  • Saya menggabungkannya dengan peta huruf besar.
  • [string map] melakukan sebagian besar hal untuk saya (menggunakan daftar, jadi apa pun yang merupakan daftar yang valid ...)
  • regexp untuk untuk karakter ganda. Gunakan karakter pengganti khusus ( ).
Johannes Kuhn
sumber
Bengali Abugida, bagaimana Anda memilih karakter itu?
Kaya
\ufffiirc. Tidak masalah. Karakter non-ascii akan melakukannya.
Johannes Kuhn
Itu tadi \u999. Seperti yang saya katakan, satu-satunya hal yang penting adalah: bukan karakter ascii.
Johannes Kuhn
@JohannesKuhn gagal pada contoh (c), kembali 1KWAKWAKSEKS skwerWAKSWAKS RUTskwerrutruddud dudskweriskweriipup.
psxls
@psxls Yang benar: A doubled letter is replaced by `skwer` followed by the TUT word for that letter.Tidak disebutkan 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"$- $_"}

Stabilo sintaks membenci yang satu ini ...

Diharapkan input pada STDIN, formatnya adalah 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."

Sunting : Saya perhatikan ada masalah dengan terjemahan X (ini menjadi 'aks' di baliknya, saya akan membahasnya nanti. Mungkin perlu memesan ulang hash :(.

Dom Hastings
sumber
1
selain X, ia juga gagal dalam contoh OP (b), (c) dan periksa juga dalam jawaban saya pada kasus uji (e) & (g).
psxls
Ini sangat benar, kembali ke papan gambar!
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.*//

Mungkin bisa dipersingkat, meskipun saya sudah selesai untuk saat ini.

Menggunakan tabel pencarian untuk menangani konversi di kedua arah, harus menangani semua pengecualian termasuk skwer case dan ruddud / RUDDUD dengan benar.

input diambil pada setiap baris sebagai 0/1 diikuti oleh string. Menggunakan \v(tab vertikal) sebagai kursor.

Hasturkun
sumber