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 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
und 7
sind aber 2
zu 5
nicht sind), unbolded Zahlen ihre entkam Äquivalente darstellen ( 0
auf 5
, von denen alle darstellbaren im ursprünglichen Programm sind; Anmerkung das 0
ist ein entkam 6
und 1
ist 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, 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):
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:
73
wirft das ab 73363
, das noch oben auf dem Stapel liegt.
3
gibt das aus 023
und verwirft das 34662
. Es ist also ersichtlich, dass 34662
es sich um einen Kommentar handelt, mit dem die in der anderen Programmversion benötigten Bytes gespeichert wurden. Als für das, was 023
tut , wenn die Ausgabe, es E / A - Format 0 (Integer) auswählt, dann ist 23
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 (derzeit 7
) 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 von 7
auf 1
; auf diese Weise werden Zeichenfolgen, die ausschließlich aus 7
s bestehen, maskiert) und hängt sie dann an das Stack-Element an, bevor ( 772
). So sind unsere Daten jetzt so etwas wie7721111111111
.
- Schließlich
3
gibt das Stapelelement in Frage (und öffnet ein leeres Stapelelement , das Teil des Standard - Anfangsstapel ist). Sein Wert wird berechnet, indem die Anzahl von 1
s und 7
s genommen und die Anzahl von 0
s und 6
s subtrahiert wird . (Das 2
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 ändern 00
, so dass wir Zeichen vor die Eingabe stellen, die es 2 niedriger als 2 höher macht. Es gibt 00
bequem versteckte acht Oktalzeichen weiter im Programm (so dass Oktalzeichen und Bytes in einer Linie zueinander stehen), so dass wir es einfach mit dem 11
am Anfang tauschen können .