Versuchen Sie, Code in Ihrer Sprache zu schreiben, der unseren Kriterien als Programmiersprache nicht mehr entspricht.
Eine Sprache erfüllt unsere Kriterien (vereinfachte Version für diese Herausforderung), eine Programmiersprache zu sein, wenn:
- Es kann Benutzereingaben lesen, die Tupel positiver Ganzzahlen darstellen.
- Es können je nach Eingabe mindestens zwei verschiedene mögliche Ergebnisse ausgegeben werden.
- Es können zwei positive ganze Zahlen verwendet und addiert werden (und das Ergebnis kann die Ausgabe beeinflussen).
- Es kann eine positive ganze Zahl annehmen und entscheiden, ob es eine Primzahl ist (und das Ergebnis kann die Ausgabe beeinflussen).
- Für diese Herausforderung wird jede Art von Ausgabe ignoriert , die keine zulässige Ausgabemethode für eine normale Herausforderung ist. Es spielt also keine Rolle, ob das Programm auch ein Musikstück abspielen oder über HTTP posten kann.
- Update: Sie können auch eine oder mehrere der zulässigen Ausgabemethoden auswählen und alle anderen ignorieren. In den folgenden Kriterien müssen Sie jedoch überall dieselbe Definition verwenden. Und wenn Ihr Programm mehr als eine Ausgabemethode deaktivieren kann, ist dies mehr Gegenstimmen wert.
Beispiele dafür sind, dass es nicht in der Lage ist, alle Schleifenkonstrukte auszugeben, oder dass es nicht in der Lage ist, Primalitätstests durchzuführen und sicherzustellen, dass der Benutzer sie nicht wieder aktivieren kann.
Sie sollten einen Platz zum Einfügen von neuem Code lassen. Standardmäßig befindet es sich am Ende Ihres Codes. Wenn wir in Betracht ziehen , den Quellcode an dieser Stelle in Ihrer Antwort abzulegen und den vollständigen Code als vollständiges Programm auszuführen, sollte der Interpreter einer neuen Sprache die Kriterien nicht erfüllen.
Aber der eingegebene Code muss in einer solchen Art und Weise ausgeführt werden , wie eine Sprache , die Kriterien erfüllen:
- Der eingefügte Code muss grammatikalisch mit etwas identisch sein (sagen wir, es ist ein Codeblock in den folgenden Kriterien), das im Allgemeinen die Kriterien erfüllt, aus der Perspektive derjenigen, die einen Syntax-Textmarker schreiben möchten. Es kann also nicht in einer Zeichenfolge, einem Kommentar usw. sein.
- Der eingefügte Code muss tatsächlich so ausgeführt werden, dass er die Kriterien erfüllen soll. Es kann also nicht in einer nicht verwendeten Funktion oder
sizeof
in C sein, Sie können nicht nur einen nicht funktionalen Teil im Code ausführen und Sie können ihn nicht nach einer Endlosschleife usw. setzen. - Sie können die Anzahl möglicher grammatikalisch korrekter Programme, die auf diese Weise generiert werden, nicht begrenzen. Wenn es in der von Ihnen verwendeten Sprache bereits so etwas wie ein Längenlimit gibt, sollte es die Kriterien nicht erfüllen, auch wenn dieses Limit entfernt wird.
- Sie können den Inhalt der Eingabe / Ausgabe nicht ändern oder "verbrauchen", aber Sie können verhindern, dass auf sie zugegriffen wird.
- Diese Kriterien gelten normalerweise nur für Sprachen ohne explizite E / A:
- Ihr Code sollte die Benutzereingabe (die Informationen beliebiger Länge enthält) an den eingefügten Code umleiten, wenn ein Codeblock die Benutzereingabe normalerweise nicht direkt / explizit in der von Ihnen verwendeten Sprache abrufen kann.
- Ihr Code sollte den zurückgegebenen Wert des eingefügten Codes ausgeben, wenn ein Codeblock normalerweise nicht in der Lage ist, Dinge direkt / explizit in der von Ihnen verwendeten Sprache auszugeben.
- Wenn Sie den zurückgegebenen Wert drucken und er in der von Ihnen verwendeten Sprache eingegeben ist, sollte der zurückgegebene Typ 2 verschiedene, praktisch mögliche Werte haben können. Beispielsweise können Sie den Typ
struct {}
oderstruct {private:int x;}
in C ++ nicht verwenden .
Dies ist ein Beliebtheitswettbewerb. Die Antwort mit der höchsten gültigen Bewertung (damit niemand einen Fehler entdeckt oder alle Fehler behoben werden) gewinnt.
Klarstellungen
- Sie sollten den Code nicht in der Textform ändern, sondern können die Syntax ändern, bevor der Code interpretiert oder kompiliert wird.
- Sie können andere Dinge tun, während der Code ausgeführt wird. Der Grund dafür, dass es die Kriterien nicht erfüllt, sollte im eingefügten Code selbst liegen. Es kann an der Störung eines anderen Threads liegen, aber nicht nur von einem anderen Thread getötet werden.
- Alle Spezifikationen bedeuten im Grunde genommen, dass es grammatikalisch wahrscheinlich ist, dass sie die Kriterien erfüllen, wenn nicht alle eingebauten Funktionen geändert wurden, dies jedoch nicht tatsächlich tun. Es ist in Ordnung, wenn Sie nicht-grammatikalische Problemumgehungen finden, z. B. die korrekte Übergabe der Parameter an den Codeblock, aber dafür sorgen, dass sie nicht in irgendeiner Weise verwendet werden können.
- Auch hier muss der eingefügte Code tatsächlich ausgeführt werden. Code nach einer Endlosschleife oder einem Absturz wird als "nicht tatsächlich ausgeführt" betrachtet und ist daher nicht gültig . Diese Antworten mögen interessant sein, aber es gibt bereits einige andere Endlosschleifen- oder Absturzfragen auf dieser Website, und Sie finden möglicherweise eine passendere Antwort. Wenn nicht, stellen Sie eine neue Frage. Beispiele für diese Fragen sind:
Bestenliste
var QUESTION_ID=61115/*,OVERRIDE_USER=8478*/;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,/*getComments()*/(more_answers?getAnswers():process())}})}/*function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}*/function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),score:s.score,language:a[1],lang:jQuery('<div>').html(a[1]).text(),link:s.share_link})}),e.sort(function(e,s){var r=e.score,a=s.score;return a-r});var s={},r=1,a=null,n=1;e.forEach(function(e){e.score!=a&&(n=r),a=e.score,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",e.n=n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.score).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text())/*,s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}*/});var t=e/*[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o])*/;t.sort(function(e,s){return (e.lang.toUpperCase()>s.lang.toUpperCase())-(e.lang.toUpperCase()<s.lang.toUpperCase())||(e.lang>s.lang)-(e.lang<s.lang)});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{PLACE}}",o.n).replace("{{LANGUAGE}}",o.language).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.score).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<(?:h\d|(?!.*<h\d>)p)>\s*((?:[^,;(\s]| +[^-,;(\s])+)(?=(?: *(?:[,;(]| -).*?)?\s*<\/(h\d|p)>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;float:left}table{width:250px}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="https://cdn.sstatic.net/Sites/codegolf/all.css?v=7509797c03ea"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Score</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Sorted by Language</h2> <table class="language-list"> <thead> <tr><td></td><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{PLACE}}</td><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
quelle
Antworten:
JavaScript-Shell
Dadurch wird die Sprache vollständig unbrauchbar.
Ist es nicht schön, wie JavaScript eine so schöne Funktion hat, um sich selbst zu zerstören?
Das ist ganz einfach, die
clear
Funktion leert ein Objekt komplett.this
bezieht sich auf das globale Objekt, das alles löscht, einschließlich Konstruktoren und Funktionen.Da dies löscht alles , tut alles , auch eine wörtliche definieren , wirft einen Fehler, so dass die Sprache völlig nutzlos: * REPL Umgebung nicht erforderlich. Verwendet die SpiderMonkey- Engine (Shell nicht Browser), die ursprüngliche JS-Engine.
quelle
clear
Funktion scheint eine SpiderMonkey-Shell-spezifische Ergänzung zu sein, keine generische JavaScript-Sache. Es erscheint sicherlich nicht in der ES5-Spezifikation § Funktionseigenschaften des globalen Objekts . Ich habe das mit probiertnode
und habe einen "ReferenceError: clear is not defined" bekommen. In der Chrome- und Firefox-Konsoleclear
löscht die Funktion nur die Konsole, unabhängig davon, welche Argumente übergeben werden. Oder entspricht das von Ihnen verwendete Tool möglicherweise einer älteren ECMAScript-Version als 5.1?Emmental
Ich weiß, das ist kein Code-Golf, aber das richtige Werkzeug für den Job, weißt du ...
Der Benutzercode kann nach dem eingefügt werden
!
.Emmental ist ein interessanter Esolang, der auf dem Umschreiben des Interpreten basiert . Jedes einzelne Symbol (auch die eingebauten) kann als beliebiges Emmentaler Programm neu definiert werden. Die Sprache stützt sich so sehr auf diese Funktion, dass sie keine Schleifenkonstrukte bietet. Stattdessen definieren Sie rekursive Befehle, die in eigenen Definitionen angezeigt werden.
Diese Neudefinition erfolgt über
!
, der ein Zeichen aus dem Stapel liest und dann eine Zeichenfolge aus dem Stapel liest, bis er auf a trifft;
. Das Zeichen wird dann neu definiert, um das durch diese Zeichenfolge dargestellte Programm zu bezeichnen.Das heißt, wir können die Looping-Funktionen von Emmental deaktivieren, indem wir uns
!
selbst als leeres Programm definieren. Während alle anderen Emmentaler noch einwandfrei funktionieren und viele der Kriterien einer Programmiersprache noch erfüllt sind, ist es unmöglich, weitere Symbole neu zu definieren. Ohne diese Funktion (und damit ohne Schleife) kann Emmental nicht mehr testen, ob eine Zahl eine Primzahl ist.quelle
PHP
Man kann PHP komplett beenden, indem man das Speicherlimit auf 1 setzt.
Es wird komplett sterben.
Versuche dies:
Dies sollte nicht einmal einen Fehler auslösen, da dafür nicht genügend Speicher vorhanden ist.
Sie können mehr über die Richtlinie lesen
memory_limit
Wenn der vorherige ungültig ist, kann man Ausgabepuffer verwenden:
Dadurch werden alle Ausgaben vollständig entfernt. Da der Ausgabepuffer noch offen ist, werden einige andere Dinge, die versehentlich nach dem Code übrig bleiben, nicht angezeigt.
Mit @fschmenglers Idee:
Dies vermeidet das Problem des Löschens des automatisch gestarteten Ausgabepuffers, der zum Auffangen der zu komprimierenden Ausgabe verwendet wird.
Dies verhindert auch, dass der Ausgabepuffer gelöscht oder geleert (an den Browser gesendet) wird. Um dies erneut zu erzwingen, wird ein Ausgabehandler hinzugefügt, der immer eine leere Zeichenfolge zurückgibt.
Laufen
ob_end_flush(); echo "Hello, world!";
erzeugt nichts, sondern sendet die Ausgabe mit einer Ebeneob_start();
.Vielen Dank an @LucasTrzesniewski für die Veröffentlichung dieses Problems!
quelle
while(ob_get_level()) ob_end_flush();
häufig in Frameworks verwendet, um alle Ausgabepuffer zu leeren, die möglicherweise versehentlich offen gelassen wurden.ob_end_flush(); echo "Hello, world!";
This shouldn't even throw any error, since there isn't enough memory for that.
LOL'ed at that :)x86-Maschinencode im Real-Modus (=> fast jedes DOS-Programm)
dh
Ich hoffe, du warst nicht zu sehr an deinem Interrupt-Tisch hängen.
quelle
cli
, und ich dann die Interrupt-Tabelle behebe und dann einige Primzahlen usw. berechne?cli
(inp
und dasoutp
nur aus gutem Grund), aber ich weiß nicht, ob das zulässig wäre nach den Regelnclear(this);
, Speicherlimit in PHP, Rekursion) Limit in Python, die Sandbox-Umgebung in Python und viele andere), würde ich dies nicht als Problem sehen.Java
Edit: Gegenmaßnahmen machen diesen Riesen :(
Leitet stdin und stdout zu Null-Streams um und ersetzt args durch ein leeres Array. Verwendet auch enorme Mengen an Reflection-Hacks, um sicherzustellen, dass das Standard-E / A wirklich verborgen ist. Schließlich wird ein Sicherheitsmanager festgelegt, der sicherstellt, dass die Standard-E / A nicht neu erstellt werden kann und dass Programme den Beendigungscode nicht festlegen können.
quelle
Lua
In Lua
_ENV
ist die Umgebung, in der alle globalen Variablen, Funktionen, Tabellen usw. gespeichert sind. Wenn Sie festlegen, dass es sich nur um eine leere Zeichenfolge handelt, können Sie nichts Neues definieren und alle Funktionen und Variablen werden gelöscht. Dies bedeutet, dass Sie nichts ausgeben, Eingaben übernehmen oder so ziemlich alles tun können.quelle
_ENV=5
zu arbeiten? Wenn ja, ist es ein Zeichen kürzer.Shakespeare-Programmiersprache
In SPL folgt der eingebaute Parser, der mit dem Programm heruntergeladen wird, sehr spezifischen Regeln, was im Skript passieren kann. Eine dieser Regeln ist, dass nur zwei Charaktere gleichzeitig auf der Bühne stehen dürfen. Wenn ein Charakter die Bühne verlässt, der noch nie auf der Bühne war, wird dies ebenfalls verwirrend sein. Das gleiche gilt für das Hinzufügen eines Charakters zur Bühne, der sich bereits auf der Bühne befindet. Wenn der Parser eine Fehlermeldung erhält, weigert er sich, etwas anderes zu tun. Sie müssen das Programm und den Parser buchstäblich komplett herunterfahren und dann alles neu starten.
PS Wenn Sie keine Ahnung haben, wie diese Sprache funktioniert, Google es. Es ist toll.
quelle
Smalltalk
Ich bin nicht sicher, ob dies qualifiziert ist:
Dadurch wird die gesamte Laufzeitumgebung gelöscht und die Objekt-Engine aufgehängt. Die einzige Möglichkeit, dies zu beheben, besteht darin, den Prozess gewaltsam zu beenden und von der Sicherung aus neu zu starten.
Für diejenigen, die es nicht wissen, ist die Funktionsweise von [Visual Works] Smalltalk etwas seltsam. Es ist wie ein Mini-OS. Wenn Sie Smalltalk starten, laden Sie ein "Speicherabbild" in den Arbeitsspeicher und es wird dort ausgeführt, wo es aufgehört hat. Die gesamte Smalltalk-IDE ist in Smalltalk geschrieben und kann dynamisch geändert werden.
Insbesondere
Smalltalk
ist ein Wörterbuch mit allen globalen Variablen. Insbesondere wird jedes Mal, wenn Sie eine neue Klasse deklarieren, eine globale Variable mit diesem Namen erstellt, die auf dasClass
Objekt für Ihre neue Klasse verweist . So EinstellungSmalltalk
zuNil
(im Wesentlichen null) löscht alle Klassen in der gesamten Anlage. Sogar die GUI-Event-Handler sind patzig.Ich habe keine Ahnung, warum diese Variable überhaupt beschreibbar ist. Wahrscheinlich, weil es eine globale Variable ist und daher als ein Eintrag in sich selbst existiert. (Tut dein Kopf schon weh? Habe ich erwähnt, dass jedes Objekt eine Klasse hat und Klassen Objekte sind, also hat jede Klasse eine Klasse? Die Klasse einer Klasse heißt Metaklasse, aber eine Metaklasse ist auch ein Objekt, das hat also eine Klasse...)
Sie könnten wahrscheinlich einen ähnlichen Effekt durch erzielen Clearing das Wörterbuch nicht ersetzt sie durch null. In der Tat gibt es eine Reihe von Dingen, die Sie codieren können, um alle Klassen im System zu löschen, sodass Sie nichts mehr tun können. Aber da der eigentliche Smalltalk-Compiler auch eine Klasse ist ... alles, was die Sprache bricht, bricht auch irgendwie die gesamte IDE, also ...
quelle
nil
stattNil
in Pharo verwenden.true become: false
, aber ich denke, dass dies in neueren Versionen der Sprache nicht funktioniert. Sie könnten SmallTalk / V 286 auf diese Weise töten.Haskell
Hier gibt es einige Möglichkeiten.
Langweilige Idee Nr. 1: Definieren
main
Sie, nichts zu tun. Egal welchen anderen Code Sie schreiben, er kann niemals ausgeführt werden. (Es sei denn, Sie führen es manuell von der REPL aus.)Langweilige Idee Nr. 2: Definieren Sie ein Modul ohne öffentliche Exporte. Egal welchen anderen Code Sie schreiben, er kann niemals ausgeführt werden.
Interessante Idee: Alle Importe deaktivieren.
Jetzt können Sie Funktionen definieren , die sind sichtbar und können ausgeführt werden ... aber sie können nichts tun. Alle Standard-Haskell-Typen und -Funktionen sind jetzt ausgeblendet. (Mit Ausnahme einiger Dinge, die wirklich fest mit der Sprache verbunden sind.)
Insbesondere können Sie keine E / A-Vorgänge ausführen. Sie können auch nicht maschinengenau rechnen. (Da
Int
,Double
etc sind jetzt undefiniert.)Sie können immer noch Lambda-Berechnungsfunktionen schreiben, die jedoch einige echte Berechnungen durchführen. Sie können einfach keine Daten in oder aus der Sache bekommen. Sie können aber natürlich auch ein anderes, separates Modul schreiben, das das
Fubar
obige Modul aufruft und in seinem Namen E / A-Vorgänge ausführt (um zu beweisen, dass der Code ausgeführt wird und bestimmte Aufgaben ausführt).Einige Feinheiten:
Die Dummy-
foo = foo
Deklaration wird benötigt, um zu verhindern, dass weitere Importe hinzugefügt werden. (Importe können nicht nach Deklarationen angezeigt werden.)Es gibt verschiedene nicht standardmäßige Haskell-Spracherweiterungen, mit denen Sie diese Situation überwinden können. Spracherweiterungen müssen jedoch mit einem Compiler-Pragma oben in der Datei aktiviert werden. (Oder mit einer Befehlszeilenoption zum Compiler. Ich kann das nicht wirklich verhindern!)
quelle
foobar
, die von Ihnen verwendete Schreibweise hat einige ... unbeabsichtigte Konnotationen.Nachsatz
Ja, PostScript ist eine Programmiersprache. Darüber hinaus ist es eine Programmiersprache, in der alle Sprachkonstrukte systemdefinierte Funktionen sind, die neu definiert werden können ...
Auf Englisch:
Magic
.systemdict
Eingabe denselben SchlüsselMagic
mit einer leeren Definition ("{}
") hinzu.Magic
oben auf den Wörterbuchstapel.Von diesem Moment an ist jeder PostScript-Sprachbefehl so definiert, dass er nichts mehr tut. AFAIK, es ist unmöglich , aus diesem Zustand zu entkommen.
(Technisch gesehen "zerstören" Sie die alten Definitionen nicht, Sie schattieren sie nur. Wenn Sie sie noch ausführen könnten
end
, würde diesMagic
den Dictionary-Stack verlassen, alle Befehle deaktivieren und Ihnen Ihr Leben zurückgeben. Aber seitdemend
selbst ist auch beschattet ... es wird jetzt nichts mehr tun.)Beachten Sie, dass alle Befehle weiterhin ausgeführt werden . Sie sind nur so definiert, dass sie nichts tun. Sie werden keine Fehler bekommen, es ist nur so, dass nichts passieren wird. (Nun, ich nehme an, ein Stapelüberlauf wird irgendwann passieren ...)
quelle
Beliebiges Programm, das unter Linux / x86 (-64) ausgeführt wird
Dieses Programm ist geschrieben in C, aber es kann unter Linux / x86 (-32 oder -64) Durchführung eines Programms läuft stören. Sie stellen es dem Befehlszeilenaufruf des Programms voran, das Sie unterbrechen möchten.
Es verwendet die Debugger-API, um zu verhindern, dass das Zielprogramm eine Ausgabe erzeugt. Insbesondere schlagen alle Systemaufrufe fehl, die der Welt außerhalb des Prozesses etwas mitteilen können (am offensichtlichsten
write
natürlich, aber auchopen
beim Erstellen einer Datei, der Großteil der Socket-API,kill
wenn sie auf einen anderen Prozess angewendet werden, ...) als wären sie nicht implementiert._exit
ist erlaubt, aber der Exit-Code wird mit einer Null überschrieben.Im Gegensatz zur vorherigen Ausgabe dieser Antwort können viele Programme unter diesen Bedingungen fast vollständig ausgeführt werden. Es ist nur so, dass all ihre Arbeit verschwendet wird. Wenn Sie dies beispielsweise tun
./no-syscalls /bin/ls
(unter der Annahme, dass GNU coreutils vorhanden istls
), wird das gesamte Verzeichnis gelesen und formatiert, und allewrite
Aufrufe zur Ausgabe schlagen fehl. (Alles , was einen bidirektionalen Kommunikationskanal zu öffnen , muss aber, wie alles X11 - Clients, wird an diesem Punkt scheitern. Ich dachte daran , damitsocket
aber nichtsend
, aber es schien zu wahrscheinlich Lücken zu öffnen.)Es gibt verschiedene Befehlszeilenoptionen, um das Verhalten zu optimieren.
Dynamisch verknüpfte Programme verlassen im
-e
Modus nicht einmal den Dynamic Linker .-S
Offensichtlich öffnet sich eine riesige Lücke in der Politik, aber es kann unterhaltsam sein, Programme zu sehen, die über nichts stöhnen, was funktioniert, zSie müssen die Protokollausgabe mit
/usr/include/asm*/unistd.h
open in einem anderen Fenster lesen , da dies bereits ziemlich lang genug ist.Leider sind die verwendeten Debugger-Schnittstellen in allen Unix-Implementierungen nur schwach konsistent und von Haus aus CPU-spezifisch. Es wäre relativ einfach, es auf andere CPU-Architekturen zu portieren (fügen Sie einfach die entsprechenden Definitionen von hinzu
SYSCALL_*_REG
), und es ist wahrscheinlich möglich , es auf jedes Unix zu portierenptrace
, aber Sie müssen sich möglicherweise intensiv mit der Syscall-Whitelist auseinandersetzen und auch mit Divergenzen befassen inptrace
.quelle
-DNO_EXIT
Modus ist für Leute, die sich so fühlen wie Sie. In diesem Modus ist keine sinnvolle Ausgabe möglich.strace
?TeX
Ich bin mir nicht sicher, ob dies tatsächlich funktionieren wird, aber theoretisch sollte dies
\
als Escape-Charakter abbrechen , sodass Sie keine Möglichkeit haben, es zu beheben. Normalerweise kann TeX Dateien lesen und schreiben, jetzt kann es nichts schreiben, was von der Logik abhängt. Somit ist die Sprache nun wie von OP definiert defekt.BEARBEITEN: Andere Kill-Befehle aus den Kommentaren (obwohl beide möglicherweise gegen die Regel verstoßen, dass Code ausgeführt werden muss):
\def\fi{}\iffalse
by smpl erzeugt einen nicht verschließbaren if-Zweig\catcode13=9%
von iwillnotexist idonotexist erstellt einen unendlichen Kommentarquelle
\def\fi{}\iffalse
. Ich kann keine Antworten dazu posten, da dies mindestens 10 Wiederholungen von dieser Site erfordert, aber dies wird auch keine Ausgabe mehr ermöglichen.\fi
zu seiner ursprünglichen Bedeutung zurückfinden , oder? Somit ist die Sprache nicht irreparabel gebrochen.\fi
ist ein TeX-Primitiv. Und nein, Sie können an dieser Stelle nichts neu definieren,\iffalse
wurde angerufen.\catcode13=9%
dass die Sprache völlig kaputt gehen würde (alles, was danach%
steht, wird kommentiert und Zeilenumbrüche (ASCII-Zeichen 13) werden ignoriert, sodass der Kommentar unendlich lang ist), wollte ich ihn hier posten. Aber Sie haben hier schon einen etwas längeren Befehl.Kratzen
Die
when [timer v] > (0)
wird ausgeführt, sobald der Code initialisiert wurde. Wenn Sie sich im Editor befinden, ist dies noch nicht einmal der Fall, bevor Sie den Code starten. Daswhen I receive (join[][])
führt dazu , dass ein Fehler jedes Mal etwas geworfen wird ausgestrahlt wird, pausiert die Ausführung von Code , wenn Sie Entwickler - Version von Flash haben. Diebreak
Funktion erstellt Klone und löst den Broadcast-Fehler aus. Jeder einzelne Klon dauert zwei Sekunden, löscht sich dann von selbst und belastet den Stapel. Und jeder Klon reagiert auf daswhen [timer v] > (0)
Ausführen derbreak
Subroutine und das Zurücksetzen des Timers, wodurch der Timer-Code erneut ausgeführt wird. Außerdem reagiert jeder Klon auch auf jeden Broadcast-Fehler, dh die Anzahl der Fehler pro Auswertungbreak
ist die Anzahl der Klone im Quadrat. Habe ich vergessen zu erwähnen, dass diebreak
Funktion hatrun without screen refresh
überprüft, was dazu führt, dass der Editor einfriert, ruckelt und verzögert sowie Speicher abruft und zuweist. Und die CPU voll ausschöpfen.Jeder Code, der bei dieser Ausführung irgendwo hinzugefügt wird, kann keine Klone erstellen (Limit von 300 Klonen überschritten) sowie den Computer, auf dem er ausgeführt wird, aufheizen und abstürzen. Und Speicher abrufen, bis kein Speicher mehr verfügbar ist, sodass die Variablen sich nicht mehr richtig verhalten.
Und
when [timer v] > (0)
wenn es zu viel Verzögerung gibt, um den Block auszulösen , läuft er weiterbreak
.Vielen Dank an @towerofnix, der mich an die Panne erinnert hat, die
when I receive
ich vor einiger Zeit gefunden habe, und der mir die Idee für gegeben hatrun without screen refresh
. Wenn Ihnen das gefallen hat, finden Sie hier das Original: https://codegolf.stackexchange.com/a/61357/43394quelle
stop this script
when I receive
Panne"?when I receive
dient nur zur Eingabe aus der Dropdown-Liste. Derjoin[][]
Block gibt einen Datentyp zurück, den derwhen I recieve
Block nicht akzeptieren soll. Jedes Mal, wenn etwas gesendet wird, überprüfen und bewerten alle Hutblöcke den Rückgabewert des Blocks und lösen einenincorrect type
Fehler aus.join
Block tatsächlich dort hineinzuholen .n
" verwendet werden, um zu sagen,(n-1)
funktioniert für positivn
<3, aber da dies algorithmisch ist, sollte ein guter Algorithmus in der Lage sein,n
groß genug zu machen , um dieses Argument abschütteln zu können. Ich bin mir nicht sicher, ob eine schnellere oder langsamere Maschine sie benutzerfreundlicher machen würde. Ich bin jedoch damit einverstanden, dass diese Lösung umgangen werden kann. Es ist kein Bullen-und-Räuber , aber trotzdem gut gemacht.Mathematica / Wolfram-Sprache
Mathematica ist eine interpretierte Sprache, in der Befehlsnamen Symbole sind, die vom Programmierer bearbeitet werden können. Sie können integrierte Operatoren nicht löschen, sie jedoch überladen oder auf andere Weise ihre Funktion ändern. Das Folgende verschlüsselt den "With" -Befehl, der für die Zuweisung zu Variablen auch intern benötigt wird. Diese Änderung verhindert, dass der Kernel Argumente enthält, die nicht ausgewertet wurden, bis die Zuweisung abgeschlossen ist, und bringt die Sprache zum Erliegen.
Wenn dieser Befehl in einer interaktiven Sitzung oder in einem Codeblock ausgeführt wird, kann Mathematica nicht einmal hinzufügen
1+1
(die resultierende Fehlermeldung ist etwa eine Seite lang, sodass ich sie hier nicht einfügen werde ).quelle
PHP
Ich bin überrascht, dass es tatsächlich funktioniert, aber das Schließen
STDOUT
undSTDERR
Unterdrücken aller Ausgaben. Um sicherzustellen, dass sie nicht erneut geöffnet werden, öffnen wir/dev/null
drei Mal, um die Dateideskriptoren 0, 1 und 2 neu zuzuweisen:Mehr dazu: https://stackoverflow.com/questions/937627/how-to-redirect-stdout-to-a-file-in-php
quelle
DOS Batch (vor Windows 95 glaube ich)
Ohne Argumente wird die Befehlszeile vom Terminal getrennt. Weitere Versuche, Eingaben zu lesen oder Ausgaben zu generieren, führen zu keinem Ergebnis.
Wenn Sie wissen möchten, wie Sie CTTY richtig verwenden:
Eine etwas leistungsstärkere Batch-Datei könnte sogar den Anrufbeantworter des Modems ansprechen und eine Verbindung zu CTTY herstellen.
quelle
Common Lisp
Ich hoffe, Sie haben diese öffnenden Klammern nicht gebraucht.
Dies ist ein Reader-Makro, das den Lisp Reader anweist, jede Instanz von
(
durch einen Aufruf von zu ersetzen(lambda (x y) ())
, einer Funktion, die zwei Argumente akzeptiert und nichts zurückgibt. So würde es zum Beispiel(foo)
als gelesenfoo)
,foo
als Variable interpretiert und dann einen nicht übereinstimmenden Klammerfehler auf werfen0
.quelle
)
als etwas kaputt interpretieren ! Auf diese Weise treten weniger Fehler auf.Kratzen
Hier ist ein ziemlich einfaches Beispiel, das Ihren Browser (und theoretisch Ihren Computer) zum Absturz bringt:
Ich ließ dies etwa zwanzig Sekunden laufen und verlor dann 2,65 GB Speicher an Scratch. Nur einen Moment später und 5 GB waren weg.
Ich schlage vor, Sie haben die Möglichkeit, Adobe Flash oder Ihren Webbrowser zu beenden, bevor Sie dies ausführen!
Ich wollte wirklich eine coole Antwort wie die von
clear(this)
JS geben, aber leider hat Scratch keine Möglichkeit, dies zu tun. Fühlen Sie sich frei, diesen Beitrag zu aktualisieren (oder Ihren eigenen zu erstellen), wenn Sie einen anderen Weg finden, Scratch unbrauchbar zu machen!quelle
Thue
Mit einem Zeilenumbruch am Ende
Die Sprache basiert auf der Definition von Regelsätzen und a
::=
kennzeichnet das Ende des Regelsatzes. Es ist unmöglich, in Thue ALLES zu tun, ohne Regeln zu definieren, die dies tun. Unabhängig davon, was Sie nach dem::=
tun, kann also nichts passieren.Alternative Antwort
(usw. für alle Zeichen in Unicode, einschließlich der
A
Zeichen vor dem Zeichen und nicht druckbarer Zeichen). Dies erfordert die Befehlszeilenoption-r
.quelle
MATLAB
Der folgende Code macht die Umgebung vollständig unbrauchbar 1 :
Dadurch werden die
builtin
Funktion und dieclear
Funktion mit neuen anonymen Funktionshandles überschrieben, die beifalse
jedem Versuch, diese Funktionen aufzurufen , einfach zurückgegeben werden. Diebuiltin
Funktion stellt sicher , dass , wenn es alle benutzerdefinierten Funktionen , die Sie in MATLAB schreiben , die den gleichen Namen wie diejenigen sind , die in MATLAB-in gebaut werden (Dinge wiesum
,max
,min
usw.), Sie sind in der Lage diese eindeutig anstelle der überladenen Funktionen aufrufen . Ebenso habenclear
Sie die Möglichkeit, alle derzeit deklarierten Variablen zu löschen, damit Sie neu beginnen können. Wenn Sie diese Funktionen entfernen, können Sie MATLAB nur dann verwenden, wenn Sie das Programm neu starten.In MATLAB R2015a erhalte ich außerdem die folgende Meldung:
Der Arbeitsbereich sind die Variablen, die derzeit in der Umgebung deklariert sind, damit Sie sie später verwenden können. Dadurch wird der Arbeitsbereich dauerhaft deaktiviert, sodass alle Variablen, die Sie erstellen, nicht gespeichert werden und daher bei der Ausführung von Codezeilen in MATLAB keine Fortschritte erzielt werden können.
1: Gutschrift geht an den Benutzer Dev-iL , der die Idee ursprünglich entdeckt hat.
quelle
feval('clear')
beheben. Oder:s=str2func('clear'); s()
.///
Der einzige Betrieb in /// ist String - Ersetzung wiederholt, wie folgt aus :
/pattern/replacement/
.Dieser Code entfernt alle Zeichen
/
, auf diese Weise können Sie keine wiederholten Zeichenfolgenersetzungen verwenden, sodass im Grunde alles, was Sie danach schreiben, gedruckt wird (mit Ausnahme von/
s).Sie können
\
s immer noch verwenden , aber das hilft Ihnen nicht viel.quelle
Befunge-96
Der Code des Benutzers kann nach dieser Sequenz an einer beliebigen Stelle folgen, sofern dies die ersten drei Zeichen in der Quelle sind.
Der
'
Befehl (One-Shot-String-Modus) schiebt den ASCII-Wert von~
auf den Stapel (dh 126), und derh
Befehl setzt dann das so genannte holistische Delta mit diesem Wert. Für diejenigen, die nicht mit Befunge-96 vertraut sind, ist das Holistische Delta ein Offset, der zum Wert jedes Befehlsbytes addiert wird, auf das der Interpreter stößt.Sobald das Delta auf 126 gesetzt ist, kann nur ein gültiger Befehl
~
(Zeicheneingabe) über ein Null-Byte in der Quelle generiert werden . Alles andere als ein Null-Byte würde in einen Wert größer als 126 übersetzt, und keiner dieser Werte wäre ein gültiger Befunge-Befehl.Ich denke, man kann mit Sicherheit sagen, dass dies die Qualifikation als Programmiersprache unmöglich machen würde.
quelle
Boo
Und dann, woanders im Projekt,
Ein einfaches Makro mit einem harmlos klingenden Namen, aber einem erstaunlich frustrierenden Effekt. Der Boo-Compiler verwendet eine mehrstufige Pipeline, die mit dem Parsen der Quelle in einen AST beginnt und mit der Codegenerierung endet. (Im Allgemeinen. Es kann für verschiedene Anwendungen neu konfiguriert werden.) In jedem Schritt dazwischen werden verschiedene Operationen auf dem AST ausgeführt.
Teilweise erfolgt die Makroerweiterung, in der Makros im Kontext des Compilers ausgeführt werden. Erinnern Sie sich an das Bit im letzten Absatz, dass die Pipeline umkonfigurierbar ist? Wenn Sie während der Makroerweiterung ein Makro aufrufen, das die Pipeline löscht, wird dem Benutzer kein Fehler angezeigt, aber alle Schritte nach der Makroerweiterung (einschließlich der Codegenerierung) sind nicht mehr vorhanden. Sie erhalten also etwas, das wie eine erfolgreiche Kompilierung aussieht - es werden keine Fehlermeldungen angezeigt -, aber aus irgendeinem Grund wird keine Binärdatei erstellt! Wenn Sie das Makro und den Aufruf gut verbergen, fahren Sie garantiert auch die besten Problemlöser die Wand hoch.
quelle
NGN / APL
NGN / APL erlaubt die Neudefinition von Primitiven, daher macht die Neudefinition (
←
) aller primitiven Funktionen⊢
("pass through": both⊢3
and2⊢3
gives3
) die Sprache völlig unbrauchbar:Probieren Sie es hier aus.
quelle
Ruby (29 Zeichen)
As 'send' wird intern verwendet, wenn eine Methode in Ruby aufgerufen wird, und da alle Objekte von der Object-Klasse erben. Dies sollte verhindern, dass eine Methode ausgeführt wird.
Fun Fact: Theoretisch ist das völlig in Ordnung. Aber es scheint aus irgendeinem Grund, die Ruby-Sprache nicht zu manipulieren. Ich habe keine Ahnung, warum es möglich ist, diesen Code auszuführen und trotzdem eine offene Ruby-Umgebung zu verwenden.
quelle
Tcl
Dadurch werden alle Keywords mit Ausnahme von
if
und aus der Sprache entferntrename
.Der obige Code würde dazu führen, dass ein neuer Code ausfällt. Es ist also fraglich, ob der neu eingefügte Code tatsächlich "ausgeführt" wird. Unten ist eine Version, die neuen Code ausführt, aber nichts tut, da alle Schlüsselwörter (außer
if
undproc
) in eine Nulloperation geändert werden:Anstatt Schlüsselwörter zu löschen, ersetzt dieser Code sie durch eine Funktion, die nichts bewirkt.
(Hinweis: Ich verwende "Keywords" hier sehr locker, weil Tcl keine Keywords hat, sondern nur Funktionen)
quelle
if
undrename
nach der Schleife umbenennen . In der zweiten Version sollten Sie auchproc
eine Ausnahme machen.proc
in der Liste vorher erscheintputs
. Technisch sollte der Code auch ohne funktionieren,rename
aber eingebaute Befehle scheinen ansonsten geschützt zu sein. Ich bin nicht sicher, was los ist, aber der Code ist getestet und funktioniert wie angekündigt.rename
. Es war Brainfart meinerseits - ich habe vergessen, auszuschließenproc
.if
weil esif
ziemlich nutzlos ist, wenn man alleine arbeiten kann, um eine Ausgabe zu generieren.Hoon
Hoon ist seltsam. Es unterscheidet sich so ziemlich von anderen Programmiersprachen, nicht nur in der Syntax, sondern auch in der Semantik. Im Gegensatz zu Sprachen wie Hexagony war es jedoch nicht absichtlich esoterisch.
Hoon kompiliert zu Nock , einer Minimal-Combinator-basierten VM. Nock ist doof: Die Spezifikation kann auf 340 Bytes komprimiert werden. Die einzige mathematische Operation ist das Inkrementieren. Alles ist ein Substantiv: ein Atom (Bignum) oder eine Zelle (Substantivpaar), wobei das gesamte Speichermodell in einem unveränderlichen azyklischen Binärbaum angeordnet ist. Die einzige Ausgabe ist das Substantiv, auf das Ihr Ausdruck reduziert ist.
Wegen des seltsamen Kompilierungsziels ist Hoon auch seltsam: Es ist völlig rein. Hoon kompiliert bis zu einem Nock-Ausdruck, der in einem "Kontext" ausgewertet wird. Der gesamte Kernel und die stdlib sowie alle Variablen werden vom Kontext implizit an das Programm übergeben.
Um Hoon unbrauchbar zu machen, verwenden wir einfach
=<
"a im Kontext von b auswerten". Wir werten immer aus~
, was null ist. Egal wasb
passiert, es kann den Wert nicht ändern, auf den es reduziert wird, und da es keine Nebenwirkungen hat, kann es keine Ein- oder Ausgabe machen.Randnotiz: Da Sie keine Eingabeaufforderung von Hoon (Reinheit!) Erhalten können, handelt es sich nach den Regeln eigentlich nicht um eine Programmiersprache. Die Eingabe erfolgt über Funktionsargumente, die Ausgabe über Rückgabewerte (oder
~&
, was eher eine Funktion zur Fehlersuche in printf ist und für das Programm transparent ist).Damit ein Programm Eingaben in Urbit erhält, schreiben Sie tatsächlich ein Programm, das eine Funktion zurückgibt, die Eingaben akzeptiert, und die Shell fragt in Ihrem Namen und übergibt sie an den Rückruf.
quelle
Taxi, 2354 Bytes.
Dieses kleine Programm fährt einfach das Taxi in einer großen Spritztour durch Townsburg, ohne Benzin. Jeder Code, den Sie danach ausführen, führt schnell zu Fehlern
error: out of gas
. Und selbst wenn Sie eine Tankstelle erreichen könnten, die ich nicht für möglich halte, könnten Sie kein Benzin bekommen, da kein Geld gesammelt wurde, da es keine Passagiere gibt.quelle
JavaScript im Browser
Zumindest im IE11.
Deaktiviert das Schreiben in das Dokument, das Schreiben in die globale Variable und die Rückkehr von der Funktion.
Kommentar, wenn ich eine Ausgabemethode verpasst habe!
quelle
window.addEventListener('error',function(){});
document
sollte im eingefügten Code weiterhin über den äußeren Bereich zugänglich sein und erst ersetzt werden, nachdem der eingefügte Code ausgeführt wurde.Python 2, wahnsinnig groß
Diese wahnsinnig große Menge an Code ist eine Wiederbelebung des alten
rexec
Moduls (in Python 2.3 aufgegeben) mit einer Reihe neuer Module, die der "ok" -Liste hinzugefügt wurden, und einer Reihe behobener Schwächen (einschließlich derobject.__subclasses__()
Methode, mit der mindestens zwei andere Pythons erstellt wurden) Antworten ungültig).Ein Großteil dieses Codes (die
__init__
Methode derRExec
Klasse und der gesamtenModuleImporter
Klasse) wird mit kleinen Änderungen aus der Python-Standardbibliothek kopiert.quelle
8064 bytes
übrigens