Versteckte Inversionen (Cops 'Thread)


35

Dies ist ein Puzzle, dessen Faden hier zu finden ist .

Ihre Aufgabe wird es zwei Schreib zwei Programme (oder Funktionen) sein , so dass sie sind Anagramme voneinander und man führt die linke Inverse des anderen. Diese Programme können beliebig viele Ganzzahlen oder komplexe Zahlen akzeptieren und ausgeben . Wenn Sie Zahlen als Zeichenpunkte oder andere sinnvolle Mittel wählen, müssen Sie dies in Ihrer Antwort angeben. Wenn Sie die Domain Ihrer Funktion einschränken möchten, müssen Sie in Ihrer Antwort auch die eingeschränkte Domain angeben.

Sie präsentieren dann das erste Programm in Form einer Antwort, deren Inverse für Räuber versteckt bleibt.

Das gezeigte Programm muss eine injektive Funktion implementieren (andernfalls würde es keine versteckte Antwort geben).

Wenn Ihre Antwort innerhalb einer Woche nicht geknackt wurde, können Sie die versteckte Antwort aufdecken und als sicher markieren . Sichere Antworten können von Räubern nicht geknackt werden und bleiben auf unbestimmte Zeit ungeknackt.

Das Ziel wird sein, die kürzeste ungeknackte Antwort in Bytes zu erzeugen.

Beispiel

Sie könnten das folgende Python-Programm anzeigen, das einen zur Eingabe hinzufügt

lambda x:~-x

Eine Lösung könnte sein:

lambda x:-~x

Dies subtrahiert eins von der Eingabe


Können wir imaginäre / komplexe ganze Zahlen haben?
Stewie Griffin

@stewie, wenn Sie so angeben, können Sie
Weizen-Assistent

1
Ist ein Diagramm definiert als das Permutieren der Zeichen oder das Permutieren der Bytes (in Sprachen, die keinen Einzelbyte-Zeichensatz verwenden)?

1. " Sie werden dann eines der Programme präsentieren " scheint zu suggerieren, dass wir wählen können, welches präsentiert werden soll, aber der Satz fährt mit " links invers versteckt " fort, was impliziert, dass wir ein bestimmtes präsentieren müssen. Welches ist es? 2. Die Frage lautet speziell " Programm " und scheint keine Funktionen zuzulassen, aber das Beispiel ist eher eine Funktion als ein Programm. Welches ist es?
Peter Taylor

Ist die Großschreibung wichtig?
Kritixi Lithos

Antworten:


12

Python 3, 80 Bytes ( geknackt )

bhmq = int(input())
print(bhmq ** 2)
(1 or [(sqrt),(specification+of*integerr)])

Bereich: positive ganze Zahlen. Die Funktion ist nur die Quadratur einer Zahl. Eingabe nach stdin, Ausgabe nach stdout sowie in der inversen Funktion. Beachten Sie, dass Python die dritte Zeile hier ignoriert, da sie syntaktisch gültig ist und 1 bereits ein wahrer Wert ist, sodass Python nicht einmal prüft, ob der richtige Teil von 'oder' genau definiert ist.

Räuber sollten eine sqrt-Funktion schreiben, die auf allen Nicht-Null-Quadraten korrekt funktioniert, wobei der ganzzahlige Wert wie er ist ohne Gleitkomma ausgegeben wird (Eingabe '4' sollte also '2' oder '2 \ n' sein, nicht '2.0'). oder '2.0 \ n').


1
Ich mag dieses. Es ist täuschend schwer zu knacken
Wheat Wizard

3
Willkommen bei ppcg! Schöner erster Beitrag!
18.

1
Egal, bei diesem Knall habe ich Mist gebaut. Die Frage steht aber noch.
Orlp

1
Ich würde "nein" sagen, wenn ich diese Einschränkung wirklich durch die Regeln der Herausforderung festlegen darf.
Wolfram


11

Python 3, 46 Bytes, geknackt

