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

다음과 같은 입출력 동작으로 프로그램을 작성하십시오.

입력 (표준 입력에서) : 진 (0/1) 표시 내가 하고 ASCII 문자열 .

  • 경우 내가 = 0 다음 의는 어떤 ASCII 문자를 포함 할 수 있습니다.
  • 경우 = 1 다음, S는 어떤 유효한 입력 용 TUT 언어 출력한다.

출력 (stdout으로) : 이진 (0/1) 표시기 j 및 ASCII 문자열 t .

  • 경우 0 다음 = J = 1 및 t는 번역 인 TUT 언어.
  • 경우 다음에 1 = J = 0 및 t는 번역 인 S 에서 TUT 언어.
  • 유효한 입력의 경우 프로그램을 자체 출력에 적용하면 원래 입력을 정확하게 재현해야합니다. 즉, program ( program ( 프로그램 ( i , s )) = ( i , s )입니다. 입력과 출력은 정확히 같은 형식이어야합니다.

채점 : 점수는 프로그램의 문자 수입니다. 최저 점수가 이깁니다.

(ㅏ)

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

(비)

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

(((제외 발음에 대해 : 모음 (의 혀 단어 e, i, ay, o, yu- (즉,로 운 수 있음), 전자 알파벳을 낭송 할 때 (난, O는 유)의 일반적인 소리를 표현하기 위해 가정된다 나, 내,), 갈매기를 깍는 세 또는 - 더 - 편지 혀의 즉, 기호 (. u, a, e)에서 (그러나, 박쥐, 내기로 소리를 해야하는)는 각각 - 이들에 대한 ASCII 교체입니다 ( ʌ æ ɛ)를 링크 된 기사에서).)))


1
대문자 두 배를 지원해야합니까? 무엇의 혀를 번역이다 AA, SKWERE또는 skwerE? 3 배 문자는 어떻습니까? 그것은입니다 wakswakswaks, skwerwakswaks, waksskwerwaks, 또는 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')이 있어야합니다. 세 개 이상의 문자로 된 문자열은 두 배의 숫자로 간주되어야하며 그 뒤에는 단일 문자가 있어야합니다. 입력 (0, 'rrd')은 출력 (1, 'skwerruddud')을 가져야합니다.
입술

어 ... 어떻게 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"에 적용됩니다.
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==""

올바르게 처리합니다.

  • 제곱 대문자 (반복 병합으로 수정되지 않음)
    • 경우 AA에 설정해야 skwerE스왑 라인 # 3, # 4,
    • 나는 또한 가정 aAAa로 설정해야 eE하고 Ee각각
  • rrd `skwerruddud로 변환합니다 (unfix는 3 문자를 얻습니다)
  • 큐브에서 첫 번째 쌍은 사각형으로보고됩니다. rrrd로 바뀝니다 skwerrutruddud. rrrrd된다skwerrutskwerruddud
  • 출력은 이제 유효한 입력입니다. 그것은 실제로 사양에 필요합니다
  • 줄 바꿈을 입력 종결 자로 사용

입력은 인디케이터와 문자열 사이에 줄 바꿈이 없어야하며 출력은이를 수정합니다 (수정 : 1 자).STDIN과의 혼합을 방지하기 위해이 시점에서 콘솔 출력이 억제되었습니다. 무료로 수정하십시오. 조금 더 추악합니다.

입력 예 :

0Hello

산출:

1
HASHiskwerlulo

입력 및 출력이 동일한 형식 을 갖도록 요구하는지에 대해 진동하고 있었지만 질문에서 명확하지 않았으므로 ...이 답변은 나에게 잘 보입니다 (지금까지-답변에 대한 테스트를 곧 실행하겠습니다) ).
입술

왜 그런지 모르겠지만 (6 문자 이상) 접두사가있는 경우에만 프로그램이 온라인 과 오프 모두에서 실행됩니다 . getcSTDIN.
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)..
Johannes Kuhn

3

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
좋은! 좋은 테스트 사례를 확인해야 할 일이 많이 있습니다. 나는 당신을 간단히 살펴 했어 난 당신이 (변경 사용 barewords 대신 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

팁 주셔서 감사합니다! 당신은 저에게 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, 그 캐릭터를 어떻게 선택 했습니까?
카야

\ufffiirc. 정말 중요하지 않습니다. ASCII가 아닌 캐릭터라면 가능합니다.
Johannes Kuhn

이었다 \u999. 내가 말했듯이, 유일한 중요한 것은 : ASCII 문자가 아닙니다.
Johannes Kuhn

@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

펄 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.*//

내가 지금 끝났지 만 아마 단축 될 수 있습니다.

조회 테이블을 사용하여 양방향 변환을 처리하며, skwer case 및 ruddud / RUDDUD를 포함한 모든 예외를 올바르게 처리해야합니다.

각 행에서 0/1로 입력 된 다음 문자열. 용도 \v커서로 (수직 탭).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.