TUT dil çevirmeni


10

Metin , aşağıdaki tabloda (bağlantılı makaleden uyarlanmış) verildiği gibi, her harfin karşılık gelen "TUT kelimesi" ile değiştirilmesiyle TUT dilinin yazılı bir versiyonuna çevrilebilir * :

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

Aşağıdaki i / o davranışına sahip bir program yazın:

Giriş (stdin'den): Bir ikili (0/1) gösterge i ve bir ASCII dizesi s .

  • Eğer ben = 0 o lar herhangi bir ASCII metin içerebilir.
  • Eğer ben 1 = o lar geçerli bazı girişi için TUT Dil çıkışı olmalıdır.

Çıktı (stdout'a): Bir ikili (0/1) gösterge j ve bir ASCII dize t .

  • Eğer i 0 ise = j = 1 ve t çevirisidir s için TUT Dil.
  • Eğer i 1 o = j = 0 ve t çevirisidir s gelen TUT Dil.
  • Geçerli herhangi bir girdi için, programı kendi çıktısına uygulamak orijinal girdiyi tam olarak yeniden üretmelidir; yani, program ( program ( i , s )) = ( i , s ). Giriş ve çıkış tam olarak aynı biçime sahip olmalıdır.

Puanlama : Puan, programdaki karakter sayısıdır - en düşük puan kazanır.

Örnekler

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

(((Kenara telaffuz hakkında: sesli harfler (için TUT deyişle e, i, ay, o, yu- (yani birlikte kafiyeli may) a, e alfabe okuyan zaman (i, o, u) olağan sesleri temsil etmek gerekiyor beni, benim,), mew biçmek üç ya-daha harfli TUT deyişle, semboller (. u, a, e) içinde (ancak, yarasa, bahis olarak ses gerekiyor) sırasıyla - bunlar için ASCII yedek olan ( ʌ æ ɛ) bağlantılı makalede.)))


1
iki kat büyük harf desteklememiz gerekir mi? Ne bir tut bir çeviri AA, SKWEREya skwerE? Üçlü harfler ne olacak? o olduğu wakswakswaks, skwerwakswaks, waksskwerwaks, hatta kyubwaks, yoksa tercih edebilir?
John Dvorak

1
rrdçevirmeli skwerruddud; bırakabilir miyiz skwerrutdud?
John Dvorak

@JanDvorak - Evet, durumdan bağımsız olarak iki katına çıkan harfleri işlemelidir. Giriş (0, 'AA SKWERE skwerE') çıkışına sahip olmalıdır (1, 'ee SUSKAKWAKSIRUTI suskakwaksirutI'). 'AA' ve 'skwerE' geçerli herhangi bir girişin çıkışı olarak gerçekleşmediği için (1, 'AA') ve (1, 'skwerE') girişleri geçerli değildir. Giriş (1, 'SKWERE') çıkışına (0, 'EE') sahip olmalıdır. Üç veya daha fazla harften oluşan bir dize, muhtemelen tek bir sayıdan sonra gelen çift sayısı olarak kabul edilmelidir. Giriş (0, 'rrd') çıkışına (1, 'skwerruddud') sahip olmalıdır.
res

ah ... nasıl 0,"AA"tercüme edilir 1,"ee"? Gelince 1,"SKWERE", Ne demek farz 0,"AA"değil 0,"EE".
John Dvorak

1
@psxls - (0, rd_RD_rD_Rd) -> (1, ruddud_RUDDUD_rutDUD_RUTdud) ve (0, aa_AA_aA_Aa) -> (1, skwere_SKWERE_eE_Ee). Kural (3) 'skwere' ve "SKWERE 'TUT kelimeleri için geçerlidir.
res

Yanıtlar:


6

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

Doğru işler:

  • kare büyük harf (yinelemeleri birleştirerek çözülme 18 karakter kazanır)
    • eğer AAdönerse skwerE, # 3 ve # 4 hatlarını değiştirin
    • Ben de üstlenecek aAve Aadönüşmesi gerektiğini eEve Eesırasıyla
  • rrd skwerruddud çevirir (unfix 3 karakter kazanır)
  • küplerde ilk çift kare olarak rapor edilir. rrrddönüşür skwerrutruddud. rrrrdolurskwerrutskwerruddud
  • çıktı artık geçerli bir girdi. Gerçekten, spec tarafından gerekli
  • newline'ı giriş sonlandırıcı olarak kullanır

Girdi, gösterge ve dize arasında yeni satır olmamasını gerektirir, çıktı onu oraya koyar (düzeltme: 1 karakter).STDIN ile karıştırmayı önlemek için bu noktada konsol çıkışı bastırılır. Unfix ücretsiz, sadece biraz daha çirkin.

Örnek girdi:

0Hello

Çıktı:

1
HASHiskwerlulo

Aynı biçimlere sahip olmak için giriş ve çıkış gerektirip gerektirmeyeceği konusunda boğuluyordum , ancak soruda net değildi, bu yüzden ... bu cevap bana iyi görünüyor (şimdiye kadar - yakında cevaplar üzerinde bazı testler yapacağım ).
res

Nedenini bilmiyorum, ancak programınız benim için çalışıyor - hem çevrimiçi hem de kapalı - yalnızca getcönekle STDIN.(altı karakter daha) öneki ise .
res

JRuby IRB 1.7.5 (2.0.0) kullanıyorum ve bana sadece bir uyarı gösteriyor. Hangi sürümü kullanıyorsunuz?
John Dvorak

Haritayı oluşturmak için stenografiyi seviyorum. Sadece tamamen dahil ettim. Bu da bunu yenmem ihtimalini düşürüyor.
Johannes Kuhn

1
@res Ben giriş / çıkış gereksinimi açık olduğuna inanıyorum: 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).Ama bunu düzeltmek için sadece 1 karakter mal olacak.
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,$_

Test senaryoları:

OP'de sağlanan (a), (b), (c) ve (d) test senaryolarını başarıyla test ettim.

A * biraz * daha okunabilir versiyon:

($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
Güzel! Kontrol etmek için bazı iyi test vakaları, görünecek çok işim var! Seninki bir göz yaşadım ve ben (değişim kullanarak barewords yerine qw kapalı birkaç byte vurmak düşünüyorum qw(bub kut ... yak zuz)için (bub,kut ... yak,zuz)ayrıca değiştirebilir,) keys%xile @b(eğer tuşlar nedeniyle ne olduğunu beri $x). Başka üç tasarrufu için küçük bir değişiklik olduğunu $1eq uc($1)için uc$1eq$1. Ayrıca , fazladan baytın sizi 443'e götürmesi için baskıdan +önce bırakabilirsiniz. !Umarım hepsi geçerlidir, sınırlı test senaryolarını test ettim!
Dom Hastings

Hmmm, uc$1eq$1olabilir uc$1 eq$1, ama emin değilim ... Bu yanlışsa özür dilerim!
Dom Hastings

İpuçları için Dom teşekkürler! Bana 10 karakter kurtardın. Hala iyileştirme için yer var, işe geri döneceğim .. :)
psxls

2

APL (Dyalog) (372)

APL'nin yerleşik dize işleme işlevlerine sahip olmadığını gerçekten söyleyebilirsiniz (genel dizi olanlar hariç). Kendi toloweryazmam gerekiyordu L. Çok satırlı Dyalog APL'de her zaman olduğu gibi, test etmek için bir düzenleme penceresine yapıştırın ve sonra çağırı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↓⍵}⍺}⎕

