Implementieren Sie diese Schlüsselverschlüsselung
Tor
Verwenden Sie den im Abschnitt Algorithmus erläuterten Algorithmus, um eine bestimmte Verschlüsselung zu implementieren.
Das Programm muss Eingaben von STDIN oder dem nächstgelegenen verfügbaren Äquivalent lesen und den Algorithmus verwenden, um den Chiffretext und einen Schlüssel zu generieren.
Der Chiffretext und der Schlüssel werden in STDOUT oder das nächste verfügbare Äquivalent geschrieben. Jedes Format ist zulässig, solange es den Chiffretext und den Schlüssel ausgibt.
Algorithmus
Konvertieren Sie die Zeichen in der Zeichenfolge in die entsprechenden ASCII-Werte. Beispielsweise:
Hello -> 72 101 108 108 111
Als Nächstes müssen Sie einen Schlüssel generieren, solange die Zeichenfolge Zufallszahlen im Bereich von 0 bis 9 enthält.
Hello -> 62841
Fügen Sie die Ganzzahlen in der Zufallszahlenfolge zu den ASCII-Werten der Zeichenfolge hinzu. In den obigen Beispielen würde 72 zu 78 und 101 zu 104 werden.
72 + 6 = 78, 101 + 2 = 103, 108 + 8 = 116, etc
Als nächstes konvertieren Sie die neuen Werte zurück in Zeichen. In den obigen Beispielen ist der Text Hello
geworden Ngtpp
.
Beispiele
(Dies sind lediglich Beispiele dafür, wie die Ausgabe aussehen könnte . Die Ausgabe kann und wird variieren.)
Hello World
Lfrlu)_supg
41606984343
This will be encoded
Zhjs$~koo gj$iuhofgj
60104723305544750226
Regeln
- Sie können davon ausgehen, dass die Eingabe nur Zeichen im Bereich von az, AZ und Leerzeichen enthält.
- Einsendungen müssen vollständige Programme oder Funktionen sein.
- Einsendungen werden in Bytes gewertet.
- Standardlücken sind verboten.
- Das ist Code-Golf, also gewinnt der kürzeste Code.
(Dies ist eine meiner ersten Herausforderungen. Wenn etwas nicht stimmt, können Sie mir gerne mitteilen, wie ich es verbessern kann.)
quelle
preferably with the format (ciphertext)\n(key).
"Bevorzugte Features" und Code-Golf passen nicht gut zusammen. Sie sollten dies verbindlich festlegen oder andere Ausgabeformate zulassen. 3. Muss der Schlüssel ohne Leerzeichen gedruckt werden? Was ist mit dem Drucken im Listenformat, zB[0, 5, 2, ...]
?Antworten:
Gelee ,
129 BytesProbieren Sie es online!
Wie es funktioniert
quelle
Python 3, 130 Bytes
Vielen Dank an @Rod für den Hinweis auf einen Fehler
Eine Funktion, die Eingaben über Argumente als Zeichenfolge akzeptiert und an STDOUT ausgibt.
Wie es funktioniert
Probieren Sie es auf Ideone
quelle
m=10**len(x);k=str(randint(m,m*10))[1:];
und Sie speichern sogar ein Byte in dem Prozess. c:randint
es inklusive ist, was bedeutet, dass Sie dies tun müsstenm*10-1
. Ich habe mir gerade eine Möglichkeit ausgedacht, dies für die gleiche Byteanzahl zu beheben.Pyth - 16 Bytes
Warten auf die Entscheidung von OP über die Ausgabeformate.
Test Suite .
quelle
Eigentlich 17 Bytes
Probieren Sie es online!
Erläuterung:
quelle
CJam - 14 Bytes
Als ich die ASCII-Code-Mathematik sah, wusste ich, dass ich eine CJam-Antwort schreiben musste.
Probieren Sie es hier online aus .
quelle
MATL, 13 Bytes
Die Ausgabe sieht folgendermaßen aus:
Probieren Sie es online!
Erläuterung:
quelle
r
oderYr
PowerShell v2 +,
79.77ByteÜbernimmt die Eingabe
$n
, durchläuft jedes Zeichen und erhältRandom
bei0..9
jeder Iteration ein Element . Speichert diese Zahlen (als Array) in$x
. Leitet dieses Array in eine andere Schleife. Jede Iteration nimmt das aktuelle Element$_
, fügt es dem in Scheiben geschnittenen Positionszeichen hinzu$n
(implizite Umwandlung von Zeichen in Ganzzahl) und wandelt es dann um als[char]
. Lässt das in der Pipeline. Das ist in Parens eingekapselt und-join
zusammengefügt, um das Wort zu bilden. Das ist noch in der Pipeline. Zusätzlich wird die Nummer$x
auch-join
zusammengefügt und in der Pipeline belassen. Diese werden implizit mit einemWrite-Output
am Ende der Ausführung gedruckt, was dazu führt, dass sie standardmäßig mit einer neuen Zeile gedruckt werden.Beispiel
quelle
C #,
252247245232216 BytesDie Größe ist ziemlich schlecht im Vergleich zu den anderen Lösungen, aber trotzdem ...
Dies ist meine zweite Antwort auf einen Codegolf und ich bin ein ziemlicher Anfänger in Anbetracht von C #, also würde ich gerne hören, wie ich es kürzer machen kann :)
Ungolfed:
static
aus der Klasse pquelle
b++<i.Count()
den dritten Satz auch leer lassen? Auch ich glaube nicht , dass Sie ein Newline benötigen, so der letzte AufrufWriteLine
könnteWrite
statt.var
. dh-var c=
anstattstring c=
ein paar Bytes zu rasieren.Console.ReadLine()
als String?i.Length
ist kürzer alsi.Count()
, System.Linq wird nicht benötigt. string hat einen char indexer. Auch die Schaffung neue zufällig ausgewählte Objekte in der Schleife weniger Bytes:new Random().Next(10)
.CJam, 11 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
05AB1E ,
1817 BytesErläuterung
Probieren Sie es online aus
quelle
Python 3, 112 Bytes
c ist eine Funktion, die den verschlüsselten Text und den Schlüssel zurückgibt
Hier ist ein Code, der das Gleiche tut und etwas besser lesbar ist
Ausgabe:
quelle
PHP,
638682 BytesBearbeiten: vergessen, den Schlüssel zu drucken ...
Vielen Dank an Alex Howansky, der mir 4 Bytes gespart hat.
Die Eingabe erfolgt über ein Befehlszeilenargument. Nimmt jedes Zeichen in der Zeichenfolge und fügt seinem ASCII-Code ein zufälliges int von 0 bis 9 hinzu. Anschließend wird der Code wieder in ASCII konvertiert. Jede Zufallszahl wird angehängt
$s
, die am Ende gedruckt wird.quelle
$s.=$r
nach dem 2. Semi in die for-Schleife einfügen und ein Byte speichern, da Sie das nachfolgende Semi ausgeben können. Dann besteht Ihre Schleife nur noch aus einer Anweisung, sodass Sie die Umbruchklammern ausschneiden und 2 weitere Bytes einsparen können. Am Ende können Sie den$s
in Anführungszeichen gesetzten String einfügen und den.
Operator um ein weiteres Byte speichern. :)J, 32 Bytes
Python-Äquivalent:
quelle
Perl, 34 Bytes
Beinhaltet +1 für
-p
quelle
Perl, 65 Bytes
Ich habe eine Weile gebraucht, um herauszufinden, wie ich die Eingabe am Ende ohne neue Zeile erhalten kann. Nimmt es als Kommandozeilenargument
quelle
$;
startet nicht leer, druckt also den alten Inhalt und der Rand kann niemals 9 generieren. Sie sind einfach zu reparieren und die Verwendung von STDIN wird Ihren Code kürzer machen :-)<>=~/./g
. Und nein,int
in Perl schneidet es gegen 0 ab, es rundet nicht.perl -wle 'print int 8.6'
Ausgänge8
Python 2,
8499 BytesVerwendet den
id()
Wert der Zeichenfolge, um Zufallszahlen zu generieren.Versuch es
quelle
map(chr,[ord(a)+int(b)for a,b in zip(x,y)])
zumap(lambda x,y:chr(ord(x)+int(y)),x,y)
? das sollte etwas rettenSenva , 74 Bytes
Hier ist das kürzeste Programm, das ich gemacht habe:
Eine kleine Erklärung? (Hinweis: BM bedeutet Back-Memory ):
Das scheint jetzt größer zu sein, stimmt: p? Vielleicht ist es möglich, diesen Code zu optimieren, aber im Moment ist das der kürzeste, den ich gefunden habe.
quelle
C #, 174 Bytes
Ungolfed:
Wirklich ziemlich unkompliziert.
quelle
Perl 6: 55 oder 70 Bytes
Als anonyme Funktion, die einen Zeichenfolgenparameter verwendet und eine Liste mit zwei Zeichenfolgen (54 Zeichen, 55 Byte) zurückgibt :
Als Programm, das aus STDIN liest und in STDOUT schreibt (69 Zeichen, 70 Bytes) :
quelle