Acme Canine Decoder 2000 do professor Schwartzman

31

Introdução

Nós - especialmente os nerds entre nós, que tendem a ser fãs - todos nos lembramos desse velho desenho animado do Far Side :

Ei!  Ei!  Ei!

Claramente, o professor Schwartzman poderia ter aprimorado suas habilidades de programação apenas um pouquinho mais antes de usar sua invenção. Mas você pode replicar você mesmo ... usando o mínimo de bytes possível?

Especificações de entrada

Você deve criar um script que traduza os sons de cães em "Hey" s entonados adequadamente. Isso é puro código de golfe; o menor número de bytes vence.

Sua entrada consistirá em alguma combinação dos seguintes tokens:

  • Bark, Baark, Baaark, Baaaark, ... (isto é, B*rk com pelo menos um asubstitui o asterisco)
  • Woof, Wooof, Woooof, ... ( W*fcom, pelo menos, 2 o s substituindo o asterisco)
  • Grr, Grrr, Grrrr, ..., ( Gseguido por, pelo menos, 2 r s)
  • Qualquer número de caracteres .(ponto), !(ponto de exclamação) e / ou ?(ponto de interrogação), que pode ocorrer em qualquer lugar da entrada

Note-se, mais uma vez, que os Woofbaseados e Grrfichas baseados sempre requerem pelo menos duas o s e rs, respectivamente; Wofe nãoGr são tokens válidos.

Não há limite para a duração de um token (por exemplo, quantos as repetidos podem existir em um Barktoken); no entanto, seu decodificador só precisa funcionar corretamente para tokens de entrada com até 10a s, os ou rs totais para passar nesse desafio.

Especificações de saída

Fiel ao design de Schwartzman, seu programa de decodificador canino deve processá-lo no texto de saída da seguinte maneira:

  • Bark, Woofe Grrtorne - se Hey;
  • Baark, Wooofe Grrrtorne - se Heyy;
  • Baaark, Woooofe Grrrrtorne - se Heyyy; etc.
  • Para Barktokens com base em todos , o número de ys no Heytoken com base na saída deve ser igual ao número de as;
  • Para Wooftokens com base em todos , o número de ys no Heytoken com base na saída deve ser um a menos que o número de os;
  • Para Grrtokens com base em todos , o número de ys no Heytoken com base na saída deve ser um a menos que o número de rs;
  • Todas as pontuações ( ., !e ?) permanecem inalteradas.

Lembre-se de retirar um yda saída apenas por se Woofes Grr! A entrada Baaaaaaaark?, com 8 as, se tornará Heyyyyyyyy?, com um conjunto correspondente de 8 ys. No entanto, Woooooooof?torna-se apenas Heyyyyyyy?, com 7 ys.

Novamente, se você conseguir que seu programa funcione para tokens de entrada de tamanho ilimitado, isso é ótimo, mas para os propósitos deste desafio, seu programa será verificado apenas para garantir que funcione corretamente para tokens de entrada que não tenham mais que 10 letras repetidas .

Todos Bark-, Woof-, e Grros tokens baseados em sua entrada são assumidos para começar com letras maiúsculas. Portanto, não há nenhuma necessidade de viragem alça Bark grrrem Hey heyyou qualquer coisa semelhante.

Exemplo de entradas e saídas

    • Entrada: Bark. Bark! Bark!!
    • Saída: Hey. Hey! Hey!!
    • Entrada: Baaaaaark?(seis as)
    • Saída: Heyyyyyy?(seis ys)
    • Entrada: Grrrrrrrr...(oito rs)
    • Saída: Heyyyyyyy...( sete y s)
    • Entrada: ?...!
    • Saída: ?...!
    • Entrada: Wooof Woof? Grrrr. Baaaark Grr!
    • Saída: Heyy Hey? Heyyy. Heyyyy Hey!
A. Mirabeau
fonte
10
Olá e bem-vindo ao site! Para que você saiba, é habitual neste site aguardar um pouco antes de aceitar a resposta mais curta. Convido você a não aceitar a resposta que aceitou e aguarde até que a atividade dessa questão acabe antes de aceitar a resposta mais curta. Isso também incentivará mais respostas.
DJMcMayhem
Relacionado.
Martin Ender
Obrigado pelas dicas sobre o processo de aceitação. Na verdade, eu estava planejando verificar a lista de respostas a cada poucas horas e, se percebi que havia uma resposta melhor, aceitá-la. Desculpe por alguém que eu possa ter negado reputação aqui.
Mirabeau A.
5
@ A.Mirabeau Isso é honroso e como funcionaria idealmente, mas algumas pessoas não são tão atenciosas, então a maioria dos respondentes pode assumir que o vencedor já foi escolhido. Embora não haja nada de errado em escolher um vencedor imediatamente, se você estiver planejando atualizá-lo, provavelmente obterá menos respostas por causa disso, além de algumas reclamações, por isso é melhor esperar pelo menos uma semana.
Martin Ender

Respostas:

16

Retina , 24 18 17 16 bytes

1 byte salvo com base em uma ideia na resposta do MT0.

\wf?k?
y
\byy
He

Experimente online!

Explicação

\wf?k?
y

Isso simplesmente transforma todas as letras em y, mas se elas são seguidas por um fou knós as substituímos imediatamente também. Removendo fe k"normalizamos" os comprimentos das palavras, para que agora todos tenham mais dois ys do que precisam.

