Verkleidete Transformatoren (Cops 'Thread)

10

Der Faden des Räubers ist hier

Die Aufgabe der Polizei besteht darin, eine Funktion oder ein Programm zu schreiben, die, wenn sie eine Eingabe von sich selbst erhalten, eine endliche deterministische Zeichenfolge ausgeben. Wenn das Programm eine andere Eingabe erhält, sollte es eine andere Ausgabe zurückgeben.

Regeln:

  • Einreichungen bestehen aus
    • Sprache Name
      • Wenn Flags verwendet werden, sollten diese aufgedeckt werden.
    • Byteanzahl des Programms
    • Byteanzahl der Ausgabe
    • Ausgabe
      • Wenn es besonders lang ist, stellen Sie bitte einen Pastebin oder ähnliches zur Verfügung
      • Wenn es nicht druckbare Dateien enthält, geben Sie bitte einen Hexdump an.
      • Nachfolgende Zeilenumbrüche und Leerzeichen sollten in die Ausgabe aufgenommen werden
    • Woher die Eingabe kommt (STDIN, Befehlszeile usw. )
  • Falls zutreffend, können Sie davon ausgehen, dass das Byte, das EOF darstellt, in der Eingabe nicht vorhanden ist, es sei denn, Sie verwenden dieses Byte in Ihrem Programm.
  • Wenn Ihr Programm geknackt ist, fügen Sie einen Link zur entsprechenden Antwort im Thread des Räubers in Ihrem Titel hinzu.
  • Ihr Programm ist erst nach Ablauf einer Woche sicher und Sie markieren es so.
  • Ich lehne Techniken wie das zufällige Seeding mit den Eingabe- oder kryptografischen Hash-Funktionen ab. Ich kann sie nicht aufhalten, aber ich werde keine Lösung akzeptieren, die beides nutzt . Beachten Sie auch, dass einige dieser Techniken Kollisionen aufweisen können, bei denen eine andere Zeichenfolge dieselbe Ausgabe erzeugt.
  • Ihr Ziel ist es, die kürzeste Leistung zu erzielen. Die kürzeste sichere Lösung, die innerhalb von drei Wochen nach dem Absenden dieser Frage veröffentlicht wurde, gewinnt!

Die Aufgabe des Räubers besteht darin, ein Programm zu finden, dessen Größe dem Original entspricht oder darunter liegt und das auch den oben genannten Regeln entspricht.

Wenn ein Räuber Ihr Programm mit einer anderen als der beabsichtigten Lösung knackt, haben Sie die Möglichkeit, es zu "entknacken", indem Sie nachweisen, dass die Lösung des Räubers falsch ist. Sie können dies tun, indem Sie eine Eingabe für das Räuberprogramm suchen, die dieselbe Ausgabe erzeugt.

Beispieleinreichung:

Brainfuck, 10 Bytes, Punktzahl: 10

]<.[<],>[,

Diese Lösung ist [>,] <[. <] , Die die Eingabe einfach umkehrt

Viel Glück!

Scherzen
quelle
"Wenn das Programm eine andere Eingabe erhält, sollte es eine andere Ausgabe zurückgeben." Bedeutet dies, dass das Programm niemals dasselbe für andere Eingaben ausgeben sollte? Oder bedeutet dies, dass das Programm unabhängig von der Eingabe nicht ständig etwas ausgeben sollte? (EXIST eine Eingabe, die nicht gleich sich selbst ist, vs. FORALL-Eingaben, die nicht gleich sich selbst sind, geben eine andere Ausgabe zurück.)
tsh
@tsh Nur die Eingabe von sich selbst muss eine eindeutige Ausgabe haben. Zum Beispiel könnte eine gültige Einreichung ein sich selbst identifizierendes Programm sein , das 1für sich selbst und auf 0andere Weise ausgibt
Jo King
@JoKing Also ist Ihre Beispiel-Python 3-Einreichung ungültig? Weil es offensichtlich auch 1021111143210532105110321051101121171164041581121141051101164011111410040105414410111010061393941für einige andere Zeichenfolgen ausgegeben wird.
Lynn
@lynn Du hast recht. Ich habe dieses Beispiel entfernt
Jo King

Antworten:

4

7 , 31 Zeichen, Punktzahl 30, sicher, aber möglicherweise kaputt?

Ein 7-Programm ist normalerweise nur eine Zahl, kann jedoch Leerzeichen enthalten und in mehrere Zahlen aufgeteilt werden. Diese Übermittlung besteht daher aus zwei Zahlen (die vom 7-Interpreter implizit verkettet werden), und das Programm verwendet ebenfalls zwei Zahlen als Eingabe über die Standardeingabe. (Die "31 Zeichen" in der Kopfzeile sind die Gesamtlänge der beiden Zahlen plus ein trennendes Leerzeichen. Die Ziffern, aus denen die Zahlen bestehen, werden bei Verwendung als Programm als oktal, bei Verwendung als Eingabe als dezimal interpretiert Es sind die Ziffern, die in beiden Fällen gleich sind, nicht die tatsächlichen Zahlen. Beachten Sie, dass es entweder irrelevant ist, wenn Sie sie als Programm oder als Eingabe behandeln, ob Sie sie durch ein Leerzeichen oder eine neue Zeile trennen. Ich hoffe, dass dies nicht der Fall ist Die Einreichung wird nicht ungültig.)

Die erwartete Ausgabe ist die folgende Zahl (hier in Dezimalzahlen ausgedrückt, da dies das Ausgabeformat ist, das der 7-Interpreter verwendet):

238363505302130098723162537059

Beachten Sie, dass der aus dem Esolang-Wiki verknüpfte 7-Interpreter Zahlen intern unär speichert, was bedeutet, dass Sie wahrscheinlich nicht über genügend Speicher verfügen, um das Programm tatsächlich auf sich selbst auszuführen, um zu sehen, was es tut. Ich habe das Programm überprüft, indem ich sein Verhalten manuell ausgearbeitet und es an kleinen Eingaben getestet habe, um zu überprüfen, ob es das getan hat, was ich erwartet hatte. Ein alternativer Ansatz wäre, einen Interpreter zu schreiben, der eine effizientere Methode zum Speichern von Zahlen verwendet.

Das Vermeiden von Rissen hier war etwas schmerzhaft, aber ich bin jetzt endlich zufrieden, dass keine anderen Zahlen als die im Programm selbst in der Lage sind, 238363505302130098723162537059 als Ausgabe zu erzeugen. ( BEARBEITEN 1 Woche später: Ich habe mich möglicherweise geirrt, je nachdem, wie Sie die Frage interpretieren; siehe unten. )

Lösung

Das ursprüngliche Programm war:

711170237403706
111723603700633
xy3xyy2y(3x1)2x=711170237403706y=111723603700633238363505302130098723162537059

Es war beabsichtigt, dass keine andere Eingabe das gewünschte Ergebnis liefert, weil:

y(3x1)2=238363505302130098723162537059y(3x1)=238363505302130098723162537061111723603700633213351071221111721335107122111173x1(3×711170237403706)1=2133510712211117xy

Abhängig davon, wie Sie die Frage interpretieren, kann es jedoch eine zweite Eingabe geben, die die gewünschte Ausgabe erzeugt (wodurch diese Lösung ungültig wird):

113x1x79454501767376699574387512354189), die nicht im Zeichensatz für 7 Programme enthalten sind. Wenn sich die Eingabe auf denselben Zeichensatz wie das Programm beschränkt, ist diese Lösung gültig. Wenn jedoch Eingaben mit Zeichen von außerhalb des Zeichensatzes des Programms zulässig sind, ist diese Lösung ungültig.

