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é.
wtaad
debería dar0 wtaad
como resultado, yvszzc
debería dar25 wtaad
como resultado.