TUT言語翻訳


10

次の表に示すように、各文字を対応する「TUTワード」で置き換えることにより、テキストをTUT言語の記述バージョンに翻訳できます(リンクされた記事から抜粋)*

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

次のI / O動作を持つプログラムを記述します。

入力(標準入力から):バイナリ(0/1)インジケーターiおよびASCII文字列s

  • 場合、私は = 0その後、Sは任意のASCIIテキストが含まれていてもよいです。
  • i = 1の場合、sは有効な入力のTUT言語出力でなければなりません。

出力(標準出力へ):バイナリ(0/1)インジケータjとASCII文字列t

  • i = 0の場合、j = 1であり、tsの TUT言語の変換です。
  • i = 1の場合、j = 0であり、tはTUT言語からs の翻訳です。
  • 有効な入力の場合、プログラムをそれ自体の出力に適用するには、元の入力を正確に再現する必要があります。すなわち、programprogramis))=(is)。入力と出力は完全に同じ形式でなければなりません。

スコアリング:スコアはプログラム内の文字数です。最も低いスコアが優先されます。

(a)

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

(((脇の発音について:母音TUTワード(eiayoyu-すなわち、(5月と押韻のアルファベットを暗唱する場合)は、(、E、I、O、U)の通常の音を表現することになっています、私、私、MOW、松下電工)3-または、より多くの文字のTUT内の単語、シンボルが(。 、ua)(eしかし、コウモリ、賭け)のような音になっているそれぞれ-これらは(のためにASCIIの代替品ですʌ æ ɛ)リンク先の記事))))


1
2倍の大文字をサポートする必要がありますか?AASKWEREまたはのツタンカーメン翻訳は何skwerEですか?三重の文字はどうですか?それはwakswakswaksskwerwakswakswaksskwerwaks、あるいはkyubwaks、または私達は選ぶことができますか?
John Dvorak

1
rrdに変換する必要がありskwerruddudます。そのままにしておけskwerrutdudますか?
John Dvorak

@JanDvorak-はい、大文字小文字を区別せずに、二重の文字を処理する必要があります。入力(0、 'AA SKWERE skwerE')には出力(1、 'ee SUSKAKWAKSIRUTI suskakwaksirutI')が必要です。有効な入力の出力として 'AA'と 'skwerE'が発生しないため、入力(1、 'AA')と(1、 'skwerE')は無効です。入力(1、 'SKWERE')には出力(0、 'EE')が必要です。3文字以上の文字列は、倍数の数と見なされ、1つの文字が後に続く可能性があります。入力(0、 'rrd')には出力(1、 'skwerruddud')が必要です。
2013年

ええと...どう0,"AA"翻訳するの1,"ee"?に関しては1,"SKWERE"、私はあなたがそう0,"AA"ではなかったと思います0,"EE"
John Dvorak

1
@psxls-意図した(0、rd_RD_rD_Rd)->(1、ruddud_RUDDUD_rutDUD_RUTdud)および(0、aa_AA_aA_Aa)->(1、skwere_SKWERE_eE_Ee)。ルール(3)は、TUTの単語「skwere」と「SKWERE」に適用されます
res

回答:


6

ルビー、 310 311文字

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

