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

Напишіть програму з такою поведінкою вводу-виводу:

Вхід (від stdin): двійковий (0/1) індикатор i та рядок ASCII s .

  • Якщо i = 0, то s може містити будь-який текст ASCII.
  • Якщо i = 1, тоді s повинен бути вихідним мовою TUT для деякого допустимого вводу.

Вихід (до stdout): двійковий (0/1) індикатор j та рядок ASCII t .

  • Якщо i = 0, то j = 1 і t - переклад s на мову TUT.
  • Якщо i = 1, то j = 0 і t - це переклад s з мови TUT.
  • При будь-якому дійсному введенні програма, застосовуючи програму до власного виводу, повинна точно відтворювати вихідний вхід; тобто програма ( програма ( i , s )) = ( i , s ). Вхід і вихід повинні мати абсолютно однаковий формат.

Підрахунок балів : оцінка - це кількість символів у програмі - найнижча кількість виграшів.

Приклади

(а)

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

( г )

(0, 'aa AA aA Aa rd RD rD Rd')
(1, 'skwere SKWERE eE Ee ruddud RUDDUD rutDUD RUTdud)

((( В сторону про вимові: The TUT слова для голосних ( e, i, ay, o, yu) повинні представляти звичайні звуки (а, е, я, о, і) при читанні алфавіту - тобто, рими з (може , мені, моє, косити, линьки) в ТДВ слів три або більше-букви, символи (. u, a, e) , як передбачається, звук , як і в (але, кажан, бет) , відповідно - це ASCII замінники ( ʌ æ ɛ) у пов'язаній статті.)))


1
чи ми повинні підтримувати подвійні великі регістри? Що таке tut переклад AA, SKWEREабо skwerE? А як щодо потрійних букв? є те wakswakswaks, skwerwakswaks, waksskwerwaksабо навіть 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".
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==""

Правильно ручки:

  • Великий регістр у квадраті (виправити шляхом об'єднання ітерацій набирає 18 символів)
    • якщо AAслід перетворитись skwerE, поміняйте рядки №3 та №4
    • Я також припускаю aAі Aaповинен перетворитись eEі Eeвідповідно
  • rrd перекладається на `skwerruddud (unfix набирає 3 символи)
  • в кубиках перша пара повідомляється як квадрат. rrrdперетворюється на skwerrutruddud. rrrrdстаєskwerrutskwerruddud
  • тепер вихід є допустимим входом. Це, дійсно, вимагає спец
  • використовує новий рядок як вхідний термінатор

Введення вимагає, щоб між індикатором та рядком не було нового рядка, висновок розміщує його там (виправити: 1 символ).Вихід консолі в цій точці пригнічений для запобігання змішування зі STDIN. Unfix безкоштовно, це просто трохи потворніше.

Приклад введення:

0Hello

Вихід:

1
HASHiskwerlulo

Я роздумував над тим, чи потрібно вимагати введення та виводу, щоб мати однакові формати, але це було не ясно в питанні, тому ... ця відповідь мені добре виглядає (поки що - я скоро проведу кілька тестів на відповіді ).
res

Я не знаю, чому, але ваша програма працює для мене - і в Інтернеті, і в режимі вимкнення - тільки якщо getcце префікс STDIN.(ще шість символів).
res

Я використовую jRuby IRB 1.7.5 (2.0.0), і він показує мені лише попередження. Яку версію ви використовуєте?
Джон Дворак

Мені подобається скорочення для створення карти. Я просто включив його повністю. Що робить малоймовірним, що я це переможу.
Йоганнес Кун

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 символ, щоб виправити це.
Йоганнес Кун

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,$_

Тестові приклади:

Я успішно перевірив тести (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. Сподіваюся, це все дійсно, я перевірив обмежені тестові випадки!
Дом Гастінгс

Хммм, це uc$1eq$1може бути uc$1 eq$1, але я не впевнений ... Вибачте, якщо це неправильно!
Дом Гастінгс

Дякую Дому за поради! Ти врятував мені 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 є на початку рядком.
  • Я примирюю це з великою картою.
  • [string string] робить для мене більшість речей (використовує список, тому все, що є коректним списком ...)
  • regexp для подвійних символів. Використовуйте спеціальний символ заміни ( ).

Бенгальська Абугіда, як ти обрав цього персонажа?
Кая

\ufffiirc. Це насправді не має значення. Будь-який персонаж, що не має права
Йоганнес Кун

Це було \u999. Як я вже казав, єдине важливе було: не аськи характер.
Йоганнес Кун

@JohannesKuhn не вдасться в приклад (c), повертається 1KWAKWAKSEKS skwerWAKSWAKS RUTskwerrutruddud dudskweriskweriipup.
psxls

@psxls Це правильно: A doubled letter is replaced by `skwer` followed by the TUT word for that letter.немає згадок про SKWER.
Йоганнес Кун

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

Це дуже правда, повертаємось до дошки для малювання!
Дом Гастінгс

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(вертикальна вкладка) як курсор.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.