Descifrar ranas neuróticas
Ahora que Puzzling.SE finalmente ha descifrado mi cifrado obsesionado con los anfibios , ¡escribamos un programa o función para descifrarlo!
(Si desea ver el rompecabezas antes de que se lo estropee, haga clic en el enlace anterior ahora)
Cómo funciona el cifrado
En Neurotic ranas O ught Para Rel una x en M ud Baños ( "neurótica ranas" para abreviar), cada letra es encriptada como una o dos palabras:
- La longitud de una palabra sin cursiva representa una letra.
neurotic
=> 8 letras =>H
frogs
=> 5 letras =>E
perpendicular
=> 13 letras =M
- Una palabra que contiene cursiva modifica la siguiente palabra, agregando 10 si la palabra en cursiva tenía una longitud impar o 20 si la palabra en cursiva tenía una longitud par. Cualquiera o toda la palabra puede estar en cursiva. Una palabra en cursiva siempre va seguida de una palabra sin cursiva.
*o*ught to
=> impar, 2 => 12 =>L
lo*u*nging calms
=> par, 5 => 25 =>Y
Cada palabra de texto sin formato corresponde a una oración de texto cifrado, y cada oración de texto sin formato corresponde a un párrafo de texto cifrado.
Formato de entrada
Su programa o función ingresará un mensaje en Neurotic Frogs, formateado en Markdown. La entrada consistirá solo en ASCII imprimible y líneas nuevas.
- Las palabras son series de caracteres que coinciden con la expresión regular
[A-Za-z0-9']
.- Los números y las letras cuentan para la longitud de una palabra.
QB64
representaD
. - NOTA: Los apóstrofes no cuentan para la longitud de una palabra.
Isn't
representaD
, noE
.
- Los números y las letras cuentan para la longitud de una palabra.
- Las letras en cursiva se envuelven en un par de asteriscos (
*letters*
).- Una o más letras consecutivas pueden estar en cursiva, hasta una palabra completa (
masseus*es*
,*all*
); múltiples letras no consecutivas en una palabra también pueden estar en cursiva (g*e*n*e*rates
). - Las cursivas nunca abarcan varias palabras, nunca incluyen signos de puntuación y nunca incluyen apóstrofes.
- Los asteriscos no apareados y los asteriscos adyacentes múltiples nunca ocurrirán.
- Una o más letras consecutivas pueden estar en cursiva, hasta una palabra completa (
- Puntuacion es cualquiera de los siguientes caracteres:
.,?!:;-()"
.- Las palabras dentro de una oración están separadas por uno o más caracteres de puntuación y / o un solo espacio. Ejemplos:
*all* welcomed
,toad*s*, newts
,Ever*y*one--frogs
,cap... bliss
,they're (I
- Las oraciones terminan con uno o más caracteres de puntuación y están separadas por un doble espacio:
Th*e* Montgomery A*m*phibian Salon! Come luxuriate today!
- Los párrafos están separados por una sola línea nueva. (La última oración de un párrafo todavía tiene uno o más caracteres de puntuación al final).
- Las palabras dentro de una oración están separadas por uno o más caracteres de puntuación y / o un solo espacio. Ejemplos:
Otros caracteres no aparecerán en la entrada y no necesitan ser manejados.
Su código puede, a su discreción, esperar que la entrada tenga una nueva línea final.
Formato de salida
El resultado de descifrar la entrada será una o más oraciones. Las letras de texto sin formato pueden ser cualquier combinación de mayúsculas y minúsculas. Las palabras dentro de una oración deben estar separadas por espacios individuales. Las oraciones deben terminar con un punto ( .
) y estar separadas por un solo espacio. Puede generar un espacio final después de la última oración. Todos sus resultados estarán en una línea, pero puede generar una nueva línea final.
Detalles varios
Su código puede usar cualquiera de los métodos estándar de entrada y salida. Debe recibir la entrada como una cadena multilínea, no como una lista u otra estructura de datos, y debe generar una cadena.
¡El código más corto en bytes gana!
Casos de prueba
-->
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.
fuente
Respuestas:
Perl, 72 bytes
Contando el shebang como uno, la entrada se toma de stdin.
Uso de muestra
fuente
JavaScript (ES6),
172169157150 bytesGuardado 10 bytes gracias a @Neil
Probablemente se puede mejorar aún más. Salidas en minúsculas.
fuente
i=0
atoString
.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
y simplemente usar.match
otros 12 bytes guardados.Python 2,
238221218214207205 bytesUtiliza muchas expresiones regulares para hacer el procesamiento. Transformamos el doble espacio en
~
y lo usamos para procesarlo.~
y\n
se manejan especialmente.La mayor ganancia de caracteres proviene del preprocesamiento de la entrada en la
for
línea; Esto definitivamente se puede jugar más golf.Ideone it! (todos los casos de prueba)
¡Guardado 7 bytes gracias a DLosc!
fuente
Pip ,
6564 bytesLa puntuación es de 62 bytes de código + 2 para las
-rs
banderas.Pruébalo en línea!
Explicación
La
-r
bandera lee todas las líneas de stdin y almacena una lista de ellasg
. El-s
indicador establece el formato de salida de las listas en espacios separados.La forma más fácil de leer este código es desde afuera en:
fuente
Python 2.7,
390342341339335 bytes:Toma entrada en el formato:
F('''Multi or Single-lined String''')
Se puede jugar mucho más al golf, lo que haré siempre que tenga la oportunidad.
Repl.it con todos los casos de prueba!
Explicación:
Utiliza el inmenso poder de las expresiones integradas de Python incorporadas para descifrar la entrada. Este es el proceso fundamental por el que pasa la función para cada entrada:
En primer lugar, todos
--
se reemplazan con un solo espacio y se elimina cada apóstrofe. Luego, todas las palabras que contienen componentes en cursiva y la palabra que lo sigue se combinan en una cadena y se reemplazan con un10 + len(second word)
número dea
s consecutivos si la longitud de la primera palabra esodd
, y de lo contrario, s20 + len(second word)
consecutivosa
. Esto utiliza la siguiente expresión regular:[^\w\s*]*\w*\*\w+\*.*?(?=\s) \w+
Por ejemplo, si tenemos la oración
Perpendicular l*ou*nging calms.
,l*ou*nging calms
se reemplazará conaaaaaaaaaaaaaaaaaaaaaaaaa
, o 25a
s, ya quel*ou*nging
tiene un número par de caracteres ycalms
tiene 520+5=25
..Ahora, la entrada recién modificada se divide en cada signo de puntuación seguido de una nueva línea (
\n
) para obtener los párrafos, luego cada párrafo se divide en cada puntuación seguido de 2 espacios para obtener las oraciones, y finalmente, cada oración se divide en palabras a lo largo cualquier puntuación, incluido un espacio. Luego, para cada palabra (incluidas las corridas dea
s consecutivas ), agregamos a una cadenaW
la letra correspondiente al punto de código Unicode64
(el punto de código Unicode del carácter anteriorA
, que es@
) máslen(word)
. Luego agregamos un solo espacio aW
una vez que todas las palabras de una oración se han agotado, y cuando todas las oraciones en un párrafo están agotadas, agregamos un.
seguido de un solo espacio.Finalmente, una vez que se ha procesado toda la entrada,
W
se envíastdout
como mensaje descifrado.fuente
re
, use ensub
lugar destr.replace
. Sugerencia de golf más general: probablemente sea más eficiente tratar todo lo que no es una palabra o una*
puntuación. Ahorra en grandes clases de personajes enormes.PHP, 196 bytes
Si pudiera suponer que solo hay un apóstrofe en medio de una palabra, 194 bytes
fuente
%0A
como una funciónrawurlencode("\n")
. Prefiero en este caso un formulario con un área de texto para la entrada, por lo que mi sitio html hace que codifique automáticamente la cadena<?
. Un error le pertenece$_GET[s]
, pero funciona correctamente$_GET["s"]
y es mejor declarar e inicializar la variable$p=0;
antes del ciclo. Ahora mi pregunta es: ¿Puedo suponer que en una Palabra hay un solo Apóstrofe en el medio de la Palabra?<?php
trabajado.<?
en la realidad. Utilizo la etiqueta corta solo en mi publicación aquí. Ahora sé que puede quedar en una página en blanco.PHP,
231226228 bytespara comenzar
Guardar en archivo, rund
php <scriptpath> <text>
. Escapar de nuevas líneas en el texto para que funcione en shell.fuente
$argv[1]
, pero no sé cómo funcionará ese enfoque cuando la entrada contenga nuevas líneas. Lo intenté"Neurotic Frogs *O*ught To Re*a*x In *M*ud Baths!"
como argumento de línea de comandos y obtuve laIFHCHCFF.
salida (así como unaUndefined variable: d
advertencia).<?
, guardarlo en un archivo y llamar a eso conphp <filename> <string>
. Puede que tenga que agregar 2 al recuento de bytes.<?
, también puede terminar con?>.
una ganancia neta de 1. FWIW, obtengoIFHCMFF.
el primer caso de prueba (usando PHP 5.5.21 de 64 bits, VC14). Usar$argn
con-F
también puede ser una opción.php <filename> <string>
es posible cuando<string>
puede contener nuevas líneas.