正しく処理します:

  • 大文字の2乗(反復をマージして固定解除すると18文字になります)
    • AA変わる場合はskwerE、行#3と#4を入れ替えます
    • 私はまた、仮定aAAaに変わるはずですeEし、Eeそれぞれ
  • rrd `skwerruddudに変換されます(unfixは3文字になります)
  • 立方体では、最初のペアは正方形として報告されます。rrrdに変わりskwerrutruddudます。rrrrdなるskwerrutskwerruddud
  • これで出力は有効な入力になります。それは確かに、仕様で要求されています
  • 入力ターミネータとして改行を使用します

入力では、インジケーターと文字列の間に改行がない必要があり、出力ではそこに配置されます(修正:1文字)。STDINとの混合を防ぐために、この時点でコンソール出力は抑制されました。修正は無料で、少し醜いです。

入力例:

0Hello

出力:

1
HASHiskwerlulo

入力と出力に同じ形式を使用する必要があるかどうか迷っていましたが、質問では明確ではなかったので...この答えは私には問題ありません(これまでのところ、答えについていくつかのテストをすぐに実行します) )。
2013年

私はなぜ知っているが、私のために、あなたのプログラムが実行されていない-の両方のオンラインおよびオフ-場合にのみgetcが付いているSTDIN.(6文字以上)。
2013年

jRuby IRB 1.7.5(2.0.0)を使用していますが、警告しか表示されません。どのバージョンを使用していますか?
John Dvorak

マップを作成するための省略形が好きです。私はそれを完全に含めました。それは私がそれを倒すことはほとんどありません。
Johannes Kuhn

1
@res入力/出力の要件は明確だったと思います。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).しかし、それを修正するには1文字しかかかりません。
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,$_

テストケース:

OPで提供される(a)、(b)、(c)、(d)テストケースを正常にテストしました。

*多少*より読みやすいバージョン:

($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
いいね!チェックすべきいくつかの良いテストケース、私にはやるべきことがたくさんあるようです!私はあなたに簡単に見て持っていたし、私はあなたが裸の単語使用の代わりに、QW(変化オフ数バイトをノックすることができると思うqw(bub kut ... yak zuz)(bub,kut ... yak,zuz)も、置き換えることができる、)keys%x@b(あなたはキーが原因であるか知っているので$x)。さらに3つを保存するための小さな変更は$1eq uc($1)uc$1eq$1です。余分なバイトの印刷の+!を443にドロップすることもできます。それがすべて有効であることを願って、限られたテストケースをテストしました!
Dom Hastings

うーん、uc$1eq$1そうである必要があるかもしれませんがuc$1 eq$1、私は確かではありません...それが間違っている場合はごめんなさい!
Dom Hastings

ヒントをドムに感謝します!あなたは私に10文字を節約しました。まだ改善の余地があります、私は仕事に戻ります.. :)
psxls

2

APL(ダイログ)(372)

APLに組み込みの文字列処理関数がないことを本当に伝えることができます(一般的な配列のものを除く)。私は自分で書く必要がありましたtolower(それはですL)。マルチラインDyalog APLの場合と同様に、テストするには、編集ウィンドウに貼り付けて呼び出します(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↓⍵}⍺}⎕

使用法:

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

ノート:

  • 用途skwerruddudのためにrrd
  • skwereskwereeのためにaaaaa

入力例:

0Hello

出力:

1HASHiskwerlulo

使い方:

  • m 最初は文字列です。
  • 大文字のマップと連結します。
  • [文字列マップ]はほとんどのことを行います(リストを使用するので、有効なリストであれば何でも...)
  • ダブル文字の正規表現。特殊な置換文字()を使用します。

ベンガル語Abugida、どのようにしてそのキャラクターを選びましたか?
カヤ

\ufffちゃんと覚えたら。本当に重要ではありません。ASCII以外の文字であれば問題ありません。
Johannes Kuhn

だった\u999。言ったように、唯一の重要なことは、アスキー文字ではないということでした。
Johannes Kuhn

@JohannesKuhn例(c)で失敗し、を返します1KWAKWAKSEKS skwerWAKSWAKS RUTskwerrutruddud dudskweriskweriipup
psxls 2013年

正しい@psxls:A doubled letter is replaced by `skwer` followed by the TUT word for that letter.なし言及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"$- $_"}

構文ハイライターはこれを嫌っています...

STDINへの入力が必要です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."

編集する:Xの翻訳に問題があることに気付きました(復帰すると「aks」になります。これについては後で調べます。ハッシュの順序を変更する必要があるかもしれません:(。


1
Xとは別に、OPの例(b)、(c)でも失敗し、私の回答でテストケース(e)および(g)も確認します。
psxls 2013年

これは非常に真実です。設計図に戻ります。
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.*//

私は今のところ終わっていますが、おそらく短縮することができます。

ルックアップテーブルを使用して両方向の変換を処理します。skwerケースとruddud / RUDDUDを含むすべての例外を正しく処理する必要があります。

文字列が後に続く0/1として各行に入力されます。\v(垂直タブ)をカーソルとして使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.