lambda x:x*(1999888577766665//844333333222200)

Verdoppelt die Eingabe.


3
Wie funktioniert Python bei Bullen und Räubern? Dürfen wir eine beliebige Version wählen, mit der wir Ihre Antwort angreifen?
Orlp

Oh, das ist speziell Python 3 , sorry. So /ist Float Division.
Lynn

3
Du hast gerade bewiesen, dass diese Herausforderung meine Zeit nicht wert ist. Weitermachen.
mbomb007


11

7 , 9 Bytes, Gebrochen

Dieses Programm ist voll mit nicht druckbaren Zeichen. Hier ist ein Hexdump:

00000000: 2573 dc01 7e13 dcb6 1f                   %s..~....

Hinweis: Hierbei wird eine numerische Eingaberoutine verwendet, die keine negativen Zahlen eingeben kann. Daher ist diese Übermittlung nur auf nicht negative Ganzzahlen beschränkt.

Ein Problem mit Herausforderungen ist, dass Sie keine Erklärungen zum Code schreiben (um das Knacken zu erschweren). Auf der anderen Seite bedeutet dies, dass ich mich hier nicht um die Probleme kümmern muss.

Ich habe 7 als Sprache gewählt, weil es, besonders in der komprimierten Notation, ziemlich schwer zu lesen ist und ich nicht verstehe, warum es nur so sein sollte ich sein der sich die Mühe macht, in 8-Bit-Programmblöcken herumzurollen eine 3-Bit-Codierung. Viel Glück!

Erläuterung

Jetzt, da das Programm geknackt wurde (leider mit brachialer Gewalt; das ist bei diesen kurzen Lösungen immer eine Gefahr), kann ich auch erklären, worauf ich hinaus wollte. Dies war tatsächlich ziemlich lösbar, indem man das Programm las; Ich hätte es sehr viel schwieriger machen können, aber das war eine schlechte Idee, wenn Brute-Force-Risse vorhanden waren.

Wir beginnen damit, das Programm in einer natürlicheren Codierung darzustellen. Wie üblich zeigen bolded Zahlen Befehle , die sofort ausgeführt werden (von denen nicht alle in einem Programm darstellbare sind, 6und 7sind aber 2zu 5nicht sind), unbolded Zahlen ihre entkam Äquivalente darstellen ( 0auf 5, von denen alle darstellbaren im ursprünglichen Programm sind; Anmerkung das 0ist ein entkam 6und 1ist ein entkam7 ):

112 7 1 7 34002 77 023 67 13303

Der Satz von Befehlen in einer 7 - Programmquelle bedeutet , dass es im Grunde nur ein wörtlichen, die den Originalstapel darstellt (es gibt nichts , was Sie mit nur entkommen Befehlen tun können, 6und7 ). Das erste, was ein Programm macht, ist, ein paar Dinge auf den Stapel zu schieben. So sieht der Stack nach dem Programmlauf aus ( |trennt Stack-Elemente wie in 7 üblich):

772 | 7 | 34662 | 023 | 73363

Das letzte Stapelelement wird dann kopiert, um der auszuführende Code zu werden (während es auf dem Stapel verbleibt). Dies ist der einzige Teil des Programms, der Code enthält. alles andere sind nur daten. Hier ist, was es übersetzt:

73363 
7       Schieben ein leeres Element auf den Stapel
  3      Output der obere Stapelelement, zu verwerfen , das Element unter
 73      kombinierte Wirkung dieser: Verwerfen der obere Stapelelement
   3     Output der obere Stapelelement, wobei das Element unter verwerfen
    6    Flucht der oberen Stapelelement, dann Hänge es an das unten stehende Element an
     3   Geben Sie das oberste Stapelelement aus, und verwerfen Sie das darunter liegende Element

Mit anderen Worten, dies ist meist nur ein Bündel von E / A-Anweisungen. Lassen Sie uns dies im Detail analysieren:

  • 73wirft das ab 73363, das noch oben auf dem Stapel liegt.
  • 3gibt das aus 023und verwirft das 34662. Es ist also ersichtlich, dass 34662es sich um einen Kommentar handelt, mit dem die in der anderen Programmversion benötigten Bytes gespeichert wurden. Als für das, was 023tut , wenn die Ausgabe, es E / A - Format 0 (Integer) auswählt, dann ist 23eine Richtlinie , die die Umsetzung zur Eingabe eine ganze Zahl anfordert (in 7, tun Sie Eingabe über bestimmte Codes ausgeben , dass Anforderungseingang). Die Eingabe erfolgt durch Kopieren des darunter liegenden Stack-Elements. Wenn z. B. die Ganzzahl der Eingabe 10 ist, wird das nächste Stack-Element (derzeit 7) 7777777777. Daher akzeptieren wir Eingaben des Benutzers als Dezimalzahl, sie werden jedoch als unär gespeichert.
  • 6maskiert das oberste Stack-Element (ändert jede Instanz von 7auf 1; auf diese Weise werden Zeichenfolgen, die ausschließlich aus 7s bestehen, maskiert) und hängt sie dann an das Stack-Element an, bevor ( 772). So sind unsere Daten jetzt so etwas wie7721111111111 .
  • Schließlich 3gibt das Stapelelement in Frage (und öffnet ein leeres Stapelelement , das Teil des Standard - Anfangsstapel ist). Sein Wert wird berechnet, indem die Anzahl von 1s und 7s genommen und die Anzahl von 0s und 6s subtrahiert wird . (Das 2in der Mitte wird in den meisten Fällen ignoriert. Wenn es sich am Ende der Zeichenfolge befindet, wird es zu einer nachgestellten Zeile, anstatt ignoriert zu werden, aber die PPCG-Regeln kümmern sich nicht darum.) Daher ist die Ausgabe das Original Eingabe plus 2.

Zu diesem Zeitpunkt befindet sich nichts Nützliches auf dem Stapel und nichts im Programm, sodass das Programm beendet wird.

Wie machen wir das rückgängig? Es ist eine einfache Sache, das 11zu ändern 00, so dass wir Zeichen vor die Eingabe stellen, die es 2 niedriger als 2 höher macht. Es gibt 00bequem versteckte acht Oktalzeichen weiter im Programm (so dass Oktalzeichen und Bytes in einer Linie zueinander stehen), so dass wir es einfach mit dem 11am Anfang tauschen können .



Randnotiz: Sie müssen Ihren Code nicht erklären, aber zu wissen, was Ihr Programm tut, wäre schön.
GB

@ GB: Ich gab eine vollständige Erklärung des Programms (einschließlich einer Erklärung, wie der Riss funktioniert).


6

Python 2, 83 Bytes, geknackt

#((()))****+,,---/2289;==oppppppqqqqqw~~
lambda n:pow(n,65537,10998167423251438693)

Dies ähnelt meiner anderen Antwort. Dies verwendet jedoch 64-Bit-RSA und ist kryptografisch recht schwach. Wenn Sie diese Antwort rauben können, können Sie theoretisch auch meine andere rauben, wenn Sie genügend Zeit haben.



5

Python 2, 47 Bytes, Gebrochen

lambda x:x**2or (iron() and saxifrage.extend())

Die Domain für diese Funktion ist {x ∈ ℤ | x> 0}. Es quadriert seine Eingabe.


nmjcman101 hat die beabsichtigte Lösung gefunden:

lambda x:sorted(a**2for a in range(x)).index(x)


1
Haha, liebe die
erfundenen

1
Cracked Das hat Spaß gemacht, ich blieb auf dem sortierten Anagramm hängen, das ich übrig hatte!
nmjcman101

5

JavaScript (ES6), 46 Bytes, Gebrochen

x=>Math.log(x+(+String(t=985921996597669)[5]))

Diese Funktion gibt zurück, ln(x+1)wo xeine nicht negative Zahl ist.

Verwendung

(x=>Math.log(x+(+String(t=985921996597669)[5])))(5)

Hinweis: Aufgrund der Art der Gleitkommazahlen f(g(x))kann es sein, dass diese nicht genau gleich sind x. Beispiel:f(g(4))=3.9999999999999996


Geknackt Das war wirklich Spaß :-)
ETHproductions


