Tłumacz języka TUT

10

Tekst można przetłumaczyć na pisemną wersję języka TUT , zastępując każdą literę odpowiednim „słowem TUT”, jak podano w poniższej tabeli (zaadaptowanej z powiązanego artykułu) * :

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

Napisz program o następującym działaniu we / wy:

Dane wejściowe (ze standardowego wejścia): binarny (0/1) wskaźnik i oraz ciąg ASCII s .

  • Jeśli i = 0, to s może zawierać dowolny tekst ASCII.
  • Jeśli i = 1, to s musi być wyjściem języka TUT dla niektórych prawidłowych danych wejściowych.

Dane wyjściowe (na standardowe wyjście): binarny (0/1) wskaźnik j oraz ciąg ASCII t .

  • Jeśli i = 0, to j = 1 it jest tłumaczeniem s na język TUT.
  • Jeśli i = 1, to j = 0 it jest tłumaczeniem s z języka TUT.
  • Dla każdego ważnego wejścia, zastosowanie programu do własnego wyjścia musi dokładnie odtworzyć oryginalne wejście; tj. program ( program ( i , s )) = ( i , s ). Dane wejściowe i wyjściowe muszą mieć dokładnie ten sam format.

Punktacja : Wynik to liczba znaków w programie - najniższy wynik wygrywa.

Przykłady

(za)

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

(((Poza około wymowa: The tut słowy dla samogłosek ( e, i, ay, o, yu) mają reprezentować zwykłe dźwięki (a, e, i, o, u), gdy recytuje alfabet - czyli z rymowania (może , ja, my, kosić, MEW) w trzy-lub-bardziej-literowych tut słów, symbole (. u, a, e) mają dźwięk jak w (ale, bat, zakład) odpowiednio - są to zamienniki ASCII ( ʌ æ ɛ) w powiązanym artykule.)))

res
źródło
1
czy musimy obsługiwać podwójne litery? Jakie jest tłumaczenie z tut AA, SKWEREalbo skwerE? Co powiesz na trzykrotne litery? jest to wakswakswaks, skwerwakswaks, waksskwerwaks, lub nawet kyubwaks, czy możemy wybrać?
John Dvorak,
1
rrdpowinien tłumaczyć na skwerruddud; czy wolno nam to zostawić skwerrutdud?
John Dvorak,
@JanDvorak - Tak, powinien obsługiwać podwójne litery, niezależnie od wielkości liter. Dane wejściowe (0, „AA SKWERE skwerE”) powinny mieć dane wyjściowe (1, „ee SUSKAKWAKSIRUTI suskakwaksirutI”). Wejścia (1, „AA”) i (1, „skwerE”) są niepoprawne, ponieważ „AA” i „skwerE” nie występują jako dane wyjściowe żadnego ważnego wejścia. Wejście (1, „SKWERE”) powinno mieć wyjście (0, „EE”). Ciąg trzech lub więcej liter powinien być traktowany jako pewna liczba podwójnych znaków, po których może następować pojedynczy. Dane wejściowe (0, „rrd”) powinny mieć dane wyjściowe (1, „skwerruddud”).
res
uh ... jak to się 0,"AA"tłumaczy 1,"ee"? Co do tego 1,"SKWERE", zakładam, że miałeś na myśli 0,"AA", nie 0,"EE".
John Dvorak,
1
@psxls - Zamierzałem (0, rd_RD_rD_Rd) -> (1, ruddud_RUDDUD_rutDUD_RUTdud) i (0, aa_AA_aA_Aa) -> (1, skwere_SKWERE_eE_Ee). Zasada (3) dotyczy słów TUT „skwere” i „SKWERE”.
res

Odpowiedzi:

6

Rubin, 310 311 znaków

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

