Ihre Aufgabe ist es, eine verschlüsselte Zeichenfolge als Eingabe zu verwenden und die entschlüsselte Zeichenfolge auszugeben, um ihre versteckte Nachricht zu enthüllen.
Die Zeichenfolgen, sowohl die Eingabe als auch die Ausgabe, enthalten Zeichen aus dieser Liste mit 64 ASCII-Zeichen (beachten Sie das führende Leerzeichen):
!"#$%&'()*+,-./0123456789:;=?@[\]^_abcdefghijklmnopqrstuvwxyz|~
Diesen Zeichen werden Nummern in der Reihenfolge zugewiesen, in der sie oben aufgeführt sind:
! " # $ % & ...
0 1 2 3 4 5 6 ...
Das Leerzeichen ist also die Nummer 0, !
die Nummer 1 und ~
die Nummer 63. Diese Zahlen können im 6-Bit-Binärcode dargestellt werden:
: 0: 000000
!: 1: 000001
": 2: 000010
#: 3: 000011
.. ... ......
z: 61: 111101
|: 62: 111110
~: 63: 111111
Die Verschlüsselung ist sehr einfach:
Ich werde eC
für verschlüsselte Zeichen und C
für Zeichen der ursprünglichen Zeichenfolge verwenden. C(n)
ist das n-te Zeichen der ursprünglichen Zeichenfolge, während eC(n)
das n-te Zeichen der verschlüsselten Zeichenfolge ist.
Sie verwenden die 6-Bit-Binärdarstellung der Zeichen. Das erste Zeichen wird sein eC(0) = not(C(0))
. Von dort werden alle Charaktere sein eC(n) = xor(C(n),C(n-1))
.
Beispiel:
Nehmen wir an, die Eingabezeichenfolge ist code
.
c
ist das 38. Zeichen (null indiziert) oder100110
binär. In der verschlüsselten Version sind alle Bits umgedreht, also011001 -> 25 -> '9'
(wieder null indiziert).o
ist das 50. Zeichen oder110010
binär.xor(100110, 110010) = 010100 = 20 = '4'
.d
ist das 39. Zeichen oder100111
binär.xor(100111, 110010) = 010101 = 21 = '5'
.e
ist das 40. Zeichen oder101000
binär.xor(101000, 100111) = 001111 = 15 = '/'
.
Wenn es sich also um die ursprüngliche Zeichenfolge handelt code
, wird die verschlüsselte Zeichenfolge zu 945/
.
Testfälle:
945/
code
,&'8[14 =?;gp+% 2'@s&&c45/eg8?&
programming puzzles & code golf
;a$5$%0r?2@12dw6# lb-eg&519nt%ot=9$@es@96+?;ga" 4*)&ta56dp[?o#t%oh/"(&?#ee![,+,/+fe4"
a $150 reward will be given to those sending account and pin# to hackers@steal_id.com
~!#!'!#!/!#!'!#![!#!'!#!/!#!'!#!~!#!'!#!/!#!'!#![!#!'!#!/!#!'!#!
!"#$%&'()*+,-./0123456789:;=?@[\]^_abcdefghijklmnopqrstuvwxyz|~
quelle
Antworten:
Jelly ,
2726 BytesProbieren Sie es online!
Alternative Version, 22 Bytes (nicht konkurrierend)
Jelly holte endlich andere Golfspieler ein und bekam ein druckbares ASCII- Atom, also funktioniert das jetzt.
Probieren Sie es online!
Wie es funktioniert
quelle
JavaScript (ES6), 115 Byte
Testfälle
Code-Snippet anzeigen
quelle
^
geht rechts von der]
. Die Antwort funktioniert immer noch mit dieser Änderung für die Testfälle, die ich glaube.d
aus dem zu konstruieren, was fehlt?Jelly ,
3431 Bytes-3 Bytes dank Dennis (Verwendung
ḟ
zweimal stattœ-
,;
und¤
, die Nutzung”~
statt 63 )Eine monadische Verknüpfung, die Listen von Zeichen aufnimmt und zurückgibt.
* Hinweis: Die Eingabeargumente an ein Jelly - Programm verwenden Python - String Formatierung, so zitiert mit
"
,'
,'''
(oder wenn eindeutig keine Angabe) sind alle Optionen.Probieren Sie es online!
Wie?
Bitweises-xor ist invertierbar (mit "führenden Nullen").
Bitwise-Not ist ein xor mit "all ones" - in diesem Fall werden immer nur 6 benötigt, also 2 7 -1 = 63 .
Sobald wir das Array oder die Zeichen erstellt und die Indizes der eingegebenen Zeichen nachgeschlagen haben, ist die Dekodierung selbst einfach eine kumulative Reduktion durch bitweises xor, wonach wir zurück in dasselbe Array indexieren können.
* Hinweis: Wenn Sie ein Leerzeichen in p nachschlagen, erhalten Sie ein Ergebnis von 64, aber das ist in Ordnung, da die Indizierung in p modular ist und ein führendes Zeichen hinzugefügt wird
1
ist.quelle
Java, 225 Bytes
Ich habe lange nicht mehr auf Java gespielt, daher sind alle Golftipps willkommen.
Probieren Sie es online!
quelle
String D(String E){
wirdE->{
(-15 Bytes);-1-J
kann sein+~J
(-1 Byte); undi=-1
kann seini=0
, das++
kann verschoben werdeni++<1?
, und danni-1
wird dasi-2
(-1 Byte). Versuchen Sie es online: 208 Bytes05AB1E , 40 Bytes
Probieren Sie es online!
Erläuterung
quelle
CPU x86-Befehlssatz, 235 Byte
Die Funktionen find () und deCript () + der String abc: 171 Bytes + 64 Bytes = 235 Assembly mit nasmw und Compiler / Library mit Borland C Compiler:
Ergebnisse:
Assemblierung ist besser (zum Beispiel, wenn ich ein Makrosystem verwende, ja, wenn ich weiß, dass es zu lang ist, aber als C one + - mit Makrosystem, zum Beispiel, wenn die Anweisungen einfacher sind, ist es auch ohne Assemblierung einfach, Code zu schreiben Nehmen Sie Korrekturen vor, während Sie in Englisch schreiben (nicht in I).
quelle
C (gcc) 153 Bytes
Probieren Sie es online!
Etwas weniger golfen
quelle
APL (Dyalog Unicode) , 52 Byte SBCS
Benötigt
⎕IO←0
Probieren Sie es online!
quelle
¨
:{C[2⊥≠\⍉~@0⍉(6/2)⊤⍵⍳⍨C←(32↓⎕UCS⍳127)~⎕A,'<>{}`']}
⍵
, können Sie durch Konvertierung in ein vollständiges Programm zwei Bytes speichern:C[2⊥≠\⍉~@0⍉(6/2)⊤⍞⍳⍨C←(32↓⎕UCS⍳127)~⎕A,'<>{}`']
Röda ,
120100 BytesProbieren Sie es online!
Ich habe den
l=63
Trick aus der JavaScript-Antwort verwendet.Im Moment arbeite ich daranA
, das Golfspiel zu verkürzen ...quelle
Python 2 , 155 Bytes
Probieren Sie es online!
quelle
PHP, 103 Bytes
Probieren Sie es online!
PHP, 107 Bytes
Probieren Sie es online!
PHP, 118 Bytes
Probieren Sie es online!
quelle
Python + Numpy, 214 Bytes
Kann nicht mit anderen Python-Lösungen mithalten, verwendet jedoch einen anderen, rein numerischen Ansatz:
Ein bisschen Erklärung:
S=A(r(32,60)+...)
- Alphabet als Codebereich definierenT=A(r(128))
- Init-Hash-Tabelle der Größe 128 (größter Codepunkt)T[S]=A(r(64))
- Füllen Sie die Hash-Tabelle, dh schreiben Sie die Indizes 0-63 in die Elemente mit ASCII-IndizesW=T[fromstring(s,"b")]
- konvertiere die Eingabe in ein Array und übersetze sie in neue CodesW[0]=~W[0]
- 1. Wert invertierenW=S[bitwise_xor.accumulate(W)&63]
- Numpys Akkumulationsmethode mit xor verwenden, um eine Schleife zu vermeiden, 2 linke Bits zurücksetzen und zurück nach ascii übersetzenquelle
Alice , 46 Bytes
Probieren Sie es online!
Erläuterung
Die erste Hälfte des Programms wird im Ordnungsmodus ausgeführt und richtet die Zuordnung von Zahlen zu Zeichen ein. Die zweite Hälfte wird im Kardinalmodus ausgeführt und verwendet diese Zuordnung, um die Eingabe zu decodieren.
quelle
Japt
-P
, 33 BytesProbieren Sie es online!
Aus irgendeinem Grunde widersprechen die Testfälle als Suite zu laufen, also hier ist die zweite , dritte und vierte einzeln.
Erläuterung:
quelle
APL (NARS), 72 Zeichen, 144 Byte
Angenommen, die Eingabe befindet sich immer im Array 's' ... Um zu verstehen, wie man entschlüsselt, musste ich zuerst die Assembly-Version schreiben ... test:
quelle
105103 Byte, Maschinencode (16-Bit x86), 57 AnweisungenLaufen: auf codegolf.com speichern, dosbox:
codegolf.com < input.bin
Fast vergessenes lustiges Teil:
Grüß dich, das ist mein zweiter Eintrag. Vorherige war RC4 . Getan mit HT Hexeditor , ohne Compiler , aber diesmal habe ich Strg-A benutzt
assemble instruction
, ich weiß immer noch nicht, ob dies als Eintrag zählt oder nicht.Warum wie
In ähnlicher Weise habe ich angefangen, Dateien mit
NOP
s zu erstellen , und dann das Einlesen / Ausschreiben von RC4 erneut verwendet . Ich habe zuerst in Python 'Übersetzungsleiter' von ASCII nach Index geschrieben. und verwendete das in der Versammlung, stellte ähnliche Leiter in der umgekehrten Richtung her, schließlich fügte ich kleinen Trick hinzu, um erstes Byte zu behandelnIn ähnlicher Weise wie RC4 wurde der letzte Schritt von zusätzlichen befreit
nops
, fixierende Sprünge entfernt.Präparation
Das Programm stützt sich wieder auf anfängliche Registerwerte .
Dummy, wird später benötigt
Byte lesen
Beenden Sie, wenn STDIN fertig ist
Leiter, die ASCII in Index übersetzt (beachten Sie, dass alle Sprünge auf 0x134 gehen)
xoder byteweise vorangegangene Bytes zeigen
SI
auf die Adresse0x100
, die anfänglich 0xFF aus dem Opcode eines Dummy-Befehls oben enthält, was zu einem negativen Verhalten führt (Erinnerung: COMs werden bei 0x100 geladen)Ergebnis auf Index begrenzen und Byte bei 0x100 speichern,
Leiter in umgekehrter Richtung
setze das Byte unter [di], schreibe das Byte nach stdout (beachte, dass AH = 40h DX als Adresse verwendet, aber beim Lesen des Bytes oben gesetzt wurde)
Beachten Sie, dass stdin -> stdout und stdout to stdin mit inc bx / dec bx ausgeführt werden
Schleife ^^
Tools und Ressourcen
quelle