4

Processing.js, 59 Bytes, Gebrochen!

float igetuwebaoli(int p){return p*(((17*-4*-3)))+0+0;}//,,

Diese Funktion multipliziert die Eingabe mit 204( 17*-4*-3=204). Es nimmt ein int als Eingabe und gibt ein float aus. Das Inverse dividiert die Eingabe wie erwartet durch204 .

Einen Online-Interpreter für processing-js finden Sie hier .





4

J , 29 Bytes ( meilenweise geknackt )

5#.[:,(3 5&#:(-$]-)7)#.inv"0]

Dies ist ein Verb, das eine positive Ganzzahl als Eingabe verwendet und Folgendes ausführt:

  1. Konvertiere in die Basen 2 und 4.
  2. Füllen Sie die Basis-4-Darstellung mit 0s auf, um dieselbe Länge wie die Basis-2-Darstellung zu haben.
  3. Verketten Sie die beiden Darstellungen (Basis 2 zuerst).
  4. Interpretieren Sie die Verkettung als Basis-5-Darstellung und konvertieren Sie sie in eine Ganzzahl.

Probieren Sie es online!

Meine Lösung

Die Logik ist so ziemlich die gleiche wie im Riss. Die Rang-Konjunktion "kann an vielen verschiedenen Stellen stecken bleiben (und ich benutze sie, um das Unnötige 0und das Unnötige loszuwerden 3), da sie in der Lösung nichts wirklich bewirkt.