Prawidłowo obsługuje:

  • kwadrat z wielkimi literami (usuń połączenie poprzez iteracje zyskuje 18 znaków)
    • jeśli AApowinno się zmienić skwerE, zamień linie # 3 i # 4
    • Ja również zakładać aAi Aapowinny przekształcić eEi Eeodpowiednio
  • rrd tłumaczy się na `skwerruddud (unix zyskuje 3 znaki)
  • w kostkach pierwsza para jest podawana jako kwadrat. rrrdzamienia się w skwerrutruddud. rrrrdstaje sięskwerrutskwerruddud
  • wyjście jest teraz prawidłowym wejściem. Jest to rzeczywiście wymagane przez specyfikację
  • używa nowej linii jako terminatora wejściowego

Dane wejściowe wymagają, aby między wskaźnikiem a łańcuchem nie było znaku nowej linii, dane wyjściowe umieszczają je tam (poprawka: 1 znak).Wyjście konsoli zostało w tym momencie wyłączone, aby zapobiec mieszaniu ze STDIN. Unfix free, to tylko trochę brzydsze.

Przykładowe dane wejściowe:

0Hello

Wynik:

1
HASHiskwerlulo
John Dvorak
źródło
Wahałem się, czy wymagać, aby wejścia i wyjścia miały identyczne formaty, ale nie było jasne w pytaniu, więc ... ta odpowiedź wygląda dla mnie dobrze (do tej pory - wkrótce przeprowadzę kilka testów odpowiedzi ).
res
Nie wiem dlaczego, ale twój program działa dla mnie - zarówno online, jak i poza nim - tylko jeśli getcjest poprzedzony STDIN.(sześć dodatkowych znaków).
res
Używam jRuby IRB 1.7.5 (2.0.0) i wyświetla mi tylko ostrzeżenie. Jakiej wersji używasz?
John Dvorak,
Lubię tworzyć skróty. Właśnie włączyłem to w pełni. Co sprawia, że ​​jest mało prawdopodobne, że to pokonam.
Johannes Kuhn
1
@res Uważam, że wymóg wejścia / wyjścia był jasny: 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).ale naprawienie go kosztowałoby tylko 1 znak.
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,$_

Przypadki testowe:

Z powodzeniem przetestowałem przypadki testowe (a), (b), (c) i (d) podane w PO.

* Nieco * bardziej czytelna wersja:

($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
źródło
1
Miły! Kilka dobrych przypadków testowych do sprawdzenia, wygląda na to, że mam dużo pracy! Miałem szybkie spojrzenie na Ciebie i myślę, że można wbić kilka bajtów wyłączyć za pomocą gołe słowa zamiast qw (zmiany qw(bub kut ... yak zuz)do (bub,kut ... yak,zuz)), także można zastąpić keys%xz @b(ponieważ wiem, jakie są klucze powodu $x). Niewielka zmiana, aby zapisać kolejne trzy to $1eq uc($1)do uc$1eq$1. Możesz także upuścić +przed !drukiem, aby ten dodatkowy bajt zabrał cię do 443. Mam nadzieję, że to wszystko jest ważne, przetestowałem ograniczone przypadki testowe!
Dom Hastings,
Hmmm, uc$1eq$1być może uc$1 eq$1, ale nie jestem pewien ... Przepraszam, jeśli to źle!
Dom Hastings,
Dzięki Dom za wskazówki! Uratowałeś mi 10 znaków. Nadal jest miejsce na ulepszenia, wrócę do pracy .. :)
psxls,
2

APL (Dyalog) (372)

Naprawdę możesz powiedzieć, że APL nie ma wbudowanych funkcji obsługi ciągu (z wyjątkiem tych z tablicy ogólnej). Musiałem napisać własny tolower(to L). Jak zawsze w przypadku wielowierszowego APL-u Dyalog, aby go przetestować, wklej go w oknie edycji, a następnie wywołaj ( 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↓⍵}⍺}⎕

Stosowanie:

      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
źródło
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]]}

Uwagi:

  • Wykorzystuje skwerrudduddo rrd.
  • skwereskwereedla aaaaa.

Przykładowe dane wejściowe:

0Hello

Wynik:

1HASHiskwerlulo

Jak to działa:

  • m jest na początku łańcuchem.
  • Powiązuję to z mapą wielkich liter.
  • [mapa ciągów] robi większość rzeczy dla mnie (używa listy, więc wszystko, co jest prawidłową listą ...)
  • Wyrażenie regularne dla podwójnych znaków. Użyj specjalnego zastępczego znaku ( ).
Johannes Kuhn
źródło
Bengalski Abugida, jak wybrałeś tę postać?
Kaya
\ufffIirc. To naprawdę nie ma znaczenia. Zrobiłaby to każda postać nie-ascii.
Johannes Kuhn
Tak było \u999. Jak powiedziałem, jedyną ważną rzeczą było: nie postać ascii.
Johannes Kuhn
@JohannesKuhn kończy się niepowodzeniem w przykładzie (c), zwraca 1KWAKWAKSEKS skwerWAKSWAKS RUTskwerrutruddud dudskweriskweriipup.
psxls,
@psxls Co jest poprawne: A doubled letter is replaced by `skwer` followed by the TUT word for that letter.Brak wzmianki o 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"$- $_"}

Zakreślacz składni nienawidzi tego ...

Oczekuje danych wejściowych STDIN, format to 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."

Edycja : Zauważyłem problem z tłumaczeniem X (staje się „aks” w wersji, zajrzę do tego później. Może trzeba zmienić kolejność hash :(.

Dom Hastings
źródło
1
pomijając X, zawodzi również w przykładach OP (b), (c) i sprawdzam również w mojej odpowiedzi przypadki testowe (e) i (g).
psxls,
To jest bardzo prawdziwe, wróć do tablicy kreślarskiej!
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.*//

Prawdopodobnie można go skrócić, choć na razie skończę.

Używa tabeli odnośników do obsługi konwersji w obu kierunkach, powinien poprawnie obsługiwać wszystkie wyjątki, w tym przypadek skwer i ruddud / RUDDUD.

wejście pobierane w każdym wierszu jako 0/1, po którym następuje łańcuch. Używa \v(tabulator pionowy) jako kursora.

Hasturkun
źródło