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行为的程序:

输入(来自stdin):二进制(0/1)指示器i和ASCII字符串s

  • 如果i = 0,则s可以包含任何ASCII文本。
  • 如果i = 1,则s必须是某些有效输入的TUT语言输出。

输出(至stdout):二进制(0/1)指示器j和ASCII字符串t

  • 如果i = 0,则j = 1,ts TUT语言的转换。
  • 如果 = 1,则Ĵ = 0和是翻译小号 TUT语言。
  • 对于任何有效的输入,将程序应用于其自己的输出必须准确地复制原始输入。即,程序programis))=(is)。输入和输出必须具有完全相同的格式。

得分:得分是程序中字符的数量-得分最低者获胜。

例子

(一个)

(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)都应该表示的(A,E,I,O,U)背诵字母表时通常的声音-即,具有押韵(可,我,我,割草,MEW)在三色或更多个字母的单词TUT,符号(uae分别)都应该声音如(但,蝙蝠,BET) -这些都是ASCII替换(ʌ æ ɛ))。))


1
我们必须支持加倍的大写吗?什么是的啧啧翻译AASKWERE还是skwerE?三重字母呢?是wakswakswaksskwerwakswakswaksskwerwaks,甚至kyubwaks,或者我们可以选择?
约翰·德沃夏克

1
rrd应该翻译成skwerruddud; 我们可以留在skwerrutdud吗?
约翰·德沃夏克

@JanDvorak-是的,无论大小写,都应该处理加倍的字母。输入(0,'AA SKWERE skwerE')应该具有输出(1,'ee SUSKAKWAKSIRUTI suskakwaksirutI')。输入(1,'AA')和(1,'skwerE')无效,因为'AA'和'skwerE'不会作为任何有效输入的输出出现。输入(1,'SKWERE')应该具有输出(0,'EE')。一串三个或三个以上字母的字符串应视为一些双打,可能后面跟一个单打。输入(0,'rrd')应该具有输出(1,'skwerruddud')。
res

呃...怎么0,"AA"翻译成1,"ee"?至于1,"SKWERE",我假设你的意思0,"AA",不是0,"EE"
约翰·德沃夏克

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”
水库

Answers:


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

正确处理:

  • 大写平方(通过合并迭代来取消可获得18个字符)
    • 如果AA应该变成skwerE,交换#3和#4行
    • 我也假设aA并且Aa应该分别变成eEEe
  • rrd 转换为`skwerruddud(unfix获得3个字符)
  • 以立方表示,第一对以正方形表示。rrrd变成skwerrutruddudrrrrd变成skwerrutskwerruddud
  • 输出现在是有效输入。实际上,这是规范要求的
  • 使用换行符作为输入终止符

输入要求指示器和字符串之间没有换行符,输出则将其放在那里(修正:1个字符)。此时控制台输出被抑制,以防止与STDIN混合。Unfix是免费的,有点丑陋。

输入示例:

0Hello

输出:

1
HASHiskwerlulo

我在就是否要求输入和输出具有相同的格式感到不安,但问题尚不明确,因此...这个答案对我来说似乎还不错(到目前为止-我将尽快对答案进行一些测试)。
2013年

我不知道为什么,但是您的程序无论是在线还是离线都可以为我运行(仅getc当前缀为STDIN.(另外六个字符)时)。
res

我正在使用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 2013年

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)。一个小小的改变才能拯救他人三是$1eq uc($1)uc$1eq$1。您也可以将打印+前的!那个多余的字节删除以将您带到443。希望这一切都是有效的,我已经测试了有限的测试用例!
Dom Hastings

嗯,uc$1eq$1可能必须是uc$1 eq$1,但我不确定...对不起,如果错了!
Dom Hastings

感谢Dom的提示!您救了我10个字符。仍有改善的空间,我会恢复工作.. :)
psxls

2

APL(Dyalog)(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]]}

笔记:

  • 用途skwerruddudrrd
  • skwereskwereeaaaaa

输入示例:

0Hello

输出:

1HASHiskwerlulo

怎么运行的:

  • m 在字符串的开头。
  • 我用大写字母来表示它。
  • [string map]为我做了大部分工作(使用列表,所以任何有效列表...)
  • regexp为双字符。使用特殊的替换字符()。

孟加拉Abugida,您如何选择该角色?
卡亚

\ufffiirc。没关系。任何非ascii字符都可以。
Johannes Kuhn

\u999。正如我所说,唯一重要的是:不是ASCII字符。
Johannes Kuhn 2013年

@JohannesKuhn在示例(c)中失败,返回1KWAKWAKSEKS skwerWAKSWAKS RUTskwerrutruddud dudskweriskweriipup
psxls

@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

这是很对的,回到绘图板上!
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.*//

尽管我现在已经完成了,但是可能可以将其缩短。

使用查找表双向处理转换,应正确处理所有例外情况,包括串字型和ruddud / RUDDUD。

每行输入为0/1,后跟字符串。使用\v(垂直选项卡)作为光标。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.