Kullanımı:

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

Notlar:

  • Kullanımları skwerruddudiçin rrd.
  • skwereskwereeiçin aaaaa.

Örnek girdi:

0Hello

Çıktı:

1HASHiskwerlulo

Nasıl çalışır:

  • m başında bir dizedir.
  • Büyük haritayla kapatıyorum.
  • [string map] çoğu şeyi benim için yapıyor (bir liste kullanıyor, yani geçerli bir liste olan her şey ...)
  • çift ​​karakterler için regexp. Özel bir yedek karakter ( ) kullanın .

Bengali Abugida, bu karakteri nasıl seçtiniz?
Kaya

\ufffiirc. Gerçekten önemli değil. Ascii olmayan herhangi bir karakter yapardı.
Johannes Kuhn

Öyleydi \u999. Dediğim gibi, tek önemli şey: bir ascii karakteri değil.
Johannes Kuhn

@JohannesKuhn (c) örneğinde başarısız olursa, geri döner 1KWAKWAKSEKS skwerWAKSWAKS RUTskwerrutruddud dudskweriskweriipup.
psxls

@psxls Doğru olandan A doubled letter is replaced by `skwer` followed by the TUT word for that letter.bahsedilmiyor 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"$- $_"}

Sözdizimi vurgulayıcı bundan nefret ediyor ...

STDIN üzerinde giriş bekliyor, format 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."

Düzenleme : X çevirisi ile ilgili bir sorun fark ettim (tersine 'aks' olur, bu daha sonra bakacağım. Hash :( yeniden sipariş etmek gerekebilir.


1
X dışında OP'nin (b), (c) örneklerinde de başarısız olur ve cevabımda ayrıca (e) & (g) test senaryolarını da kontrol eder.
13:20, psxls

Bu çok doğru, çizim tahtasına geri!
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.*//

Şimdilik bittiğim halde muhtemelen kısaltılabilir.

Her iki yönde de dönüşümleri işlemek için bir arama tablosu kullanır, skwer case ve ruddud / RUDDUD dahil tüm istisnaları doğru şekilde işlemelidir.

her satırda 0/1 olarak alınan giriş ve ardından dize. \vİmleç olarak (dikey sekme) kullanır .

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.