(7-5)#.[:(]-:&#$,)5#.inv"0 3]

Ich verstehe J nicht, aber meine Experimente zeigen, dass dies tatsächlich eine Ganzzahl in den Basen 2 und 4 ist, dass am Ende der Basis 4 Nullen hinzugefügt werden, um ihre Länge gleich zu machen, und dass sie dann verkettet werden. Sind diese Nullen beabsichtigt?
Wolfram

@Wolfram Die Nullen sind gedacht, das habe ich versucht mit "gleichzeitig" zu sagen. Ansonsten denke ich nicht, dass es umkehrbar wäre.
Zgarb

@Wolfram Ich habe eine genauere Beschreibung hinzugefügt.
Zgarb


4

Verarbeitung (Java), 59 Bytes, SAFE

float igetuwebaoli(int p){return p*(((17*-4*-3)))+0+0;}//,,

Diese Funktion multipliziert die Eingabe mit 204( 17*-4*-3=204). Es nimmt ein int als Eingabe und gibt ein float aus. Das Inverse dividiert die Eingabe wie erwartet durch204 . Hinweis: Beide Programme nehmen ein int als Eingabe und geben ein float aus.

Diese Antwort ist genau die gleiche wie meine andere Antwort, außer dass meine andere Antwort in Processing.js geschrieben wurde. Lernen Sie Processing-java kennen, den weniger ausführlichen Cousin von Java. Sie können Processing hier auf processing.org herunterladen .

Der Riss

float ap(int i){return i*pow(blue(get(0,0)),-1);}//++7*4*-3

Dieses Programm teilt das Argument durch 204. Aber wie? Gehen wir in die Funktion ein.

i *                              //multiply i by
         blue( get(0, 0) )       //this (evaluates to 204)
    pow(                  , -1)  //raises to the -1 power (ie its reciprocal)

Einfach genug, aber wie wird blue( get(0, 0) )es 204? Dies ist das Kernstück dieser Einreichung. Zunächst get(0,0)wird die Farbe des Pixels ermittelt, das sich in (0,0)der oberen linken Ecke des Fensters befindet, das immer in einer Verarbeitungsskizze geöffnet wird. Als nächstes blue()wird der blaue Wert dieses Pixels ermittelt, der ist 204!

