Traducteur de langue TUT

10

Le texte peut être traduit dans une version écrite de la langue TUT en remplaçant chaque lettre par le "mot TUT" correspondant, comme indiqué dans le tableau suivant (adapté de l'article lié) * :

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

Écrivez un programme avec le comportement d'E / S suivant:

Entrée (depuis stdin): un indicateur binaire (0/1) i et une chaîne ASCII s .

  • Si i = 0, alors s peut contenir n'importe quel texte ASCII.
  • Si i = 1, alors s doit être la sortie TUT Language pour une entrée valide.

Sortie (vers stdout): un indicateur binaire (0/1) j et une chaîne ASCII t .

  • Si i = 0 alors j = 1 et t est la traduction de s en TUT Language.
  • Si i = 1 alors j = 0 et t est la traduction de s à partir du langage TUT.
  • Pour toute entrée valide, l'application du programme à sa propre sortie doit reproduire exactement l'entrée d'origine; c'est-à-dire programme ( programme ( i , s )) = ( i , s ). L'entrée et la sortie doivent avoir exactement le même format.

Score : Le score est le nombre de caractères dans le programme - le score le plus bas gagne.

Exemples

(une)

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

((( A part à la prononciation: Les mots TUT pour les voyelles ( e, i, ay, o, yu) sont censés représenter les sons habituels de (a, e, i, o, u) en récitant l'alphabet - par exemple, qui riment avec (peut , moi, mon, faucher Mew) dans les trois ou-plus-lettre mots TUT, les symboles (. u, a, e) sont censés son comme dans (mais, chauve - souris, pari) respectivement - ce sont des remplacements ASCII pour ( ʌ æ ɛ) dans l'article lié.)))

res
la source
1
devons-nous prendre en charge les majuscules doublées? Quelle est la traduction de tut AA, SKWEREou skwerE? Et les lettres triplées? est - il wakswakswaks, skwerwakswaks, waksskwerwaks, ou même kyubwaks, ou nous pouvons choisir?
John Dvorak
1
rrddevrait se traduire par skwerruddud; sommes-nous autorisés à le laisser à skwerrutdud?
John Dvorak
@JanDvorak - Oui, il devrait gérer les lettres doublées, quel que soit le cas. L'entrée (0, 'AA SKWERE skwerE') doit avoir une sortie (1, 'ee SUSKAKWAKSIRUTI suskakwaksirutI'). Les entrées (1, 'AA') et (1, 'skwerE') ne sont pas valides car 'AA' et 'skwerE' ne se produisent pas comme sorties d'une entrée valide. L'entrée (1, 'SKWERE') doit avoir une sortie (0, 'EE'). Une chaîne de trois lettres ou plus doit être considérée comme un certain nombre de doubles, éventuellement suivie d'un simple. L'entrée (0, 'rrd') doit avoir une sortie (1, 'skwerruddud').
res
euh ... comment ça se 0,"AA"traduit 1,"ee"? Quant à 1,"SKWERE", je suppose que vous vouliez dire 0,"AA"non 0,"EE".
John Dvorak
1
@psxls - Je voulais (0, rd_RD_rD_Rd) -> (1, ruddud_RUDDUD_rutDUD_RUTdud) et (0, aa_AA_aA_Aa) -> (1, skwere_SKWERE_eE_Ee). La règle (3) s'applique aux mots TUT «skwere» et «SKWERE».
res

Réponses:

6

Rubis, 310 311 caractères

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

Gère correctement:

  • carré en majuscules (le défixe en fusionnant les itérations gagne 18 caractères)
    • si cela AAse transforme en skwerE, permutez les lignes # 3 et # 4
    • Je suppose également aAet Aadevrais devenir eEet Eerespectivement
  • rrd se traduit par `skwerruddud (unfix gagne 3 caractères)
  • en cubes, la première paire est indiquée comme un carré. rrrdse transforme en skwerrutruddud. rrrrddevientskwerrutskwerruddud
  • la sortie est maintenant une entrée valide. Il est, en effet, requis par la spécification
  • utilise la nouvelle ligne comme terminateur d'entrée

L'entrée nécessite qu'il n'y ait pas de nouvelle ligne entre l'indicateur et la chaîne, la sortie le place là (correction: 1 caractère).La sortie de la console est supprimée à ce stade pour empêcher le mélange avec STDIN. Unix gratuit, c'est juste un peu plus laid.

Exemple d'entrée:

0Hello

Production:

1
HASHiskwerlulo
John Dvorak
la source
Je hésitais sur la nécessité d'exiger des entrées et des sorties pour avoir des formats identiques , mais ce n'était pas clair dans la question, alors ... cette réponse me semble bien (jusqu'à présent - je vais bientôt faire des tests sur les réponses ).
res
Je ne sais pas pourquoi, mais votre programme s'exécute pour moi - en ligne et hors ligne - uniquement s'il getcest préfixé par STDIN.(six caractères supplémentaires).
res
J'utilise jRuby IRB 1.7.5 (2.0.0) et cela ne me montre qu'un avertissement. Quelle version utilisez-vous?
John Dvorak
J'aime le raccourci pour créer la carte. Je viens de l'inclure complètement. Ce qui rend peu probable que je batte ça.
Johannes Kuhn
1
@res Je crois que l'exigence d'entrée / sortie était claire: 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).mais cela ne coûterait qu'un seul caractère pour résoudre ce problème.
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,$_

Cas de test:

J'ai testé avec succès les cas de test (a), (b), (c) et (d) fournis dans le PO.

Une version * un peu * plus lisible:

($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
la source
1
Agréable! Quelques bons cas de test à vérifier, il me semble que j'ai beaucoup de travail à faire! J'ai jeté un coup d'œil au vôtre et je pense que vous pouvez supprimer quelques octets en utilisant des mots nus au lieu de qw (changer qw(bub kut ... yak zuz)en (bub,kut ... yak,zuz)), vous pouvez également le remplacer keys%xpar @b(puisque vous savez de quoi sont faites les clés $x). Un petit changement pour sauver trois autres est $1eq uc($1)de uc$1eq$1. Vous pouvez également supprimer l' +avant !de l'impression pour cet octet supplémentaire pour vous amener à 443. J'espère que tout est valide, j'ai testé des cas de test limités!
Dom Hastings
Hmmm, ça uc$1eq$1devrait l'être uc$1 eq$1, mais je ne suis pas certain ... Désolé si c'est faux!
Dom Hastings
Merci Dom pour les conseils! Vous m'avez sauvé 10 caractères. Il y a encore place à l'amélioration, je vais retourner au travail .. :)
psxls
2

APL (Dyalog) (372)

Vous pouvez vraiment dire qu'APL n'a pas de fonctions intégrées de gestion des chaînes (à l'exception des tableaux génériques). J'ai dû écrire le mien tolower(c'est L). Comme toujours avec Dyalog APL multiligne, pour le tester, collez-le dans une fenêtre d'édition puis appelez-le ( 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↓⍵}⍺}⎕

Usage:

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

Remarques:

  • Utilise skwerruddudpour rrd.
  • skwereskwereepour aaaaa.

Exemple d'entrée:

0Hello

Production:

1HASHiskwerlulo

Comment ça fonctionne:

  • m est au début une chaîne.
  • Je concaté avec la carte en majuscules.
  • [string map] fait la plupart des choses pour moi (utilise une liste, donc tout ce qui est une liste valide ...)
  • regexp pour les caractères doubles. Utilisez un caractère de remplacement spécial ( ).
Johannes Kuhn
la source
Le Bengali Abugida, comment avez-vous choisi ce personnage?
Kaya
\ufffiirc. Ça n'a pas vraiment d'importance. N'importe quel caractère non-ascii ferait l'affaire.
Johannes Kuhn
Ça l'était \u999. Comme je l'ai dit, la seule chose importante était: pas un caractère ascii.
Johannes Kuhn
@JohannesKuhn il échoue à l'exemple (c), retourne 1KWAKWAKSEKS skwerWAKSWAKS RUTskwerrutruddud dudskweriskweriipup.
psxls
@psxls Ce qui est correct: A doubled letter is replaced by `skwer` followed by the TUT word for that letter.Aucune mention de 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"$- $_"}

Le surligneur de syntaxe déteste celui-ci ...

Attend l'entrée sur STDIN, le format est 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."

Edit : J'ai remarqué un problème avec la traduction de X (il devient 'aks' dans la réversion, je vais y revenir plus tard. Peut-être besoin de réorganiser le hachage :(.

Dom Hastings
la source
1
à part X, il échoue également dans les exemples (b), (c) de OP et vérifie également dans ma réponse les cas de test (e) & (g).
psxls
C'est très vrai, revenons à la planche à dessin!
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.*//

Pourrait probablement être raccourci, bien que j'aie fini pour l'instant.

Utilise une table de recherche pour gérer les conversions dans les deux sens, doit gérer correctement toutes les exceptions, y compris skwer case et ruddud / RUDDUD.

entrée prise sur chaque ligne comme 0/1 suivie de la chaîne. Utilise \v(onglet vertical) comme curseur.

Hasturkun
la source