Tradutor de idiomas TUT

10

O texto pode ser traduzido para uma versão escrita do idioma TUT , substituindo cada letra pela "palavra TUT" correspondente, conforme indicado na tabela a seguir (adaptada do artigo vinculado) * :

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

Escreva um programa com o seguinte comportamento de E / S:

Input (from stdin): Um indicador binário (0/1) ie uma string ASCII s .

  • Se i = 0, então s pode conter qualquer texto ASCII.
  • Se i = 1, então s deve ser a saída do idioma TUT para alguma entrada válida.

Saída (para stdout): Um indicador binário (0/1) j e uma string ASCII t .

  • Se i = 0, então j = 1 e t é a tradução de s para o idioma TUT.
  • Se i = 1, então j = 0 e t é a tradução de s da linguagem TUT.
  • Para qualquer entrada válida, a aplicação do programa à sua própria saída deve reproduzir exatamente a entrada original; isto é, programa ( programa ( i , s )) = ( i , s ). A entrada e a saída devem ter exatamente o mesmo formato.

Pontuação : A pontuação é o número de caracteres no programa - a pontuação mais baixa vence.

Exemplos

(uma)

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

(((Além cerca de pronúncia: As palavras TUT para as vogais ( e, i, ay, o, yu) é suposto representar os sons habituais de (a, e, i, o, u) ao recitar o alfabeto - ou seja, que rima com (maio , me, meu, cortar, mew) nos três ou mais-palavrões TUT, os símbolos (. u, a, e) é suposto som como em (mas, bastão, aposta), respectivamente - estes são substitutos ASCII para ( ʌ æ ɛ) no artigo vinculado.)))

res
fonte
11
temos que suportar maiúsculas dobradas? Qual é a tradução completa de AA, SKWEREou skwerE? E as cartas triplicadas? é ele wakswakswaks, skwerwakswaks, waksskwerwaks, ou mesmo kyubwaks, ou podemos escolher?
precisa
11
rrddeve traduzir para skwerruddud; podemos deixar como está skwerrutdud?
John Dvorak
@ JanDvorak - Sim, ele deve lidar com letras dobradas, independentemente do caso. A entrada (0, 'AA SKWERE skwerE') deve ter saída (1, 'ee SUSKAKWAKSIRUTI suskakwaksirutI'). As entradas (1, 'AA') e (1, 'skwerE') não são válidas porque 'AA' e 'skwerE' não ocorrem como saídas de nenhuma entrada válida. A entrada (1, 'SKWERE') deve ter saída (0, 'EE'). Uma sequência de três ou mais letras deve ser considerada como um número de duplas, possivelmente seguida por uma única. A entrada (0, 'rrd') deve ter saída (1, 'skwerruddud').
res
uh ... como isso se 0,"AA"traduz 1,"ee"? Quanto a 1,"SKWERE", suponho que você quis dizer 0,"AA", não 0,"EE".
John Dvorak
11
@psxls - pretendi (0, rd_RD_rD_Rd) -> (1, ruddud_RUDDUD_rutDUD_RUTdud) e (0, aa_AA_aA_Aa) -> (1, skwere_SKWERE_eE_Ee). A regra (3) se aplica às palavras TUT 'skwere' e "SKWERE '.
res

Respostas:

6

Rubi, 310 311 caracteres

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

