Traductor de idiomas TUT

10

El texto puede traducirse a una versión escrita del lenguaje TUT reemplazando cada letra por la "palabra TUT" correspondiente, como se indica en la siguiente tabla (adaptada del artículo vinculado) * :

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

Escriba un programa con el siguiente comportamiento de E / S:

Entrada (desde stdin): un indicador binario (0/1) iy una cadena ASCII s .

  • Si i = 0, s puede contener cualquier texto ASCII.
  • Si i = 1, entonces s debe ser la salida del lenguaje TUT para alguna entrada válida.

Salida (a stdout): un indicador binario (0/1) j y una cadena ASCII t .

  • Si i = 0, entonces j = 1 yt es la traducción de s al lenguaje TUT.
  • Si i = 1, entonces j = 0 yt es la traducción de s del lenguaje TUT.
  • Para cualquier entrada válida, la aplicación del programa a su propia salida debe reproducir exactamente la entrada original; es decir, programa ( programa ( i , s )) = ( i , s ). La entrada y la salida deben tener exactamente el mismo formato.

Puntuación : La puntuación es el número de caracteres en el programa: gana la puntuación más baja.

Ejemplos

(una)

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

(si)

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

(((Aparte sobre la pronunciación: Las palabras TUT para las vocales ( e, i, ay, o, yu) se supone que representan los sonidos habituales de (a, e, i, o, u) al recitar el alfabeto - es decir, con rima (mayo , mi, mi, cortar, mew) en las palabras TUT de tres o más letras, los símbolos (. u, a, e) se supone que el sonido como en (pero, el palo, apuesta), respectivamente - son reemplazos para ASCII ( ʌ æ ɛ) en el artículo vinculado.)))

res
fuente
1
¿tenemos que soportar mayúsculas duplicadas? ¿Qué es la traducción de Tut AA, SKWEREo skwerE? ¿Qué pasa con las letras triplicadas? es que wakswakswaks, skwerwakswaks, waksskwerwaks, o incluso kyubwaks, o podemos elegir?
John Dvorak
1
rrddebería traducir a skwerruddud; ¿Se nos permite dejarlo en skwerrutdud?
John Dvorak
@ JanDvorak: Sí, debe manejar letras duplicadas, independientemente del caso. La entrada (0, 'AA SKWERE skwerE') debe tener salida (1, 'ee SUSKAKWAKSIRUTI suskakwaksirutI'). Las entradas (1, 'AA') y (1, 'skwerE') no son válidas porque 'AA' y 'skwerE' no se producen como salidas de ninguna entrada válida. La entrada (1, 'SKWERE') debe tener salida (0, 'EE'). Una cadena de tres o más letras debe considerarse como un número de dobles, posiblemente seguida de una sola. La entrada (0, 'rrd') debe tener salida (1, 'skwerruddud').
res
eh ... ¿cómo se 0,"AA"traduce a 1,"ee"? En cuanto a 1,"SKWERE", supongo que quisiste decir 0,"AA", no 0,"EE".
John Dvorak
1
@psxls: tenía la intención (0, rd_RD_rD_Rd) -> (1, ruddud_RUDDUD_rutDUD_RUTdud) y (0, aa_AA_aA_Aa) -> (1, skwere_SKWERE_eE_Ee). La regla (3) se aplica a las palabras TUT 'skwere' y "SKWERE '.
res

Respuestas:

6

Rubí, 310 311 caracteres

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

