Переводчик языка 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) индикатор i и строка ASCII s .

  • Если i = 0, то s может содержать любой текст ASCII.
  • Если i = 1, тогда s должен быть выходом языка TUT для некоторого допустимого ввода.

Выход (в стандартный вывод): двоичный (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.')

(Б)

(0, '"Mrs. Hogwallop up and R-U-N-N-O-F-T."')
(1, '"MUMrutsus. HASHojugwakseskwerlulopup yupup enundud RUT-YU-NUN-NUN-O-FUF-TUT."')

( в )

(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
мы должны поддерживать двойной заглавные буквы? Что тут перевод 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»). Строка из трех или более букв должна рассматриваться как некоторое число двойных чисел, за которыми, возможно, следует одна. Input (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».
Рез.

Ответы:

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 (нефикс получает 3 символа)
  • в кубах первая пара указывается как квадрат. rrrdпревращается в skwerrutruddud. rrrrdстановитсяskwerrutskwerruddud
  • вывод теперь является действительным вводом. Это действительно требуется спецификацией
  • использует перевод строки как входной терминатор

Для ввода требуется, чтобы между индикатором и строкой не было новой строки, вывод выводит ее туда (исправление: 1 символ).В этот момент вывод на консоль подавлен, чтобы предотвратить смешивание с STDIN. Нефиксированный, просто немного страшнее.

Пример ввода:

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) контрольные примеры, представленные в OP.

* Несколько * более читаемая версия:

($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
источник
1
Ницца! Несколько хороших тестовых примеров, кажется, у меня много работы! Я быстро взглянул на ваш, и я думаю, что вы можете отбросить несколько байтов, используя голые слова вместо 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 map] выполняет большую часть работы за меня (использует список, поэтому все, что является допустимым списком ...)
  • регулярное выражение для двойных символов. Используйте специальный символ замены ( ).
Йоханнес Кун
источник
Бенгальский Abugida, как вы выбрали этот персонаж?
Кая
\ufffIIRC. Не имеет значения Подойдет любой не-ascii персонаж.
Йоханнес Кун
Это было \u999. Как я уже сказал, единственной важной вещью было: не характер ascii.
Йоханнес Кун
@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 case и ruddud / RUDDUD.

ввод, взятый в каждой строке как 0/1, за которым следует строка. Использует \v(вертикальная вкладка) в качестве курсора.

Hasturkun
источник