Dies ist ein Cops-and-Robbers- 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
quelle
Antworten:
Python 3, 80 Bytes ( geknackt )
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').
quelle
Python 3, 46 Bytes, geknackt
Verdoppelt die Eingabe.
quelle
/
ist Float Division.7 , 9 Bytes, Gebrochen
Dieses Programm ist voll mit nicht druckbaren Zeichen. Hier ist ein Hexdump:
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 Cops-and-Robbers- 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,
6
und7
sind aber2
zu5
nicht sind), unbolded Zahlen ihre entkam Äquivalente darstellen (0
auf5
, von denen alle darstellbaren im ursprünglichen Programm sind; Anmerkung das0
ist ein entkam6
und1
ist ein entkam7
):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,
6
und7
). 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):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:
Mit anderen Worten, dies ist meist nur ein Bündel von E / A-Anweisungen. Lassen Sie uns dies im Detail analysieren:
73
wirft das ab73363
, das noch oben auf dem Stapel liegt.3
gibt das aus023
und verwirft das34662
. Es ist also ersichtlich, dass34662
es sich um einen Kommentar handelt, mit dem die in der anderen Programmversion benötigten Bytes gespeichert wurden. Als für das, was023
tut , wenn die Ausgabe, es E / A - Format 0 (Integer) auswählt, dann ist23
eine 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 (derzeit7
)7777777777
. Daher akzeptieren wir Eingaben des Benutzers als Dezimalzahl, sie werden jedoch als unär gespeichert.6
maskiert das oberste Stack-Element (ändert jede Instanz von7
auf1
; auf diese Weise werden Zeichenfolgen, die ausschließlich aus7
s bestehen, maskiert) und hängt sie dann an das Stack-Element an, bevor (772
). So sind unsere Daten jetzt so etwas wie7721111111111
.3
gibt das Stapelelement in Frage (und öffnet ein leeres Stapelelement , das Teil des Standard - Anfangsstapel ist). Sein Wert wird berechnet, indem die Anzahl von1
s und7
s genommen und die Anzahl von0
s und6
s subtrahiert wird . (Das2
in 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
11
zu ändern00
, so dass wir Zeichen vor die Eingabe stellen, die es 2 niedriger als 2 höher macht. Es gibt00
bequem versteckte acht Oktalzeichen weiter im Programm (so dass Oktalzeichen und Bytes in einer Linie zueinander stehen), so dass wir es einfach mit dem11
am Anfang tauschen können .quelle
JavaScript (ES6), 21 Bytes, Gebrochen
Das ist einfach.
Gibt den Cube der Eingabe zurück.
quelle
Python 2, 83 Bytes, geknackt
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.
quelle
Python 2, 47 Bytes, Gebrochen
Die Domain für diese Funktion ist {x ∈ ℤ | x> 0}. Es quadriert seine Eingabe.
nmjcman101 hat die beabsichtigte Lösung gefunden:
quelle
JavaScript (ES6), 46 Bytes, Gebrochen
Diese Funktion gibt zurück,
ln(x+1)
wox
eine nicht negative Zahl ist.Verwendung
Hinweis: Aufgrund der Art der Gleitkommazahlen
f(g(x))
kann es sein, dass diese nicht genau gleich sindx
. Beispiel:f(g(4))=3.9999999999999996
quelle
J, 8 Bytes, geknackt
Ein weiterer einfacher Einstieg.
Verdoppelt die Eingabe.
quelle
Processing.js, 59 Bytes, Gebrochen!
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 .
quelle
J, 10 Bytes, geknackt
Noch eine einfache. Gibt n 2 -1 zurück.
quelle
JavaScript (ES6), 15 Bytes, geknackt von Emigna
Sie können es wie folgt testen:
Geknackt
Meine beabsichtigte Lösung ist ein bisschen anders als Emignas Riss:
quelle
J , 29 Bytes ( meilenweise geknackt )
Dies ist ein Verb, das eine positive Ganzzahl als Eingabe verwendet und Folgendes ausführt:
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ötige0
und das Unnötige loszuwerden3
), da sie in der Lösung nichts wirklich bewirkt.quelle
Verarbeitung (Java), 59 Bytes, SAFE
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
Dieses Programm teilt das Argument durch
204
. Aber wie? Gehen wir in die Funktion ein.Einfach genug, aber wie wird
blue( get(0, 0) )
es204
? Dies ist das Kernstück dieser Einreichung. Zunächstget(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ächstesblue()
wird der blaue Wert dieses Pixels ermittelt, der ist204
!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 sind204
,204
,204
und255
jeweils. Aus diesem Grund habe ich mich für eine einfache Operation mit dieser Nummer entschieden und bin zu diesem Beitrag gelangt.quelle
JavaScript (ES6), 63 Bytes Gebrochen von Ilmari Karonen
Zeit für etwas
atob
Unsinn. Diese Funktion gibt zurück,x*x+1
wox
eine nicht negative Zahl ist.Verwendung
Beabsichtigt
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 la
atob
quelle
Brain-Flak , 26 Bytes, Gebrochen
Original
Mein Riss
1000000000 's Crack
quelle
Python 2, 225 Bytes, geknackt von Sp3000
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.
quelle
J, 15 Bytes
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!
quelle