Ecco le lettere dell'alfabeto inglese in ordine di frequenza:
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
Cioè, e
è la lettera più usata ed z
è la meno comune. (Dati da Wikipedia .)
La tua sfida è prendere del testo ROT-n'd, come:
ocdndnvqzmtnzxmzohznnvbzocvodnqzmtnzxpmzviynvaz
Questo è il testo "thisisaverysecretmessagethatisverysecureandsafe" che è "crittografato" tramite ROT-21 (metà di 42). Il tuo programma, usando la tabella delle frequenze sopra, dovrebbe essere in grado di determinare di quanto è stato ruotato ogni carattere e il testo originale.
(Se non si ha familiarità con ROT-n, sta essenzialmente spostando ciascun carattere di n
. Ad esempio, in ROT-2 a -> c, b -> d, ..., x -> z, y -> a, z -> b
).
Come lo chiedi? L'algoritmo (molto ingenuo) che devi usare è:
- per ciascuno
n
da0
a25
incluso, applicare ROT--n
alla stringa di input. (Negativon
perché vogliamo invertire la crittografia. ROT--n
è equivalente a ROT-26-n
, se è più semplice.) - converte ogni stringa di input in un numero sommando le frequenze relative dei caratteri.
e
è0
,t
è1
,a
è2
, ecc. Ad esempio, il numero corrispondente per la stringa"hello"
è 7 + 0 + 10 + 10 + 3 = 30. - trova la stringa che ha il numero corrispondente più basso.
- output quella stringa e la sua corrispondente
n
.
Regole:
- l'input può essere ovunque ragionevole (STDIN, argomenti di funzione, da un file, ecc.), così come l'output (STDOUT, valore di ritorno della funzione, in un file, ecc.)
- è possibile utilizzare un algoritmo diverso, purché produca sempre risultati identici. Ad esempio, avere
z
0 ee
25 e anche scegliere il numero più alto va bene. - se due stringhe hanno punteggi identici, puoi scegliere di emetterne una (o entrambe). Questo è un caso limite e non è necessario tenerne conto.
- questo è code-golf , quindi vincerà il codice più breve in byte!
Casi test:
Ingresso: ocdndnvqzmtnzxmzohznnvbzocvodnqzmtnzxpmzviynvaz
Uscita:21 thisisaverysecretmessagethatisverysecureandsafe
Ingresso: pmttwxmwxtmwnxzwoziuuqvoxchhtmakwlmowtnabiksmfkpivom
Uscita:8 hellopeopleofprogrammingpuzzlescodegolfstackexchange
Ingresso: ftueimeqzodkbfqpiuftdaffiqxhqeaufygefnqbqdrqofxkemrq
Uscita:12 thiswasencryptedwithrottwelvesoitmustbeperfectlysafe
Ingresso: jgtgkuvjghkpcnvguvecugvjcvaqwowuvfgetarv
Uscita:2 hereisthefinaltestcasethatyoumustdecrypt
Nel caso ti stavi chiedendo, ecco un JSFiddle del codice di test JavaScript che ho scritto, che ha decifrato con successo tutti i casi di test che ho lanciato.
wtaad
dovrebbe dare0 wtaad
come risultato evszzc
dovrebbe dare25 wtaad
come risultato.