Manipula corretamente:

  • letras maiúsculas ao quadrado (o cancelamento da união das iterações ganha 18 caracteres)
    • se AAdeve se transformar skwerE, troque as linhas 3 e 4
    • Eu também assumo aAe Aadevo me transformar eEe, Eerespectivamente,
  • rrd traduz para `skwerruddud (o unfix ganha 3 caracteres)
  • em cubos, o primeiro par é relatado como um quadrado. rrrdse transforma skwerrutruddud. rrrrdtorna-seskwerrutskwerruddud
  • a saída agora é uma entrada válida. É, de fato, exigido pelas especificações
  • usa nova linha como terminador de entrada

A entrada requer que não exista nova linha entre o indicador e a sequência, a saída a coloca lá (correção: 1 caractere).Saída do console suprimida neste momento para impedir a mistura com STDIN. Sem correção, é apenas um pouco mais feio.

Exemplo de entrada:

0Hello

Resultado:

1
HASHiskwerlulo
John Dvorak
fonte
Eu estava hesitando em exigir que a entrada e a saída tivessem formatos idênticos , mas não ficou claro na pergunta, então ... esta resposta me parece boa (até agora - executarei alguns testes nas respostas em breve) )
res
Não sei por que, mas seu programa é executado para mim - on - line e off- line - somente se getcfor prefixado com STDIN.(mais seis caracteres).
res
Estou usando o jRuby IRB 1.7.5 (2.0.0) e ele me mostra apenas um aviso. Qual versão você está usando?
precisa
Eu gosto da abreviação para criar o mapa. Eu apenas o incluí totalmente. O que torna improvável que eu supere isso.
Johannes Kuhn
11
@res Creio que o requisito de entrada / saída era claro: 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).mas custaria apenas 1 caractere para corrigir isso.
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,$_

Casos de teste:

Testei com sucesso os casos de teste (a), (b), (c) e (d) fornecidos no OP.

Uma versão * um pouco * mais legível:

($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
fonte
11
Agradável! Alguns bons casos de teste para verificar, parece que tenho muito trabalho a fazer! Eu dei uma olhada rápida na sua e acho que você pode digitar alguns bytes usando palavras de barra em vez de qw (mude qw(bub kut ... yak zuz)para (bub,kut ... yak,zuz)), também pode substituir keys%xpor @b(já que você sabe o que são as chaves $x). Uma pequena alteração para salvar outras três é $1eq uc($1)para uc$1eq$1. Você também pode deixar o +antes !da impressão desse byte extra para levá-lo à 443. Espero que tudo seja válido, eu testei casos de teste limitados!
Dom Hastings
Hmmm, uc$1eq$1pode ter que ser uc$1 eq$1, mas não tenho certeza ... Desculpe se isso está errado!
Dom Hastings
Obrigado Dom pelas dicas! Você me salvou 10 caracteres. Ainda há espaço para melhorias, voltarei ao trabalho .. :)
psxls
2

APL (Dyalog) (372)

Você pode realmente dizer que o APL não possui funções de manipulação de seqüência de caracteres incorporadas (exceto as de matriz genérica). Eu tive que escrever o meu próprio tolowerL). Como sempre com o Dyalog APL com várias linhas, para testá-lo, cole-o em uma janela de edição e depois chame-o ( 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↓⍵}⍺}⎕

Uso:

      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."       
marinus
fonte
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]]}

Notas:

  • Usa skwerruddudpara rrd.
  • skwereskwereepara aaaaa.

Exemplo de entrada:

0Hello

Resultado:

1HASHiskwerlulo

Como funciona:

  • m é no início uma string.
  • Eu concordo com o mapa em maiúsculas.
  • [string map] faz a maioria das coisas para mim (usa uma lista, qualquer coisa que seja uma lista válida ...)
  • regexp para para os caracteres duplos. Use um caractere de substituição especial ( ).
Johannes Kuhn
fonte
O Abugida bengali, como você escolheu esse personagem?
KayaNov
\ufffiirc. Realmente não importa. Qualquer caractere não-ascii serviria.
Johannes Kuhn
Foi \u999. Como eu disse, a única coisa importante era: não um personagem ascii.
Johannes Kuhn
@JohannesKuhn falha no exemplo (c), retorna 1KWAKWAKSEKS skwerWAKSWAKS RUTskwerrutruddud dudskweriskweriipup.
Psxls
@psxls O que é correto: A doubled letter is replaced by `skwer` followed by the TUT word for that letter.nenhuma menção a 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"$- $_"}

O marcador de sintaxe odeia este ...

Espera entrada no STDIN, o formato é 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."

Edit : notei um problema com a tradução do X (torna-se 'aks' na reversão, analisarei isso mais tarde. Talvez seja necessário reordenar o hash :(.

Dom Hastings
fonte
11
além de X, ele também falha nos exemplos (b), (c) do OP e também verifica na minha resposta os casos de teste (e) e (g).
Psxls #
Isso é verdade, de volta à prancheta!
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.*//

Provavelmente poderia ser encurtado, embora eu esteja pronto por enquanto.

Usa uma tabela de pesquisa para lidar com conversões em ambas as direções, deve lidar com todas as exceções, incluindo skwer case e ruddud / RUDDUD corretamente.

entrada tomada em cada linha como 0/1 seguida pela sequência. Usa \v(guia vertical) como um cursor.

Hasturkun
fonte