Um dieses Ergebnis zu erzielen, habe ich experimentiert, indem ich die verschiedenen Attribute der von erhaltenen Farbe gedruckt habe get(0,0). Ich habe herausgefunden, dass die rot, grün, blau, Alpha - Werte sind 204, 204, 204und 255jeweils. Aus diesem Grund habe ich mich für eine einfache Operation mit dieser Nummer entschieden und bin zu diesem Beitrag gelangt.


Ich dachte, Kotlin sei der weniger ausführliche Cousin von Java! Ich gebe zu, dass die C-Familie von Sprachen ziemlich groß ist ... aber wie würde der Stammbaum tatsächlich aussehen ...
CAD97

Ich glaube du hast es geschafft, niemand hat deinen Beitrag geknackt und es ist eine Woche her.
Meilen

3

JavaScript (ES6), 63 Bytes Gebrochen von Ilmari Karonen

x=>eval(atob`eCp4KzEvLyAgfXBModLS4TvEn4wp1iys9YRRKC85KLIhNMC=`)

Zeit für etwas atobUnsinn. Diese Funktion gibt zurück, x*x+1wo xeine nicht negative Zahl ist.

Verwendung

(x=>eval(atob`eCp4KzEvLyAgfXBModLS4TvEn4wp1iys9YRRKC85KLIhNMC=`))(5)

Beabsichtigt

x=>eval(atob`Lyp5fMRwICAgKi9NYXRoLnBvdyh4LTEsMC41KS8veCp4KzE=`)

Es gibt eine große Anzahl möglicher Lösungen, aber ich hatte gehofft, dass die führenden Charaktere die Bytereihenfolge so weit verringern, dass dies schwieriger wird. C'est laatob



Haben Sie gerade versehentlich Ihren Challenge-Code als beabsichtigte Lösung neu gepostet? :)
Ilmari Karonen

@IlmariKaronen Danke, lehrt , dass du mich kopieren / einfügen ... lol yeah right: P
SLuck49


2

Python 2, 225 Bytes, geknackt von Sp3000

#((()))****+,,---/000555666888;==oppppppqqqqqw~~
lambda n:pow(n,65537,9273089718324971160906816222280219512637222672577602579509954532420895497077475973192045191331307498433055746131266769952623190481881511473086869829441397)

Die Domäne dieser Funktion ist [0, n], wobei n die große Zahl oben ist. Ja, diese Funktion ist in dieser Domain umkehrbar. Und wenn ich nichts falsch gemacht habe, ist das Brechen dieser Antwort so schwer wie das Brechen von 512-Bit-RSA.


1
Das Brute-Forcen ist erheblich einfacher als das Brute-Forcen von RSA, da Sie bereits ein ungefähres Anagramm der benötigten Konstante haben. Andererseits ist es wahrscheinlich immer noch zu schwierig, in der Praxis damit umzugehen.

4
Beachten Sie, dass es einen Meta-Post zu Randomisierung bei CnR-Herausforderungen gibt: meta.codegolf.stackexchange.com/questions/10793/…
Kritixi Lithos

5
@KritixiLithos Meine Antwort enthält keine Randomisierung, Hashes oder eingebauten Krypto-Code. Es ist buchstäblich eine modulare Potenzierung.
Orlp

2
Ihre Antwort zielt absichtlich auf ein Problem ab, von dem bekannt ist, dass es schwer zu lösen ist, und stimmt daher mit dem Metapost überein (zumal RSA direkt erwähnt wird). Ich denke, auch wenn Sie eine Lücke haben, verdient Ihr Drehbuch meine Ablehnung.
Christoph


0

J, 15 Bytes

(".&,'10.')#.#:

Nimmt eine nicht negative Ganzzahl n , konvertiert sie in eine Liste von Binärziffern und kombiniert diese Ziffern als Zahl zur Basis 10.

Probieren Sie es online!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.