Einführung:
In einem Dokument, das ich als Kind zusammengestellt habe, sind viele verschiedene Chiffren gespeichert. Ich habe einige ausgewählt, die meiner Meinung nach am besten für Herausforderungen geeignet sind (nicht zu trivial und nicht zu schwierig), und sie in Herausforderungen umgewandelt. Die meisten von ihnen sind noch im Sandkasten und ich bin mir noch nicht sicher, ob ich sie alle oder nur einige veröffentlichen werde. Aber hier ist der erste von ihnen, der etwas anfängt von.
Eine Computer-Chiffre verschlüsselt den gegebenen Text in 'zufällige' Zeichengruppen einer gegebenen length
. Wenn eine solche Gruppe eine Ziffer enthält, wird diese Ziffer verwendet, um das verschlüsselte Zeichen in eine eigene Gruppe einzuteilen. Wenn in der Gruppe keine Ziffer vorhanden ist, wird das erste Zeichen verwendet.
Angenommen, wir möchten den Text this is a computer cipher
mit einer bestimmten Länge von verschlüsseln 5
. Dies ist eine mögliche Ausgabe (Hinweis: Zahlen sind im folgenden Beispiel 1-indiziert):
t h i s i s a c o m p u t e r c i p h e r (without spaces of course, but added as clarification)
qu5dt hprit k3iqb osyw2 jii2o m5uzs akiwb hwpc4 eoo3j muxer z4lpc 4lsuw 2tsmp eirkr r3rsi b5nvc vid2o dmh5p hrptj oeh2l 4ngrv (without spaces of course, but added as clarification)
Nehmen wir ein paar Gruppen als Beispiele, um zu erklären, wie die Gruppe entschlüsselt werden kann:
qu5dt
: Diese Gruppe enthält eine Ziffer5
der (1-indizierte) 5. Zeichen dieser Gruppe ist das Zeichen für den entschlüsselten Text verwendet wird , so:t
.hprit
: Keine Ziffern enthält diese Gruppe, so das erste Zeichen dieser Gruppe implizit für den entschlüsselten Text verwendet wird:h
.osyw2
: Diese Gruppe enthält eine Ziffer2
, so dass die (1-indizierte) 2. Zeichen dieser Gruppe das Zeichen für den entschlüsselten Text verwendet wird:s
.
Herausforderung:
Geben Sie bei einer bestimmten Ganzzahl length
und Zeichenfolge word_to_encipher
einen Zufallsgenerator aus verschlüsselte Zeichenfolge wie oben beschrieben.
Sie haben nur die angegebenen chiffrieren length
und word_to_encipher
, so dass keine Notwendigkeit als auch eine Entschlüsselung Programm / Funktion zu erstellen. Ich könnte jedoch in Zukunft eine Teil-2-Herausforderung für die Entschlüsselung stellen.
Herausforderungsregeln:
- Sie können davon ausgehen, dass der
length
Wert im Bereich liegt[3,9]
. - Sie können davon ausgehen, dass das
word_to_encipher
nur Buchstaben enthält. - Sie können entweder Groß- oder Kleinbuchstaben verwenden (bitte geben Sie an, welche Sie in Ihrer Antwort verwendet haben).
- Ihre Ausgaben, jede Gruppe und die Positionen der Ziffern in einer Gruppe (falls vorhanden) sollten einheitlich zufällig sein . Alle zufälligen Buchstaben des Alphabets haben also die gleiche Wahrscheinlichkeit, vorzukommen. Die Position des verschlüsselten Buchstabens in jeder Gruppe hat die gleiche Wahrscheinlichkeit des Auftretens. und die Position der Ziffer hat die gleiche Chance aufzutreten (außer wenn es sich um das erste Zeichen handelt und keine Ziffer vorhanden ist; und es kann sich offensichtlich nicht an derselben Position wie das verschlüsselte Zeichen befinden).
- Sie können auch 0-indizierte Ziffern anstelle von 1-indizierten verwenden. Bitte geben Sie an, welche der beiden Antworten Sie verwendet haben.
- Die Ziffer
1
(oder0
wenn sie mit 0 indiziert ist) wird niemals in der Ausgabe vorhanden sein. Esb1ndh
ist also keine gültige Gruppe, um das Zeichen 'b' zu verschlüsseln. Jedochb4tbw
gilt, wo die4
chiffriert dieb
an der 4. (1-indizierte) Position und die anderen Zeichenb
,t
,w
zufällig sind (die zufällig auch ein enthältb
). Andere mögliche gültige Gruppen vonlength
5 bis chiffrieren das Zeichen ‚b‘:abcd2
,ab2de
,babbk
,hue5b
, usw.
Allgemeine Regeln:
- Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden. - Für Ihre Antwort gelten Standardregeln mit Standard-E / A-Regeln. Daher dürfen Sie STDIN / STDOUT, Funktionen / Methoden mit den richtigen Parametern und vollständige Programme vom Rückgabetyp, verwenden. Ihr Anruf.
- Standardlücken sind verboten.
- Fügen Sie nach Möglichkeit einen Link mit einem Test für Ihren Code hinzu (z. B. TIO ).
- Außerdem wird dringend empfohlen, eine Erklärung für Ihre Antwort hinzuzufügen.
Testfälle:
Input:
Length: 5
Word to encipher: thisisacomputercipher
Possible output:
qu5dthpritk3iqbosyw2jii2om5uzsakiwbhwpc4eoo3jmuxerz4lpc4lsuw2tsmpeirkrr3rsib5nvcvid2odmh5phrptjoeh2l4ngrv
Input:
Length: 8
Word to encipher: test
Possible output:
ewetng4o6smptebyo6ontsrbtxten3qk
Input:
Length: 3
Word to encipher: three
Possible output:
tomv3h2rvege3le
abcd2
,ab2de
,babbk
alle gleich? Ist das auchb1akk
gültig?b1akk
würde ich nein sagen. Wird es in der Herausforderungsbeschreibung bearbeiten, um zu verdeutlichen. Wenn das erste Zeichen das verschlüsselte ist, darf keine Ziffer vorhanden sein."a??"
hat 676 mögliche Ergebnisse, aber"1a?"
,"?a1"
,"2?a"
,"?2a"
, hat only104 Ergebnisse. Wenn ich also versuche, aus all diesen 780 Ergebnissen ein Ergebnis auszuwählen, ist die Verteilung von "Position des verschlüsselten Buchstabens" 13: 1: 1, nicht 1: 1: 1. Und ich würde das als "einheitlich zufällig" betrachten.Antworten:
Pyth, 22 Bytes
Probieren Sie es online aus.
Verwendet Kleinbuchstaben und Nullindizierung.
Erläuterung
Sehr einfacher Algorithmus.
quelle
Perl 6 , 125 Bytes
Probieren Sie es online!
Nimmt die Eingabe und Ausgabe in Großbuchstaben vor. Nimmt Eingaben wie Curry
f(n)(string)
. Verwendet 1 Indizierung.Erläuterung:
quelle
Python 2 ,
187177176156154148 BytesProbieren Sie es online!
Verwendet Großbuchstaben und 0-indizierte Zahlen.
-3 Bytes, danke an Kevin Cruijssen
quelle
sample(R(l),2)[::1|-(random()<.5)]
bedeutetrange(l)
und mischt sie. Aber anscheinend Probe garantiert keine Bestellung, so ist es nicht erforderlich :)(j==i)*(n>0)
? Die Multiplikation hat Vorrang vor dem Subtrahieren, nicht wahr?JavaScript (Node.js) , 135 Byte
Probieren Sie es online!
Danke Arnauld für 1B
quelle
R ,
134132123 BytesProbieren Sie es online!
Nimmt Großbuchstaben.
Erklärung des alten Codes (meistens der gleiche Ansatz):
quelle
Java (JDK) , 193 Byte
Probieren Sie es online!
IntStream
(durchgestricheneString::chars
) sowie eine Zahl und gibt eine andere zurückIntStream
.double
bisint
sind wegen des Hackes unnötig+=
.quelle
Japt , 29 Bytes
Probieren Sie es online!
Nullindexiert.
Erläuterung:
quelle
C 115 Bytes
Probieren Sie es online!
0-indiziert, Kleinbuchstaben.
Leicht ungolfed und erweitert:
Der Code sollte ziemlich einfach sein. Die zwei Zufälle
i
,j
die in einemrand()
Aufruf erzeugt werden , sind gut wie unabhängig, da gcd (n
,~-n
) = 1 undRAND_MAX
groß ist.quelle
Sauber , 256 Bytes
Probieren Sie es online!
Wählt:
x
(Position des Zeichens im Segment)y
, der nicht gleich istx
(Position der Ziffer im Segment)x
und nicht gleich ist,y
esx
sei denn, sie ist Nullquelle
JavaScript, 134 Byte
Probieren Sie es online!
Diese Antwort wählte die codierte Zeichenfolge aus allen möglichen codierten Zeichenfolgen einheitlich aus. So ist es eher möglich, den verschlüsselten Buchstaben als den ersten zu erstellen.
quelle
C # (Visual C # Interactive Compiler) , 171 Byte
Probieren Sie es online!
Erläuterung...
quelle
Holzkohle ,
35-30BytesProbieren Sie es online! Link ist eine ausführliche Version des Codes. 0-indiziert. Erläuterung:
Geben Sie die Länge ein.
Geben Sie das Wort ein und durchlaufen Sie die Zeichen.
Wählen Sie eine zufällige Position für den entschlüsselten Buchstaben.
Wählen Sie eine andere zufällige Position für die Ziffer, es sei denn, der Buchstabe befindet sich an Position 0. In diesem Fall setzen Sie die Ziffer auch an Position 0.
Schleife einmal für jedes ausgegebene Zeichen und schalte die Position ein.
Wenn dies die Position der Ziffer ist, geben Sie die Position des entschlüsselten Buchstabens aus.
Wenn dies jedoch die Position des entschlüsselten Buchstabens ist, geben Sie den Buchstaben aus. Dies hat Vorrang vor der Position der Ziffer, da Charcoal die letzte Eingabe vornimmt, wenn mehrere Schaltergehäuse denselben Wert haben.
Ansonsten geben Sie einen zufälligen Buchstaben aus.
quelle
05AB1E , 26 Bytes
0-indiziert.
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
quelle