Machen Sie Ihre Sprache * meistens * unbrauchbar! (Polizistenthread)


61

Inspiriert von diesem Kommentar ...

Vielen Dank an die Benutzer Step Hen , Wheat-Wizard und Dennis, die mir geholfen haben, die Spezifikation dieser Herausforderung zu konkretisieren, bevor sie veröffentlicht wurden!

Dies ist der Thread der Cops. Für den Faden Robbers, gehen hier


In dieser Herausforderung müssen Sie Code ausführen, der dafür sorgt, dass Ihre Sprache unsere Kriterien als Programmiersprache nicht mehr erfüllt. In dieser Herausforderung heißt das, es so zu machen, dass die Sprache nicht mehr ...

  • Zahleneingabe und -ausgabe übernehmen

  • Addiere zwei Zahlen

  • Testen Sie, ob eine bestimmte Zahl eine Primzahl ist oder nicht.

Dies ist eine Herausforderung, bei der es zwei unterschiedliche Herausforderungen mit zwei unterschiedlichen Zielen gibt: Die Cops werden versuchen, Code zu schreiben, der die Sprache größtenteils unbrauchbar macht, und die Räuber werden versuchen, die verborgene Problemumgehung zu finden, die es den Cops ermöglicht ihre Sprache wiederzugewinnen.

Als Cop müssen Sie zwei Codeausschnitte schreiben:

  1. Eine, die Ihre Sprache größtenteils unbrauchbar macht, z. B. indem integrierte Funktionen für Eingabe / Ausgabe und numerische Operationen entfernt werden. Je mehr Features Sie entfernen, desto besser. Dieser Code darf nicht abstürzen oder beendet werden. Es sollte möglich sein, Code am Ende dieses Snippets hinzuzufügen, und dieser Code wird ausgewertet . Und...

  2. ... ein Codeausschnitt, der zwei nicht negative Ganzzahlen als Eingabe verwendet, sie addiert und ihre Summe ausgibt. Dieses Snippet muss auch nach dem Ausführen des ersten Snippets noch ordnungsgemäß funktionieren. Wenn die beiden Ausschnitte miteinander kombiniert werden, müssen sie ein vollständiges Programm bilden, das zwei Zahlen hinzufügt, oder eine Funktion definieren, die zwei Zahlen hinzufügt. Im Idealfall sollte sich dieses Snippet auf ein sehr undurchsichtiges Verhalten stützen, damit es schwieriger zu finden ist.

Sie können eine beliebige Standardmethode für die Eingabe und Ausgabe auswählen . Sie müssen jedoch genau angeben, welches Format (Eingabe und Ausgabe) Sie verwenden. Ein Räuber kann Ihre Antwort nur knacken, wenn er dasselbe Format wie Sie verwendet.

Nachdem Sie diese beiden Ausschnitte geschrieben haben, müssen Sie den ersten als Antwort veröffentlichen, ohne den zweiten preiszugeben. Ihre Antwort sollte alle folgenden Informationen enthalten:

  • Der erste Ausschnitt (offensichtlich nicht der zweite).

  • Sprache (einschließlich Nebenversion, da die meisten Einsendungen wahrscheinlich auf seltsamen Randfällen beruhen)

  • IO-Format, einschließlich, ob es sich um eine Funktion oder ein vollständiges Programm handelt. Räuber müssen dasselbe Format verwenden, damit ihr Riss gültig ist.

  • Irgendwelche seltsamen Randfälle, die erforderlich sind, damit Ihre Antwort funktioniert. Läuft beispielsweise nur unter Linux oder erfordert eine Internetverbindung . Das ist natürlich ein bisschen subjektiv, aber wenn ein Cop einen extremen Kantenfall hat, der ein Knacken verhindert, und dies erst dann aufdeckt, wenn er in Sicherheit ist, dann halte ich das für eine schlechte Sportlichkeit. Ein potenzieller Räuber sollte über alle Informationen verfügen, die erforderlich sind, um Ihre Antwort zu knacken, bevor sie geknackt wird.

Sie müssen Ihre Byteanzahl erst bekannt geben, wenn Ihre Antwort sicher ist.

Hier ist ein Beispiel. Für das erste Snippet können Sie das folgende Python 3-Programm einreichen:

Python 3

print=None

Übernimmt die Eingabe von STDIN und gibt sie an STDOUT aus

Und dann könnten Sie als zweites Snippet schreiben:

import sys
a,b=int(input()),int(input())
sys.stdout.write(a+b)

Dies ist gültig, da zwei Zahlen als Eingabe und Ausgabe ihrer Summe verwendet werden, auch wenn Sie die beiden Ausschnitte zusammenfügen, z

print=None
import sys
a,b=int(input()),int(input())
sys.stdout.write(a+b)

Dies wird jedoch für einen Räuber extrem einfach zu lösen sein. Da dies sehr einfach zu knacken wäre, könnten Sie versuchen, diesen bestimmten Ansatz wie folgt zu patchen:

import sys
sys.stdout=None
print=None

Selbst dies hat jedoch eine sehr einfache Problemumgehung:

del print
a,b=int(input()),int(input())
print(a+b)

Als Polizist ist es Ihr Ziel, die verborgene Problemumgehung so dunkel wie möglich zu gestalten, um zu verhindern, dass die Räuber sie finden.

Die Räuber sehen sich eine Ihrer Antworten an und versuchen, sie zu knacken. Sie können es knacken, indem sie ein gültiges Snippet schreiben , das als Snippet 2 funktionieren könnte (indem sie zwei Zahlen addieren, nachdem die Sprache größtenteils unbrauchbar gemacht wurde). Dies muss nicht dasselbe Snippet sein, das Sie ursprünglich beabsichtigt haben. Wenn ein Räuber Ihre Antwort knackt, hinterlässt er einen Kommentar zu Ihrer Antwort, und Sie sollten ihn bearbeiten, um anzuzeigen, dass er geknackt wurde. Wenn Ihr Beitrag geknackt ist, sollten Sie Ihre Antwort bearbeiten, um die Lösung (Snippet 2) anzuzeigen, die Sie ursprünglich beabsichtigt haben. Dies ist an sich keine Regel , sondern nur ein freundlicher Vorschlag, um das Spiel unterhaltsam zu gestalten. Du musst nicht.

Wenn eine Antwort eine Woche lang nicht geknackt ist, können Sie sie in Ihrem zweiten Snippet bearbeiten und darauf hinweisen, dass Ihre Antwort jetzt sicher ist . Wenn Sie es nach Ablauf der Woche nicht bearbeiten, können andere Benutzer es trotzdem knacken, bis Sie dies tun. Wenn Sie Ihr zweites Snippet nicht offenlegen, können Sie für Ihre Antwort keine Punkte beanspruchen oder es als sicher bezeichnen.

Der Gewinner des Cops-Threads ist die kürzeste sichere Antwort, einschließlich beider Ausschnitte , die in Bytes gezählt werden. Diese Antwort wird akzeptiert, wenn genügend Zeit verstrichen ist. Sie nicht benötigen eine Byteanzahl zu offenbaren , bis die Antwort sicher ist, da Byteanzahl , um Ihre Gäste irrelevant ist , bis die Antwort sicher ist. Wenn genügend Zeit verstrichen ist und keine Antworten ungerissen bleiben, ist der Gewinner die Antwort, die am längsten ungerissen geblieben ist.

Habe Spaß!

Regelklärungen

  • Das erste Snippet muss korrekt ausgeführt werden, ohne dass Eingaben erforderlich sind . Die Ausgabe kann beliebig sein, und diese Ausgabe wird ignoriert - solange das Snippet fertig ist, wird das zweite Snippet korrekt ausgeführt.

  • Das zweite Snippet muss tatsächlich ausgeführt werden, damit Ihre Antwort gültig ist. Dies bedeutet eine Antwort wie

    import sys
    sys.exit()
    

    ist nicht gültig, weil es die Sprache nicht bricht. Es hört einfach auf. Ebenso ist die Eingabe einer Endlosschleife nicht gültig, da das zweite Snippet niemals ausgeführt wird.

  • Nachdem Sie sicher sind, ist Ihre Punktzahl die Byteanzahl beider Snippets .

  • Dies geht zurück auf Bitte enthüllen Sie alle seltsamen Randfälle, die erforderlich sind, damit Ihre Antwort funktioniert . Ihre Einreichung muss genügend Informationen enthalten, bevor sie enthüllt wird, damit sie nach der Enthüllung reproduzierbar ist. Dies bedeutet, dass, wenn Ihre Antwort sicher ist, Sie Folgendes bearbeiten: Hier ist meine Antwort. Oh ja, übrigens funktioniert dies nur, wenn Sie es unter Solaris ausführen. Ihre Antwort ist ungültig und wird gelöscht und gilt nicht als gewinnberechtigt.

  • Das zweite Snippet kann nach der Ausgabe der Summe abstürzen - solange die Ausgabe noch korrekt ist (wenn Sie sich beispielsweise für die Ausgabe in STDERR entscheiden und dann eine Reihe von Absturzinformationen erhalten, ist dies ungültig).

  • Sie können Ihren Code nach dem Absenden einer Antwort nicht bearbeiten.

  • Sie können sich möglicherweise nicht auf kryptografische Funktionen wie Verschlüsselung, Hash-Funktionen, CSPRNGs usw. verlassen.

Ausschnitt, um ungerissene Beiträge zu finden:


