Beschreibung
Ein Caesar Shift ist eine sehr einfache monoalphabetische Chiffre, bei der jeder Buchstabe durch den Buchstaben nach dem Buchstaben im Alphabet ersetzt wird. Beispiel:
Hello world! -> IFMMP XPSME!
( IBSLR, EGUFV!
Ist die Ausgabe für die eigentliche Herausforderung, dies war ein Beispiel für die Verschiebung um 1.)
Wie Sie sehen können, bleiben Abstand und Interpunktion unbemerkt. Um jedoch zu verhindern, dass die Nachricht erraten wird, werden alle Buchstaben in Großbuchstaben geschrieben. Durch Zurückschieben der Buchstaben wurde die Nachricht entschlüsselt, bequem, aber auch von anderen Personen, die nicht wissen sollen, was die Nachricht bedeutet, wirklich leicht zu entschlüsseln.
Wir werden Caesar also ein wenig helfen, indem wir eine fortgeschrittene Form seiner Chiffre verwenden: den selbstverschiebenden Caesar Shift !
Herausforderung
Ihre Aufgabe ist es, ein Programm oder eine Funktion zu schreiben, die bei einer zu verschlüsselnden Zeichenfolge die der Eingabe entsprechende verschlüsselte Zeichenfolge ausgibt. Der fortgeschrittene Caesar Shift funktioniert so:
1. Compute letter differences of all adjacent letters:
1.1. Letter difference is computed like this:
Position of 2nd letter in the alphabet
-Position of 1st letter in the alphabet
=======================================
Letter difference
1.2. Example input: Hello
H - e|e - l|l - l|l - o
7 - 5|5 - 12|12 - 12|12 - 15 Letter differences: 3; -7; 0; -3
=3| =-7| =0| =-3
2. Assign the letters continously a letter difference from the list,
starting at the second letter and inverting the differences:
2.1. 2nd letter: first difference, 3rd letter: second difference, etc.
2.2. The first letter is assigned a 1.
2.3. Example input: Hello with differences 3; -7; 0; -3
Letter || Value
=======||======
H || 1
E || -3
L || 7
L || 0
O || 3
3. Shift the letters by the value x they have been assigned:
3.1. In case of a positive x, the letter is shifted x letters to the right.
3.2. In case of a negative x, the letter is shifted |x| letters to the left.
3.3. In case of x = 0, the letter is not shifted.
3.4. If the shift would surpass the limits of the alphabet, it gets wrapped around
Example: Y + Shift of 2 --> A
3.5. Example input: See the table under 2.3.
|| || Shifted
Letter || Value || Letter
=======||=======||=========
H || 1 || I
E || -3 || B Program output:
L || 7 || S IBSLR
L || 0 || L
O || 3 || R
Leerzeichen und andere spezielle Symbole, z. B. Satzzeichen, werden dabei übersprungen. Es ist garantiert, dass Ihr Programm eine Zeichenfolge erhält, die nur druckbare ASCII-Zeichen enthält. Die Ausgabe Ihrer Funktion / Ihres Programms darf nur in Großbuchstaben erfolgen.
Dies ist Codegolf , daher gelten Standardlücken, und es kann die kürzeste Antwort in Bytes gewinnen!
quelle
E
-3
?ZEN
zum Beispiel.Z
um 1 verschoben ist ...A
? (Als Randnotiz verwandelt sich die 05AB1E-AntwortZ
inA
)RELIEF
und,RELIES
um beide zum gleichen Ergebnis zu verschlüsselnSRSFAG
?Antworten:
05AB1E ,
282724 BytesProbieren Sie es online!
Erläuterung
quelle
IBSLR, EGUFV!
dafürHello, World!
, ist das richtig? Hat OP dieses Beispiel nur durcheinander gebracht?Python 3 , 100 Bytes
Probieren Sie es online!
b
Verfolgt den ASCII-Code des letzten Buchstabens oder ist anfangs Null. Die Formelc+c-(b or~-x)
bedeutet, dass ein Buchstabe mit ASCII-Codec
um denc-b
Wertb
ungleich Null und denc-(c-1) == +1
Wertb
Null (für den allerersten Buchstaben) verschoben wird .b
wird nie wieder Null, da die Zeichenfolge garantiert aus druckbaren ASCII-Zeichen besteht.Zum Schluss wird
64<c<91
geprüft, obc
es sich um einen ASCII-Großbuchstaben handelt, und(…-65)%26+65
alles wird wieder in denA-Z
Bereich eingeschlossen.ovs hat ein Byte gespeichert. Vielen Dank!
quelle
05AB1E ,
323029 BytesProbieren Sie es online!
quelle
ES6 (Javascript), 138 Bytes:
http://jsbin.com/manurenasa/edit?console
quelle
MATL , 27 Bytes
Probieren Sie es online!
Ich denke, dies ist die kürzeste, die ich bekommen kann, aber es gibt viele verschiedene Sorten, da 'Variablen' häufig wiederverwendet werden (es gibt 3
t
(Duplizieren) und 2w
(Tauschen) Operationen, die ZwischenablageH
wird verwendet, und Auch dann gibt es noch ein Duplikat1Y2
...). Leider konnte ich mit der automatischenM
Zwischenablage keine Bytes speichern .Über die Hälfte des Programms ist darauf ausgerichtet, Großbuchstaben zu schreiben und nicht-alphabetische Zeichen zu ignorieren - nur die Chiffre darf nicht länger als 13 Bytes sein ( Online ausprobieren! )
quelle
Perl,
9089Obwohl Nicht-Codegolf-Sprachen selten wettbewerbsfähig sind, können wir unter 100 gehen;)
Ich habe mich dazu entschlossen, dies zu entgolfen:
@a = split//,<>;
Übernimmt die Eingabe von STDIN und speichert die Zeichenliste (mit Zeilenumbruch!) In @a.say uc(++$a[0])
Geben Sie den ersten Buchstaben in Großbuchstaben mit einer Verschiebung von 1 aus. Es hat sich herausgestellt, dass Sie einen Buchstaben in Perl erhöhen können, wenn Sie ein Präfix ++ verwenden. Dies ist ein Mutator von c.2*ord($a[$_+1])-ord($a[$_])+!$_
Wir werden gebeten, das Zeichen bei x zu nehmen und die Differenz + (x- (x-1)) zu addieren. Nun, das ist 2x - (x-1). Allerdings: Ich habe den Anfangsbuchstaben geändert! Also muss ich diesen Fehler korrigieren+!$_
, der korrigiert wird, wenn an Position 0 zu viele subtrahiert wurden (nur Fall! $ _ Ist nicht undef). Wir erhalten dannuc chr
einen Großbuchstaben aus dem berechneten ASCII-Wert.map{ ... } $#a-2
-$#a
ist die Position, an der auf das letzte Array-Element zugegriffen werden kann. Da ich einen hinzufüge, möchte ich$#a-1
, aber weil der Zeilenumbruch von der Eingabe ignoriert werden muss, ist dies$#a-2
.Dies wird mit dem ersten Buchstaben verkettet, und wir sind fertig :)
quelle
Perl 5
-F
,737774 BytesProbieren Sie es online!
quelle
Hello, World!
sollte dazu führenIBSLR, EGUFV!
, nichtIBSLR, XGUFV!
.PHP,
10698 Bytesziemlich böse das ... wenn nur
base_convert
nicht so lange (oderctype_alpha
) ...aber ich habe es unter 100. zufrieden.
Laufen Sie als Pipe mit
-nR
oder versuchen Sie es online .quelle
JavaScript (Node.js) ,
86838781 BytesProbieren Sie es online!
quelle