Erläuterung

So funktioniert die beabsichtigte Lösung:

711170237403706 111723603700633
7 7 7 Stapelelementtrenner
 111 023 403706 111723603700633 Anfängliche Stapelelemente
 111 Nummer 3, unary
     023 I / O DSL für "Eingabe einer Nummer"
         403706 111723603700633 Hauptprogramm
(Implizit: Führen Sie eine Kopie des Hauptprogrammelements aus, wobei das Original erhalten bleibt.)
         40 Tauschen Sie {023} über {program} aus und entkommen Sie ihm
           3 Führen Sie E / A mit {023} aus. pop {program}
     0 E / A: numerisch
      23 Geben Sie eine Zahl ein und kopieren Sie {111} so oft
            706 Fügen Sie der Zahl "6" hinzu (dekrementieren Sie sie)
                11 Schieben Sie zwei leere Stapelelemente
                  17236 Schieben Sie ein Stapelelement "23" (nicht entkapselt)
                       0 Escape {23} verbraucht ein leeres Element
                        3 Führen Sie E / A mit {23} aus. pop {das Element unten}
                    23 Kopieren Sie die Oberseite des Stapels Eingangs viele Male
                         7006 "66" anhängen (dh 2 subtrahieren)
                             3 Ausgabe {als Zahl}
                              3 Beenden Sie das Programm (aufgrund des niedrigen Stapels)