3
Was ist für Sprachen wie C zu tun? Die Verkettung erlaubt nur ein "Hauptschnipsel", und jede Logik muss dahin. Wenn ich zB habe, int main(){ do_evil_stuff(); }wohin soll der Benutzercode gehen? In einer Funktion? Nach all den Aussagen in main?
Conor O'Brien

1
Kann das zweite Snippet an einer beliebigen Stelle im ersten Snippet platziert werden?
LegionMammal978

1
Ich weiß nichts über Codierung, aber diese Herausforderung sieht
toll

2
Ich habe in jimmy23013's großartigem Snippet editiert . Sie können jederzeit zurückkehren, aber ich habe es trotzdem verwendet, um Einsendungen zu finden, und dachte, es könnte anderen helfen.
Dom Hastings

2
@DomHastings Das ist sehr hilfreich! Vielen Dank :)
DJMcMayhem

Antworten:


2

Gforth 0.7.3 (TIO) , 231 Byte [SICHER]

Dieser Code definiert einige notwendige Ausgabemethoden sowie die Addition und etwas Entscheidendes zum Deklarieren von Funktionen als nutzlos. Viel Glück!

: . ;
: dec. ;
: u. ;
: .r ;
: u.r ;
: d. ;
: ud. ;
: d.r ;
: ud.r ;
: emit ;
: type ;
: + postpone 2drop ;
: ; + + + postpone exit reveal postpone [ ;

Die Eingabe erfolgt über zwei Ganzzahlen mit Vorzeichen, die als Funktionsparameter am oberen Rand des Stapels abgelegt werden. Ausgabe an STDOUT.

Sie sollten also den verursachten Schaden beheben und eine Funktion definieren, die die beiden obersten Werte aus dem Stapel entnimmt und das Ergebnis als Ganzzahl (kein Gleitkomma) ohne zusätzliche Ausgabe (kein Leerzeichen) an STDOUT ausgibt.

Hier ist eine Vorlage , wenn Ihre Zielfunktion benannt ist f.

Lösung:

79 Bytes

Ich habe das immediateSchlüsselwort tatsächlich am Ende der Neudefinition von entfernt ;, so dass es für eine Antwort erforderlich war, es am Anfang einzuschließen. Die von mir definierte Funktion entspricht größtenteils der internen Definition von ., gibt jedoch nicht das Leerzeichen am Ende aus, und die Addition wird zuerst ausgeführt, indem die Zahlen in den Gleitkommastapel und zurück verschoben werden.

immediate : f s>f s>f f+ f>d swap over dabs <<# #s rot sign #> (type) #>> 0 0 ;

Probieren Sie es online aus


1
Das ist eine sehr schöne Antwort. Bei dieser Geschwindigkeit scheint es die einzige ungerissene Antwort zu sein!
DJMcMayhem

:) Ich habe ein paar verschiedene Hindernisse kombiniert. An dieser Stelle frage ich mich, ob ich nur eine einzige hätte machen können, um meine Punktzahl zu verbessern. Aber es ist möglich, dass es noch keine Risse gibt, wenn mehrere vorhanden sind.
mbomb007

21

Haskell, geknackt von Christian Sievers

import Prelude(getLine,print)
a=a

Vollständiges Programm, das zwei ganze Zahlen (einschließlich negativer) von stdin liest und in stdout schreibt.

Ich habe gerade das Prelude deaktiviert, sodass fast nichts im Geltungsbereich ist, und dann eine Definition hinzugefügt. weitere Importe sind syntaktisch ungültig. Ich gab dir getLineund printobwohl.


Bearbeitet, um meine ursprüngliche Lösung hinzuzufügen. Christians Crack war anders, nutzt jedoch die gleichen Grundfunktionen (Sie können überraschend viel Rechenaufwand erzielen, indem Sie auf Funktionen mit syntaktischem Zucker zugreifen, selbst wenn Sie nichts Eingebautes direkt aufrufen oder die beteiligten Typen benennen können).

import Prelude(getLine,print)
a=a
(x:l)!0=x
(x:l)!n=l!d[0..n]
d[x,y]=x
d(x:l)=d l
x^y=[x..]!y
x+y=f[0..y](x^y)(-((-x)^(-y)))
f[]x y=y
f _ x y=x
f.g= \x->f(g x)
f&0= \x->x
f&n=f.(f&d[0..n])
x*y=((+x)&y)0
x%[]=x
x%('-':s)= -(x%s)
x%(c:s)=x*10+i c%s
i c=l['1'..c]
l[]=0
l(x:s)=1+l s
main=do
 x<-getLine
 y<-getLine
 print((0%x)+(0%y))

Was wahrscheinlich sowieso nicht super ist, aber hier ist es besser lesbar:

import Prelude(getLine,print)
a=a

-- List indexing
(x : _) !! 0 = x
(_ : xs) !! n = xs !! (sndLast [0..n])

-- sndLast [0..n] lets us decrement a positive integer
sndLast [x, _] = x
sndLast (_ : xs) = sndLast xs

-- Pseudo-addition: right-operator must be non-negative
x +~ y = [x..] !! y

-- Generalised addition by sign-flipping if y is negative
x + y = switch [0..y] (x +~ y) (-((-x) +~ (-y)))
  where switch [] _ empty = empty   -- [0..y] is null if y is negative
        switch _ nonempty _ = nonempty

f . g = \x -> f (g x)

-- compose a function with itself N times
composeN f 0 = \x -> x
composeN f n = f . (composeN f (sndLast [0..n]))

-- multiplication is chained addition
x * y = composeN (+x) y 0

strToNat acc [] = acc
strToNat acc ('-' : cs) = -(strToNat acc cs)
strToNat acc (c : cs) = strToNat (acc * 10 + charToDigit c) cs

charToDigit c = length ['1'..c]

length [] = 0
length (_ : xs) = 1 + length xs

main = do
  x <- getLine
  y <- getLine
  print (strToNat 0 x + strToNat 0 y)


17

Python 2 , geknackt

Implementiert die Addition als benannte Funktion

import sys
c="".join(open(__file__).read().split('\n')[4:])
if set(c)-set(' &)(,.:[]a`cdfijmonrt~')or"import"in c:sys.setrecursionlimit(1)
f=lambda\

Probieren Sie es online!

Was macht das?

