Inspiriert von diesem Kommentar ...
Vielen Dank an die Benutzer Step Hen , Wheat-Wizard und Dennis, die mir geholfen haben, die Spezifikation dieser Herausforderung zu konkretisieren, bevor sie veröffentlicht wurden!
Dies ist der Thread der Cops. Für den Faden Robbers, gehen hier
In dieser Herausforderung müssen Sie Code ausführen, der dafür sorgt, dass Ihre Sprache unsere Kriterien als Programmiersprache nicht mehr erfüllt. In dieser Herausforderung heißt das, es so zu machen, dass die Sprache nicht mehr ...
Zahleneingabe und -ausgabe übernehmen
Addiere zwei Zahlen
Testen Sie, ob eine bestimmte Zahl eine Primzahl ist oder nicht.
Dies ist eine Cops-and-Robbers- Herausforderung, bei der es zwei unterschiedliche Herausforderungen mit zwei unterschiedlichen Zielen gibt: Die Cops werden versuchen, Code zu schreiben, der die Sprache größtenteils unbrauchbar macht, und die Räuber werden versuchen, die verborgene Problemumgehung zu finden, die es den Cops ermöglicht ihre Sprache wiederzugewinnen.
Als Cop müssen Sie zwei Codeausschnitte schreiben:
Eine, die Ihre Sprache größtenteils unbrauchbar macht, z. B. indem integrierte Funktionen für Eingabe / Ausgabe und numerische Operationen entfernt werden. Je mehr Features Sie entfernen, desto besser. Dieser Code darf nicht abstürzen oder beendet werden. Es sollte möglich sein, Code am Ende dieses Snippets hinzuzufügen, und dieser Code wird ausgewertet . Und...
... ein Codeausschnitt, der zwei nicht negative Ganzzahlen als Eingabe verwendet, sie addiert und ihre Summe ausgibt. Dieses Snippet muss auch nach dem Ausführen des ersten Snippets noch ordnungsgemäß funktionieren. Wenn die beiden Ausschnitte miteinander kombiniert werden, müssen sie ein vollständiges Programm bilden, das zwei Zahlen hinzufügt, oder eine Funktion definieren, die zwei Zahlen hinzufügt. Im Idealfall sollte sich dieses Snippet auf ein sehr undurchsichtiges Verhalten stützen, damit es schwieriger zu finden ist.
Sie können eine beliebige Standardmethode für die Eingabe und Ausgabe auswählen . Sie müssen jedoch genau angeben, welches Format (Eingabe und Ausgabe) Sie verwenden. Ein Räuber kann Ihre Antwort nur knacken, wenn er dasselbe Format wie Sie verwendet.
Nachdem Sie diese beiden Ausschnitte geschrieben haben, müssen Sie den ersten als Antwort veröffentlichen, ohne den zweiten preiszugeben. Ihre Antwort sollte alle folgenden Informationen enthalten:
Der erste Ausschnitt (offensichtlich nicht der zweite).
Sprache (einschließlich Nebenversion, da die meisten Einsendungen wahrscheinlich auf seltsamen Randfällen beruhen)
IO-Format, einschließlich, ob es sich um eine Funktion oder ein vollständiges Programm handelt. Räuber müssen dasselbe Format verwenden, damit ihr Riss gültig ist.
Irgendwelche seltsamen Randfälle, die erforderlich sind, damit Ihre Antwort funktioniert. Läuft beispielsweise nur unter Linux oder erfordert eine Internetverbindung . Das ist natürlich ein bisschen subjektiv, aber wenn ein Cop einen extremen Kantenfall hat, der ein Knacken verhindert, und dies erst dann aufdeckt, wenn er in Sicherheit ist, dann halte ich das für eine schlechte Sportlichkeit. Ein potenzieller Räuber sollte über alle Informationen verfügen, die erforderlich sind, um Ihre Antwort zu knacken, bevor sie geknackt wird.
Sie müssen Ihre Byteanzahl erst bekannt geben, wenn Ihre Antwort sicher ist.
Hier ist ein Beispiel. Für das erste Snippet können Sie das folgende Python 3-Programm einreichen:
Python 3
print=None
Übernimmt die Eingabe von STDIN und gibt sie an STDOUT aus
Und dann könnten Sie als zweites Snippet schreiben:
import sys
a,b=int(input()),int(input())
sys.stdout.write(a+b)
Dies ist gültig, da zwei Zahlen als Eingabe und Ausgabe ihrer Summe verwendet werden, auch wenn Sie die beiden Ausschnitte zusammenfügen, z
print=None
import sys
a,b=int(input()),int(input())
sys.stdout.write(a+b)
Dies wird jedoch für einen Räuber extrem einfach zu lösen sein. Da dies sehr einfach zu knacken wäre, könnten Sie versuchen, diesen bestimmten Ansatz wie folgt zu patchen:
import sys
sys.stdout=None
print=None
Selbst dies hat jedoch eine sehr einfache Problemumgehung:
del print
a,b=int(input()),int(input())
print(a+b)
Als Polizist ist es Ihr Ziel, die verborgene Problemumgehung so dunkel wie möglich zu gestalten, um zu verhindern, dass die Räuber sie finden.
Die Räuber sehen sich eine Ihrer Antworten an und versuchen, sie zu knacken. Sie können es knacken, indem sie ein gültiges Snippet schreiben , das als Snippet 2 funktionieren könnte (indem sie zwei Zahlen addieren, nachdem die Sprache größtenteils unbrauchbar gemacht wurde). Dies muss nicht dasselbe Snippet sein, das Sie ursprünglich beabsichtigt haben. Wenn ein Räuber Ihre Antwort knackt, hinterlässt er einen Kommentar zu Ihrer Antwort, und Sie sollten ihn bearbeiten, um anzuzeigen, dass er geknackt wurde. Wenn Ihr Beitrag geknackt ist, sollten Sie Ihre Antwort bearbeiten, um die Lösung (Snippet 2) anzuzeigen, die Sie ursprünglich beabsichtigt haben. Dies ist an sich keine Regel , sondern nur ein freundlicher Vorschlag, um das Spiel unterhaltsam zu gestalten. Du musst nicht.
Wenn eine Antwort eine Woche lang nicht geknackt ist, können Sie sie in Ihrem zweiten Snippet bearbeiten und darauf hinweisen, dass Ihre Antwort jetzt sicher ist . Wenn Sie es nach Ablauf der Woche nicht bearbeiten, können andere Benutzer es trotzdem knacken, bis Sie dies tun. Wenn Sie Ihr zweites Snippet nicht offenlegen, können Sie für Ihre Antwort keine Punkte beanspruchen oder es als sicher bezeichnen.
Der Gewinner des Cops-Threads ist die kürzeste sichere Antwort, einschließlich beider Ausschnitte , die in Bytes gezählt werden. Diese Antwort wird akzeptiert, wenn genügend Zeit verstrichen ist. Sie nicht benötigen eine Byteanzahl zu offenbaren , bis die Antwort sicher ist, da Byteanzahl , um Ihre Gäste irrelevant ist , bis die Antwort sicher ist. Wenn genügend Zeit verstrichen ist und keine Antworten ungerissen bleiben, ist der Gewinner die Antwort, die am längsten ungerissen geblieben ist.
Habe Spaß!
Regelklärungen
Das erste Snippet muss korrekt ausgeführt werden, ohne dass Eingaben erforderlich sind . Die Ausgabe kann beliebig sein, und diese Ausgabe wird ignoriert - solange das Snippet fertig ist, wird das zweite Snippet korrekt ausgeführt.
Das zweite Snippet muss tatsächlich ausgeführt werden, damit Ihre Antwort gültig ist. Dies bedeutet eine Antwort wie
import sys sys.exit()
ist nicht gültig, weil es die Sprache nicht bricht. Es hört einfach auf. Ebenso ist die Eingabe einer Endlosschleife nicht gültig, da das zweite Snippet niemals ausgeführt wird.
Nachdem Sie sicher sind, ist Ihre Punktzahl die Byteanzahl beider Snippets .
Dies geht zurück auf Bitte enthüllen Sie alle seltsamen Randfälle, die erforderlich sind, damit Ihre Antwort funktioniert . Ihre Einreichung muss genügend Informationen enthalten, bevor sie enthüllt wird, damit sie nach der Enthüllung reproduzierbar ist. Dies bedeutet, dass, wenn Ihre Antwort sicher ist, Sie Folgendes bearbeiten: Hier ist meine Antwort. Oh ja, übrigens funktioniert dies nur, wenn Sie es unter Solaris ausführen. Ihre Antwort ist ungültig und wird gelöscht und gilt nicht als gewinnberechtigt.
Das zweite Snippet kann nach der Ausgabe der Summe abstürzen - solange die Ausgabe noch korrekt ist (wenn Sie sich beispielsweise für die Ausgabe in STDERR entscheiden und dann eine Reihe von Absturzinformationen erhalten, ist dies ungültig).
Sie können Ihren Code nach dem Absenden einer Antwort nicht bearbeiten.
Sie können sich möglicherweise nicht auf kryptografische Funktionen wie Verschlüsselung, Hash-Funktionen, CSPRNGs usw. verlassen.
int main(){ do_evil_stuff(); }
wohin soll der Benutzercode gehen? In einer Funktion? Nach all den Aussagen inmain
?