TUT Sprachübersetzer

10

Text kann in eine schriftliche Version der TUT-Sprache übersetzt werden, indem jeder Buchstabe durch das entsprechende "TUT-Wort" ersetzt wird, wie in der folgenden Tabelle angegeben (angepasst aus dem verlinkten Artikel) * :

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

Schreiben Sie ein Programm mit folgendem E / A-Verhalten:

Eingabe (von stdin): Ein binärer (0/1) Indikator i und eine ASCII-Zeichenfolge s .

  • Wenn i = 0 ist, kann s beliebigen ASCII-Text enthalten.
  • Wenn i = 1 ist, muss s die TUT-Sprachausgabe für eine gültige Eingabe sein.

Ausgabe (an stdout): Ein binärer (0/1) Indikator j und eine ASCII-Zeichenfolge t .

  • Wenn i = 0, dann ist j = 1 und t ist die Übersetzung von s in die TUT-Sprache.
  • Wenn i = 1, dann ist j = 0 und t ist die Übersetzung von s aus der TUT-Sprache.
  • Für jede gültige Eingabe muss das Anwenden des Programms auf seine eigene Ausgabe die ursprüngliche Eingabe exakt wiedergeben. dh Programm ( Programm ( i , s )) = ( i , s ). Eingabe und Ausgabe müssen genau das gleiche Format haben.

Wertung : Die Punktzahl ist die Anzahl der Zeichen im Programm - die niedrigste Punktzahl gewinnt.

Beispiele

(ein)

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

(((Außer über die Aussprache: Die TUN Worte für die Vokale ( e, i, ay, o, yuwerden) soll die üblichen Geräusche des (a, e darstellen, i, o, u) , wenn das Alphabet rezitieren - dh mit Reimen (Mai , mich, meine, mähen, mew) in den drei-oder-mehr-Buchstaben TUT Worten, die Symbole (. u, a, e) sollen klingen , als in (aber, bat, Wette) , die jeweils - diese ASCII Ersatz für ( ʌ æ ɛ) im verlinkten Artikel.)))

res
quelle
1
Müssen wir doppelte Großbuchstaben unterstützen? Was ist das tut Übersetzung von AA, SKWEREoder skwerE? Was ist mit verdreifachten Buchstaben? ist es wakswakswaks, skwerwakswaks, waksskwerwaks, oder auch kyubwaks, oder wir wählen?
John Dvorak
1
rrdsollte übersetzen in skwerruddud; dürfen wir es bei lassen skwerrutdud?
John Dvorak
@ JanDvorak - Ja, es sollte doppelte Buchstaben verarbeiten, unabhängig von der Groß- und Kleinschreibung. Die Eingabe (0, 'AA SKWERE skwerE') sollte eine Ausgabe haben (1, 'ee SUSKAKWAKSIRUTI suskakwaksirutI'). Die Eingaben (1, 'AA') und (1, 'skwerE') sind ungültig, da 'AA' und 'skwerE' nicht als Ausgaben einer gültigen Eingabe auftreten. Eingang (1, 'SKWERE') sollte Ausgang (0, 'EE') haben. Eine Zeichenfolge aus drei oder mehr Buchstaben sollte als eine Anzahl von Doppelbuchstaben betrachtet werden, möglicherweise gefolgt von einer einzelnen. Eingabe (0, 'rrd') sollte Ausgabe haben (1, 'skwerruddud').
Res
äh ... wie 0,"AA"übersetzt man 1,"ee"? Was 1,"SKWERE"nehme ich an Dich gedacht 0,"AA", nicht 0,"EE".
John Dvorak
1
@psxls - Ich beabsichtigte (0, rd_RD_rD_Rd) -> (1, ruddud_RUDDUD_rutDUD_RUTdud) und (0, aa_AA_aA_Aa) -> (1, skwere_SKWERE_eE_Ee). Regel (3) gilt für die TUT-Wörter "skwere" und "SKWERE".
Res

Antworten:

6

Rubin, 310 311 Zeichen

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