Um Ihnen ein wenig zu helfen, erkläre ich, was dies bewirkt. Dieser Code öffnet die Quelldatei und prüft, ob der Rest des Codes den folgenden Kriterien entspricht:

  • Enthält nicht die Zeichenfolge import
  • Wird ausschließlich aus den Charakteren gemacht &)(,.:[]a`cdfijmonrt~

Wenn eines der beiden Kriterien nicht erfüllt ist, wird das Rekursionslimit so festgelegt, 1dass jeder von Ihnen geschriebene Code das Rekursionslimit erreicht.

Hier gibt es keine Tricks. Ich habe eine Lösung geschrieben, die nur diese Zeichen und keine Importe verwendet. Ich mache nichts Subversives, aber ich werde sagen, dass ich denke, dass dies ziemlich schwer zu knacken sein wird.

Um Ihnen Zeit zu sparen, finden Sie hier eine kurze Liste nützlicher Dinge, die Sie mit dieser Einschränkung nicht tun können

  • + gut duh,

  • eval/ execWollte dich damit nicht davonkommen lassen

  • Zahlen, sie könnten nützlicher sein als Sie denken

  • String-Literale

  • len

  • =, Keine Zuweisung von Variablen

  • >, <, ==. . . Ich habe dich ohne Vergleiche gelassen

  • *, -, /, %, ^, |, >>, << Die einzigen Betreiber zur Verfügung stehen ~und&

  • __foo__, Keine dieser ausgefallenen Methoden mit doppeltem Unterstrich ist zulässig.


1
Wow das ist ziemlich böse. Nett!
HyperNeutrino

Fantastische Antwort zum Auftakt :)
DJMcMayhem

Hehe, das könnte von der blöden Herausforderung des Königs der Hügel inspiriert worden sein, die ich einmal im Chat versucht habe
Stephen,

4
Ich denke, dies ist ein gültiger Riss: codegolf.stackexchange.com/a/133209/68942
HyperNeutrino

RE das erste Snippet: This code is not allowed to crash or exit.(Siehe Chat für die Diskussion darüber)
Stephen

12

Python 2 , geknackt

Dies ist die vierte Iteration dieser Antwort. Jede der letzten Antworten wurde durch Zurücksetzen der Rekursionstiefe geknackt.

Implementiert die Addition als benannte Funktion

import sys
if set("".join(open(__file__).read().split('\n')[4:]))-set(' &)(,.:[]a`cdfijmonrt~'):sys.setrecursionlimit(1)
for m in sys.modules:sys.modules[m]=None
del sys;f=lambda\

Probieren Sie es online!

Was macht das?

Um Ihnen ein wenig zu helfen, erkläre ich, was dies bewirkt. Dieser Code öffnet die Quelldatei und prüft, ob der Rest des Codes nur aus den Zeichen besteht &)(,.:[]a`cdfijmonrt~

Wenn dies fehlschlägt, wird das Rekursionslimit so festgelegt, 1dass jeder von Ihnen geschriebene Code das Rekursionslimit erreicht.

Ich habe auch alle Module deaktiviert, sodass Sie nichts importieren können.

Hier gibt es keine Tricks. Ich habe eine Lösung geschrieben, die nur diese Zeichen und keine Importe verwendet. Ich mache nichts Subversives, aber ich werde sagen, dass ich denke, dass dies ziemlich schwer zu knacken sein wird.

Um Ihnen Zeit zu sparen, finden Sie hier eine kurze Liste nützlicher Dinge, die Sie mit dieser Einschränkung nicht tun können

  • + gut duh,

  • eval/ execWollte dich damit nicht davonkommen lassen

  • Zahlen, sie könnten nützlicher sein als Sie denken

  • String-Literale

  • len

  • =, Keine Zuweisung von Variablen

  • >, <, ==. . . Ich habe dich ohne Vergleiche gelassen

  • *, -, /, %, ^, |, >>, << Die einzigen Betreiber zur Verfügung stehen ~und&

  • __foo__, Keine dieser ausgefallenen Methoden mit doppeltem Unterstrich ist zulässig.

Meine Lösung

Nun, da xnor es so geknackt hat, dass ich mit meiner Lösung zufrieden genug bin, werde ich sie offenbaren

r,o:(o and f(~(~r&~o)&~(r&o),int(`r`[:r&~r].join([`dict()`[r&~r],`r&~r`,`dict([(r&~r,r&~r)])`[int(`~([]in[[]])`[[]in[[]]:])],`min`[[]in[[]]],`dict()`[~(r&~r)],`r&~r`]).format(r&o),int(`~([]in[[]])`[[]in[[]]:]))))or r

Überraschen, überraschen, es ist ein riesiger Haufen Kauderwelsch. Anstatt das aufzuschlüsseln, gehe ich den Prozess durch, wie ich das gemacht habe.

Ich habe mit einem ziemlich normalen Additionsalgorithmus begonnen

r,o:(o and f(r^o,r&o<<1))or r

Dann habe ich einen bitweise Trick für die Darstellung ^mit |, &, ~.

r,o:(o and f((r|o)&~(r&o),r&o<<1))or r

Ich habe einen anderen bitweisen Trick benutzt, um das loszuwerden |

r,o:(o and f(~(~r&~o)&~(r&o),r&o<<1))or r

Jetzt ist nur noch das übrig <<, sollte nicht zu schwer sein, oder? Nun mach dich bereit für eine holprige Fahrt. Um die Bitverschiebung zu ersetzen, habe ich Strings verwendet, um eine Null an das Ende der Binärdarstellung anzuhängen

r,o:(o and f(~(~r&~o)&~(r&o),int(bin(r&o)[2:]+"0",2)))or r

Dies hat ein paar Probleme, aber das primäre Problem ist die Verwendung von Addition. Daher habe ich dies mithilfe eines Formats umgangen

r,o:(o and f(~(~r&~o)&~(r&o),int("{}0".format(bin(r&o)[2:]),2)))or r

Wir dürfen bin nicht verwenden, daher habe ich die Zeichenfolgenformatierung verwendet, um in binär zu konvertieren.

r,o:(o and f(~(~r&~o)&~(r&o),int("{0:b}0".format(r&o),2)))or r

Da String-Literale verboten sind, muss ich den String {0:b}0aus Teilen zusammensetzen, die mit Back Ticks gemacht wurden join.

r,o:(o and f(~(~r&~o)&~(r&o),int("".join(["{","0",":","b","}","0"]).format(r&o),2)))or r

Die leere Zeichenfolge ist ziemlich einfach, das können Sie einfach tun

`r`[:0]

Die Nullen waren

`0`

und die {:}wurden alle aus Wörterbüchern gepackt.

r,o:(o and f(~(~r&~o)&~(r&o),int("".join([`dict()`[0],`0`,`dict([(0,0)])`[2],"b",`dict()`[-1],`0`]).format(r&o),2)))or r

bscheint ziemlich schwer zu bekommen, es ist nicht in unserem Zeichensatz, also wie sollen wir ein Objekt bekommen, das ein bin seinem hat repr? reprUnd so geht's: Wenn Sie eine eingebaute Funktion verwenden, erhalten Sie etwas, das aussieht

<built-in function name>

Und von dort beziehen wir unsere b.

r,o:(o and f(~(~r&~o)&~(r&o),int("".join([`dict()`[0],`0`,`dict([(0,0)])`[2],`min`[1],`dict()`[-1],`0`]).format(r&o),2)))or r

Jetzt sind nur noch Zahlen übrig, ich brauche nur noch -1, 0, 1 und 2, und so habe ich sie dargestellt:

-1 = ~(r&~r)
 0 = r&~r
 1 = []in[[]]
 2 = `~([]in[[]])`[[]in[[]]:]

2 könnte eigentlich ein Byte kürzer sein als

```r&~r```.find(`r&~r`)

basierend auf @ Blenders Vorschlägen in den Kommentaren, aber daran habe ich erst nachträglich gedacht.

Also setzen wir diese Zahlen in ein

r,o:(o and f(~(~r&~o)&~(r&o),int(`r`[:r&~r].join([`dict()`[r&~r],`r&~r`,`dict([(r&~r,r&~r)])`[int(`~([]in[[]])`[[]in[[]]:])],`min`[[]in[[]]],`dict()`[~(r&~r)],`r&~r`]).format(r&o),int(`~([]in[[]])`[[]in[[]]:]))))or r

Und das ist der Riss.


Dieses Snippet scheint von sich aus einen Fehler zu machen.
ATaco

@ATaco Ich glaube, das wurde im Chat besprochen und es wurde entschieden, dass dies in Ordnung war.
Weizen-Assistent

Regeln geben ausdrücklich etwas anderes an. "Dieser Code darf nicht abstürzen oder beendet werden."
ATaco

@ATaco Hier ist die Nachricht, die er sagte, er würde sie aktualisieren, wenn er die Chance dazu hätte.
Weizen-Assistent


10

C (gcc) geknackt!

#define D(f)void f(void);
D(printf)D(fprintf)D(putc)D(puts)D(getchar)D(putc)D(fputc)D(ferror)D(feof)D(read)D(fclose)D(fread)D(wr1te)D(fgets)D(fgetc)D(popem)D(gets)D(read)D(scanf)D(setbuf)D(execl)D(execlp)D(putchar)D(execle)D(execv)D(malloc)D(execvp)D(execvpe)D(exec)D(system)D(close)D(fwrite)D(open)D(free)
int stdin;
int main(){
//your code goes here...hehe
}

Probieren Sie es online!

Eingabe von STDIN und Ausgabe an STDOUT.

Dies läuft ohne Fehler. Hahaha das ist ziemlich böse. Ich habe es nur auf TIOs gcc getestet. Normalerweise müssen Sie Ihren Code nach diesem Snippet anhängen, damit er funktioniert :) Der Kommentar ist gemein, hören Sie ihn sich nicht an.

Getestet am gcc (GCC) 6.3.1 20161221 (Red Hat 6.3.1-1). Sollte auf jedem Linux-System funktionieren.

Originelle Lösung

#define D(f)void f(void);
D(printf)D(fprintf)D(putc)D(puts)D(getchar)D(putc)D(fputc)D(ferror)D(feof)D(read)D(fclose)D(fread)D(wr1te)D(fgets)D(fgetc)D(popem)D(gets)D(read)D(scanf)D(setbuf)D(execl)D(execlp)D(putchar)D(execle)D(execv)D(malloc)D(execvp)D(execvpe)D(exec)D(system)D(close)D(fwrite)D(open)D(free)
int stdin;
int main(){
//your code goes here...hehe
}
void __attribute__ ((destructor)) dtor() {
    int a,b,c,d;a=b=c=0;
    struct FILE* z = popen("cat", "r");
#define q(x)for(;(c=getc(z))^32&&c^-1;)x=10*x+c-48;
q(a);q(b);
    char*y=calloc(c=a+b,1);
    for(a=0;c;){y[a++]=(48+(c%10));c=c/10;}
    for(b=0;b<a/2;b++){d=y[b];y[b]=y[a-b-1];y[a-b-1]=d;}
    write(1,y,a);
}

@ LegionMammal978 Ah ja
Conor O'Brien

2
Geben Sie Ihre Plattform an!
Joshua

@Joshua Ich habe einige Informationen hinzugefügt
Conor O'Brien


Nun, __asm__und Sie haben viele Funktionen zur Auswahl :) Denken Sie nicht, dass C und C ++ hier gute Feinde sind.
Edmz

9

Haskell , geknackt von Ben

main=main--

Probieren Sie es online! Dies sollte ein vollständiges Programm sein, das zwei Zahlen von stdin liest und die Summe an stdout ausgibt.

Jedes vollständige Programm startet mit der Ausführung der mainFunktion, mainruft sich jedoch selbst auf und führt zu einer Endlosschleife. Um die Sache noch schlimmer zu machen, wird ein Zeilenkommentar --direkt hinter dem rekursiven Aufruf gestartet , um zu verhindern, dass dieser in z. B. main2geändert wird und dann definiert wird, dass die Summierung durchgeführt wird.


Beabsichtigte Lösung:

main=main--$()
_ --$ _ = do
     x <- readLn
     y <- readLn
     print $ x+y

Probieren Sie es online!

--Startet einen Zeilenkommentar, es sei denn, er kann auch als Teil eines Operators analysiert werden. (Die Syntaxhervorhebung scheint sich dieser Tatsache nicht bewusst zu sein.) Es --$handelt sich um einen gültigen Infix-Operator, der mainals erstes Argument und als zweites Dummy-Argument verwendet wird (). Es wird dann definiert, beide Argumente zu ignorieren und stattdessen die erforderliche Aufgabe auszuführen.



5
Sie können einfach "where main = ..."
hinzufügen

+1 für eine Haskell-Lösung, die nur aufgrund von Haskells verzögerter Bewertung funktioniert.
Jules

9

C (GCC unter Linux) (geknackt)

Anstatt dumme Sandbox-Techniken zum Lesen von Dateien zu verwenden, machen wir es auf die richtige Art und Weise - mit SECCOMP Whitelisting!

Ihre Aufgabe: Addition mit Eingabe von STDIN und Ausgabe nach STDOUT implementieren.

#include <stdlib.h>
#include <unistd.h>
#include <sys/prctl.h>
#include <linux/seccomp.h>
#include <syscall.h>
#include <stdio.h>
void sandbox();
__attribute__ ((constructor(0))) int s() {
    close(0);
    close(1);
    close(2);
    prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT);
}
int main() {
    sandbox();
    syscall(SYS_exit, EXIT_SUCCESS);
}
void sandbox() {
    // Your code here!
}

Probieren Sie es online!

Was zur Hölle ist das!?

Um Ihnen bei Ihrer unüberwindlichen Aufgabe zu helfen, erkläre ich, was dieser Code bewirkt.

__attribute__ ((constructor(0)))Stellt sicher, dass die sFunktion zuerst ausgeführt wird. Die Funktion schließt alle offenen Dateideskriptoren für STDIN, STDOUT und STDERR. Dann beschränkt sich das Programm auf eine strikte SECCOMP-Whitelist, die Ihre Systemaufrufe auf Folgendes beschränkt:

read(2)
write(2)
_exit(2)
sigreturn(2)

Daher können Sie keine neuen Dateien öffnen (oder im Grunde nichts tun). Wir kommen dann zu main und rufen Ihren Code auf, schön in die sandboxFunktion eingepackt .

Das syscall(SYS_exit, EXIT_SUCCESS);am Ende ist nur, um sicherzustellen, dass das Programm sauber beendet wird - standardmäßig wird GCC beendet, exit_group(2)was von der SECCOMP-Whitelist nicht erlaubt ist. Diese Exit-Funktion wird aufgerufen, nachdem Ihr Code ausgeführt wurde.

Sie haben also keine offenen Dateideskriptoren und können nichts Neues öffnen. Unmöglich, richtig? ;)



8

x86 16 Bit Real Mode Assembly ( geknackt )

_main:
    call l
    cli
    hlt
l:  pop si
    xor ax, ax
    mov bp, cs
    mov es, ax
    mov di, 12
    mov [di], si
    mov [di + 2], bp
    pushf
    mov bp, sp
    or word [bp], 256
    popf

Einfach, wenn Sie den Trick kennen.


1
Wie nimmst du den Input auf? Auf dem Stapel oder in Registern? (Es sieht auch so aus, als ob dies eine 16-Bit-Assembly sein soll, aber wenn ja, or [bp], 256ist sie ungültig. Soll das so sein or WORD PTR [bp], 256?)
Cody Gray

1
Außerdem sollten Sie angeben, welchen Prozessor Sie verwenden. Es gibt viele x86-Versionen und -Klone sowie viele undefinierte Anweisungen. Wenn ich Code für einen "obskuren 80186-Klon" geschrieben hätte, der zufällig eine undefinierte Anweisung enthielt, die ein paar Argumente und bla bla bla ... Möglicherweise benötigen wir auch eine Umgebung. 16-Bit-Windows gab eine SS == DS-Garantie, die andere Systeme beispielsweise möglicherweise nicht.
Orion

1
Sie müssen nur angeben , welchen Prozessor , wenn Sie tatsächlich sind einige Tricks verwenden , die nur auf einem bestimmten Modell (oder eine bestimmten Generation) arbeiten. Dieser Code ist nicht so, also denke ich, dass "x86-16" ausreicht. Je allgemeiner, desto besser. Einverstanden, dass der echte oder geschützte Modus angegeben werden soll, obwohl das Vorhandensein des hltBefehls (Ring 0) stark impliziert, dass dies kein geschützter Modus ist.
Cody Grey

3
@Joshua, wenn es nicht auf jeder Plattform funktioniert, müssen Sie zumindest eine Plattform angeben, auf der es funktioniert, glaube ich. Your submission must contain enough information before being revealed to be reproducible after being revealed
Stephen

1
@StepHen: Die Lösung, um die Sprache freizugeben, ist plattformunabhängig, sobald der Real-Modus x86-16 festgelegt wurde, aber I / O ist nicht plattformunabhängig. Wer ausbricht, kann das Betriebssystem angeben, für das er ausgebrochen ist. Ich habe das _main-Label spät hinzugefügt, damit jemand theoretisch eine fast agnostische Pause machen kann, indem er gegen libc verlinkt.
Joshua

4

Javascript, geknackt

Diese Herausforderung baut auf der von Grant Davis auf , behebt jedoch die von ihm geplante Lösung (die einen Iframe erstellt und den Iframe verwendet window). Die Lösung wird in der Javascript-Konsole auf Chrome ausgeführt about:blank pageund benötigt zwei input()Sekunden, addiert sie und console.logergibt das Ergebnis. Gib deinen Code nachher ein:

d=prompt=console=document;new MutationObserver(s=>s.forEach(e=>{t=e.target;t.parentNode.removeChild(t)})).observe(d,{"childList":d, "subtree":d})

Zuerst quatschen wir promptund consoleund legen die Verknüpfung fest d. Dann erstellen wir einen Mutationsbeobachter mit einem Rückruf, der jedes mutierte Ziel entfernt. Wir stellen diesen Mutationsbeobachter so ein, dass er das Dokument beachtet childListund subtreeÄnderungen mitteilt. Anstelle des trueBuchstabens verwenden wir unsere Abkürzung zum Wahrheitswert document(die Spezifikation erlaubt dies nicht, Chrom jedoch).

Nachdem ich dies gepostet hatte, bemerkte ich einen viel eleganteren Clobber. Meine vorgesehene Lösung funktioniert immer noch, aber der eingestellte Riss funktioniert nicht:

 h=document.querySelector("html");h.parentNode.removeChild(h);

Willkommen auf der Seite! Ich bin
gespannt,


4

Perl 5, geknackt von Ilmari Karonen

$_=<DATA>;
s/[+'{dPz|K.UD!_ iJ;o}e6tjWb7253k@%&Iq4l0AN:?\$8B`Yywn9^pfmZQTF"M#-]//g;
eval;
print@_,$!,pop,shift,<>,eval"@>",$\,@ARGV,eval"@$",$@,eval"@@",$,,eval"@,",$/
__DATA__

Die Eingabe wird in separaten Zeilen von empfangen STDINund die Ausgabe wird auf gedruckt STDOUT.

Der gesamte Code folgt dem __DATA__Marker. Hierbei wird eine ähnliche Methode wie bei der @ WheatWizard-Lösung verwendet, bei der der Code analysiert und nicht verwendbare Zeichen entfernt werden.

Dies wurde in den Versionen 5.8, 5.10 und 5.16 getestet und erfordert keine Befehlszeilenflags.

Probieren Sie es online!


2
Könnten Sie bitte die Eingabe- / Ausgabemethode und das Format angeben?
Ilmari Karonen

@IlmariKaronen Entschuldigung, es ist STDINmit Zeichen in separaten Zeilen und STDOUT. Ich werde dies zum Hauptteil hinzufügen.
Dom Hastings

Cracked , denke ich.
Ilmari Karonen

4

Python 3, geknackt von zbw

import sys
for mod in sys.modules.values():mod.__dict__.clear()
1+1

Alle Module wurden gelöscht, dh es sind keine eingebauten Module verfügbar und es kann nicht viel mehr getan werden. Ausgabe nach STDOUT, Eingabe von STDIN. Dies ist die zweite Iteration dieser Antwort, nachdem die vorherige durch einen unbedeutenden Riss durch Hinzufügen einer break-Anweisung unterbrochen wurde.


Ich bin sehr gespannt auf das Snippet, das danach funktioniert
NickA

Nun, Sie haben sieben Tage warten , oder für einen nicht-trivialen Riss, je nachdem was zuerst kommt ...
pppery


Na ja, solche Herausforderungen sind sehr schwer zu
meistern

4

APL (ngn-apl) , geknackt von ngn

In Zusammenarbeit mit meinem Kollegen Marshall gemacht .

Eingabe durch linke und rechte Argumente bis +. Dh Ihr Ziel ist es, Code nach dem Folgenden einzufügen, so dass Ihre letzte Zeile STDOUT liest ⎕←3+2und ausgibt 5.

+←-←−←⍴←≢←≡←⊥←⊤←⍟←○←⍳←⌹←~←∈←∊←⍷←<←≤←=←≥←>←≠←,←⍪←⌷←⌽←⍉←⊖←{}⋄⍣←∘

Probieren Sie es online!

Stellt alle nützlichen Funktionen ein, für {}die ein oder zwei Argumente erforderlich sind, und gibt eine leere numerische Liste zurück. Legt auch fest , dass nur Funktionen erstellt werden.


Riss

+←{⌈/⍋⍺⍵1/0}

⍺⍵1/0 repliziere 0 durch das linke Argument und das rechte Argument und 1

 erhalten Sie die Indizes, die das sortieren würden (da alle Elemente null sind, gibt es 0 1 2… (a + b)

⌈/ der Maximalwert (a + b)


ngn / apl beinhaltet die Möglichkeit, beliebiges JavaScript auszuführen. Ich halte eine solche Lösung nicht für gültig, da es dann eher um das Deaktivieren von JavaScript als von APL geht. Es gibt in der Tat eine gültige (wenn auch obskure) Methode zum Zurücksetzen, +bei der nur reine APL und keine schmutzigen Tricks verwendet werden.
Adám

3

Python 2 , geknackt

Dies ist die zweite Iteration einer Antwort, die von @HyperNuetrino mit einer Methode geknackt wurde, die ich nicht erwartet hatte. Ich habe es jetzt so gepatcht, dass hoffentlich die einzigen verbleibenden Lösungen die von mir beabsichtigten Einschränkungen einhalten müssen.

Implementiert die Addition als benannte Funktion

import sys
c="".join(open(__file__).read().split('\n')[4:])
if set(c)-set(' &)(,.:[]a`cdfijmonrt~')or"import"in c:sys.setrecursionlimit(1)
sys.modules['sys'],sys.modules['os']=None,None;del sys;f=lambda\

Probieren Sie es online!


Ich denke, ich könnte das tun, wenn ich eine hätte u, aber ich stecke ohne sie fest.
isaacg

@isaacg Nur aus Neugier, was würdest du damit machen u?
Weizen-Assistent

.count. Ich kann einen String so lang wie die gewünschte Ausgabe bekommen, aber ich habe keine Möglichkeit, seine Länge zu bestimmen.
isaacg

__import__('sys').setrecursionlimit(100)... und tatsächlich wurde nichts geflickt. Ich habe aber nicht wirklich Lust, es in den Thread des Räubers zu schreiben, ich habe Lust zu schummeln. Versuchen Sie es online
Value Ink


3

Java 8, Gebrochen von @ OlivierGrégoire

Hier ist mein Versuch. Die Idee ist, einfach alle Namespaces zu überladen, die Sie für die Ausgabe verwenden können (und zu reflektieren, hoffe ich). Die Ausgabe soll sdout (System.out).

class java {
    public static void main(String[]s){
       //there is no executable code in snippet one.
       //your code here.
    }
    class Class{}
    class Method{}
    class System{}
    class FileDescriptor{}
    class Logger{}
    class Runtime{}
    class Scanner{}
}

Blacklisting ist in der Regel ein schlechterer Ansatz als Whitelisting. Ich bin sicher, es ist nur eine Frage der Zeit, bis jemand einen Ansatz findet, über den ich nicht nachgedacht habe.


1
Dies ist keine ausführbare Klasse ...
Olivier Grégoire

1
@ OlivierGrégoire Sorry, das habe ich class String{}nach dem Testen hinzugefügt , ohne zu merken, dass es ausfallen würde main(String[] ...). Es sollte jetzt funktionieren
Lord Farquaad

1
Ja, das wird es tun, danke! :) Es ändert aber nichts an dem Riss, den ich machen werde: p
Olivier Grégoire

1
Geknackt! Ich habe diesen wirklich genossen :)
Olivier Grégoire

