Hier sind die Buchstaben des englischen Alphabets nach Häufigkeit sortiert:
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
Dies ist e
der am häufigsten verwendete und am seltensten verwendete Buchstabe z
. (Daten aus Wikipedia .)
Ihre Herausforderung besteht darin, einen Text mit der Aufschrift ROT-n zu verwenden, z. B .:
ocdndnvqzmtnzxmzohznnvbzocvodnqzmtnzxpmzviynvaz
Dies ist der Text "thisisaverysecretmessagethatisverysecureandsafe", der über ROT-21 (Hälfte von 42) "verschlüsselt" wird. Ihr Programm sollte anhand der obigen Häufigkeitstabelle feststellen können, um wie viel jedes Zeichen gedreht wurde und um wie viel der Originaltext gedreht wurde.
(Wenn Sie mit ROT-n nicht vertraut sind, verschiebt es im Wesentlichen jedes Zeichen um n
. Zum Beispiel in ROT-2,. a -> c, b -> d, ..., x -> z, y -> a, z -> b
)
Wie, fragst du? Der (sehr naive) Algorithmus, den Sie verwenden müssen, ist:
- Wenden Sie für jedes
n
von0
bis25
einschließlich ROT--n
auf die Eingabezeichenfolge an. (Negativ,n
weil wir die Verschlüsselung umkehren möchten . ROT--n
entspricht ROT-26-n
, falls dies einfacher ist.) - Konvertieren Sie jede Eingabezeichenfolge in eine Zahl, indem Sie die relativen Häufigkeiten der Zeichen addieren.
e
ist0
,t
ist1
,a
ist2
usw. Beispielsweise ist die entsprechende Nummer für die Zeichenfolge"hello"
7 + 0 + 10 + 10 + 3 = 30. - Suchen Sie die Zeichenfolge mit der niedrigsten entsprechenden Nummer.
- gib diesen String und den dazugehörigen aus
n
.
Regeln:
- Die Eingabe kann überall sinnvoll sein (STDIN, Funktionsargumente, aus einer Datei usw.) und kann daher ausgegeben werden (STDOUT, Funktionsrückgabewert, in eine Datei usw.).
- Sie können einen anderen Algorithmus verwenden, sofern er immer zu identischen Ergebnissen führt. Zum Beispiel ist es auch in Ordnung
z
, 0 unde
25 zu sein und die höchste Zahl zu wählen. - Wenn zwei Zeichenfolgen identische Noten haben, können Sie eine (oder beide) ausgeben. Dies ist ein Randfall und Sie müssen ihn nicht berücksichtigen.
- Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes!
Testfälle:
Eingabe: ocdndnvqzmtnzxmzohznnvbzocvodnqzmtnzxpmzviynvaz
Ausgabe:21 thisisaverysecretmessagethatisverysecureandsafe
Eingabe: pmttwxmwxtmwnxzwoziuuqvoxchhtmakwlmowtnabiksmfkpivom
Ausgabe:8 hellopeopleofprogrammingpuzzlescodegolfstackexchange
Eingabe: ftueimeqzodkbfqpiuftdaffiqxhqeaufygefnqbqdrqofxkemrq
Ausgabe:12 thiswasencryptedwithrottwelvesoitmustbeperfectlysafe
Eingabe: jgtgkuvjghkpcnvguvecugvjcvaqwowuvfgetarv
Ausgabe:2 hereisthefinaltestcasethatyoumustdecrypt
Für den Fall, dass Sie sich wundern, hier ist eine JSFiddle des JavaScript-Testcodes, den ich geschrieben habe, die alle Testfälle, die ich darauf geworfen habe, erfolgreich entschlüsselt hat.
quelle
wtaad
sollte0 wtaad
als Ergebnis geben, undvszzc
sollte25 wtaad
als Ergebnis geben.Antworten:
GolfScript - 87
Der Cheat dabei ist, jede Umdrehung gleichzeitig aufzubauen. Da wir jedes ROT und dann jedes Zeichen durchlaufen müssen, lassen Sie uns einfach jedes Zeichen durchlaufen, das gesamte Alphabet aufschneiden und es dann komprimieren. Von dort gehen Sie wie erwartet vor: Zählen Sie die Punktzahl für jedes ROT und wählen Sie das Minimum.
Extra Golf gespielt:
Nur ein bisschen Golf gespielt:
quelle
Haskell -
192175Laufen
quelle
[1,1,1,1]
, und dies gibt die gleiche Reihenfolge. Aus Mapping und Summation wird dann,concatMap
was mit Hilfe eines Listenverständnisses kurz und bündig geschrieben werden kann. Zusammen mit einigen anderen Tricks, ich verkürzt es auf 152 Zeichen: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 ZeichenIch bin nicht glücklich über die Wiederholung mit der Entschlüsselung am Ende, aber meh.
Ungolfed (wenn das Sinn macht: P) und etwas ältere Version:
quelle
echo
wurde, dass standardmäßig eine neue Zeile eingefügt wird, die der Interpreter aufnimmt.JavaScript (205)
Ich denke, es kann noch ein bisschen mehr golfen werden, also sind Vorschläge willkommen!
Einige Hinweise zum besseren Verständnis der Lösung
m
,n
undo
verfolgen Sie die höchste Punktzahl.u
undw
verfolgen Sie das Zeichen- bzw. Wertergebnis für den aktuellen Werti
(a+a)
Verhindert ein Überlaufen beim Umwickeln der Vergangenheitz
und ist kürzer als dies der Fall ist%26
Beweis: http://jsfiddle.net/J9ZyV/5/
quelle
indexOf
einer Variablen herausholen.C # + Linq -
273264Als eine Funktion, die die Eingabezeichenfolge übernimmt und die dekodierte Zeichenfolge und den Offset zurückgibt (gemäß den Anforderungen):
Ungolfed mit Kommentaren:
Kleiner Testtreiber (denken Sie daran, die Referenzierung
System.Core
für Linq zu kompilieren ):Geben:
quelle
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)
, nicht25
.dg -
137130129128 BytesBeispiele:
Ungolfed-Code:
quelle
c - 97
und nicht entfernen(0..26)
?dg
zuvor gehört. Könnten Sie einen Link bereitstellen?J - 92 Zeichen
Ein bisschen wie ein hässliches Entlein, aber es funktioniert. Gibt die Zahl und dann die Zeichenfolge in zwei Zeilen aus.
Wenn Sie möchten, dass sie sich in derselben Zeile befinden, die durch Leerzeichen getrennt ist, werden nur 93 Zeichen angezeigt, die Route ist jedoch hässlicher.
Eine Erklärung für
(/:'ctljapqhewvknfdsyigbmuoxrz')
: In diesem Verb bearbeiten wir die Buchstabenwerte als A = 0, B = 1, C = 2 usw. Um die Buchstabenwerte des Strings zu kodierenetaoinshrdlcumwfgypbvkjxqz
, ist der kürzeste Weg tatsächlich, die Sortierpermutation dafür zu nehmen seltsame Zeichenfolge. Dies liegt daran, dass A bei Index 4 ist, B bei Index 19, C bei 0, D bei 14 und so weiter; daher ist die Sortierpermutation,4 19 0 14 8 13 ...
wenn Sie es benoten (/:
), und Sie erhalten genau die Zahlenwerte füretaoin...
.Verwendung:
quelle
q, 97
.
quelle
APL - 70 Zeichen
Beispiel:
Ich bin mir sicher, dass es Möglichkeiten gibt, dies weiter zu komprimieren, und ich lade alle anderen APL-Benutzer ein, Lösungen dafür zu finden.
quelle
Python 188
quelle
Perl: 256 Zeichen (plus Zeilenumbrüche zur besseren Lesbarkeit) einschließlich der Häufigkeitstabelle:
Der Text sieht so aus:
Nehmen Sie 12 Zeichen ab, wenn Sie die Werte von ord (a) und die Länge von @f einbrennen möchten
quelle
Elm - 465
Es werden keine Golfpreise gewonnen, aber es wird eine statische Webseite erstellt, auf der eine Liste des Formulars angezeigt wird,
[(rotation number, rotated string)]
während Sie tippen.Hinweis: funktioniert hier noch nicht, aber Sie können es in den offiziellen Editor kopieren und ausführen.
quelle
Python 2, 171
quelle