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 ec'est la lettre la plus utilisée et zla 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 nde0à25inclusif, appliquez ROT--nà la chaîne d'entrée. (Négatifnparce que nous voulons inverser le cryptage. ROT--nest é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. eest0,test1,aest2, 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 z0 ete25 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.
wtaaddevrait donner0 wtaadcomme résultat etvszzcdevrait donner25 wtaadcomme résultat.