170666123453123451234512345

ais523
quelle
3

Node.js v10.9.0 , 40 Bytes, Score: 40, Cracked

Eingang

Dies ist eine Funktion, die genau einen Parameter akzeptiert.

Ausgabe

&`nij.9=j.,)r31n=+(=ooj`[o.o.)1.s](>=6>t
Arnauld
quelle
Ich kann nur neu anordnen o=>[...j=o,].sort(n=>(j+=113)&69).join`` , aber jnicht zur Ganzzahl gehen
l4m2
Gebrochen. Das hat ziemlich viel Spaß gemacht :-)
ETHproductions
3

Ein Birnbaum , 46 Bytes ASCII, Punktzahl 0, Gebrochen

Die Eingabe erfolgt über die Standardeingabe. Die erwartete Ausgabe (bei Standardausgabe) ist eine leere Zeichenfolge (dh wenn das Programm selbst als Argument angegeben wird, sollte keine Ausgabe gedruckt werden).

Mit anderen Worten, die Herausforderung besteht hier darin, ein A Pear Tree-Programm zu schreiben, das bei Standardausgabe nichts auf Standardausgabe ausgibt und bei Standardausgabe etwas auf Standardausgabe ausgibt, wenn bei Standardeingabe etwas anderes als sich selbst angegeben wird, wobei no verwendet wird mehr als 46 Bytes. (Ich habe es geschafft, das Programm auch auf druckbarem ASCII zu halten, obwohl A Pear Tree häufig nicht-ASCII- und nicht druckbare Zeichen verwendet.) Dies ist effektiv die Aufgabe, ein sich selbst identifizierendes Programm mit einem bestimmten Ausgabeformat zu schreiben (dh Nullzeichenfolge, wenn die Selbstidentifizierung erfolgreich ist); Ein Birnbaum hat jedoch mindestens zwei Wendungen, die die Aufgabe etwas schwieriger machen, als es aussieht, wenn sie in dieser bestimmten Sprache ausgeführt wird (weshalb ich sie für meine Cop-Einreichung ausgewählt habe).

Meine Lösung

Meine Lösung unterscheidet sich ein wenig vom Riss:

eval(k=q(print$\=$_="eval(k=q($k))"ne$_;MZpa))

Probieren Sie es online aus!

Anstatt zu verwenden exit, setze ich stattdessen $_(implizite Ausgabe) und $\(Zeilenumbruch nach Ausgabe, einschließlich impliziter Ausgabe) auf die Nullzeichenfolge, wenn eine Übereinstimmung vorliegt (und 1wenn keine Übereinstimmung vorliegt ). A printist weiterhin erforderlich, da die implizite Ausgabe nur aktiviert ist, wenn mindestens ein Byte Eingabe vorhanden ist (daher müssen wir explizit etwas drucken, wenn wir eine leere Zeichenfolge als Eingabe erhalten, die sich vom Programm unterscheidet).

Jedes A Pear Tree-Programm muss irgendwo eine Prüfsumme enthalten (das ist die MZpain dieser Lösung). Sowohl meine Lösung als auch die Namen der Crack-Pick-Variablen (und andere kleinere Details des Codes variieren), damit die Prüfsumme vollständig aus ASCII-Buchstaben besteht.

ais523
quelle
1
Gebrochen .
user202729
3

Perl 5 -p0777, 10 Bytes, Punktzahl 10, sicher

