Die Herausforderung
Ich präsentiere Ihnen eine weitere Herausforderung zwischen Spion und Spion. In diesem Fall ist das zu schützende Datum jedoch kein Eingang, sondern ein Ausgang .
Die Regeln der Herausforderung sind einfach. Schreiben Sie eine Routine mit folgenden Angaben:
- Die Routine kann in einer beliebigen Sprache geschrieben sein, darf jedoch 320 Byte nicht überschreiten.
- Die Routine muss drei 32-Bit-Ganzzahlen mit Vorzeichen als Eingaben akzeptieren. Es kann die Form einer Funktion annehmen, die 3 Argumente akzeptiert, einer Funktion, die ein einzelnes Array mit 3 Elementen akzeptiert, oder eines vollständigen Programms, das 3 Ganzzahlen von einer beliebigen Standardeingabe liest.
- Die Routine muss eine vorzeichenbehaftete 32-Bit-Ganzzahl ausgeben.
- Für alle möglichen Eingaben muss die Routine zwischen 2 und 1000 (einschließlich) eindeutige Werte ausgeben. Die Anzahl der eindeutigen Werte, die eine Routine ausgeben kann, wird als Schlüssel bezeichnet .
Als Beispiel das C-Programm
int foo( int i1, int i2, int i3 ) {
return 20 + (i1^i2^i3) %5;
}
hat einen Schlüssel von 9, da es (hoffentlich) nur Ausgang der neun Werte 16
, 17
, 18
, 19
, 20
, 21
, 22
, 23
, und 24
.
Einige zusätzliche Einschränkungen sind wie folgt:
- Die Routine muss vollständig deterministisch und zeitinvariant sein und identische Ausgaben für identische Eingaben zurückgeben. Die Routine sollte keine Pseudozufallszahlengeneratoren aufrufen.
- Die Routine stützt sich möglicherweise nicht auf "versteckte Variablen" wie Daten in Dateien, Systemvariablen oder esoterische Sprachfunktionen. Beispielsweise sollten Routinen im Allgemeinen nicht auf Konstanten verweisen, es sei denn, die Konstanten sind im Code selbst eindeutig definiert. Von Routinen, die auf Compiler-Macken, Ausgaben von mathematisch undefinierten Operationen, Rechenfehlern usw. beruhen, wird ebenfalls dringend abgeraten. Im Zweifelsfall bitte nachfragen.
- Sie (der Codierer) müssen genau wissen, wie viele eindeutige Ausgaben die Routine erzeugen kann, und sollten in der Lage sein, mindestens eine Eingabesequenz bereitzustellen, die jede Ausgabe erzeugt. (Da es möglicherweise Hunderte von eindeutigen Ausgaben geben kann, wird dieses Set immer nur dann angefordert, wenn Ihr Schlüssel angefochten wird.)
Da dieses Problem der klassischen Verschlüsselung weitaus weniger ähnelt als das vorherige, gehe ich davon aus, dass es einem breiteren Publikum zugänglich sein wird.
Je kreativer, desto besser.
Die Wertung
Die kürzeste (n) nicht geknackte (n) Einsendung (en) pro Byteanzahl wird (werden) zum Gewinner erklärt.
Bei Unklarheiten wenden Sie sich bitte an uns.
Die Gegen-Herausforderung
Alle Leser, einschließlich derer, die ihre eigenen Routinen eingereicht haben, werden aufgefordert, Einsendungen zu "knacken". Ein Beitrag wird geknackt, wenn sein Schlüssel im zugehörigen Kommentarbereich veröffentlicht wird. Wenn eine Einreichung 72 Stunden lang ohne Änderung oder Crack andauert, wird sie als "sicher" eingestuft und jeder nachfolgende Erfolg beim Cracken wird für den Wettbewerb ignoriert.
Pro Einsendung und Leser ist nur ein Crackversuch zulässig. Wenn ich zum Beispiel an Benutzer X sende: "Ihr Schlüssel ist 20" und ich irre mich, lehnt Benutzer X meine Vermutung als falsch ab und ich kann keine weiteren Vermutungen für diese Übermittlung mehr übermitteln.
Gebrochene Einsendungen werden von der Konkurrenz ausgeschlossen (sofern sie nicht "sicher" sind). Sie sollten nicht bearbeitet werden. Wenn ein Leser eine neue Routine einreichen möchte, sollte er dies in einer separaten Antwort tun.
Die Punktzahl eines Crackers ist die Anzahl der Einreichungen (entweder konform oder nicht konform), die er knackt. Bei Crackern mit identischer Anzahl wird die Rangfolge durch die Gesamtbytezahl aller geknackten Einsendungen bestimmt (je höher, desto besser).
Der / die Cracker mit der (den) höchsten Punktzahl (en) wird (werden) zusammen mit den Entwicklern der Gewinnroutine zum Gewinner erklärt.
Bitte knacken Sie nicht Ihren eigenen Beitrag.
Viel Glück. :)
Bestenliste
Zuletzt aktualisiert am 2. September, 10:45 EST
Unbewegliche Barrieren (ungerissene Vorlagen):
- CJam, 105 [Dennis]
Unaufhaltsame Kräfte (Cracker):
- Dennis [ Java, 269 ; C 58 ; Mathematica, 29 ]
- Martin Büttner [ Java, 245 ]
return
etc ...Antworten:
CJam, 105 Bytes
Das Obige verwendet Caret- und M-Notation, da es nicht druckbare Zeichen enthält. Nach der Konvertierung des Byte-Streams in eine Ganzzahl (
256b
) wird der folgende Code ausgeführt:Sie können diese Version online im CJam-Interpreter testen .
Wie es funktioniert
Diese Vorlage verwendet die Zahlentheorie anstelle der Verschleierung. Das Programm gibt für fast alle Eingaben 0 zurück. Aus den wenigen Eingaben, die zu einer Ausgabe ungleich Null führen, wird ein geheimer Modul abgeleitet, der auf die 10 niedrigstwertigen Bits der dritten Ganzzahl angewendet wird.
Die effizienteste Art, diese Herausforderung zu lösen (die mir einfällt), wäre die Faktorisierung der 512-Bit-Ganzzahl, die hoffentlich in 72 Stunden nicht erreichbar sein wird.
Beispiellauf
quelle
Java - 269
Vielen Dank für die Geduld aller, dies sollte nun behoben sein.
verkürzt:
Nicht gekürzt:
quelle
double e,f,d=...;e=...;f=...;
aufdouble d=...,e=...,f=...;
1
und deine Antwort ist auch falsch;) (123 ist richtig ... jemand kommt vorbei und schnappt sich die knackende Punktzahl ...). Und ich denke, Stretch Maniac hat das nicht berücksichtigt,sin == 1.0
als er sagte, dass 122 korrekt ist.Ein Sampler
Natürlich kein offizieller Eintrag, und die Anzahl der Zeichen ist zu hoch, aber ich denke, wenn jemand eine nervenaufreibende Herausforderung haben möchte, kann er versuchen, zu bestimmen, wie viele eindeutige Ausgaben die folgende Funktion erzeugt (vorausgesetzt, drei Eingaben werden im OP beschrieben). :
Tatsächlich bin ich so zuversichtlich, dass es unknackbar ist, dass ich jeden, der es knackt, mit dem "Supreme Unstoppable Force of Nature Award" auszeichnen werde.
Weil sie es wirklich verdienen.
quelle
C, 58 Bytes (geknackt)
Ein einfaches:
quelle
-15485867, -1299721, -104287, 0, 104287, 1299721, 15485867
).Java - 245
Gebrochen von Martin Büttner
Füttere die Eingabe als int-Array:
a(new int[]{1,2,3})
. Ich erwarte nicht, dass es 72 Stunden dauern wird, aber viel Spaß damit.Hier ist es mit Zeilenumbrüchen, um es ein bisschen lesbarer zu machen:
quelle
Mathematica, 29 Bytes, Schlüssel: 715, Gebrochen von Dennis
Dies ist nur eine feste Version meiner ursprünglichen Antwort, die bei nicht positiven Eingaben nicht funktioniert hat.
Nimmt eine Liste von ganzen Zahlen wie
quelle
349
einzigartige Ergebnisse gefunden. Die Reichweite betrug von3
bis717
.3 ... 717
).207 Zeichen in C / C ++, noch nicht verschleiert:
quelle