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.
la source
wtaad
devrait donner0 wtaad
comme résultat etvszzc
devrait donner25 wtaad
comme résultat.Réponses:
GolfScript - 87
La triche ici est de construire chaque rotation simultanément. Étant donné que nous devons parcourir chaque ROT puis chaque caractère, passons simplement en revue chaque caractère, coupons l'alphabet entier, puis zippons-le. De là, procédez comme prévu: comptez le score pour chaque ROT et choisissez le minimum.
Extra golf:
Seulement un peu de golf:
la source
Haskell -
192175Fonctionnement
la source
[1,1,1,1]
, et cela donnera le même ordre. La cartographie et la somme deviennent alorsconcatMap
ce qui peut être écrit succinctement en utilisant une compréhension de liste. Combiné avec quelques autres trucs, j'écourté à 152 caractères: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 caractèresJe ne suis pas content de la répétition avec le re-décryptage à la fin, mais meh.
Version non golfée (si cela a du sens: P) et version légèrement plus ancienne:
la source
echo
met une nouvelle ligne par défaut, que l'interprète reprend.JavaScript (205)
Je pense qu'il peut encore être joué un peu plus, alors les suggestions sont les bienvenues!
Quelques notes pour aider à comprendre la solution
m
,n
Eto
suivre le score le plus élevé.u
etw
suivre le résultat du caractère et de la valeur, respectivement pour le couranti
(a+a)
aide à prévenir le débordement lors du passage dans le passéz
, et est plus court que de le faire%26
Preuve: http://jsfiddle.net/J9ZyV/5/
la source
indexOf
une variable.C # + Linq -
273264En tant que fonction qui prend la chaîne d'entrée et renvoie la chaîne décodée et le décalage (selon les exigences):
Non golfé avec des commentaires:
Petit pilote de test (pensez à compiler le référencement
System.Core
pour Linq):Donnant:
la source
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)
, non25
.dg -
137130129128 octetsExemples:
Code non golfé:
la source
c - 97
et(0..26)
?dg
auparavant. Pourriez-vous fournir un lien?J - 92 car
Un petit vilain petit canard, mais ça marche. Sort le nombre puis la chaîne, sur deux lignes.
Si vous voulez qu'ils soient sur la même ligne, séparés par des espaces, cela ne monte que jusqu'à 93 caractères , mais prend un itinéraire plus laid.
Une explication pour
(/:'ctljapqhewvknfdsyigbmuoxrz')
: Dans ce verbe, nous opérons sur les valeurs des lettres comme A = 0, B = 1, C = 2, etc. Pour encoder les valeurs des lettres de la chaîneetaoinshrdlcumwfgypbvkjxqz
, le moyen le plus court est en fait de prendre la permutation de tri pour chaîne étrange. En effet, A est à l'index 4, B à l'index 19, C à 0, D à 14, etc. par conséquent, la permutation de tri est4 19 0 14 8 13 ...
lorsque vous la notez (/:
) et que vous obtenez exactement les valeurs numériques pouretaoin...
.Usage:
la source
q, 97
.
la source
APL - 70 caractères
Exemple:
Je suis sûr qu'il existe des moyens de compresser davantage cela, et j'invite tous les autres utilisateurs APL à trouver des solutions pour cela.
la source
Python 188
la source
Perl: 256 caractères (plus de nouvelles lignes pour la lisibilité), y compris le tableau des fréquences:
Le texte est fourni comme suit:
Enlevez 12 caractères si vous voulez incorporer les valeurs de ord (a) et la longueur de @f
la source
Orme - 465
Ne va pas gagner de prix de golf, mais il crée une page Web statique qui affiche une liste du formulaire
[(rotation number, rotated string)]
que vous tapez.Remarque: ne fonctionne pas encore ici, mais vous pouvez le copier-coller dans l'éditeur officiel et l'exécuter.
la source
Python 2, 171
la source