\byy
He

Isso transforma as duas primeiras yde cada palavra He, completando a transformação.

Martin Ender
fonte
A resposta mais eficiente até agora, bem feita. Ainda não vou aceitar, mas posso lhe dizer que você merece o CAT FUD.
A. Mirabeau
10

Perl, 51 41 39 bytes

s/(G.|[BW]..)(\w+)/He."y"x length$2/ge

Uso

perl -pE 's/(G.|[BW]..)(\w+)/He."y"x length$2/ge'

Entrada

Bark. Bark! Bark!!
Baaaaaark?
Grrrrrrrr...
?...!
Wooof Woof? Grrrr. Baaaark Grr!

Saída

Hey. Hey! Hey!!
Heyyyyyy?
Heyyyyyyy...
?...!
Heyy Hey? Heyyy. Heyyyy Hey!

Como funciona

Substituição simples de regexp usando a impressão automática -padicionando 1 byte à contagem. /geexecuta a substituição para cada padrão e executa a substituição como código.


Uma versão mais antiga usava uma detecção de três vias, mas Martin Ender percebeu que eu não era agressivo o suficiente, o que me salvou em 10 bytes.

O msh210 me informou que você não precisa de aspas na string He, economizando dois bytes.

tubo
fonte
2
Melhor até agora, parabéns.
A. Mirabeau
1
@ A.Mirabeau Obrigado, isso é um elogio, considerando que acabei de me registrar aqui há alguns minutos!
pipe
Ter três soluções é motivador, considerando que acabei de me registrar aqui há algumas horas.
A. Mirabeau
1
Você não precisa de aspas He.
msh210
@ msh210 Interessante, não sabia que você podia omiti-los lá!
pipe
5

Python, 106 bytes

f=lambda s,a="B,He,Gr,He,Wo,He,a,y,r,y,o,y,f,,yk,".split(","):s if a==[]else f(s.replace(a[0],a[1]),a[2:])

Demo

https://repl.it/C6Rr

Chuck Morris
fonte
Embora não seja a resposta aceita, essa merece uma menção honrosa por ser a solução mais eficiente em bytes que altera apenas as três palavras-chave necessárias na linguagem do cão.
A. Mirabeau
4

JavaScript (ES6) - 57 55 52 51 bytes

f=s=>s.replace(/\wk?f?/g,'y').replace(/\byy/g,'He')

Teste:

f=s=>s.replace(/\wk?f?/g,'y').replace(/\byy/g,'He');

[
  'Bark. Bark! Bark!!',
  'Baaaaaark?',
  'Grrrrrrrr...',
  '?...!',
  'Wooof Woof? Grrrr. Baaaark Grr!'
].forEach( s=>{console.log( f(s) );} );

Agradecemos a @MartinEnder pelos bytes 56 e 51 e a inspiração para algumas das outras aparas.

MT0
fonte
4

Vimscript, 51 39 37 33 32 29 28 bytes,

%s/\hk\?f\?/y/g|%s/\<yy/He/g

Créditos Regex para barbear mais 9 bytes: MT0, Martin Ender, msh210

asciicast Demo

Explicação:

                               1. Normalize words to same length & replace letters with ys 

%s                             Regex search and replace 
  /                            Regex search begin
   \hk\?f\?                    Find any letter (\h) optionally followed by k or f
           /                   Regex search end and replace start
            y                  Replace with y
             /                 Replace end
              g                Replace globally

               |               New command

                               2. Overwrite first two y of every word with He

                %s             Regex search and replace
                  /            Regex search begin
                   \<yy        Find yy at a word's beginning
                        /      Regex search end and replace start
                         He    replace with He
                           /   Replace end
                            g  Replace globally
starcorder
fonte
1
Não conheço o Vimscript, mas você pode usar em \<yyvez de \<\hy?
Msh210
@ msh210 sim, é possível e eu atualizei a solução, graças
starcorder
2

Perl 5, 25 bytes

Uma cópia Perl da resposta de Martin Ender Retina . 24 bytes, mais 1 para em -pevez de -e.

s;\wf?k?;y;g;s;\byy;He;g
msh210
fonte
2

Javascript, 72 66 64 bytes

f=
t=>t.replace(/k|f/g,'').replace(/\w/g,'y').replace(/\byy/g,'He')

Editar: separado f=e função + contagem reduzida de bytes

starcorder
fonte
1
Você não precisa do f=(como padrão do PPCG), então 64 bytes funcionam.
Rɪᴋᴇʀ
@ EᴀsᴛᴇʀʟʏIʀᴋ Ótimo, eu não sabia disso
starcorder
1

Pyke, 35 bytes

.cFDlR\G.^+3-\y*"He"R+)Rdc~lL-],AsJ

Experimente aqui!

Gera Heys, gera pontuação, fecha e junta-se

Azul
fonte
1

Python 3, 140 135 134 bytes

from re import*
f=lambda s:''.join('He'+'y'*len(x)+y for x,y in[(a+b+c,d)for a,b,c,d in findall('(?:Wo(o+)f|Gr(r+)|B(a+)rk)(\W+)',s)])

Usando regex para encontrar ocorrências de caracteres substituíveis.

Edit: Golfed 1 byte espaço em branco e 4 bytes para obter os valores do resultado de findall.

Edit2: Golfed 1 byte ("a" de Bark não foi contado corretamente)

Gábor Fekete
fonte