1
Ich habe mir so etwas angeschaut (es tut mir leid, dass es schwierig ist, Code in Kommentaren zu formatieren), aber ich denke, Ihre Lösung ist viel sauberer:int sum = 0; new Exception("" + sum) { public void printStackTrace() { ClassLoader cl = ClassLoader.getSystemClassLoader(); try { printStackTrace(new PrintStream((PrintStream)cl.loadClass("java.lang.System").getDeclaredField("out").get(null))); } catch (Exception e){} } }.printStackTrace();
Lord Farquaad,

3

cQuents, von Mayube geknackt

#|1,1:A

Das sollte ziemlich einfach sein, aber man weiß es nie.

Das "Problem" war, dass ohne Cin Ihrem Code, Sie einen Fehler bekommen haben.

Mayubes Lösung:

#|1,1:A+BC

Jedes Element in der Sequenz ist die erste Eingabe plus das zweite Mal die dritte (auch bekannt als 1).

Meine Lösungen:

#1,1:A+B,C

Die Sequenz wechselt zwischen dem ersten Eingang plus dem zweiten Eingang und dem dritten Eingang (1). Der erste Punkt im zweiten ist A+B.

#1,1:A+B+C-C

Ähnlich wie bei Mayubes Lösung - anstatt zu multiplizieren B*C, wird es einfach addiert Cund dann subtrahiert.

