Einführung
Um zu verhindern, dass Keylogger das Passwort eines Benutzers stehlen, hat ein bestimmtes Bankkontosystem die folgende Sicherheitsmaßnahme implementiert: Bei jeder Eingabe werden nur bestimmte Ziffern abgefragt.
Angenommen, das Passwort Ihres Ziels lautet 89097
: Das System fordert Sie möglicherweise auf, die 2., 4. und 5. Ziffer einzugeben:
997
Oder sie werden aufgefordert, die 1., 3. und 5. Ziffer einzugeben:
807
Sie wissen nur, dass Ihr Ziel die Ziffern der Reihe nach eingegeben hat, aber Sie wissen nicht, zu welcher Position sie im aktuellen Passwort gehören . Alles, was Sie wissen, ist, dass es zwei Neunen gibt, die vor sieben kommen müssen. und dass 8 vor 0 und 0 vor 7 kommt. Daher gibt es sechs mögliche Passwörter:
80997
89097
89907
98097
98907
99807
Der Keylogger auf dem Computer Ihres Ziels sammelt seit Monaten Passworteingaben, also lasst uns einsteigen!
Herausforderung
Geben Sie bei einer Liste dreistelliger Eingaben alle möglichen Passwörter aus, die für alle Eingaben gültig sind. Um die Komplexität der Berechnungen zu verringern und die Anzahl der möglichen Ergebnisse gering zu halten, ist das Kennwort garantiert numerisch und hat eine feste Größe von 5. Die Ziffern in jeder Eingabe sind in der richtigen Reihenfolge: Wenn es 123 ist, gibt das Ziel zuerst 1 ein. dann 2, dann 3.
Ein- / Ausgabebeispiele
|----------------------|--------------------------------------------|
| Input | Output |
|----------------------|--------------------------------------------|
| [320, 723, 730] | [37230, 72320, 73203, 73230] |
| [374, 842] | [37842, 38742, 83742] |
| [010, 103, 301] | [30103] |
| [123, 124, 125, 235] | [12345, 12354, 12435] |
| [239, 944] | [23944] |
| [111, 120] | [11201, 11120, 11210, 12011, 12110, 12101] |
| [456, 789] | [] |
| [756, 586] | [07586, 17586, 27586, 37586, 47586, 57586, 57856, 58756, 67586, 70586, 71586, 72586, 73586, 74586, 75086, 75186, 75286, 75386, 75486, 75586, 75686, 75786, 75806, 75816, 75826, 75836, 75846, 75856, 75860, 75861, 75862, 75863, 75864, 75865, 75866, 75867, 75868, 75869, 75876, 75886, 75896, 75986, 76586, 77586, 78586, 79586, 87586, 97586] |
| [123] | [00123, 01023, 01123, 01203, 01213, 01223, 01230, 01231, 01232, 01233, 01234, 01235, 01236, 01237, 01238, 01239, 01243, 01253, 01263, 01273, 01283, 01293, 01323, 01423, 01523, 01623, 01723, 01823, 01923, 02123, 03123, 04123, 05123, 06123, 07123, 08123, 09123, 10023, 10123, 10203, 10213, 10223, 10230, 10231, 10232, 10233, 10234, 10235, 10236, 10237, 10238, 10239, 10243, 10253, 10263, 10273, 10283, 10293, 10323, 10423, 10523, 10623, 10723, 10823, 10923, 11023, 11123, 11203, 11213, 11223, 11230, 11231, 11232, 11233, 11234, 11235, 11236, 11237, 11238, 11239, 11243, 11253, 11263, 11273, 11283, 11293, 11323, 11423, 11523, 11623, 11723, 11823, 11923, 12003, 12013, 12023, 12030, 12031, 12032, 12033, 12034, 12035, 12036, 12037, 12038, 12039, 12043, 12053, 12063, 12073, 12083, 12093, 12103, 12113, 12123, 12130, 12131, 12132, 12133, 12134, 12135, 12136, 12137, 12138, 12139, 12143, 12153, 12163, 12173, 12183, 12193, 12203, 12213, 12223, 12230, 12231, 12232, 12233, 12234, 12235, 12236, 12237, 12238, 12239, 12243, 12253, 12263, 12273, 12283, 12293, 12300, 12301, 12302, 12303, 12304, 12305, 12306, 12307, 12308, 12309, 12310, 12311, 12312, 12313, 12314, 12315, 12316, 12317, 12318, 12319, 12320, 12321, 12322, 12323, 12324, 12325, 12326, 12327, 12328, 12329, 12330, 12331, 12332, 12333, 12334, 12335, 12336, 12337, 12338, 12339, 12340, 12341, 12342, 12343, 12344, 12345, 12346, 12347, 12348, 12349, 12350, 12351, 12352, 12353, 12354, 12355, 12356, 12357, 12358, 12359, 12360, 12361, 12362, 12363, 12364, 12365, 12366, 12367, 12368, 12369, 12370, 12371, 12372, 12373, 12374, 12375, 12376, 12377, 12378, 12379, 12380, 12381, 12382, 12383, 12384, 12385, 12386, 12387, 12388, 12389, 12390, 12391, 12392, 12393, 12394, 12395, 12396, 12397, 12398, 12399, 12403, 12413, 12423, 12430, 12431, 12432, 12433, 12434, 12435, 12436, 12437, 12438, 12439, 12443, 12453, 12463, 12473, 12483, 12493, 12503, 12513, 12523, 12530, 12531, 12532, 12533, 12534, 12535, 12536, 12537, 12538, 12539, 12543, 12553, 12563, 12573, 12583, 12593, 12603, 12613, 12623, 12630, 12631, 12632, 12633, 12634, 12635, 12636, 12637, 12638, 12639, 12643, 12653, 12663, 12673, 12683, 12693, 12703, 12713, 12723, 12730, 12731, 12732, 12733, 12734, 12735, 12736, 12737, 12738, 12739, 12743, 12753, 12763, 12773, 12783, 12793, 12803, 12813, 12823, 12830, 12831, 12832, 12833, 12834, 12835, 12836, 12837, 12838, 12839, 12843, 12853, 12863, 12873, 12883, 12893, 12903, 12913, 12923, 12930, 12931, 12932, 12933, 12934, 12935, 12936, 12937, 12938, 12939, 12943, 12953, 12963, 12973, 12983, 12993, 13023, 13123, 13203, 13213, 13223, 13230, 13231, 13232, 13233, 13234, 13235, 13236, 13237, 13238, 13239, 13243, 13253, 13263, 13273, 13283, 13293, 13323, 13423, 13523, 13623, 13723, 13823, 13923, 14023, 14123, 14203, 14213, 14223, 14230, 14231, 14232, 14233, 14234, 14235, 14236, 14237, 14238, 14239, 14243, 14253, 14263, 14273, 14283, 14293, 14323, 14423, 14523, 14623, 14723, 14823, 14923, 15023, 15123, 15203, 15213, 15223, 15230, 15231, 15232, 15233, 15234, 15235, 15236, 15237, 15238, 15239, 15243, 15253, 15263, 15273, 15283, 15293, 15323, 15423, 15523, 15623, 15723, 15823, 15923, 16023, 16123, 16203, 16213, 16223, 16230, 16231, 16232, 16233, 16234, 16235, 16236, 16237, 16238, 16239, 16243, 16253, 16263, 16273, 16283, 16293, 16323, 16423, 16523, 16623, 16723, 16823, 16923, 17023, 17123, 17203, 17213, 17223, 17230, 17231, 17232, 17233, 17234, 17235, 17236, 17237, 17238, 17239, 17243, 17253, 17263, 17273, 17283, 17293, 17323, 17423, 17523, 17623, 17723, 17823, 17923, 18023, 18123, 18203, 18213, 18223, 18230, 18231, 18232, 18233, 18234, 18235, 18236, 18237, 18238, 18239, 18243, 18253, 18263, 18273, 18283, 18293, 18323, 18423, 18523, 18623, 18723, 18823, 18923, 19023, 19123, 19203, 19213, 19223, 19230, 19231, 19232, 19233, 19234, 19235, 19236, 19237, 19238, 19239, 19243, 19253, 19263, 19273, 19283, 19293, 19323, 19423, 19523, 19623, 19723, 19823, 19923, 20123, 21023, 21123, 21203, 21213, 21223, 21230, 21231, 21232, 21233, 21234, 21235, 21236, 21237, 21238, 21239, 21243, 21253, 21263, 21273, 21283, 21293, 21323, 21423, 21523, 21623, 21723, 21823, 21923, 22123, 23123, 24123, 25123, 26123, 27123, 28123, 29123, 30123, 31023, 31123, 31203, 31213, 31223, 31230, 31231, 31232, 31233, 31234, 31235, 31236, 31237, 31238, 31239, 31243, 31253, 31263, 31273, 31283, 31293, 31323, 31423, 31523, 31623, 31723, 31823, 31923, 32123, 33123, 34123, 35123, 36123, 37123, 38123, 39123, 40123, 41023, 41123, 41203, 41213, 41223, 41230, 41231, 41232, 41233, 41234, 41235, 41236, 41237, 41238, 41239, 41243, 41253, 41263, 41273, 41283, 41293, 41323, 41423, 41523, 41623, 41723, 41823, 41923, 42123, 43123, 44123, 45123, 46123, 47123, 48123, 49123, 50123, 51023, 51123, 51203, 51213, 51223, 51230, 51231, 51232, 51233, 51234, 51235, 51236, 51237, 51238, 51239, 51243, 51253, 51263, 51273, 51283, 51293, 51323, 51423, 51523, 51623, 51723, 51823, 51923, 52123, 53123, 54123, 55123, 56123, 57123, 58123, 59123, 60123, 61023, 61123, 61203, 61213, 61223, 61230, 61231, 61232, 61233, 61234, 61235, 61236, 61237, 61238, 61239, 61243, 61253, 61263, 61273, 61283, 61293, 61323, 61423, 61523, 61623, 61723, 61823, 61923, 62123, 63123, 64123, 65123, 66123, 67123, 68123, 69123, 70123, 71023, 71123, 71203, 71213, 71223, 71230, 71231, 71232, 71233, 71234, 71235, 71236, 71237, 71238, 71239, 71243, 71253, 71263, 71273, 71283, 71293, 71323, 71423, 71523, 71623, 71723, 71823, 71923, 72123, 73123, 74123, 75123, 76123, 77123, 78123, 79123, 80123, 81023, 81123, 81203, 81213, 81223, 81230, 81231, 81232, 81233, 81234, 81235, 81236, 81237, 81238, 81239, 81243, 81253, 81263, 81273, 81283, 81293, 81323, 81423, 81523, 81623, 81723, 81823, 81923, 82123, 83123, 84123, 85123, 86123, 87123, 88123, 89123, 90123, 91023, 91123, 91203, 91213, 91223, 91230, 91231, 91232, 91233, 91234, 91235, 91236, 91237, 91238, 91239, 91243, 91253, 91263, 91273, 91283, 91293, 91323, 91423, 91523, 91623, 91723, 91823, 91923, 92123, 93123, 94123, 95123, 96123, 97123, 98123, 99123] |
|----------------------|--------------------------------------------|
Regeln
- Die Eingabe ist garantiert nicht leer.
- Führende und nachfolgende Nullen sind wichtig: Sie
01234
unterscheiden sich von den Kennwörtern12340
und1234
knacken sie nicht. Überlegen Sie, wie echte Passwörter funktionieren! - Es gelten die Standard-E / A-Regeln .
- Keine Standardlücken .
- Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes. Nicht-Codegolf-Sprachen sind willkommen!
Antworten:
Python, 100 Bytes
Probieren Sie es online!
Funktioniert sowohl in Python 2 als auch in Python 3.
( 97 Bytes in Python 3.8 :)
quelle
'%05d'
.05AB1E ,
119 BytesProbieren Sie es online!
Erläuterung
quelle
JavaScript (ES6), 88 Byte
Druckt die Ergebnisse mit
alert()
.Probieren Sie es online!
Kommentiert
quelle
Haskell,
81807876 BytesDer offensichtliche Brute-Force-Ansatz in Haskell: Erstellen Sie eine Liste aller möglichen Kennwörter und behalten Sie diejenigen bei, bei denen sich alle Elemente aus der Eingabeliste in der jeweiligen Liste der Teilsequenzen befinden.
Probieren Sie es online!
Edit: -1 Byte dank @xnor,
-2-4 Byte dank @ H.PWizquelle
concat.words<$>mapM(:" ")p
ist kürzerp<-mapM(:['1'..'9'])"00000"
, um 2 weitere Bytes zu speichernJelly , 11 Bytes
Probieren Sie es online!
quelle
Pyth, 11 Bytes
Nimmt die Eingabe als eine Reihe von Zeichenfolgen.
Probieren Sie es hier aus
Erläuterung
quelle
Ruby , 54 Bytes
Probieren Sie es online!
Nimmt die Eingabe als Array von Zeichen-Arrays.
quelle
Python 3 , 98 Bytes
Probieren Sie es online!
Versucht rekursiv, jede fünfstellige Zahlenfolge einzubauen
s
, und verfolgt dabei die Teilfolgen, diel
noch getroffen werden müssen. Wenn am Ende alle leer sind, wird das Ergebnis gedruckt.Python 3.8 (Vorabversion) , 94 Byte
Probieren Sie es online!
Siehe die Macht der Zuweisungsausdrücke ! Verwendet die Methode von hier zum Überprüfen von Teilsequenzen.
quelle
Perl 5
-a
, 80 BytesProbieren Sie es online!
quelle
$t+=/$b/
anstelle von/$b/&&$t++
Netzhaut , 53 Bytes
Probieren Sie es online! Erläuterung:
Nehmen Sie nach dem Ausführen des Skripts das Ergebnis als neues Skript und führen Sie es ebenfalls aus.
.*
Überall einfügen . Dies führt.*3.*2.*0.*
zwar dazu, dass wir nur brauchen3.*2.*0
, aber nicht, dass es darauf ankommt.Fügen Sie
G`
am Anfang jeder Zeile ein. Dies macht es zu einem Retina Grep-Befehl.Stellen Sie zwei weiteren Retina-Befehlen das Präfix voran. Das resultierende Skript sieht daher ungefähr so aus:
Löschen Sie den Puffer (der die ursprüngliche Eingabe enthält).
Wiederholen Sie 5 mal ...
... an jede Zeile anhängen ...
... die Ziffer
0
, dann eine Kopie der Zeile, dann die Ziffer1
usw. bis9
. Dies bedeutet, dass Sie nachn
Schleifen allen
Ziffern haben.Filtern Sie die möglichen Zahlen basierend auf der Eingabe heraus.
quelle
R ,
8082 BytesHier ist eine Basis-R-Lösung mit Regex. Durch das Schreiben dieser verschachtelten Reihe von Funktionen wurde mir klar, wie sehr ich gelernt habe, das Paket magrittr zu schätzen!
Hatte anfangs keine Regeln für die Eingabe gelesen, liest jetzt also von stdin (danke @KirillL).
Probieren Sie es online!
quelle
Ruby ,
7977 BytesProbieren Sie es online!
Die Eingabe ist ein Array von Zeichenfolgen.
Hier ist eine besser lesbare Version desselben Codes:
quelle
1e5
, wie dieserPHP 128 Bytes
oder
Eingabe von Befehlszeilenargumenten. Laufen Sie mit
-nr
oder probieren Sie sie online aus .quelle
J , 52 Bytes
Probieren Sie es online!
quelle
Japt, 21 Bytes
Versuch es!
-2 Bytes dank @Shaggy!
quelle
1e5o ù'0 fA{Ue@AèX®+".*
1e5o ù'0 fA{Ue@AèX¬q".*
return X,Y,Z
dass ich das letzte Semester wählen würde. Danke für die Tipps :)C # (Visual C # Interactive Compiler) , 116 Byte
Probieren Sie es online!
BEARBEITEN: Ein Fehler wurde behoben, durch den dasselbe Zeichen mehr als einmal gezählt wurde. Wenn beispielsweise
000
protokolliert wurde, gibt die Funktion alle Kennwörter zurück, die ein einzelnes enthalten0
.quelle
Sauber , 113 Bytes
Probieren Sie es online!
quelle
K 67 Bytes
K hat eine (sehr) primitive Regex-Fähigkeit, also habe ich einen anderen Ansatz ausprobiert.
{...} definiert ein Lambda. Anwendungsbeispiel:
{...}("320";"723";"730")
kehrt zurück
("37230";"72320";"73203";"73230")
n
ist die Liste der Ganzzahlen im Bereich 0..9999 als mit 0 aufgefüllte Zeichenfolgen_1e5
Wendet Floor auf Float 1e5 an (wissenschaftliche Notation) -> generiert eine Ganzzahl von 100000!_1e5
Erzeugt Integer-Liste 0..99999{..}'!_1e5
Wendet Lambda auf jeden Wert in 0..99999 an$x
transformiere das Argument x (implizites Argument) in einen String-5$$x
rechts stell die Zeichenkette $ x auf ein Feld der Größe 5 (zB-5$$12
erzeugt" 12"
"0"^string
Ersetzt Leerzeichen durch "0","0"^-5$$12
erzeugt also"00012"
a
ist die Liste der Ganzzahlen im Bereich 0..31 als 5-Bit-Werte!32
Werte generieren 0..31(5#2)
wiederhole 2 fünf mal (liste 2 2 2 2 2)(5#2)\:'!32
generiert 5-Bit-Werte (2-Basis-Fünffach) für jeden Wert im Bereich 0..31Wir filtern die Werte von a mit genau drei. Dass Werte sind alle Kombinationen (Plätze) , wo Muster angeordnet werden können:
11100 11010 11001 10110 10101 10011 01110 01101 01011 00111
. Ex. für "abc" Muster haben wir Äquivalenz mit regulären Ausdrückenabc?? ab?c? ab??c a?bc? a?b?c a??bc ?abc? ?ab?c ?a?bc ??abc?
+\'a
berechnet die Summe jeder binären Darstellung (Anzahl von Einsen)3=+\'a
Erzeugt eine Liste von Booleschen Werten (wenn jeder Wert in a genau drei hat)a@&3=+\'a
liest als "a an wo 3 = + 'a ist wahr"Liste der Indizes für frühere Orte generieren:
(0 1 2; 0 1 3; 0 1 4; 0 2 3; 0 2 4; 0 3 4; 1 2 3; 1 2 4; 1 3 4; 2 3 4)
und die möglichen eingegebenen Werte für ein Passwort (x)&:'
Liest als "where each", gilt für die Liste der binär codierten Ganzzahlen und berechnet die Indizes für jedes 1-Bitx@/:
Wendet das Passwort x auf jedes Element der Indexliste an (generiert alle möglichen eingegebenen Werte)Bestimmt, ob sich alle Muster in der Liste aller möglichen eingegebenen Werte befinden
y
ist das Argument, das eine Liste von Mustern darstellty in\:
Liest als jeden Wert von y in der Liste auf der rechten Seite&/
ist "und vorbei".&/y in\:..
Gibt true zurück, wenn sich alle Muster in y in der Liste befinden.Geben Sie abschließend bei jedem Index, der Lambda wahr macht, jeden String in n zurück
n@&{..}
liest als "n an, wo Lambda {..} wahr zurückgibt"quelle
C (GCC) 222 Bytes
Probieren Sie es online aus
Vorwahl
Ausgabe
quelle