Traduttore di lingua TUT


10

Il testo può essere tradotto in una versione scritta del linguaggio TUT sostituendo ciascuna lettera con la "parola TUT" corrispondente, come indicato nella seguente tabella (adattato dall'articolo collegato) * :

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

Scrivi un programma con il seguente comportamento di I / O:

Input (dallo stdin): un indicatore binario (0/1) i e una stringa ASCII s .

  • Se i = 0, allora s può contenere qualsiasi testo ASCII.
  • Se i = 1, allora s deve essere l'output della lingua TUT per alcuni input validi.

Output (su stdout): un indicatore binario (0/1) j e una stringa ASCII t .

  • Se i = 0 allora j = 1 e t è la traduzione di s per TUT lingua.
  • Se i = 1 allora j = 0 e t è la traduzione di s da TUT lingua.
  • Per qualsiasi input valido, l'applicazione del programma al proprio output deve riprodurre esattamente l'input originale; vale a dire, programma ( programma ( i , s )) = ( i , s ). L'input e l'output devono avere esattamente lo stesso formato.

Punteggio : il punteggio è il numero di personaggi nel programma - il punteggio più basso vince.

Esempi

(un)

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

(((Da parte circa pronuncia: Le parole TUT per le vocali ( e, i, ay, o, yu) si suppone di rappresentare i soliti suoni di (a, e, i, o, u) quando recitare l'alfabeto - vale a dire, in rima con (maggio , io, il mio, falciare, Mew) nelle parole TUT tre o più-lettere, i simboli (. u, a, e) si suppone che il suono come in (ma, pipistrello, bet), rispettivamente, - questi sono sostituzioni ASCII per ( ʌ æ ɛ) nell'articolo collegato.)))


1
dobbiamo supportare il maiuscolo raddoppiato? Qual è la traduzione tut di AA, SKWEREo skwerE? E le lettere triplicate? è vero wakswakswaks, skwerwakswaks, waksskwerwaks, o anche kyubwaks, o possiamo scegliere?
John Dvorak,

1
rrddovrebbe tradurre in skwerruddud; possiamo lasciarlo a skwerrutdud?
John Dvorak,

@JanDvorak - Sì, dovrebbe gestire lettere raddoppiate, indipendentemente dal caso. L'ingresso (0, "AA SKWERE skwerE") dovrebbe avere l'output (1, "ee SUSKAKWAKSIRUTI suskakwaksirutI"). Gli input (1, 'AA') e (1, 'skwerE') non sono validi perché 'AA' e 'skwerE' non si verificano come output di alcun input valido. L'ingresso (1, 'SKWERE') dovrebbe avere l'uscita (0, 'EE'). Una stringa di tre o più lettere dovrebbe essere considerata come un numero di doppi, eventualmente seguito da un singolo. Input (0, 'rrd') dovrebbe avere output (1, 'skwerruddud').
ris.

uh ... come si 0,"AA"traduce in 1,"ee"? Per quanto riguarda 1,"SKWERE", presumo che intendessi 0,"AA", non 0,"EE".
John Dvorak,

1
@psxls - Intendevo (0, rd_RD_rD_Rd) -> (1, ruddud_RUDDUD_rutDUD_RUTdud) e (0, aa_AA_aA_Aa) -> (1, skwere_SKWERE_eE_Ee). La regola (3) si applica alle parole TUT "skwere" e "SKWERE".
ris.

Risposte:


6

Rubino, 310 311 caratteri

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

Gestisce correttamente:

  • quadrata maiuscola (la correzione mediante l'unione delle iterazioni guadagna 18 caratteri)
    • se AAdovesse trasformarsi in skwerE, scambia le righe n. 3 e n. 4
    • Presumo anche aAe Aadovrei trasformarmi in eEe Eerispettivamente
  • rrd si traduce in `skwerruddud (unfix guadagna 3 caratteri)
  • in cubi la prima coppia è indicata come un quadrato. rrrdsi trasforma in skwerrutruddud. rrrrddiventaskwerrutskwerruddud
  • l'output ora è un input valido. È, infatti, richiesto dalla specifica
  • usa newline come terminatore di input

L'input richiede che non ci sia una nuova riga tra l'indicatore e la stringa, l'output lo mette lì (correzione: 1 carattere).L'output della console è stato soppresso a questo punto per impedire il mix con STDIN. Unfix free, è solo un po 'più brutto.

Esempio di input:

0Hello

Produzione:

1
HASHiskwerlulo

Stavo vacillando sull'opportunità di richiedere input e output con formati identici , ma non era chiaro nella domanda, quindi ... questa risposta mi sta bene (finora - Eseguirò presto alcuni test sulle risposte ).
res

Non so perché, ma il tuo programma funziona per me - sia online che offline - solo se ha il getcprefisso STDIN.(altri sei caratteri).
res

Sto usando jRuby IRB 1.7.5 (2.0.0) e mi mostra solo un avvertimento. Quale verion stai usando?
John Dvorak,

Mi piace la scorciatoia per creare la mappa. L'ho appena incluso completamente. Il che rende improbabile che lo batterò.
Johannes Kuhn,

1
@res Credo che il requisito di input / output fosse chiaro: 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).ma per risolverlo costerebbe solo 1 carattere.
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,$_

Casi test:

Ho testato con successo i casi di test (a), (b), (c) e (d) forniti nel PO.

Una versione * un po 'più leggibile:

($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
Bello! Alcuni buoni casi di test da controllare, sembra che abbia molto lavoro da fare! Ho dato una rapida occhiata alla tua e penso che tu possa eliminare qualche byte usando barewords invece di qw (cambia qw(bub kut ... yak zuz)in (bub,kut ... yak,zuz)), inoltre puoi sostituirlo keys%xcon @b(dato che sai di cosa sono le chiavi $x). Un piccolo cambiamento per salvare un altro tre è $1eq uc($1)a uc$1eq$1. Potresti anche rilasciare la +prima !della stampa per quel byte extra per portarti a 443. Spero che sia tutto valido, ho testato casi di test limitati!
Dom Hastings,

Hmmm, uc$1eq$1potrebbe essere necessario uc$1 eq$1, ma non sono sicuro ... Scusa se è sbagliato!
Dom Hastings,

Grazie Dom per i suggerimenti! Mi hai salvato 10 caratteri. C'è ancora spazio per migliorare, torno al lavoro .. :)
psxls

2

APL (Dyalog) (372)

Puoi davvero dire che APL non ha funzioni di gestione delle stringhe integrate (eccetto quelle generiche dell'array). Ho dovuto scrivere il mio tolowerL). Come sempre con Dyalog APL multilinea, per testarlo, incollarlo in una finestra di modifica e quindi chiamarlo ( 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↓⍵}⍺}⎕

Uso:

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

Appunti:

  • Utilizza skwerruddudper rrd.
  • skwereskwereeper aaaaa.

Esempio di input:

0Hello

Produzione:

1HASHiskwerlulo

Come funziona:

  • m è all'inizio una stringa.
  • Lo concordo con la mappa maiuscola.
  • [string map] fa la maggior parte delle cose per me (usa un elenco, quindi tutto ciò che è un elenco valido ...)
  • regexp per per i doppi personaggi. Utilizzare un carattere di sostituzione speciale ( ).

Il bengalese Abugida, come hai scelto quel personaggio?
Kaya,

\ufffIIRC. Non importa davvero. Qualsiasi personaggio non ascii lo farebbe.
Johannes Kuhn,

Lo era \u999. Come ho detto, l'unica cosa importante era: non un personaggio ASCII.
Johannes Kuhn,

@JohannesKuhn fallisce nell'esempio (c), ritorna 1KWAKWAKSEKS skwerWAKSWAKS RUTskwerrutruddud dudskweriskweriipup.
psxls,

@psxls Che è corretto: A doubled letter is replaced by `skwer` followed by the TUT word for that letter.nessuna menzione di 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"$- $_"}

L'evidenziatore di sintassi odia questo ...

Si aspetta input su STDIN, il formato è 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."

Modifica : ho notato un problema con la traduzione di X (diventa "aks" nell'inversione, lo esaminerò più avanti. Potrebbe essere necessario riordinare l'hash :(.


1
a parte X, fallisce anche negli esempi di OP (b), (c) e controlla anche nella mia risposta i casi di test (e) & (g).
psxls,

Questo è molto vero, tornando al tavolo da disegno!
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.*//

Probabilmente potrebbe essere abbreviato, anche se per ora ho finito.

Utilizza una tabella di ricerca per gestire le conversioni in entrambe le direzioni, dovrebbe gestire tutte le eccezioni tra cui skwer case e ruddud / RUDDUD correttamente.

input preso su ogni riga come 0/1 seguito dalla stringa. Utilizza \v(scheda verticale) come cursore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.