Probieren Sie es online!

Erläuterung

#|1,1      Append 1 and 1 to the end of the user's input
     :     Set mode to : (sequence 1: if given n, output nth term in sequence; if given no n, output whole sequence)
      A    Each item in the sequence equals the first input

Derzeit gibt dieses Programm aus 1, da ohne Benutzereingabe die erste Eingabe die erste 1in der Standardeingabe ( #) ist.


Die Dokumente scheinen wirklich peinlich formuliert zu sein, ich kann für mein ganzes Leben nicht herausfinden, was es bedeutet, wenn es heißtDefault input is combined with user input to form the total input, which must align with the expected input (which is based on the highest input requested by the Sequence Definition)
Skidsdev

@ Mayube es ist komisch, ich muss einen Weg finden, es richtig auszudrücken. Grundsätzlich kann Ihre Eingabe in das Programm der höchsten Eingabe entsprechen, die von Variablen A,B,C,D,Eim Code abgefragt wird . Wenn Sie beispielsweise die Variable zu einem beliebigen Zeitpunkt Din Ihrem Programm haben, erwartet der Parser 4 Eingaben, aber wenn es auch eine gibt E, erwartet der Parser, dass es 5 Eingaben gibt. Es kann nicht weniger als die erwartete Menge sein. Es gibt jedoch immer eine optionale letzte Eingabe, ndie von verschiedenen Modi auf unterschiedliche Weise verwendet wird.
Stephen

@Mayube Das Snippet, das ich oben gepostet habe, enthält ein A, also sucht es nach einem Eingang. Da es zwei gibt, von #denen beide die Standardeingabe angeben, wird der erste als AWert und der zweite als Wert verwendet n.
Stephen

Wenn ich also 2 Eingaben machen und anhängen würde BC, wäre A die erste Eingabe, B wäre die zweite, C wäre 1 und n wäre die zweite 1?
Skidsdev

@Mayube genau, sorry für meine beschissenen docs. TMI: Wenn der Anfang so aussähe #1,1(kein Balken), wäre dies: A als erste 1, B als zweite 1, C als erste Eingabe und n als zweite Eingabe. Sie können auch Folgendes tun #1|1: A ist die erste 1, B ist die erste Eingabe, C ist die zweite Eingabe und n ist die zweite 1.
Stephen

3

Node.JS Version 7.3.0 (geknackt von Dom Hastings)

var p=process,f;(_=>{var w=p.stdout.write,n='f'+(Math.random()*1e7|0),l=1
f=p.stdout.write=a=>eval(`(function ${n}(a){while(l&&((typeof a)[0]!='s'||'f'+a!=n));a=l?l="":a;w.apply(p.stdout,arguments);})`)(a)})();

Platzieren Sie den zweiten Codeblock nach dem ersten.

Haftungsausschluss: Der zweite Codeblock funktioniert nicht von alleine (ohne nach dem ersten platziert zu sein). Wenn dies jedoch nicht erlaubt ist, kann ich das zweite Snippet ändern.

Dies ist ein volles Programm. Ausgabe ist process.stdout(STDOUT), Eingabe ist process.argv(Befehlszeilenargumente)

Dies ist meine erste Polizei und Räuber, hoffentlich ist dies eine gute Herausforderung :)

Probieren Sie es online!


Die Herausforderung erklärt

Erzeugt eine Zufallsvariable nvon 0 bis 1e7. Wenn Sie schreiben mit der richtigen nennen n, druckt nicht alles , aber setzt lauf 0 , die die Schreibfunktion „entriegelt“, so dass Sie etwas drucken. Wenn Sie versuchen, write mit einer Nicht-Zeichenfolge aufzurufen, werden Sie in eine Endlosschleife versetzt. Wenn Sie versuchen, write mit etwas anderem als dem richtigen aufzurufen, nwährend write "gesperrt" ist, werden Sie in eine Endlosschleife geschickt, um das Erraten zu verhindern.

Die beabsichtigte Lösung

Schleicht an dem Typ vorbei, der anscheinend nur mithilfe eines Symbols nach Zeichenfolgen sucht, das ebenfalls mit s beginnt. Dies löst einen Fehler in der Funktion aus, der sich aus dem eval-Aufruf ergibt, da Sie die Zeichenfolge "f" nicht zu einem Symbol hinzufügen können. Wir fangen den Fehler ab und verwenden Regex, um nden Stack-Trace wiederherzustellen , der im Namen der Funktion enthalten ist. Dann versuchen wir zu schreiben, nwas nichts druckt, sondern setzen die Variable "lock" lauf 0, um die Schreibfunktion "freizugeben". Jetzt, da die Schreibfunktion freigeschaltet ist, geben wir nur die Summe aus.

try{f(Symbol())}catch(e){f(e.stack.match(/f(\d+)/)[1])
f(+p.argv[2]+ +p.argv[3]+"")}


Das ist genial ... ich war damals auf dem richtigen Weg! Danke für das Gehirntraining!
Dom Hastings

3