W)9r46<(k

Das letzte Zeichen hier ist "Verschieben", Zeichencode 14 (dezimal) / 0E (hex). Alle anderen sind druckbare ASCII.

Da wir das implizite E / A-Argument von Perl verwenden -p0777, stammt die Eingabe von der Standardeingabe und die Ausgabe geht an die Standardausgabe.

Lösung

Das Programm führt Folgendes aus:

NUL-Pads die Eingabe auf mindestens 10 Zeichen, dann XORs mit der Zeichenfolge svgOUT_TOP

Dies bedeutet, dass das Programm selbst, die einzige Eingabe, die die gewünschte Ausgabe erzeugt, Folgendes ist:

$ _ ^ = abc | $ ^

Probieren Sie es online aus!

Erläuterung

Perl verfügt über eine Reihe von Spezialvariablen. Bei Verwendung -p0777für implizite E / A $_wird beispielsweise am Anfang des Programms eingegeben und am Ende des Programms ausgegeben.

Die meisten dieser Variablen haben einen sehr einfachen Standardwert. Der Standardwert von $^, dem aktuell ausgewählten Format für den Seitenanfang, ist jedoch die viel längere Zeichenfolge STDOUT_TOP. Als solches können wir dies als sehr knappe Verschleierungsmethode über XORing $^mit dem Wert verwenden, den wir verschleiern möchten (in diesem Fall das Programm).

Um die Anzeige _TOPam Ende zu verbergen , habe ich das Programm selbst auf 10 Zeichen aufgefüllt, indem ich ein hinzugefügt habe abc|, was bedeutet, dass alle Zeichen von STDOUT_TOPmit etwas XOR-verknüpft wären. Die Auswahl von abc|zu Beginn war eine einfache Möglichkeit, die Ausgabe größtenteils druckbar zu halten (und es schwieriger zu machen, zu erkennen, dass ich XORing mit einer Zeichenfolge durchgeführt habe, die hauptsächlich aus Großbuchstaben besteht, da in ASCII XOR-Großbuchstaben in Kleinbuchstaben Kleinbuchstaben sind).

ais523
quelle
3

Python 3, 50 Bytes geknackt

Eingabe und Ausgabe von / nach stdin / -out. Die Ausgabe ist für jede einzelne Eingabe unterschiedlich. Einzigartige Ausgabe bei Angabe des Quellcodes:

218216195196222130136136132192197195196130241204136209197216206130201131244155157154215136138204197216138201138195196138195196218223222130131247131131

(Das sind 150 Ziffern)

Viel Glück!

agtoever
quelle
Hoppla! Ich sehe jetzt, dass diese Herausforderung längst vorbei ist ... Seltsam, dass sie in meiner Timeline / meinem Feed aufgetaucht ist. Neugierig zu sehen, ob jemand darauf reagiert ...
26.
Gebrochen.
Boboquack
2

05AB1E , 35 Bytes, Punktzahl: 7

Eingabe:
Vonstdin

Ausgabe:
QÕ Ƿe

Emigna
quelle
2

Cubix , 18 Bytes, Score 18, sicher

Es ist eine Schande, dass diese Herausforderung nicht mehr Beachtung fand, aber so geht es manchmal. Ich wollte dies unsicher lassen, entschied mich aber, die Lösung zu veröffentlichen, bevor ich sie vergaß.

Dies sollte ziemlich leicht zu knacken sein.

Eingabe vonstdin

Ausgabe

$`*2aJPJ#74(o);89

Bearbeiten: Ich sollte erwähnen, dass dies die Quelle in ihrer verkürzten Form erwartet ... und jetzt habe ich festgestellt, dass ein fehlendes Byte (nicht druckbar) aus dem Ergebnis fehlt, das ich beim Posten gebrochen habe. Sollte jetzt auskopieren. Die Hex-Werte sind24 60 2a 13 32 61 4a 50 4a 23 37 34 28 6f 29 3b 38 39

Das Konzept bestand darin, das erste Zeichen zu drucken und dann den inversen Index aus dem Zeichen zu entfernen, z. B. [Zeichen] - [0, len ([Zeichen]). 2]

Der Code ist

$r;#AoW\U-@</u.?;;

welches auf den folgenden Würfel abgebildet wird

    $ r
    ; #
A o W \ U - @ <
/ u . ? ; ; . .
    . .
    . .

Probieren Sie es hier aus

MickyT
quelle
2

Gelee , 14 Bytes, Punktzahl: 21, sicher

Sowohl das Programm als auch die Ausgabegröße werden mithilfe der Jelly-Codepage gezählt.

Eingang

Erstes Befehlszeilenargument.

Ausgabe

-§ḋẇ"*YdĖDƘ>Ẉed€Ç+æạɦ

Lösung

ØJiⱮÄÆNPḃØ⁵ịØJ

Probieren Sie es online aus!

Bubbler
quelle
Da das Konvertieren von / zu Jelly-Codepage schwierig ist, wäre es nützlich, einen Verifizierer zu haben (der ein Programm benötigt, es von UTF8 in Jelly konvertiert, mit sich selbst füttert, von Jelly in UTF8 konvertiert und prüft, ob es dem erwarteten Wert entspricht Ausgabe)
user202729
@ user202729 Dieses Jelly-Programm gibt nachv⁼ , 1wenn die als Jelly-Code mit einer Eingabe der Eingabe ausgewertete Eingabe gleich der Eingabe ist, und gibt entweder nach 0oder gibt einen Fehler (wenn die Eingabe ein ungültiger Jelly-Code ist), wenn nicht.
Jonathan Allan
1

JavaScript Firefox, <10 Bytes, Score: 52, aus der Eingabe von Funktionsargumenten, Cracked

ZnVuY3Rpb24gYnRvYSgpIHsKICAgIFtuYXRpdmUgY29kZV0KfQ==


btoa

btoa(btoa) codiert die folgende Zeichenfolge:

function btoa() {
    [native code]
}

was gibt:

"ZnVuY3Rpb24gYnRvYSgpIHsKICAgIFtuYXRpdmUgY29kZV0KfQ=="

gerade kopiert

14 m2
quelle
Zunächst einmal, nachdem Sie das Offensichtliche getan haben, ist dies kein tatsächlicher Code? Zweitens geben Sie nicht an, woher die Eingabe kommt. Ich würde einen Crack posten, aber ehrlich gesagt bin ich mir nicht sicher, ob diese Einsendung gültig ist.
Quintec
Gebrochen
Arnauld
Ich denke nicht, dass es notwendig ist, den Crack-Beitrag in diesen Beitrag aufzunehmen - Leute können einfach auf den Link klicken, um den Riss anzuzeigen.
user202729
1

GCC 61-> 61 Bytes

70 4F 92 73 08 D4 03 E7 65 DC D6 89 B5 AD BA 90 
97 26 31 10 F6 FA 0A 30 8F 24 69 0A A7 8B 59 9E 
A2 42 D5 67 B8 12 3A 1E 9D 25 80 F9 6B 25 32 C2 
EE 46 3F 8D 7E 0C 73 0F F0 93 C6 68 50

Vollständiges Programm, Eingabe von stdin und Ausgabe an stdout

14 m2
quelle
Gibt es nach dem letzten ein Leerzeichen 50?
tsh
@tsh Es ist ein Hex Dump
l4m2
1

Perl 6, 43 Bytes, Score: 15, von stdin

49671296789805
Donaldh
quelle
2
Können Sie bestätigen, dass diese Übermittlung funktioniert, da Ihre vorherige Antwort nicht den Regeln für eine eindeutige Ausgabe für Ihr Programm als Eingabe entsprach?
Jo King
Ja, ich denke schon.
Donaldh
1

Pepe , 23 Bytes, Punktzahl: 23, von MickyT geknackt

Eingang:

Standard

Ausgabe:

RDCbn@?K]<[G98765TSR^PO
nicht definiert
quelle
geknackt?
MickyT
1

J , 26 Bytes, Punktzahl: 52, sicher

Das Programm ist keine REPL, sondern ein vollständiges Skript, das akzeptiert stdinund explizit druckt stdout.

Eingang

Standardeingabe.

Ausgabe

6fc42353c98217ef5a2908a3c63d090aa9a55b2558b61294e06a

Nein, es ist keine Verschlüsselungsmethode.


Lösung

echo]hfd]257x#.3&u:stdin''
                   stdin'' Take the whole input
               3&u:        Convert to codepoints
         257x#.     Convert base 257 to integer
     hfd]           "Hex from Decimal"
echo]               Print to stdout

Probieren Sie es online aus!

Bubbler
quelle
1

Fass , 6 Bytes, Punktzahl: 6

Eingang

Von stdin, mit?

Ausgabe

5\x1c"\x1c"9

Beachten Sie jedoch, dass dies Escape-Sequenzen für nicht druckbare Bytes sind. Ersetzen Sie die Escapezeichen durch die wörtlichen Zeichen. Rohtext hier verfügbar

Viel Glück mit diesem! Bis nächste Woche!

Lyxal
quelle
0

 Perl 6, 31 Bytes, Score: 39, von stdin - Cracked

Hier geknackt

().1111111111112222235abcegijkmnorstvy

Rohlösung. Könnte überleben.

Donaldh
quelle
Ich bin mir ziemlich sicher, dass ich Ihre Lösung geknackt habe und ich vermute, dass Ihr Programm nicht der Regel folgt, dass unterschiedliche Eingaben unterschiedliche Ausgaben erzeugen sollten.
Nwellnhof