Voici les lettres de l'alphabet anglais par ordre de fréquence:
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
C'est-à-dire que e
c'est la lettre la plus utilisée et z
la moins courante. (Données de Wikipedia .)
Votre défi est de prendre du texte ROT-n'd, tel que:
ocdndnvqzmtnzxmzohznnvbzocvodnqzmtnzxpmzviynvaz
Il s'agit du texte "thisisaverysecretmessagethatisverysecureandsafe" qui est "crypté" via ROT-21 (la moitié de 42). Votre programme, en utilisant le tableau des fréquences ci-dessus, devrait être en mesure de déterminer la rotation de chaque caractère et le texte d'origine.
(Si vous n'êtes pas familier avec ROT-n, il déplace essentiellement chaque caractère de n
. Par exemple, dans ROT-2,. a -> c, b -> d, ..., x -> z, y -> a, z -> b
)
Comment, demandez-vous? L'algorithme (très naïf) que vous devez utiliser est:
- pour chacun
n
de0
à25
inclusif, appliquez ROT--n
à la chaîne d'entrée. (Négatifn
parce que nous voulons inverser le cryptage. ROT--n
est équivalent à ROT-26-n
, si c'est plus facile.) - convertir chaque chaîne d'entrée en nombre en additionnant les fréquences relatives des caractères.
e
est0
,t
est1
,a
est2
, etc. Par exemple, le nombre correspondant pour la chaîne"hello"
est 7 + 0 + 10 + 10 + 3 = 30. - recherchez la chaîne qui a le plus petit nombre correspondant.
- sortie cette chaîne et son correspondant
n
.
Règles:
- l'entrée peut être n'importe où raisonnable (STDIN, arguments de fonction, à partir d'un fichier, etc.), tout comme la sortie (STDOUT, valeur de retour de fonction, dans un fichier, etc.)
- vous pouvez utiliser un algorithme différent, tant qu'il produit toujours des résultats identiques. Par exemple, avoir
z
0 ete
25 et choisir le nombre le plus élevé est également acceptable. - si deux chaînes ont des scores identiques, vous pouvez choisir d'en sortir une (ou les deux). Il s'agit d'un cas de pointe et vous n'avez pas à en tenir compte.
- c'est le code-golf , donc le code le plus court en octets gagnera!
Cas de test:
Entrée: ocdndnvqzmtnzxmzohznnvbzocvodnqzmtnzxpmzviynvaz
Sortie:21 thisisaverysecretmessagethatisverysecureandsafe
Entrée: pmttwxmwxtmwnxzwoziuuqvoxchhtmakwlmowtnabiksmfkpivom
Sortie:8 hellopeopleofprogrammingpuzzlescodegolfstackexchange
Entrée: ftueimeqzodkbfqpiuftdaffiqxhqeaufygefnqbqdrqofxkemrq
Sortie:12 thiswasencryptedwithrottwelvesoitmustbeperfectlysafe
Entrée: jgtgkuvjghkpcnvguvecugvjcvaqwowuvfgetarv
Sortie:2 hereisthefinaltestcasethatyoumustdecrypt
Au cas où vous vous poseriez la question, voici un JSFiddle du code de test JavaScript que j'ai écrit, qui a réussi à décrypter tous les cas de test que je lui ai lancés.
wtaad
devrait donner0 wtaad
comme résultat etvszzc
devrait donner25 wtaad
comme résultat.