Aquí están las letras del alfabeto inglés en orden por frecuencia:
e t a o i n s h r d l c u m w f g y p b v k j x q z
Es decir, e
es la letra más utilizada y z
es la menos común. (Datos de Wikipedia ).
Su desafío es tomar un texto ROT-n'd, como:
ocdndnvqzmtnzxmzohznnvbzocvodnqzmtnzxpmzviynvaz
Este es el texto "este es un mensaje secreto que es muy seguro y seguro" que está "encriptado" a través de ROT-21 (la mitad de 42). Su programa, utilizando la tabla de frecuencias anterior, debería poder determinar cuánto se rotó cada carácter y el texto original.
(Si no está familiarizado con ROT-n, esencialmente está cambiando cada carácter por n
. Por ejemplo, en ROT-2,. a -> c, b -> d, ..., x -> z, y -> a, z -> b
)
¿Cómo preguntas? El algoritmo (muy ingenuo) que debe usar es:
- para cada
n
desde0
hasta25
inclusivo, aplique ROT--n
a la cadena de entrada. (Negativon
porque queremos revertir el cifrado. ROT--n
es equivalente a ROT-26-n
, si eso es más fácil). - Convierta cada cadena de entrada en un número sumando las frecuencias relativas de los caracteres.
e
es0
,t
es1
,a
es2
, etc. Por ejemplo, el número correspondiente para la cadena"hello"
es 7 + 0 + 10 + 10 + 3 = 30. - encuentra la cadena que tiene el número correspondiente más bajo.
- salida esa cadena y su correspondiente
n
.
Reglas:
- la entrada puede ser razonable (STDIN, argumentos de función, desde un archivo, etc.) y, por lo tanto, puede salir (STDOUT, valor de retorno de función, a un archivo, etc.)
- puede usar un algoritmo diferente, siempre y cuando siempre produzca resultados idénticos. Por ejemplo, tener
z
0 ye
25 y elegir el número más alto también está bien. - Si dos cadenas tienen puntajes idénticos, puede elegir generar uno (o ambos) de ellos. Este es un caso extremo y no tiene que dar cuenta de ello.
- Este es el código de golf , por lo que el código más corto en bytes ganará.
Casos de prueba:
Entrada: ocdndnvqzmtnzxmzohznnvbzocvodnqzmtnzxpmzviynvaz
Salida:21 thisisaverysecretmessagethatisverysecureandsafe
Entrada: pmttwxmwxtmwnxzwoziuuqvoxchhtmakwlmowtnabiksmfkpivom
Salida:8 hellopeopleofprogrammingpuzzlescodegolfstackexchange
Entrada: ftueimeqzodkbfqpiuftdaffiqxhqeaufygefnqbqdrqofxkemrq
Salida:12 thiswasencryptedwithrottwelvesoitmustbeperfectlysafe
Entrada: jgtgkuvjghkpcnvguvecugvjcvaqwowuvfgetarv
Salida:2 hereisthefinaltestcasethatyoumustdecrypt
En caso de que se lo pregunte, aquí hay un JSFiddle del código de prueba de JavaScript que escribí, que descifró con éxito todos los casos de prueba que le arrojé.
fuente
wtaad
debería dar0 wtaad
como resultado, yvszzc
debería dar25 wtaad
como resultado.Respuestas:
GolfScript - 87
El truco aquí es construir cada rotación simultáneamente. Dado que necesitamos recorrer cada ROT y luego cada carácter, simplemente recorramos cada carácter, cortemos el alfabeto completo y luego lo comprimamos. A partir de ahí, proceda como se esperaba: cuente la puntuación para cada ROT y elija el mínimo.
Golf extra:
Solo un poco de golf:
fuente
Haskell -
192175Corriendo
fuente
[1,1,1,1]
, y esto dará el mismo orden. El mapeo y la suma se convierten en loconcatMap
que se puede escribir de manera sucinta utilizando una lista de comprensión. En combinación con algunos otros trucos, lo acorté a 152 caracteres:main=interact(\s->snd$minimum[([1|x<-r,_<-fst$span(/=x)"etaoinshrdlcumwfgypbvkjxqz"],show(26-n)++' ':r)|n<-[0..25],r<-[[([x..'z']++['a'..])!!n|x<-s]]])
.GolfScript,
112108102100 caracteresNo estoy contento con la repetición con el descifrado al final, pero meh.
Ungolfed (si eso tiene algún sentido: P) y una versión ligeramente anterior
fuente
echo
coloca una nueva línea por defecto, que el intérprete recoge.JavaScript (205)
Creo que todavía se puede jugar un poco más, así que las sugerencias son bienvenidas.
Algunas notas para ayudar a entender la solución.
m
,n
yo
rastrea la puntuación más alta.u
yw
rastrear el resultado de carácter y valor, respectivamente para el actuali
(a+a)
ayuda a prevenir el desbordamiento cuando se envuelvez
y es más corto que hacerlo%26
Prueba: http://jsfiddle.net/J9ZyV/5/
fuente
indexOf
una variable.C # + Linq -
273264Como una función que toma la cadena de entrada y devuelve la cadena decodificada y el desplazamiento (según los requisitos):
Ungolfed con comentarios:
Pequeño controlador de prueba (recuerde compilar referencias
System.Core
para Linq):Dando:
fuente
Tuple<string,int> d
Tuple<int,string>f(string x){return Enumerable.Range(0,25).Select(n=>Tuple.Create(26-n,string.Concat(x.Select(c=>(char)((c-97+n)%26+97))))).OrderBy(t=>(t.Item2.Select(c=>"etaoinshrdlcumwfgypbvkjxqz".IndexOf(c))).Sum()).First();}
Range(0, 26)
, no25
.dg -
137130129128 bytesEjemplos:
Código sin golf:
fuente
c - 97
y(0..26)
?dg
antes. ¿Podría proporcionar un enlace?J - 92 char
Un poco de un patito feo, pero funciona. Emite el número y luego la cadena, en dos líneas.
Si desea que estén en la misma línea, separados por espacios, esto solo sube a 93 caracteres , pero toma una ruta más fea.
Una explicación para
(/:'ctljapqhewvknfdsyigbmuoxrz')
: En este verbo, operamos en los valores de letras como A = 0, B = 1, C = 2, etc. Para codificar los valores de letras de la cadenaetaoinshrdlcumwfgypbvkjxqz
, la forma más corta es tomar la permutación de clasificación para esto cuerda rara Esto se debe a que A está en el índice 4, B en el índice 19, C en 0, D en 14, y así sucesivamente; por lo tanto, la permutación de clasificación es4 19 0 14 8 13 ...
cuando la califica (/:
) y obtiene exactamente los valores numéricos paraetaoin...
.Uso:
fuente
q, 97
.
fuente
APL - 70 caracteres
Ejemplo:
Estoy seguro de que hay formas de comprimir esto aún más, e invito a cualquier otro usuario de APL a encontrar soluciones para eso.
fuente
Python 188
fuente
Perl: 256 caracteres (más nuevas líneas para facilitar la lectura), incluida la tabla de frecuencias:
El texto se proporciona así:
Quítese 12 caracteres si desea hornear los valores de ord (a) y la longitud de @f
fuente
Elm - 465
No va a ganar ningún premio de golf, pero crea una página web estática que muestra una lista del formulario a
[(rotation number, rotated string)]
medida que escribe.Nota: todavía no funciona aquí, pero puede copiarlo y pegarlo en el editor oficial y ejecutarlo.
fuente
Pitón 2, 171
fuente