Für diese Herausforderung definieren wir Leerzeichen als nur Zeilenvorschübe (0x0A) und Leerzeichen (0x20). Beachten Sie, dass die meisten Sprachen und Regex-Varianten auch viele andere Zeichen als Leerzeichen betrachten, sowohl innerhalb als auch außerhalb des ASCII-Bereichs, sodass Sie möglicherweise nicht in der Lage sind, die entsprechenden integrierten Funktionen zu verwenden.
Die Herausforderung der Polizei
Sie sollten ein Programm oder eine Funktion in einer Sprache Ihrer Wahl schreiben, die eine Zeichenfolge aus ASCII-Zeichen (außer NUL-Zeichen) als Eingabe und Ausgabe verwendet, wobei alle Leerzeichen entfernt werden. Zum Beispiel, wenn Sie die folgende Eingabe erhalten haben:
H e l l o,
W o r l d!
Sie sollten ausgeben
Hello,World!
Ihre Übermittlung ist dann Ihr Quellcode, wobei alle Leerzeichen entfernt werden (der gleiche Vorgang wie das Übergeben Ihrer Lösung als Eingabe an sich selbst, obwohl Ihre Lösung auch Zeichen außerhalb des ASCII-Bereichs enthalten kann). Ihr Ziel ist es, es so schwierig wie möglich zu machen, herauszufinden, wo Leerzeichen eingefügt werden müssen, um eine gültige Lösung in der Sprache Ihrer Wahl zu finden. Beachten Sie, dass Räuber möglicherweise weniger Leerzeichen einfügen, als Sie entfernt haben, jedoch nicht mehr. Denken Sie auch daran, dass Räuber nicht unbedingt Ihren genauen Code angeben müssen, sondern lediglich eine gültige Lösung finden müssen.
Ihre Antwort sollte Folgendes enthalten:
- Die Sprache (und ggf. die Version), in der Sie Ihre Lösung geschrieben haben.
- Die Byteanzahl Ihrer Lösung, bevor Leerzeichen entfernt werden.
- Ihre Lösung mit Leerzeichen entfernt.
Ihre Lösung kann entweder ein Programm oder eine Funktion sein, aber kein Snippet, und Sie dürfen keine REPL-Umgebung annehmen. Sie können Eingaben über STDIN, Befehlszeilenargument oder Funktionsargument und Ausgaben über STDOUT, Funktionsrückgabewert oder Funktionsparameter (out) vornehmen.
Im Interesse der Fairness muss es einen frei verfügbaren Dolmetscher oder Compiler für die von Ihnen gewählte Sprache geben.
Sie dürfen keine integrierten Funktionen zum Hashing, zur Verschlüsselung oder zur Generierung von Zufallszahlen verwenden (auch wenn Sie den Zufallszahlengenerator auf einen festen Wert setzen). Ihre Lösung muss in der Lage sein, Zeichenfolgen mit maximal 100 Zeichen in weniger als 10 Sekunden auf einem vernünftigen Desktop-Computer zu verarbeiten.
Wenn Ihre Antwort nicht innerhalb von 7 Tagen (168 Stunden) geknackt wurde, können Sie Ihre eigene Lösung aufzeigen, zu welchem Zeitpunkt Ihre Antwort als sicher eingestuft wird . Solange Sie Ihre Lösung nicht preisgeben, kann sie auch dann von Räubern geknackt werden, wenn die sieben Tage bereits verstrichen sind. Die kürzeste sichere Antwort gewinnt (gemessen vor dem Entfernen von Leerzeichen).
Wenn Ihre Antwort geknackt wird, geben Sie dies bitte in der Kopfzeile Ihrer Antwort zusammen mit einem Link zur Antwort des entsprechenden Räubers an.
Gehen Sie hier für die Räuber.
Uncracked Submissions
<script>site = 'meta.codegolf'; postID = 5686; isAnswer = false; QUESTION_ID = 103182;</script><script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>jQuery(function(){var u='https://api.stackexchange.com/2.2/';if(isAnswer)u+='answers/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJeRCD';else u+='questions/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJO6t)';jQuery.get(u,function(b){function d(s){return jQuery('<textarea>').html(s).text()};function r(l){return new RegExp('<pre class="snippet-code-'+l+'\\b[^>]*><code>([\\s\\S]*?)</code></pre>')};b=b.items[0].body;var j=r('js').exec(b),c=r('css').exec(b),h=r('html').exec(b);if(c!==null)jQuery('head').append(jQuery('<style>').text(d(c[1])));if (h!==null)jQuery('body').append(d(h[1]));if(j!==null)jQuery('body').append(jQuery('<script>').text(d(j[1])))})})</script>
quelle
Antworten:
Haskell, 100 Bytes, geknackt von Nimi
Dies ist ein volles Programm und ein dadaistisches Gedicht.
Code mit withspace (Online ausprobieren !)
Sieht immer noch ziemlich poetisch aus, wenn Sie mich fragen.
Enttarnt
Erläuterung
Die
do
-Notation ist nur syntaktischer Zucker,f
kann also gleichbedeutend als geschrieben werdenFür Listen ist der
>>=
-operator definiert alsconcatMap
, sof
wirdWenn Sie also eine Eingabe machen
"a b\nc"
,lines
teilen Sie die Eingabe in Zeilenumbrüche["a b","c"]
und teilen Siewords
jede Zeile in Leerzeichen auf[["a","b"],["c"]]
(wie mir erst jetzt klar wurde, enthält diese Eingabe Zeilenumbrüche, wird alsolines
eigentlich nicht benötigt). Verketten gibt einmal["a","b","c"]
,id
ist die Identitätsfunktion und als solche keine Auswirkungen haben und die endgültige Verkettung ergibt die Zeichenfolge"abc"
.quelle
C, 475 Bytes, geknackt von Riley
Bestimmte Teile von C machen es wirklich sehr einfach zu sehen, wohin Whitespace gehen soll. Der c-Preprozessor tut dies jedoch nicht. Dieser Code besteht also aus zwei Teilen: Bis zur Zeile 17 (236 Zeichen mit Leerzeichen) ist der Code praktisch nicht verschleiert, und danach (239 Zeichen mit Leerzeichen) viel Glück!
Ich werde diesen Wettbewerb bei weitem nicht gewinnen, aber ich wollte sehen, was mit dem c-Preprozessor alles möglich ist.
Kompiliert (mit Warnungen, wenn Sie sie aktivieren) mit
gcc -std=c89 -ansi
und funktioniert wiecat file | ./a.out
Dies wurde viel schneller geknackt als ich dachte, Glückwunsch! Meine Strategie bestand darin
#defines
, offensichtliche Token-Grenzen (wie ';') zu entfernen und dann mehr#defines
zu verwenden, um es WIRKLICH unintuitiv zu machen, wie sie herumgemischt wurden.Übrigens sieht der Code so aus, nachdem nur das offensichtliche Leerzeichen hinzugefügt wurde:
quelle
Oktave, 69 Bytes, SICHER!
Eingabeformat: Zeilenumbrüche können nicht direkt in die Eingabeaufforderung eingegeben werden. Erstellen Sie die Zeichenfolge durch Verketten wie folgt:
Rufen Sie die Funktion wie folgt auf (fügen Sie Leerzeichen hinzu):
Originalcode:
Sie brauchten dafür nur 66 Bytes, aber ich habe 69 in den Header geschrieben, um nicht zu viele Informationen preiszugeben.
Der ursprüngliche Code sieht folgendermaßen aus:
Erläuterung:
U
ist ein Codepunkt85
in der ASCII-Tabelle, sodass es so aussieht, als ob das erste Leerzeichen dahinter stehen sollte85
. Falsch!Wenn wir
853
stattdessen das Leerzeichen nach einfügen , sollten wir die Zeichennummer erhalten853
, richtig ..? Verwenden Siechar
, um zu überprüfen, ob das ein erkennbares Zeichen ist:Wir verwenden jedoch nicht
char
den Code, sondern die kürzere Version, in der wir die Zahlen mit einer leeren Zeichenfolge verketten[853 '']
. Anstatt einen Fehler außerhalb des Bereichs anzugeben, verwendet die kürzere Version einfach den Zahlenmodul 256.Es ist einfach so
85+3*256 = 853
. Währendchar(853)
eine Warnung gibt,[853,'']
kehrt zurückU
.Der naheliegende Weg, um diese Aufgabe in Octave zu erledigen, ist:
Wir wissen, dass es nach dem ersten eine öffnende Klammer (Code-Punkt 40) geben muss
U
.29
Offensichtlich passt das nicht, also verschieben wir den Raum ein Stück weiter nach rechts und kommen an296
.mod(296,256) = 40
. Bingo!Fahren Sie wie folgt fort und beenden Sie die Sequenz:
Schließlich verwenden wir
eval
, um den String in Code umzuwandeln.quelle
U
unter diesen Zahlen wiedererkenne :-)JavaScript ES6, 199 Bytes, geknackt von SLuck49
Ein ziemlich sperriger Eintrag mit 33 Bytes Leerzeichen.
quelle
[ 10, 0, 0, 0, 0, 9, 8, 1, 5, 0, 0 ]
für die Lückensequenz und meine Iterationsfunktion für das Array ist(a)=>{for(var x=0;!a[x];x++);if(a.length-x>1){a[0]=a[x]-1;a[x]=(x==0?a[x]:0);a[x+1]++;}else{a[0]=a[x]+1;a[x]=0;i=0}}
. Ich fing an bei[ 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]
.> <>, 40 Bytes, Gebrochen von Teal Pelican
Ich habe übrigens fishlanguage.com verwendet , nur für den Fall, dass es Unterschiede zwischen den Dolmetschern gibt.
quelle
Befunge-93, 58 Bytes, Sicher!
Probieren Sie es online!
Ursprüngliches Programm
Probieren Sie es online!
Der Trick dabei war, dass der Ausführungspfad eher vertikal als horizontal war. Dann wurden verschiedene Leerzeichen nach dem Zufallsprinzip in den Code eingefügt, um die vertikalen Pfade weiter zu mischen. Nachdem die Zeilenumbrüche und Leerzeichen endlich entfernt worden waren, gab es hoffentlich nur sehr wenige Hinweise darauf, wie sich die Vorgänge zueinander verhalten.
Für den Fall, dass das nicht schwierig genug war, habe ich auch ein wenig Interleaving eingesetzt, sodass eine Reihe von Operationen von verschiedenen, senkrecht zueinander verlaufenden Codepfaden ausgeführt wurden. Die Idee ist, dass Sie, wenn Sie dachten, Sie hätten die richtige Position für einen bestimmten Befehl gefunden, nicht erkennen würden, dass Sie ihn später im Code möglicherweise erneut verwenden müssen.
Ich bin mir nicht sicher, ob es die Mühe wert war, die Dinge kompliziert zu machen, oder ob sich die Leute überhaupt nicht darum gekümmert haben, es zu lösen. :)
Code-Erklärung
quelle
C # 6, 201 Bytes, Cracked by Link Ng
184 Bytes sind zusammengebrochen, so dass Sie 17 Bytes Leerzeichen haben.
Gebrochene Lösung unter Verwendung der,
Concat
während meine beabsichtigte Lösung die verwendeteJoin
, hier ist die beabsichtigte Lösung:quelle
MATL , 22 Bytes. Gebrochen und geknackt .
Dies ist ein Programm, das Eingaben über STDIN entgegennimmt und die Ausgabe über STDOUT erzeugt.
Code ohne Leerzeichen oder Zeilenumbrüche:
Das Eingabeformat ist aufgrund der Art und Weise, wie MATL Zeichenfolgen eingibt, etwas umständlich. Zeichenfolgen mit Zeilenumbrüchen können nicht direkt über STDIN eingegeben werden, da jede Eingabe eine einzelne Zeile sein muss (Zeilenumbruch markiert das Ende der Eingabe). Das Format ist also wie folgt:
Eine Zeichenfolge wird in einfache Anführungszeichen eingeschlossen . Wenn der Zeichenfolgeninhalt einfache Anführungszeichen enthält, werden diese durch Duplizieren maskiert . Beispiel:
'I''m a string'
Um eine Zeichenfolge mit Zeilenumbrüchen einzugeben, müssen Sie die Zeichenfolge in Zeilenumbrüche aufteilen und alles (in eckigen Klammern) verketten, einschließlich Zahlen als ASCII-Codes . Betrachten Sie beispielsweise die Zeichenfolge, die aus meinem Vor- und Nachnamen mit einem Zeilenumbruch dazwischen besteht. Es würde als eingegeben werden
['Luis' 10 'Mendo']
.Dies ermöglicht die Eingabe anderer (möglicherweise nicht druckbarer) ASCII-Codes. So könnte die Zeichenfolge in Punkt 1 oben alternativ als eingegeben werden
['I' 39 'm ' 97 32 'string']
. Überprüfen Sie es hier .Die einzige Bedingung ist, dass mindestens einer der Teile in den Klammern eine Zeichenfolge ist. Das erzwingt, dass beliebige Zahlen bei der Verkettung als ASCII-Codes interpretiert werden.
Entschuldigung für die UngeschicklichkeitViel Glück bei der Verwendung dieses Formats!Originelle Lösung
Jedes
%
ist ein Kommentarsymbol und der Rest der Zeile wird ignoriert.Leerzeichen tun nichts, sondern dienen als Trennzeichen. Beispielsweise
1e5
würde ohne das Leerzeichen als die Zahl interpretiert100000
.t
Nimmt die Eingabe und dupliziert sie.' @ *'
pusht diese Zeichenkette undd
berechnet ihre aufeinanderfolgenden Differenzen, was ergibt[32 -32 10]
(das-32
ist nutzlos).m
gibt ein logisches Zeilenarray an, das angibt, welche Zeichen32
oder10
(oder-32
) sind.1
gefolgt vone
Formänderungen in einer Reihe. Dies ist hier nicht möglich.5
gefolgt vonM
erneutem Drücken1
(letzte Eingabe für die letzte Funktion mit mehreren Eingaben, d. h.e
).d
berechnet aufeinanderfolgende Differenzen von1
und gibt so[]
(leeres Array).w
swappt und(
ordnet schließlich[]
Leerzeichen zu, dh entfernt sie.quelle
RProgN , 15 Bytes geknackt !
Sie können Spielzeug mit dem Code hier . Eine relativ einfache Lösung, die hoffentlich aufgrund der nervigen Art, wie RProgN mit Zeichenfolgen umgeht, ungerissen bleibt.
Ursprüngliches Programm
Explination
Erstens wird die Eingabe implizit in den Stapel verschoben. Stapel:
<INPUT>
Dann verwenden wir '', um ein Leerzeichen auf den Stapel zu schieben. Stapel:
<INPUT> " "
Das `versucht tatsächlich, einen String zu pushen, der durch` (WORD) dargestellt wird, aber da dahinter ein Leerzeichen steht, pusht es nur einen leeren String. Stapel:
<INPUT> " " ""
Das R hier ist Zucker für den Befehl Ersetzen. Stapel:
<INPUTWITHOUTSPACES>
Als nächstes drückt die "NEWLINE" eine Zeichenkette, die eine Newline enthält. Das ist schön, weil RProgN keine Escape-Zeichen verwendet, sondern nur eine solche Zeichenkette direkt nach oben drückt. Stapel
<INPUTWOSPACES> "\n"
Dann verwenden wir wieder den Trick `und Replace, was unsere Ausgabe ergibt.
quelle
Ruby, 86 Bytes + 1 Flag = 87 ( geknackt von Dom Hastings )
Erfordert ein Befehlszeilenflag
-p
.Der Code ist in dieser Form tatsächlich gültig, es ist nur ein No-Op.
quelle
Strahl , 72 Bytes, sicher!
Nun zu einer 2d Sprache. Kann mit dem TIO Nexus gespielt werden .
Ein ziemlich einfaches Programm ohne viel zu tun, um die Leute zum Narren zu halten.
quelle
Labyrinth , 127 Bytes
Hoffentlich habe ich das richtig gemacht :) Dies ist mein erster Eintrag für Polizisten und Räuber.
Ursprünglicher Code
quelle
Java, 3241 + 28 Bytes für einen großen Integer-Import
Dieser Eintrag dient ausschließlich dem Nachweis der Möglichkeit eines rein kryptografisch gesicherten Eintrags. Ich glaube, dass dies innerhalb der Regeln liegt, aber wenn es gegen den Geist ist, lassen Sie es mich bitte wissen und ich werde aus Fairness streichen. Ich werde dies "unsicher" auf unbestimmte Zeit belassen, bis (und falls) ein Riss gefunden wird. Dies ist eine Monstrosität und könnte sicherlich weiter optimiert werden, aber hier ist es.
Aus Fairness gegenüber Räubern wird hier das "offensichtliche" Leerzeichen hinzugefügt.
Viel Glück, ich würde es lieben, wenn dies geknackt würde. Tatsächlich werde ich dafür sogar ein unbegrenztes Kopfgeld erheben. Wenn Sie dies irgendwann knacken, erhalten Sie beim Stapelaustausch eine unbegrenzte Anzahl von 500 Wiederholungen (sowie wahrscheinlich eine wunderbare mathematische Arbeit).
quelle
C, 140 Bytes, geknackt von Riley
Beginnen wir mit einem einfachen.
(Ich hoffe, ich mache das richtig.)
quelle
Befunge 98, 65 Bytes, geknackt von Pietu1998
Ursprüngliches Programm
quelle
V , 37 Bytes Gebrochen von nmjcman101
Da dies nicht druckbar ist, ist hier die lesbare Version:
Oder wenn Sie es vorziehen, ein Hexdump:
quelle
Minkolang v0.15 , 88 Bytes, Gebrochen!
Probieren Sie es online!
quelle
JavaScript ES6, 380 Byte, sicher
Dies ist die Art von Eintrag, die ich ursprünglich veröffentlichen wollte. Es ist riesig und hat fast keine Gewinnchance, aber ich denke, es sollte kryptografisch stark genug sein, um 7 Tage zu überstehen. Nun kann ich mich irren!
67 Bytes Leerzeichen zum Hinzufügen.
Lösung
Dies ist eine Implementierung des Extended Tiny Encryption Algorithmus . Der 64-Bit-Whitespace-codierte Schlüssel wird auf den folgenden 128-Bit-Schlüssel erweitert:
Quelle: Wikipedia
Sobald der 64-Bit-Block entschlüsselt und in ASCII konvertiert wurde, wird er
[x, y]
als gelesen.c3BsaXQ=
Dies ist die Base64-codierte Darstellung vonsplit
.Code-Snippet anzeigen
quelle
Vitsy , 73 Bytes, sicher
Das ist absolut böse.
Viel Glück! 13 Elemente mit Leerzeichen zum Hinzufügen.
Originalcode:
Probieren Sie es online!
Dies vereinfacht sich grob auf:
quelle
C #, 159 Bytes, Gebrochen von Milch
153 zusammengebrochen, so dass nur 6 Bytes Whitespace zu finden sind, sollte nicht zu schwer sein ...
quelle
netzförmig, 43 bytes, geknackt
Die Version auf TIO ist veraltet, aber Sie können sich eine Kopie vom Github besorgen .
quelle
Wolfram, 132
Hat wahrscheinlich mehr als eine Lösung (Hinweis: Mersenne)
Lösung
quelle
Leerzeichen ,
8174 BytesVom Menschen lesbare Version:
Ich weiß, dass dies eine alte Herausforderung ist, aber hoffentlich ist jemand bereit, dies zu knacken. Ich habe versucht, für bytecount zu optimieren, aber es ist möglicherweise möglich, etwas mit der gleichen Anzahl von Tabulatorzeichen zu verkürzen.
quelle
tcc, 850 bytes
Um zu vermeiden, dass eine sehr lange Zeile eingefügt wird, habe ich diese mit tr -d '\ n' | übergeben fold -b -w 60.
quelle
SILOS , 159 Bytes Sicher!
Sollte ziemlich trivial sein. Es ist mein erster Eintrag für Bullen und Räuber.
Niemand griff es an, wahrscheinlich aufgrund der Esoterik meiner eigenen Sprache. Scheint eine schmierige Art zu sein, vorbei zu rutschen, aber das ist eigentlich egal, da kürzere sicher sind.
Probieren Sie es einfach online aus
quelle