Maneja correctamente:

  • al cuadrado en mayúscula (al no fusionar las iteraciones se obtienen 18 caracteres)
    • si AAdebe convertirse en skwerE, intercambie las líneas 3 y 4
    • También asumo aAy Aadebo convertirme en eEy Eerespectivamente
  • rrd se traduce como `skwerruddud (el despliegue gana 3 caracteres)
  • en cubos, el primer par se informa como un cuadrado. rrrdse convierte en skwerrutruddud. rrrrdse convierteskwerrutskwerruddud
  • La salida es ahora una entrada válida. De hecho, es requerido por la especificación
  • usa nueva línea como terminador de entrada

La entrada requiere que no haya una nueva línea entre el indicador y la cadena, la salida la coloca allí (corrección: 1 carácter).Salida de la consola suprimida en este punto para evitar la mezcla con STDIN. Descomprima gratis, es un poco más feo.

Entrada de ejemplo:

0Hello

Salida:

1
HASHiskwerlulo
John Dvorak
fuente
Estaba vacilando sobre si exigir que la entrada y la salida tengan formatos idénticos , pero no estaba claro en la pregunta, así que ... esta respuesta me parece bien (hasta ahora, ejecutaré algunas pruebas sobre las respuestas pronto )
res
No sé por qué, pero su programa se ejecuta para mí, tanto en línea como fuera, solo si getctiene el prefijo STDIN.(seis caracteres más).
res
Estoy usando jRuby IRB 1.7.5 (2.0.0) y solo me muestra una advertencia. ¿Qué versión estás usando?
John Dvorak el
Me gusta la taquigrafía para crear el mapa. Lo acabo de incluir por completo. Lo que hace improbable que lo supere.
Johannes Kuhn
1
@res Creo que el requisito de entrada / salida era claro: 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).pero solo costaría 1 carácter arreglar eso.
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,$_

Casos de prueba:

He probado con éxito los casos de prueba (a), (b), (c) y (d) proporcionados en el OP.

Una versión * algo * más legible:

($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
fuente
1
¡Agradable! Algunos buenos casos de prueba para verificar, ¡parece que tengo mucho trabajo por hacer! He echado un vistazo rápido al tuyo y creo que puedes eliminar algunos bytes usando palabras vacías en lugar de qw (cambiar qw(bub kut ... yak zuz)a (bub,kut ... yak,zuz)), también puedes reemplazarlo keys%xcon @b(ya que sabes a qué se deben las claves $x). Un pequeño cambio para salvar a otros tres es $1eq uc($1)hacerlo uc$1eq$1. También puede soltar el +antes !de la impresión para que ese byte adicional lo lleve a 443. Espero que todo sea válido, ¡he probado casos de prueba limitados!
Dom Hastings
Hmmm, uc$1eq$1podría ser así uc$1 eq$1, pero no estoy seguro ... ¡Lo siento si eso está mal!
Dom Hastings
Gracias Dom por los consejos! Me salvaste 10 caracteres. Todavía hay margen de mejora, volveré a trabajar ... :)
psxls
2

APL (Dyalog) (372)

Realmente se puede decir que APL no tiene funciones integradas de manejo de cadenas (excepto las genéricas). Tuve que escribir el mío tolower(es L). Como siempre con Dyalog APL multilínea, para probarlo, péguelo en una ventana de edición y luego llámelo ( 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."       
marinus
fuente
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]]}

Notas:

  • Usos skwerruddudpara rrd.
  • skwereskwereepara aaaaa.

Entrada de ejemplo:

0Hello

Salida:

1HASHiskwerlulo

Cómo funciona:

  • m es al principio una cadena
  • Lo concatino con el mapa en mayúscula.
  • [mapa de cadena] hace la mayoría de las cosas por mí (usa una lista, por lo que todo lo que sea una lista válida ...)
  • regexp para los caracteres dobles. Use un carácter de reemplazo especial ( ).
Johannes Kuhn
fuente
La Abugida bengalí, ¿cómo elegiste ese personaje?
Kaya
\ufffIirc. Realmente no importa. Cualquier personaje que no sea ascii lo haría.
Johannes Kuhn
Fue \u999. Como dije, lo único importante era: no un personaje ascii.
Johannes Kuhn
@JohannesKuhn falla en el ejemplo (c), regresa 1KWAKWAKSEKS skwerWAKSWAKS RUTskwerrutruddud dudskweriskweriipup.
psxls
@psxls Lo que es correcto: A doubled letter is replaced by `skwer` followed by the TUT word for that letter.no se menciona 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"$- $_"}

El resaltador de sintaxis odia este ...

Espera entrada en STDIN, el formato es 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."

Editar : He notado un problema con la traducción de X (se convierte en 'aks' en la reversión, lo investigaré más tarde. Es posible que deba volver a ordenar el hash :(.

Dom Hastings
fuente
1
aparte de X, falla también en los ejemplos de OP (b), (c) y comprueba también en mi respuesta los casos de prueba (e) y (g).
psxls
¡Esto es muy cierto, de vuelta al tablero de dibujo!
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.*//

Probablemente podría acortarse, aunque he terminado por ahora.

Utiliza una tabla de búsqueda para manejar las conversiones en ambas direcciones, debe manejar todas las excepciones, incluido el caso de skwer y ruddud / RUDDUD correctamente.

entrada tomada en cada línea como 0/1 seguida de la cadena. Usos \v(pestaña vertical) como cursor.

Hasturkun
fuente