RProgN2 , Gebrochene von Arnold Palmer

"+-/*÷^"{²[[\=};

Schreibt über alle mathematischen Operatoren, ohne dass diese wiederhergestellt werden können. Insbesondere werden sie durch eine Funktion ersetzt, die die beiden obersten Elemente auf dem Stapel entfernt.

Probieren Sie es online!

Ursprüngliche Lösung

{S]‘[L}`d={0RL}`i=«x=y=x{xd`x=yi`y=x}:y»`+=

{S]‘[L}`d={0RL}`i=«x=y=x{xd`x=yi`y=x}:y»`+=
{     }`d=                                  #Define a function, "d", which returns n-1
 S                                          #Convert the input to a stack, which, as a number, makes a stack of 1 - n.
  ]‘                                        #Duplicate the stack, and pop the top value off it.
    [                                       #Discard the popped'd value.
     L                                      #Get the length of the stack, which now is n-1.
          {   }`i=                          #Define a function, "i", which returns n+1
           0R                               #Get the range of numbers between 0 and n.
             L                              #Get the length of that stack, which is n+1
                  «                    »`+= #Define a function, "+", which takes two numbers, and outputs their sum. We use «» here, because it localises references, instead of globalising them.
                   x=                       #Set the first input to the value of "x", which by default, is x.
                     y=                     #Ditto for y.
                       x{          x}:      #While x is truthy, which in this case, is non-zero.
                         xd                 #Get x - 1
                           `x=              #Set x to it.
                              yi`y=         #And set y to y + 1
                                      y     #Push y to the output. And we're done.

Probieren Sie es online!


Ich gehe Ihre Dokumentation durch und finde anscheinend nicht, was das ²Symbol bewirkt. Möchtest du mich aufklären?
Arnold Palmer

Diese Dokumentation ist für RProgN2 nicht besonders relevant, und dieses Symbol übernimmt [[in diesem Fall die nächsten beiden Konzepte und umhüllt sie mit einer Funktion @ArnoldPalmer
ATaco,


Mist, das ist viel besser. Ich wusste nichts über die Stack-Operatoren, was sicher praktisch gewesen wäre. Außerdem «»wäre es sehr hilfreich gewesen , lokale Variablen zu erstellen, anstatt globale zu vermasseln.
Arnold Palmer

3

Haskell, 161 144 Bytes, Cracked by BlackCap

{-#OPTIONS_GHC -fth -w#-}
module M where

Eingang zu STDIN, Ausgang zu STDERR. Fügen Sie am Ende des Programms hinzu.

Bearbeiten: Soll ohne zusätzliche GHC-Argumente kompiliert werden, nur die normale ghc --make prog.hs .

Erneut bearbeitet, um die Anzahl der Bytes zu verringern.

Habe Spaß!


Also kann ich das nicht machen, weil die Hauptfunktion nicht aufgerufen wird? main = do x <- readLn :: IO Integer; y <- readLn; print $ x + y
BlackCap

@BlackCap Nein, da GHC erwartet, dass sich die mainFunktion im Modul befindet, Mainwenn kein -main-isFlag bereitgestellt wird.
zbw

Dies funktioniert nicht, aber ich möchte die Idee trotzdem teilen
BlackCap

Ich werde das geknackt nennen. Hier war meine beabsichtigte Lösung, Golf zu spielen. Bei TIO funktioniert dies nicht, da der Wrapper die Eingabe nicht an den Compiler sendet.
ZBW

Wenn Sie Ihre Lösung posten, werde ich sie als geknackt markieren.
ZBW

3

Mascarpone , geknackt von Ilmari Karonen

[ Make 'i' and 'z' print 'q' ]$
v ['q.]v* 'i<^
v ['q.]v* 'z<^

[ Disable some standard commands ]$
v[]v*   '1<^
v[]v*   '$<^
v[]v*   '@<^
v[]v*   '{<^
v[]v*   '}<^
v[<:]v* '<<^
v[]v*   'v<^$

Die Eingabe erfolgt über Stdio-Kirchennummern, wobei ifür Inkrement und zfür Null verwendet wird. Zum Beispiel wäre 2 + 3:

iiziiiz

Mit einem nachgestellten Zeilenumbruch

sollte Output eine Zahl auf stdout sein, im selben Format wie auf stdio. Wenn die Antwort beispielsweise fünf ist, sollten Sie Folgendes ausgeben:

iiiiiz

(Mascarpone hat kein Konzept von Zahlen)


Beabsichtigte Lösung:

: '[/''/'i/'./' /':/',/'>/'!/']/* 'i<^
: '[/':/',/'>/'!/']/* 'z<^
: ,>!
'z.

Es ist nicht sofort aus der Dokumentation ersichtlich, aber wie @IlmariKaronen in seinem Riss feststellte, sind String-Literale in Mascarpone tatsächlich syntaktischer Zucker, um eine Folge von Zeichen zu verschieben.

Ich habe absichtlich Kommentare geschrieben [this]$, um es so aussehen zu lassen, als würde ich eine Schnur drücken und sie unmittelbar danach knallen lassen. Ein naiver Cracker hätte vielleicht versucht [:,>!]/*, eine Zeichenfolge zu verschieben, mit dem Interpreter zu tauschen und zu interpretieren.

Ich tue auch so, als würde ich den Interpreter, mit dem ich auf dem Stack belassen habe $, $in eine NOP umdefinieren. Sie haben diesen Interpreter auf dem Stack und müssen ihn durch das gesamte Programm mit sich führen. durch jedes Zeichen jeder Zeichenfolge.


Geknackt Und nein, ich hatte noch nie zuvor von Mascarpone gehört.
Ilmari Karonen

@IlmariKaronen Neue Lieblingssprache? Gut gemacht!
BlackCap

2

C # (.NET Core) Gebrochen von Ilmari Karonen

Auch von Joshua geknackt .

namespace System
{
    class Console
    {
        static void Main()
        {
            //Your code goes here
        }
    }
}

Liest die beiden Werte aus stdin und schreibt das Ergebnis in stdout. Getestet unter Windows mit Framework Version 3, 4.6 und TIO .

Hier ist das vollständige Programm, das ich beabsichtigt hatte.

namespace System
{
    class Console
    {
        static void Main()
        {
            var t = Reflection.Assembly.Load("mscorlib").GetType("System.Console");
            var r = t.GetMethod("ReadLine");
            int a = int.Parse((string)r.Invoke(null, null));
            int b = int.Parse((string)r.Invoke(null, null));
            var w = t.GetMethod("WriteLine", new[] { typeof(int) });
            w.Invoke(null, new object[] { a + b });
        }
    }
}

Probieren Sie es online!



codegolf.stackexchange.com/a/133412/14306 Ich gehe davon aus, dass dies nicht die beabsichtigte Lösung war.
Joshua

@IlmariKaronen: +1. Dies war die beabsichtigte Lösung.
Raznagul

@Joshua: +1 für die Suche nach einer anderen Lösung als ich beabsichtigt hatte.
Raznagul

2

GolfScript , geknackt von Dennis

{}' !$%&()*+,-./<=>?@[\]^`|~'':'*~;

Probieren Sie es online!

Dies ist schließlich eine Herausforderung. Warum also nicht GolfScript ausprobieren?

Eine gültige Lösung sollte ein Snippet sein, das zwei Ganzzahlen vom Stapel liest, sie addiert und das Ergebnis auf dem Stapel zurückgibt. Der Haken ist, dass es auch dann noch funktionieren sollte, wenn der obige Code fast alle integrierten GolfScript-Operatoren neu definiert hat , um absolut nichts zu tun. Zumindest bin ich ;unberührt geblieben, so dass Sie immer noch Werte vom Stapel werfen können. ;-) Dein Code sollte auf dem Standard GolfScript Interpreter funktionieren, wie er zB auf TIO implementiert ist (siehe Link oben).


Dennis 'Lösung basiert wie meine eigene auf der selten verwendeten Funktion von GolfScript, die interpolierten Ruby-Code in Strings in doppelten Anführungszeichen ermöglicht. Mit dieser Funktion definieren wir einen neuen Additionsoperator, der genau wie der eingebaute Operator funktioniert +, und rufen ihn dann auf.

(Ein Grund, warum die Ruby-Interpolationsfunktion in GolfScript so selten verwendet wird, ist, dass der interpolierte Ruby-Code während des Parsens umständlich ausgeführt und seine Ausgabe vom GolfScript-Interpreter zwischengespeichert wird. Wenn Sie also z. B. einen String mit interpoliertem Ruby-Code haben In einer Schleife wird der Code nur einmal ausgeführt, bevor das eigentliche Programm gestartet wird, und anschließend wird bei jeder Iteration der Schleife immer derselbe Wert zurückgegeben. Sie können dies umgehen , indem Sie mit string eval das Parsen verschieben, was die ohnehin unangenehme Syntax jedoch noch weiter verschärft hässlich und wortreich, und für diese Herausforderung habe ich auf jeden Fall den Operator eval deaktiviert .~ . Es stellt sich jedoch heraus, dass neue integrierte GolfScript-Operatoren definiert werden



Geknackt Endlich herausgefunden, was ich falsch gemacht habe.
Dennis

@ Tennis: Ja, du hast es dieses Mal geschafft. FWIW, meine beabsichtigte Lösung war "#{var'_','gpush a+b'.cc2}";_, die genau wie Ihre funktioniert, außer dass sie einige Bytes kürzer ist.
Ilmari Karonen

2

Node.js v8.2.0, geknackt von Dom Hastings

let mess = ctx => f => new Proxy (f, {
  has: (t, p) => p in t || p in ctx
, get: (t, p) => {
    let k = p in t? t[p]: ctx[p];

    if (k instanceof Function) return (
      function fetch (_k) {
        return mess (ctx) ( x => ( q => q instanceof Function
                                      ? fetch (q)
                                      : t (q)
                                  ) ( _k(x) )
                          )
      })(k);

    return k;
  }
});

with (mess (global) (x => x)) {
  dot   = f => a => b => f(a(b))
  ap    = f => g => x => f (x) (g (x))
  flip  = f => x => y => f (y) (x)
  Const = a => b => a
  id    = x => x
  num   = n => n (x => x + 1) (0)
  log   = console.log

  let x = flip (Const . id . id)
    , y = flip (Const . id . id . id)
  for (let i = 0; i < process.argv[2]; i++) x = ap (dot) (x)
  for (let i = 0; i < process.argv[3]; i++) y = ap (dot) (y)
  process.argv = [];

  logic = x => y => /* Your code here */;

  log . id . num ( logic (ap (dot) (x))
                         (f => z => (( y(flip (id) . id . flip (dot (id)) (f)) ) (Const (z))) (id) )
                 );
}

Sie müssen die logicFunktion implementieren . Die Eingabe ist das bereitgestellte Argument (von stdin), die Ausgabe ist das, was Ihre Funktion zurückgibt (wird nach stdout ausgegeben).


Meine Codekirche codiert die Zahlen aus der Eingabe. Der Rest des Codes ist nur dazu da, Sie einzuschüchtern.
Die Mess-Funktion macht einige Tricks, um eine punktfreie Notation ( a . b == dot (a) (b)) zu implementieren , die ich hauptsächlich verwende, um . id .zufälligen Stellen etwas hinzuzufügen , was nichts bewirkt, aber jemanden verwirrt, der nicht mit funktionaler Programmierung vertraut ist.
Die Transformation, die auf die Zahlen angewendet wird, bevor ich sie an die logicFunktion übergebe, ist x+1und y-1, was sich zu 0 addiert, also ist es ein weiterer NOP, der der Dunkelheit hinzugefügt werden muss.

Die beabsichtigte Lösung war:

logic = x => y => f => z => x (f) (y (f) (z))


@DomHastings Das ist nicht die beabsichtigte Lösung, aber ich werde sagen, dass Sie das können, solange das Programm ohne Ausnahme anhält und keine zusätzlichen Zeichen zur Ausgabe
druckt

Ich habe gerade eine Alternative gepostet! (Sie können meine vorherige Lösung in der Geschichte dieser Antwort sehen!)
Dom Hastings

Oh wow, ich war ein Ausweg ... Trotzdem ist das besser als mein erster sehr betrügerischer Versuch! Danke für das Rätsel!
Dom Hastings

2

Informiere 7 , geknackt von ppperry

For reading a command: rule fails.

[Your code here.]

Die Eingabe sollte vom Player als interaktiver Befehl eingegeben werden, z . B. add 17 to 25oder sum 17 25. Sie können die genaue Form des Befehls auswählen, der eingegeben werden soll, sofern er zwei Zahlen enthält. Die Summe der Zahlen (z. B. 42) sollte als Antwort auf den Befehl gedruckt werden.

Die Herausforderung besteht natürlich darin, dass die gesamte Aktivität "Lesen eines Befehls" durch ein No-Op ersetzt wird. Es gibt wahrscheinlich mehrere Möglichkeiten, um dieses Problem zu lösen, aber es sollte zumindest eine gewisse Kenntnis der Sprache erfordern. Der, den ich mir ausgedacht habe, ist eigentlich ganz einfach, wenn auch ein bisschen unerwartet.

Ich habe meine Lösung in der GNOME Inform 7-IDE, Version 6L38 , unter Ubuntu Linux getestet . Die beabsichtigte Lösung funktioniert sowohl auf dem Glulx- als auch auf dem Z-Computer-Back-End und sollte auch auf anderen neueren Versionen von Inform 7 funktionieren. Beachten Sie, dass (ohne eine geeignete Umgehung) der obige Code den Interpreter zu einer Besetztschleife veranlasst, wenn er versucht, einen Befehl zu lesen. Der Z-Machine-Interpreter reagiert in diesem Fall nicht mehr und kann in der IDE nicht mehr gestoppt werden. Ich empfehle daher, zum Testen Glulx zu verwenden.


geknackt , und für den Fall, dass Sie sich wundern, ich hatte noch nie von dieser Herausforderung gehört
pppery

2

CPython 3 (wieder), geknackt von Sisyphus

import sys,os,functools
def p(f,e,a,_=os._exit):
 if e == "c_call":_(1)
sys.setprofile(p)

Sie können alles tun, was Sie wollen - solange es nicht in C implementiert ist. Das heißt, nein print, nein input- alle treffen die _(1)Leitung und enden. Eingabe von STDIN mit den Zahlen in zwei separaten Zeilen, Ausgabe an STDOUT. Ich frage mich, wie lange das wohl dauern wird ... Ich habe eine ganze Weile gebraucht, um das zweite funktionierende Snippet zu finden, nachdem ich mir diesen Deaktivierungstrick ausgedacht habe. Explizite Angabe von Cpython, um Cracks zu vermeiden, sofern keine alternative Implementierung von sys.setprofile vorliegt.


Geknackt Ich habe keine Ahnung, warum das funktioniert.
Sisyphus

Ich schätze, ich kann jetzt fragen: warum functools?
Dennis

@ Tennis Da Sispyphus eine Lücke entdeckt, nicht die beabsichtigte Lösung
pppery

@ Sisyphus Ihr Riss wurde als Fehler in Python
Pppery

2

Java 8 ( Gebrochen )

Zweiter Versuch. Dieses Mal habe ich zwei Minuten lang getestet.

static {

    try {

        System.setIn(null);
        System.setOut(null);
        System.setErr(null);

        for (Method m : System.class.getMethods()) {

            m.setAccessible(false);

        }

        System.class.getMethod("getSecurityManager", new Class[0]).setAccessible(false);

        for (Method m : Class.class.getMethods()) {

            m.setAccessible(false);

        }

        SecurityManager mngr = new SecurityManager() {

            @Override
            public void checkPermission(Permission p) {

                if (p.getName().equals("createSecurityManager")) throw new SecurityException();
                if (p.getActions().startsWith("read")) throw new SecurityException();

            }

        };

        System.setSecurityManager(mngr);

        // Your code goes here.

    } catch (Throwable t) {

    }

}

Die meisten Dinge shouuuld abgedeckt werden.


1
Würden Sie dies bitte einer Klasse mit entsprechenden Importen beifügen? Es ist die Art von Herausforderung, bei der diese kleinen Änderungen einen Eintrag machen oder brechen können. Ich habe verschiedene Lösungen für diese, wie sie sind, aber das reduziert sich drastisch, wenn Sie dies einfach in eine Klasse / Schnittstelle einschließen. Auch das Formatieren, um alle diese Zeilen zu entfernen, wäre für uns, Leser, sehr hilfreich.
Olivier Grégoire

Dort eine geknackte Antwort mit genau deinem Code. Und eine +1, weil ich es anscheinend vergessen habe. Es tut uns leid.
Olivier Grégoire

Die #setAccessible (false) -Aufrufe bewirken nichts.
Nevay

1

Python 2 geknackt

import sys,hashlib
c=open(__file__).read().split()[-1]
if c!='#'and hashlib.sha256(c).hexdigest()!='e6400dd63733d10ec042e3c28033cfa85e1d25fbef80020810c354d7c942e843':sys.exit() #

Probieren Sie es online!

Ich werde dies vorwegnehmen, indem ich sage, dass diese Antwort ein Ruck ist, der als Antwort auf die untere Grenze gedacht ist.


Inspiriert von den Antworten von Wheat Wizard und HyperNeutrino .

Das Snippet liest die Quelldatei und weigert sich, fortzufahren, wenn der letzte durch Leerzeichen getrennte Codeabschnitt nicht in diese Datei eingefügt wird e6400dd63733d10ec042e3c28033cfa85e1d25fbef80020810c354d7c942e843.

BEARBEITEN : Leicht bearbeitet als Reaktion auf diesen Kommentar . Das Kernproblem ändert sich nicht, jeder Rissversuch wird nicht für ungültig erklärt.


1
RE das erste Snippet:This code is not allowed to crash or exit.
Stephen

Dies ist ungültig, da es beendet wird, was für das erste Snippet nicht zulässig ist.
DJMcMayhem


1

Java 8 Gebrochen von @ OlivierGrégoire

Ich habe versucht, es so schwer wie möglich zu machen! :) Und anders als bei der bisherigen Java-Antwort müssen Sie die genauen Regeln der Challenge befolgen, indem Sie sie nach diesem gesamten Snippet platzieren (also nein, Sie geben Ihren Code nicht in die public static void main(String[] args)Methode ein, sondern Sie geben ihn ein nach dem ganzen unterricht :) Viel glück!

Ich habe Kommentare hinzugefügt, um zu zeigen, was eingeschränkt wird.
( Inspiriert von diesem Beitrag, der weniger restriktiv und selig mit dem gleichen Ansatz ist, den ich für meine Antwort verwenden könnte. )

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileDescriptor;
import java.io.FilePermission;
import java.io.PrintStream;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class Main {

  // Put everything in a static block so it is run before the static main method 
  // and any trailing (static) initializer-blocks:
  static {
    try {
      initializing();
    } catch (final Exception e) {
    }
  }

  static void initializing() throws Exception {
    // Overwrite System.out, System.err and System.in:
    System.setOut(new PrintStream(new ByteArrayOutputStream()));
    System.setErr(new PrintStream(new ByteArrayOutputStream()));
    System.setIn(new ByteArrayInputStream(new byte[0]));

    // Enable reflection for System.out, System.err and System.in:
    final Field modifiersField = Field.class.getDeclaredField("modifiers");
    modifiersField.setAccessible(true);
    final Class<?> fdClass = java.io.FileDescriptor.class;
    final Field outField = fdClass.getDeclaredField("out");
    outField.setAccessible(true);
    modifiersField.setInt(outField, outField.getModifiers() & ~Modifier.FINAL);
    final Field errField = fdClass.getDeclaredField("err");
    errField.setAccessible(true);
    modifiersField.setInt(errField, errField.getModifiers() & ~Modifier.FINAL);
    final Field inField = fdClass.getDeclaredField("in");
    inField.setAccessible(true);
    modifiersField.setInt(inField, inField.getModifiers() & ~Modifier.FINAL);

    // Replace existing System.out FileDescriptor with a new (useless) one:
    outField.set(null, new FileDescriptor());
    // Replace existing System.err FileDescriptor with a new (useless) one:
    errField.set(null, new FileDescriptor());
    // Replace existing System.in FileDescriptor with a new (useless) one:
    inField.set(null, new FileDescriptor());

    // Disable reflection for System.out, System.err, System.in again:
    modifiersField.setInt(outField, outField.getModifiers() & ~Modifier.FINAL);
    modifiersField.setInt(errField, errField.getModifiers() & ~Modifier.FINAL);
    modifiersField.setInt(inField, inField.getModifiers() & ~Modifier.FINAL);
    inField.setAccessible(false);
    errField.setAccessible(false);
    outField.setAccessible(false);
    modifiersField.setAccessible(false);

    // Overwrite the SecurityManager:
    System.setSecurityManager(new SecurityManager() {

      private boolean exitAllowed = false;

      @Override
      public void checkExec(final String cmd) {
        throw new SecurityException();
      }

      @Override
      public void checkPermission(final java.security.Permission perm) {
        final String name = perm.getName();
        // You're not allowed to read/write files:
        if (name.equals("setIO") || name.equals("writeFileDescriptor")
            || name.equals("readFileDescriptor")
            || ((perm instanceof FilePermission) && name.startsWith("/proc/self/fd/"))) {
          throw new SecurityException();
        }
        // You're not allowed to overwrite the Security settings:
        if (name.equals("setSecurityManager") || name.equals("suppressAccessChecks")) {
          throw new SecurityException();
        }
        // You're not allowed to use reflection anymore:
        if (name.equals("getModifiers") || name.equals("get") || name.equals("set")
            || name.equals("setBoolean") || name.equals("setByte")
            || name.equals("setChar") || name.equals("setShort") || name.equals("setInt")
            || name.equals("setLong") || name.equals("setFloat") || name.equals("setDouble")
            || name.equals("setFieldAccessor") || name.equals("setFieldAccessor")) {
          throw new SecurityException();
        }
        // When you try to leave the current VM it will stop the program:
        if (name.startsWith("exitVM") && !this.exitAllowed) {
          this.exitAllowed = true;
          System.exit(0);
        }

        // You know what, nothing is allowed!
        throw new SecurityException("Mhuahahahaha!");
      }
    });
  }

  public static void main(String[] args) {
    // Overwritting all given arguments:
    args = new String[0];

    // Exit the program before you can do anything!
    System.exit(0);
  }
}

// Your code goes below:

Probieren Sie es hier aus. (ideone.com anstelle von TIO, da es dort nicht zu funktionieren scheint. Die Tests wurden in der Eclipse-IDE durchgeführt, aber meine vorgesehene Lösung funktioniert, wenn Sie ideone.com verwenden.)



1

Jelly: Geknackt

Dies wird im Vergleich zu Wheat Wizard's fantastischer Python-Antwort wahnsinnig einfach sein, aber jetzt geht es los: P

“for c in code_page:
 if c in atoms:atoms[c].call=None”ŒVø<insert code snippet here>

Das sha256-Hexdigest meiner Workaround-Lösung, einschließlich des ersten Snippets, ist cfeb1e193ad77f66f039c0d6a792a3e4c311490f6412698e019ca1fae10c0e0a.

Hinweis

Der Code enthält möglicherweise keine Zeilenumbrüche, außer für Zeichenfolgen. Andernfalls wird dieser Code nicht einmal ausgeführt, was den Zweck dieser Herausforderung zunichte macht.

Von DJMcMayhem geknackt

Um fair zu sein, wird ein Zeilenvorschub verwendet. Daher würde ich gerne eine Lösung sehen, bei der kein Zeilenvorschub verwendet wird.

Auch eine Lösung von Jonathan Allan

Hier wird kein Zeilenumbruch verwendet, daher wurden Risse festgestellt. : P

Meine Lösung lautet:

“for c in code_page:
 if c in atoms:atoms[c].call=None”ŒVø“print(int(input())+int(input()))”ŒV

Das erste Snippet löscht nur einzelne Zeichenatome, was bedeutet, dass Python eval immer noch funktioniert :)))


