Dịch giả ngôn ngữ TUT


10

Văn bản có thể được dịch sang phiên bản viết của ngôn ngữ TUT bằng cách thay thế từng chữ cái bằng "TUT word" tương ứng, như được đưa ra trong bảng sau (được điều chỉnh từ bài viết được liên kết) * :

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

Viết chương trình với hành vi i / o sau:

Đầu vào (từ stdin): Chỉ báo nhị phân (0/1) i và chuỗi ASCII s .

  • Nếu i = 0 thì s có thể chứa bất kỳ văn bản ASCII nào.
  • Nếu i = 1 thì s phải là đầu ra Ngôn ngữ TUT cho một số đầu vào hợp lệ.

Đầu ra (tới thiết bị xuất chuẩn): Chỉ báo nhị phân (0/1) j và chuỗi ASCII t .

  • Nếu i = 0 thì j = 1 và t là bản dịch của s sang TUT Language.
  • Nếu i = 1 thì j = 0 và t là bản dịch của s từ Ngôn ngữ TUT.
  • Đối với bất kỳ đầu vào hợp lệ nào, áp dụng chương trình cho đầu ra của chính nó phải sao chép chính xác đầu vào ban đầu; tức là chương trình ( chương trình ( i , s )) = ( i , s ). Đầu vào và đầu ra phải có cùng định dạng.

Chấm điểm : Điểm là số lượng nhân vật trong chương trình - điểm thấp nhất sẽ thắng.

Ví dụ

(a)

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

(((Bên cạnh về phát âm: Những lời TUT cho các nguyên âm ( e, i, ay, o, yu) có nghĩa vụ phải đại diện cho âm thanh thông thường (a, e, i, o, u) khi đọc bảng chữ cái - tức là, vần điệu với (có thể , tôi, tôi, cắt, mew) theo lời TUT ba-hay-hơn-lá thư, những biểu tượng (. u, a, e) có nghĩa vụ phải phát âm giống như (nhưng, dơi, đặt cược) tương ứng - đây là những thay thế ASCII cho ( ʌ æ ɛ) trong bài viết được liên kết.)))


1
chúng ta có phải hỗ trợ gấp đôi chữ hoa không? Bản dịch tut là gì AA, SKWEREhay skwerE? Những gì về thư tăng gấp ba? được nó wakswakswaks, skwerwakswaks, waksskwerwaks, hoặc thậm chí kyubwaks, hoặc chúng ta có thể chọn?
John Dvorak

1
rrdnên dịch sang skwerruddud; chúng ta có được phép để nó ở skwerrutdud?
John Dvorak

@JanDvorak - Có, nó sẽ xử lý các chữ cái nhân đôi, bất kể trường hợp nào. Đầu vào (0, 'AA SKWERE skwerE') nên có đầu ra (1, 'ee SUSKAKWAKSIRUTI suskakwaksirusI'). Đầu vào (1, 'AA') và (1, 'skwerE') không hợp lệ vì 'AA' và 'skwerE' không xuất hiện dưới dạng đầu ra của bất kỳ đầu vào hợp lệ nào. Đầu vào (1, 'SKWERE') nên có đầu ra (0, 'EE'). Một chuỗi gồm ba chữ cái trở lên nên được coi là một số số nhân đôi, có thể theo sau là một chữ cái. Đầu vào (0, 'rrd') nên có đầu ra (1, 'skwerruddud').
res

uh ... làm thế nào để 0,"AA"dịch sang 1,"ee"? Đối với 1,"SKWERE", tôi giả sử bạn có nghĩa là 0,"AA", không 0,"EE".
John Dvorak

