Decifrar sapos neuróticos
Agora que o Puzzling.SE finalmente quebrou minha cifra obcecada por anfíbios , vamos escrever um programa ou função para descriptografá-la!
(Se você quiser ver o quebra-cabeça antes de estragá-lo, clique no link acima agora.)
Como a cifra funciona
Em Neurotic Frogs O ught Para Rel um x em M ud Banhos ( "Neurotic Frogs" para o short), cada letra é criptografada como uma ou duas palavras:
- O comprimento de uma palavra em itálico representa uma letra.
neurotic
=> 8 letras =>H
frogs
=> 5 letras =>E
perpendicular
=> 13 letras =M
- Uma palavra que contenha itálico modifica a palavra a seguir, adicionando 10 se a palavra em itálico tiver tamanho ímpar ou 20 se a palavra em itálico tiver tamanho par. Qualquer uma ou todas as palavras podem estar em itálico. Uma palavra em itálico é sempre seguida por uma palavra não em itálico.
*o*ught to
=> ímpar, 2 => 12 =>L
lo*u*nging calms
=> par, 5 => 25 =>Y
Toda palavra de texto simples corresponde a uma frase de texto cifrado, e toda frase de texto simples corresponde a um parágrafo de texto cifrado.
Formato de entrada
Seu programa ou função deve inserir uma mensagem no Neurotic Frogs, formatado em Markdown. A entrada consistirá apenas em ASCII imprimível e novas linhas.
- As palavras são séries de caracteres que correspondem ao regex
[A-Za-z0-9']
.- Números e letras contam para o comprimento de uma palavra.
QB64
representaD
. - NOTA: Os apóstrofos não contam para o comprimento de uma palavra.
Isn't
representaD
, nãoE
.
- Números e letras contam para o comprimento de uma palavra.
- As letras em itálico são colocadas em um par de asteriscos (
*letters*
).- Uma ou mais letras consecutivas podem estar em itálico, com uma palavra inteira (
masseus*es*
,*all*
); várias letras não consecutivas em uma palavra também podem estar em itálico (g*e*n*e*rates
). - O itálico nunca abrange várias palavras, nunca inclui pontuação e nunca inclui apóstrofos.
- Asteriscos não emparelhados e vários asteriscos adjacentes nunca ocorrerão.
- Uma ou mais letras consecutivas podem estar em itálico, com uma palavra inteira (
- A pontuação é qualquer um dos seguintes caracteres:
.,?!:;-()"
.- As palavras em uma frase são separadas por um ou mais caracteres de pontuação e / ou um único espaço. Exemplos:
*all* welcomed
,toad*s*, newts
,Ever*y*one--frogs
,cap... bliss
,they're (I
- As frases terminam com um ou mais caracteres de pontuação e são separadas por um espaço duplo:
Th*e* Montgomery A*m*phibian Salon! Come luxuriate today!
- Os parágrafos são separados por uma única nova linha. (A última frase de um parágrafo ainda possui um ou mais caracteres de pontuação no final.)
- As palavras em uma frase são separadas por um ou mais caracteres de pontuação e / ou um único espaço. Exemplos:
Outros caracteres não aparecerão na entrada e não precisam ser manipulados.
Seu código pode, a seu critério, esperar que a entrada tenha uma única nova linha à direita.
Formato de saída
O resultado da descriptografia da entrada será uma ou mais frases. Letras em texto sem formatação podem ser qualquer combinação de maiúsculas e minúsculas. As palavras em uma frase devem ser separadas por espaços únicos. As frases devem terminar com um ponto ( .
) e ser separadas por um único espaço. Você pode gerar um espaço à direita após a última frase. Sua saída estará toda em uma linha, mas você poderá gerar uma nova linha à direita.
Detalhes diversos
Seu código pode usar qualquer um dos métodos padrão de entrada e saída. Ele deve receber entrada como uma sequência de linhas múltiplas, não como uma lista ou outra estrutura de dados e deve gerar uma sequência de caracteres.
O código mais curto em bytes vence!
Casos de teste
-->
Neurotic Frogs *O*ught To Rel*a*x In *M*ud Baths!
<--
HELLO.
-->
Business standards all*o*w only *adult* amphibians.
<--
HINT.
-->
Rejoice, *a*ll frogs an*d* toads also! Montgomery Sal*o*n opens up! Ha*pp*y throng fill*s* street ecstatically!
<--
GOOD JOB PPL.
-->
I like 3.1415926535897.
IM*O*, it's a *b*la*st*, yeah!
<--
ADAM. MAN.
-->
*I*, happily, *th*anks 2 u *e*ditin*g* specific wor*ding*--clarifying a *bit*--betterment :D!
<--
QUARTATA.
-->
Perpendicular l*ou*nging calms. *A* frog, a m*u*d cap... bliss! Wallowing g*e*n*e*rates happiness. Amphibian sp*a* isn't expensive--seventy d*o*llars--cheap! That'*s* not *a* large e*x*pens*e* from an*y* discerning fr*o*g's money, unlik*e* Super 8.
Ever*y*one--frogs, toad*s*, newts, *a*nd salamanders! G*e*t a wonderful shiat*s*u, or recei*v*e an other kind. Masseus*es* are her*e* today! Invite a fianc*e*e, supervisor, roommate, niece: *all* welcomed!
Y*o*u simply ne*v*er believed these p*o*ssibilitie*s*; they're (I *swear*) absolute truth! Th*e* Montgomery A*m*phibian Salon! Come luxuriate today!
<--
MY NAME IS INIGO MONTOYA. YOU KILLED MY FATHER. PREPARE TO DIE.
fonte
Respostas:
Perl, 72 bytes
Contando o shebang como um, a entrada é obtida de stdin.
Uso da amostra
fonte
JavaScript (ES6),
172169157150 bytesGuardado 10 bytes graças a @Neil
Provavelmente pode ser melhorado ainda mais. Saídas em minúsculas.
fonte
i=0
para otoString
.x=>x.replace(/([\w*']+)[^\w\n*' ]* ?( ?)/g,(_,y,z)=>/\*/.test(y,l=y.replace(/'/g ,"").length)?(i=l%2||2,""):l+i*10+9).toString(36,i=0)+z,i=0).replace(/\n|$/g,". ")
.replace
e usar apenas.match
salvou outros 12 bytes.Python 2,
238221218214207205 bytesUsa muita regex para fazer o processamento. Transformamos o espaço duplo
~
e o usamos para processá-lo.~
e\n
são tratados especialmente.O maior ganho de caractere vem do pré-processamento da entrada no
for
linha; isso definitivamente pode ser ainda mais jogado.Ideone it!(todos os casos de teste)
Economizou 7 bytes graças ao DLosc!
fonte
Pip ,
6564 bytesA pontuação é 62 bytes de código + 2 para os
-rs
sinalizadores.Experimente online!
Explicação
A
-r
bandeira lê todas as linhas de stdin e armazena uma lista delasg
. O-s
sinalizador define o formato de saída das listas como separado por espaço.A maneira mais fácil de ler esse código é de fora para:
fonte
Python 2.7,
390342341339335 bytes:Recebe entrada no formato:
F('''Multi or Single-lined String''')
Pode ser jogado muito mais, o que farei sempre que tiver a chance.
Repl.it com todos os casos de teste!
Explicação:
Usa o imenso poder dos built-ins de expressão regular do Python para decifrar a entrada. Este é o processo fundamental pelo qual a função passa para cada entrada:
Primeiro, todos
--
são substituídos por um único espaço e todos os apóstrofos são removidos. Em seguida, todas as palavras que contêm componentes em itálico e a palavra que a segue são correspondidas em uma sequência e substituídas pelo10 + len(second word)
número dea
s consecutivos, se o comprimento da primeira palavra forodd
, e20 + len(second word)
consecutivos,a
caso contrário. Isso faz uso da seguinte expressão regular:[^\w\s*]*\w*\*\w+\*.*?(?=\s) \w+
Por exemplo, se tivermos a sentença
Perpendicular l*ou*nging calms.
,l*ou*nging calms
ela será substituída poraaaaaaaaaaaaaaaaaaaaaaaaa
ou 25a
s, poisl*ou*nging
possui um número par de caracteres ecalms
possui 520+5=25
..Agora, a entrada recém-modificada é dividida em cada sinal de pontuação, seguida por uma nova linha (
\n
) para obter os parágrafos; depois, cada parágrafo é dividido em cada pontuação, seguido por 2 espaços para obter as sentenças e, finalmente, cada frase é dividida em palavras. qualquer pontuação, incluindo um espaço. Então, para cada palavra (incluindo as execuções dea
s consecutivas ), adicionamos a uma sequênciaW
a letra correspondente ao ponto de código unicode64
(o ponto de código unicode do caractere anteriorA
, que é@
) maislen(word)
. Em seguida, adicionamos um único espaço aW
uma vez que todas as palavras de uma frase foram esgotadas e, quando todas as frases em um parágrafo foram esgotadas, adicionamos um.
seguido por um único espaço.Finalmente, depois de toda a entrada ter sido processada,
W
é emitidastdout
como a mensagem decifrada.fonte
re
, use emsub
vez destr.replace
. Sugestão de golfe mais geral: provavelmente é mais eficiente tratar tudo que não é uma palavra ou*
pontuação. Economiza em grandes classes de personagens.PHP, 196 bytes
Se eu pudesse assumir que existe apenas um apóstrofo no meio de uma palavra 194 bytes
fonte
%0A
como uma funçãorawurlencode("\n")
. Eu prefiro, neste caso, um formulário com um textarea para a entrada e assim o meu site html torna automaticamente para codificar a string<?
. Um erro pertence a$_GET[s]
ele, mas o correto é$_GET["s"]
e é melhor declarar e inicializar a variável$p=0;
antes do loop. Agora, minha pergunta para você é: Posso assumir que em uma Palavra existe apenas um apóstrofo no meio da Palavra?<?php
funcionou.<?
na realidade. Eu uso a tag curta apenas no meu post aqui. Agora eu sei que ele pode ser exibido novamente em uma página em branco.PHP,
231226228 bytespara começar
Salvar no arquivo, rund
php <scriptpath> <text>
. Escape de novas linhas no texto para fazê-lo funcionar com casca.fonte
$argv[1]
, mas não sei como essa abordagem funcionará quando as entradas contiverem novas linhas. Tentei"Neurotic Frogs *O*ught To Re*a*x In *M*ud Baths!"
como argumento da linha de comando e obtiveIFHCHCFF.
a saída (assim como umUndefined variable: d
aviso).<?
, salvá-lo em um arquivo e chamá-lo comphp <filename> <string>
. Talvez eu precise adicionar 2 à contagem de bytes.<?
, também pode terminar com?>.
, para um ganho líquido de 1. FWIW, receboIFHCMFF.
o primeiro caso de teste (usando o PHP 5.5.21 de 64 bits, VC14). Usar$argn
com-F
também pode ser uma opção.php <filename> <string>
is possible when<string>
can contain newlines.