Das zweite Snippet wird immer an das Ende des ersten Snippets angehängt.
Stephen

@StepHen Nur spezifizieren: P Aber ich habe vergessen, die Notiz hinzuzufügen; Das ist wirklich wichtig.
HyperNeutrino

3
Ich glaube nicht, dass Sie die Räuber so einschränken können. Wenn Sie es mit Newlines knacken können, ist das ein gültiger Riss. Gibt es eine Möglichkeit, das Hinzufügen von Newlines zu verhindern oder die Ausführung der ersten Zeile zu erzwingen?
DJMcMayhem


1
Ich mag deinen beabsichtigten Riss. Sehr hinterhältig.
Dennis

1

JavaScript, geknackt

Eingabe: prompt()zweimal

Ausgabe: console.log()

Meine Lösung funktioniert nicht in jsfiddle. Funktioniert auf der Seite about: blank mit der JS-Konsole von Google Chrome.

prompt=console=0

Meine Lösung:

x=document.createElement("iframe")
x.src="data:text/html,<script>console.log(prompt()-0+(prompt()-0))</script>"
document.body.appendChild(x)

Erläuterung:

Ich habe prompt und console entfernt, indem ich sie auf 0 gesetzt habe.

In meiner Lösung erstelle ich einen Iframe, der eine Sandbox erstellt, und eine neue Instanz eines Fensters, in dem Eingabeaufforderung und Konsole ordnungsgemäß funktionieren.