1
@psxls - Tôi dự định (0, rd_RD_rD_Rd) -> (1, ruddud_RUDDUD_rutDUD_RUTdud) và (0, aa_AA_aA_Aa) -> (1, skwere_SKWERE_e. Quy tắc (3) áp dụng cho các từ TUT 'skwere' và "SKWERE '.
res

Câu trả lời:


6

Hồng ngọc 310 311 ký tự

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

Xử lý chính xác:

  • chữ hoa bình phương (không trộn bằng cách lặp lại lặp lại tăng 18 ký tự)
    • nếu AAnên chuyển thành skwerE, hoán đổi dòng # 3 và # 4
    • Tôi cũng giả định aAAanên biến thành eEEetương ứng
  • rrd dịch sang `skwerruddud (unix tăng 3 ký tự)
  • trong các hình khối, cặp đầu tiên được báo cáo là một hình vuông. rrrdbiến thành skwerrutruddud. rrrrdtrở thànhskwerrutskwerruddud
  • đầu ra bây giờ là một đầu vào hợp lệ. Đó là, thực sự, được yêu cầu bởi thông số kỹ thuật
  • sử dụng dòng mới làm đầu cuối

Đầu vào yêu cầu không có dòng mới giữa chỉ báo và chuỗi, đầu ra đặt nó ở đó (sửa: 1 ký tự).Đầu ra giao diện điều khiển bị chặn tại thời điểm này để ngăn trộn với STDIN. Unfix miễn phí, nó chỉ là một chút xấu xí.

Ví dụ đầu vào:

0Hello

Đầu ra:

1
HASHiskwerlulo

Tôi đã không biết liệu có yêu cầu đầu vào và đầu ra phải có định dạng giống hệt nhau hay không , nhưng trong câu hỏi này không rõ ràng, vì vậy ... câu trả lời này có vẻ tốt với tôi (cho đến nay - tôi sẽ sớm thực hiện một số bài kiểm tra về câu trả lời ).
res

Tôi không biết tại sao, nhưng chương trình của bạn chạy cho tôi - cả trực tuyến và tắt - chỉ khi getcđược thêm tiền tố STDIN.(sáu ký tự nữa).
res

Tôi đang sử dụng jRuby IRB 1.7.5 (2.0.0) và nó chỉ hiển thị cho tôi một cảnh báo. Bạn đang sử dụng verion nào?
John Dvorak

Tôi thích tốc ký để tạo ra bản đồ. Tôi chỉ bao gồm nó đầy đủ. Điều đó làm cho nó không có khả năng tôi sẽ đánh bại điều đó.
Julian Kuhn

1
@res Tôi tin rằng yêu cầu đầu vào / đầu ra rất rõ ràng: 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).Nhưng sẽ chỉ tốn 1 ký tự để khắc phục điều đó.
Julian 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,$_

Các trường hợp thử nghiệm:

Tôi đã thử nghiệm thành công các trường hợp thử nghiệm (a), (b), (c) và (d) được cung cấp trong OP.

Phiên bản A * phần nào * dễ đọc hơn:

($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
Đẹp! Một số trường hợp kiểm tra tốt để kiểm tra, có vẻ như tôi có rất nhiều việc phải làm! Tôi đã có một cái nhìn nhanh về bạn và tôi nghĩ rằng bạn có thể loại bỏ một vài byte bằng cách sử dụng barewords thay vì qw (đổi qw(bub kut ... yak zuz)thành (bub,kut ... yak,zuz)), bạn cũng có thể thay thế keys%xbằng @b(vì bạn biết phím là gì vì $x). Một sự thay đổi nhỏ để tiết kiệm ba khác là $1eq uc($1)để uc$1eq$1. Bạn cũng có thể thả +trước !bản in cho byte bổ sung đó để đưa bạn đến 443. Hy vọng đó là tất cả hợp lệ, tôi đã thử nghiệm các trường hợp thử nghiệm giới hạn!
Dom Hastings

Hmmm, uc$1eq$1có thể phải như vậy uc$1 eq$1, nhưng tôi không chắc chắn ... Xin lỗi nếu điều đó sai!
Dom Hastings

Cảm ơn Dom cho lời khuyên! Bạn đã cứu tôi 10 ký tự. Vẫn còn chỗ để cải thiện, tôi sẽ quay lại làm việc .. :)
psxls

2

APL (Dyalog) (372)

Bạn thực sự có thể nói APL không có các hàm xử lý chuỗi tích hợp (ngoại trừ các mảng chung). Tôi đã phải tự viết tolower(nó L). Như mọi khi với APL đa dòng, để kiểm tra nó, dán nó vào một cửa sổ chỉnh sửa và sau đó gọi nó ( 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↓⍵}⍺}⎕

Sử dụng:

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

Ghi chú:

  • Sử dụng skwerruddudcho rrd.
  • skwereskwereecho aaaaa.

Ví dụ đầu vào:

0Hello

Đầu ra:

1HASHiskwerlulo

Làm thế nào nó hoạt động:

  • m là ở đầu một chuỗi.
  • Tôi kết hợp nó với bản đồ chữ hoa.
  • [chuỗi bản đồ] thực hiện hầu hết mọi thứ cho tôi (sử dụng danh sách, vì vậy mọi thứ là danh sách hợp lệ ...)
  • regrec cho các nhân vật đôi. Sử dụng một ký tự thay thế đặc biệt ( ).

Người Abugida người Bengal, bạn đã chọn nhân vật đó như thế nào?
Kaya

\uffftuần hoàn Không thực sự quan trọng. Bất kỳ nhân vật không ascii sẽ làm.
Julian Kuhn

Nó đã được \u999. Như tôi đã nói, điều quan trọng duy nhất là: không phải là một nhân vật ascii.
Julian Kuhn

@JohannesKuhn nó thất bại ở ví dụ (c), trả về 1KWAKWAKSEKS skwerWAKSWAKS RUTskwerrutruddud dudskweriskweriipup.
psxls

@psxls Điều này đúng: A doubled letter is replaced by `skwer` followed by the TUT word for that letter.Không đề cập đến SKWER.
Julian 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"$- $_"}

Cú pháp tô đậm ghét cái này ...

Yêu cầu đầu vào trên STDIN, định dạng là 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."

Chỉnh sửa : Tôi đã nhận thấy một vấn đề với bản dịch của X (nó trở thành 'aks' trong quá trình đảo ngược, tôi sẽ xem xét vấn đề này sau. Có thể cần phải đặt lại hàm băm :(.


1
ngoài X, nó cũng thất bại trong các ví dụ của OP (b), (c) và cũng kiểm tra trong câu trả lời của tôi về các trường hợp thử nghiệm (e) & (g).
psxls

Điều này rất đúng, trở lại bảng vẽ!
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.*//

Có lẽ có thể rút ngắn, mặc dù tôi đã hoàn thành.

Sử dụng bảng tra cứu để xử lý các chuyển đổi theo cả hai hướng, nên xử lý tất cả các trường hợp ngoại lệ bao gồm trường hợp skwer và ruddud / RUDDUD một cách chính xác.

đầu vào được thực hiện trên mỗi dòng là 0/1 theo sau là chuỗi. Sử dụng \v(tab dọc) làm con trỏ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.