Richtig behandelt:

  • quadratischer Großbuchstabe (durch Zusammenführen von Iterationen nicht fixiert, erhält 18 Zeichen)
    • Wenn dies der AAFall sein sollte skwerE, tauschen Sie die Zeilen 3 und 4 aus
    • Außerdem gehe ich davon aAund Aasollte wiederum in eEund Eejeweils
  • rrd übersetzt in `skwerruddud (unfix erhält 3 Zeichen)
  • In Würfeln wird das erste Paar als Quadrat angegeben. rrrdverwandelt sich in skwerrutruddud. rrrrdwirdskwerrutskwerruddud
  • Die Ausgabe ist jetzt eine gültige Eingabe. Es ist in der Tat von der Spezifikation vorgeschrieben
  • verwendet newline als Eingangsabschluss

Die Eingabe erfordert, dass zwischen dem Indikator und der Zeichenfolge keine neue Zeile steht, die Ausgabe setzt sie dort ab (Fix: 1 Zeichen).Die Konsolenausgabe wird an dieser Stelle unterdrückt, um ein Mischen mit STDIN zu verhindern. Unfix frei, es ist nur ein bisschen hässlicher.

Beispieleingabe:

0Hello

Ausgabe:

1
HASHiskwerlulo
John Dvorak
quelle
Ich schwankte darüber, ob Eingabe und Ausgabe identische Formate erfordern sollten , aber es war in der Frage nicht klar, also ... diese Antwort sieht für mich gut aus (bis jetzt - ich werde bald einige Tests für die Antworten durchführen ).
Res
Ich weiß nicht warum, aber Ihr Programm läuft für mich - sowohl online als auch offline - nur, wenn (sechs weitere Zeichen) getcvorangestellt sind STDIN..
Res
Ich verwende jRuby IRB 1.7.5 (2.0.0) und es wird nur eine Warnung angezeigt. Welche Version verwenden Sie?
John Dvorak
Ich mag die Kurzform, um die Karte zu erstellen. Ich habe es nur vollständig aufgenommen. Was es unwahrscheinlich macht, dass ich das schlagen werde.
Johannes Kuhn
1
@res Ich glaube, dass die Eingabe- / Ausgabeanforderung klar war: 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).Aber es würde nur 1 Zeichen kosten, um das zu beheben.
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,$_

Testfälle:

Ich habe die im OP bereitgestellten Testfälle (a), (b), (c) und (d) erfolgreich getestet.

Eine * etwas * besser lesbare Version:

($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
quelle
1
Nett! Einige gute Testfälle zu überprüfen, es scheint, ich habe viel Arbeit zu tun! Ich habe einen kurzen Blick auf Ihr hatte und ich denke , man kann ein paar Bytes abschlagen Barewords statt qw (Änderung mit qw(bub kut ... yak zuz)zu (bub,kut ... yak,zuz)), können Sie auch ersetzen keys%xmit @b(da Sie wissen , was die Tasten sind wegen $x). Eine kleine Änderung, um weitere drei zu speichern, ist $1eq uc($1)zu uc$1eq$1. Sie können auch das +vor dem !Druck stehen lassen, um dieses zusätzliche Byte auf 443 zu bringen. Ich hoffe, das ist alles gültig. Ich habe begrenzte Testfälle getestet!
Dom Hastings
Hmmm, muss uc$1eq$1vielleicht sein uc$1 eq$1, aber ich bin mir nicht sicher ... Entschuldigung, wenn das falsch ist!
Dom Hastings
Danke Dom für die Tipps! Du hast mir 10 Zeichen gespart. Es gibt noch Raum für Verbesserungen, ich mache mich wieder an die Arbeit .. :)
psxls
2

APL (Dyalog) (372)

Sie können wirklich feststellen, dass APL keine integrierten Funktionen zur Behandlung von Zeichenfolgen hat (mit Ausnahme der generischen Array-Funktionen). Ich musste mein eigenes schreiben tolower(es ist L). Wie immer bei mehrzeiliger Dyalog-APL, um sie zu testen, fügen Sie sie in ein Bearbeitungsfenster ein und rufen Sie sie dann auf ( 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↓⍵}⍺}⎕

Verwendungszweck:

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

Anmerkungen:

  • Verwendet skwerruddudfür rrd.
  • skwereskwereefür aaaaa.

Beispieleingabe:

0Hello

Ausgabe:

1HASHiskwerlulo

Wie es funktioniert:

  • m ist am Anfang eine Zeichenfolge.
  • Ich verknüpfe es mit der Großbuchstabenkarte.
  • [string map] erledigt die meisten Dinge für mich (verwendet eine Liste, also alles, was eine gültige Liste ist ...)
  • regulärer Ausdruck für die Doppelzeichen. Verwenden Sie ein spezielles Ersatzzeichen ( ).
Johannes Kuhn
quelle
Die Bengali Abugida, wie hast du diesen Charakter gewählt?
Kaya
\ufffiirc. Ist nicht wirklich wichtig. Jedes Nicht-ASCII-Zeichen würde ausreichen.
Johannes Kuhn
Es war \u999. Wie gesagt, das einzig Wichtige war: kein ASCII-Charakter.
Johannes Kuhn
@JohannesKuhn schlägt bei Beispiel (c) fehl, gibt zurück 1KWAKWAKSEKS skwerWAKSWAKS RUTskwerrutruddud dudskweriskweriipup.
psxls
@psxls Was richtig ist: A doubled letter is replaced by `skwer` followed by the TUT word for that letter.Keine Erwähnung von 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"$- $_"}

Syntax Textmarker hasst diesen ...

Erwartet Eingabe auf STDIN, Format ist 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."

Bearbeiten : Ich habe ein Problem mit der Übersetzung von X festgestellt (es wird in der Umkehrung zu "aks", ich werde dies später untersuchen. Möglicherweise muss der Hash neu angeordnet werden :(.

Dom Hastings
quelle
1
Abgesehen von X schlägt es auch in den Beispielen (b), (c) von OP fehl und überprüft auch in meiner Antwort die Testfälle (e) und (g).
psxls
Dies ist sehr wahr, zurück zum Zeichenbrett!
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.*//

Könnte wahrscheinlich verkürzt werden, obwohl ich jetzt fertig bin.

Verwendet eine Nachschlagetabelle, um Konvertierungen in beide Richtungen zu verarbeiten, sollte alle Ausnahmen, einschließlich Skwer-Fall und Ruddud / RUDDUD, korrekt behandeln.

Eingabe in jeder Zeile als 0/1 gefolgt von der Zeichenfolge. Verwendet \v(vertikale Registerkarte) als Cursor.

Hasturkun
quelle