@CRDrost Ich glaube nicht, dass es in der Spezifikation Primalitätstests gibt, und Sie zeigen nicht beide Ausschnitte.
Stephen

Entschuldigung, Sie haben Recht, ich habe falsch gelesen.
CR Drost

1

Java, geknackt

import java.lang.reflect.*;
public class Main{
  public static void main(String... args){
    System.setOut(null);
    System.setErr(null);
    /*Your code here*/
  }
}

Dies sollte sehr leicht zu knacken sein.

Beabsichtigte Lösung

import java.lang.reflect.*;
public class Main{
public static void main(String... args){
  System.setOut(null);
  System.setErr(null);
  try{
    Class<?> cistream = Class.forName("java.io.InputStream");
    Class<?> cfostream = Class.forName("java.io.FileOutputStream");
    Class<?> costream = Class.forName("java.io.OutputStream");
    Class<?> cfdescriptor = Class.forName("java.io.FileDescriptor");
    Object sout = cfostream.getConstructor(cfdescriptor).newInstance(cfdescriptor.getField("out").get(null));
    Class<?> csys = Class.forName("java.lang.System");
    Field mod = Field.class.getDeclaredField("modifiers");
    mod.setAccessible(true);
    Field stdout = csys.getField("out");
    mod.set(stdout,Integer.class.cast(mod.get(stdout) )&~ Modifier.FINAL);
    stdout.set(null,Class.forName("java.io.PrintStream").getConstructor(costream).newInstance(sout));
    Class<?> cscanner = Class.forName("java.util.Scanner");
    Object scanner = cscanner.getConstructor(cistream).newInstance(System.in);
    Method nextInt = cscanner.getMethod("nextInt");
    int f = Integer.class.cast(nextInt.invoke(scanner));
    int s = Integer.class.cast(nextInt.invoke(scanner));
    int sum = s + f;
    System.out.println(sum);
  }catch(Throwable t){t.printStackTrace();}
  }
}

Probieren Sie es online aus



Ich habe völlig vergessen java.io.. Aber Sie haben die beabsichtigte Lösung trotzdem ..
Roman Gräf

Ich sehe hier kein Problem. Ich habe das zweite Snipet geschrieben, habe aber vergessen, es zu bearbeiten. Laut TIO kompiliert der erste Snipppet ohne Vorwarnung.
Roman Gräf

@ OlivierGrégoire Fertig. Ich denke, jede IDE wird mich dafür anschreien, aber ich zumindest der Compiler akzeptiert es ...
Roman Gräf
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.