Definieren wir ein unberührtes Programm als ein Programm, das selbst keine Fehler aufweist, das jedoch fehlerhaft ist, wenn Sie es ändern, indem Sie zusammenhängende Teilzeichenfolgen mit N Zeichen entfernen 1 <= N < program length
.
Zum Beispiel das dreistellige Python 2-Programm
`8`
ist ein unberührtes Programm ( danke, Sp ), da alle Programme, die aus dem Entfernen von Teilzeichenfolgen der Länge 1 resultieren, Fehler verursachen (Syntaxfehler in der Tat, aber jede Art von Fehler reicht aus):
8`
``
`8
und auch alle Programme, die aus dem Entfernen von Teilzeichenfolgen der Länge 2 resultieren, verursachen Fehler:
`
`
Wenn zum Beispiel `8
ein fehlerfreies Programm gewesen `8`
wäre, wäre es nicht makellos, da alle Ergebnisse der Entfernung der Teilzeichenfolgen fehlerhaft sein müssen.
Ihre Aufgabe bei dieser Herausforderung ist es, das kürzestmögliche unberührte Programm zu schreiben, das keine Eingabe benötigt, sondern eines der folgenden fünf Wörter ausgibt:
world
earth
globe
planet
sphere
Welches Wort Sie wählen, liegt ganz bei Ihnen. Das einzige Wort und eine optionale nachgestellte Zeile sollten auf stdout (oder die nächstgelegene Alternative Ihrer Sprache) gedruckt werden. Das kürzeste Programm in Bytes gewinnt.
Anmerkungen:
- Ein eigenständiges Programm ist erforderlich, keine Funktion.
- Die Wörter sind case sensitive; ausgeben
World
oderEARTH
ist nicht erlaubt. - Compiler-Warnungen gelten nicht als Fehler.
- Die fehlerhaften Unterprogramme können Eingaben oder Ausgaben annehmen oder irgendetwas anderes tun, solange sie immer irgendwann fehlerhaft sind.
Hier ist ein Stack-Snippet, das auflistet, welche Programme bei einem möglicherweise unberührten Programm fehleranfällig sind:
<script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>function go() { var s = $('#i').val(), e = []; for (var i = 1; i < s.length; i++) { for (var j = 0; j <= s.length - i; j++) { e.push(s.substring(0, j) + s.substring(j + i)); } } $('#o').val(e.join('\n---\n')); }</script>Program:<br><textarea id='i' rows='16' cols='80'>`8`</textarea><br><button onclick='go()' type='button'>Go</button><br><br>Programs that should error: (--- separated)<br><textarea id='o' rows='16' cols='80'></textarea><br>
quelle
Antworten:
Schiene , 24 Bytes
Ich denke das funktioniert. Und es ist sowohl kurz als auch lesbar (soweit es Rail betrifft).
$'main'
wirInternal Error: Crash: No 'main' function found
.#
, kann das Programm nicht ordnungsgemäß beendet werden, sodass es immer mit beendet wirdCrash: No valid move
. Ich glaube, dass es nicht möglich ist, einen Teilstring so zu löschen, dass der Track eine gültige (Endlos-) Schleife bildet.#
, wird sie vom Ende der Strecke getrennt, sodass der Zug abstürzt (mit demselben Fehler wie oben).#
, wird auch die Verbindung#
zum Ende der Spur (und möglicherweise sogar zum Anfang der Spur vom Einstiegspunkt$
) getrennt. Also nochmal der selbe Fehler.Was das eigentliche Programm betrifft: Jedes Rail-Programm muss einen
$'main'
(oder eine längere Variante, aber wir spielen hier Golf) als Einstiegspunkt in die Funktion haben, und der Zug$
fährt in südöstlicher Richtung. Alles in dieser ersten Zeile kann Teil der Spur sein. Entfernen'main'
der Spur ist also:Die
-
und/
sind einfach Schienenstücke, die wir brauchen, damit der Zug diese 45 ° -Drehungen macht.[world]
drückt den Stringworld
undo
druckt ihn aus.#
markiert das Ende der Strecke - die einzige Möglichkeit, ein Rail-Programm sicher zu beenden.Interessanterweise ist diese Lösung nur möglich, weil Rail den Gleisen erlaubt, durch die
main
Linie zu fahren - wenn das nicht möglich#
wäre, wäre es nach der ersten neuen Linie und der Code könnte immer auf gekürzt werdenDas ist ein gültiges Programm, das nichts tut. (Nicht-Leerzeichen zwischen
'
und#
würden das nicht beeinflussen.)Ebenfalls sehr interessant: Wenn ich nur Golf gespielt
world
hätte, wäre das Drucken nicht viel kürzer oder einfacher gewesen:quelle
/
vom trennen#
.$
, sodass der Zug sofort abstürzt (Rail erwartet, dass das Gleis südöstlich des Gleises fortgesetzt wird$
).Funktion (
186136 Bytes in UTF-16)Dieses Programm druckt "Welt".
Die meisten Teilzeichenfolgen, die Sie daraus entfernen, verhindern, dass es sich um eine vollständige Box handelt, über die sich der Parser beschwert. Die einzigen möglichen Umzüge, die eine komplette Box hinterlassen, sind:
Die meisten davon entfernen das baumelnde Ende oben rechts an der Box, bei dem es sich um den Ausgangsanschluss handelt. Ohne dieses lose Ende ist die Box nur ein Kommentar:
Dies ist kein gültiges Programm mehr, da der Parser ein Programm mit genau einer Ausgabe erwartet:
Die einzige Möglichkeit, die einen Ausgangsanschluss verlässt, ist die letzte der oben genannten Möglichkeiten.
Diese Nummer codiert jedoch keine gültige Unicode-Zeichenfolge in Funcitons esoterischem UTF-21. Versuchen Sie dies auszuführen, erhalten Sie:
Daher ist dieses Programm makellos.
quelle
Visual C ++ -
9695 BytesEigenschaften:
int main()
Ohne einen Kompilierungsfehler können Sie keinen Teil von entfernen .a
bei allen Mittelnmain()
nie bekommt{
, das Entfernenb
überhaupt bedeutet , dass unsere Linie nicht in einem nicht enden;
, das Entfernen<
Mittelstd::cout<'w'
einen Fehler verursacht und das Entfernen von<<
Ursachenstd::cout'w'
,'w''o'
usw.I(a)
,I(b)
die niemals übereinstimmen undI
die zuvor erweitert wurden(
. auf der anderen Seite mitI(,
Ursachen<<<<
und,)
löscht das Semikolon (abgesehen von anderen Fehlern).std::cout
ohne in eine führenden<<
und daher keinesfalls entfernen ,#include<iostream>
ohne einen Compiler - Fehler am Anfang.''
haben einen Leerzeichenfehler und'w,
versuchen, alles in ein Zeichen zu verwandeln.)
oder(
auf der anderen Seite zu lassen, z. B. können Sie solche Dinge nicht tunI('w',I('r'
.Kompiliert online mit Visual C ++ .
Auch dies ist kein vollständiger Beweis. Wenn Sie denken, dass Sie es auch ohne Abschnitt zum Laufen bringen können, lassen Sie es mich bitte wissen.
Frühere Versionen verwendeten einen erheblich anderen Ansatz und erwiesen sich als nicht makellos. Deshalb habe ich diese Partituren entfernt.
Nachprüfung:
Das folgende Programm hat bestätigt, dass diese Version mit dem
cl
Compiler von Visual C ++ 2010 fehlerfrei ist. Ich wünschte, ich hätte mir die Mühe gemacht, dies früher zu schreiben:quelle
/c
Option automatisch einbezogen und kompiliert (als ob Sie eine Bibliothek und kein Programm erstellen würden). Wenn Sie das Kontrollkästchen Ausführen aktivieren, das die Site nicht enthält/c
, wird keine Erfolgsmeldung angezeigt. Stattdessen wird der natürliche Eintrag "LINK: Schwerwiegender Fehler LNK1561: Einstiegspunkt muss definiert sein" angezeigt.Python 3,
7933open(1,'w')
öffnet die Standardausgabe, dann drucken wir den String.write
Gibt die Anzahl der geschriebenen Zeichen zurück. Dies wird verwendet, um das Entfernen von Teilzeichenfolgen zu verhindern: Wenn ein Teil der Zeichenfolge entfernt wird, wird etwas anderes als 5 zurückgegeben, und 5 abzüglich dieses Werts wird dann als true ausgewertet. Aber das führt dazu, dass derif
-body ausgeführt wird unda
ist undefiniert.Dies basiert auf Anders Kaseorg cleveren unberührten quine hier .
Da nur eine einzige Aussage überprüft werden muss, ist dies viel kürzer als die alte Lösung, aber auch weniger allgemein.
Alte Lösung:
So stellen Sie sicher, dass es sich wirklich um ein unberührtes Programm handelt:
Einige wichtige Punkte:
q
Ausführung erfordert eine Anweisung außerhalb vonq
. Dastry
löst sich schön, indem man mindestens zwei Aussagen benötigt, von denen keine vollständig gelöscht werden kann.q
der Ausführung erfolgt durch Auswertungr
am Ende.q
wurde nicht erreicht wird, modifiziert durcheval(q[17:])
, was zu bewerten hatNone
fürq
geführt werden.if
Bedingung ist ein bisschen schwierig, richtig zu machen. Um sicherzustellen, dass es ausgewertet wurde, hat es den netten Nebeneffekt des Einstellense
, der zum Einstellen benötigt wirdr
. (Dies ist der Grund, warum ich Python 3 verwendet habe,expr
da eine Funktion Wunder bei Nebenwirkungen auf Expression-Ebene bewirkt.)quelle
Haskell, 61
Jede Art von Fehler ist in Ordnung? In diesem Fall:
Haskell, 39
quelle
JavaScript,
747335 BytesEs stellte sich heraus, dass die Antwort viel einfacher war als ich dachte ...
Erläuterung
quelle
a="world"
, keine Fehlerif(a="world")["bol"+a[4]]
Fehler nicht.Java 8, 301 Bytes
Weil jede Frage eine Java-Antwort braucht.
Erweitert
Erläuterung
public static main(String[]a){}
ist nötig.Der schwierigste Teil:
final
Schlüsselwort entfernt wird, wird die zweite Zeile zu ausgewertet1/(8-8)
, was zu einer/ by zero
Ausnahme führt.quelle
System.out.print()
Methode. Es gibt fürprintln()
, aber nicht fürprint()
. Wenn Sie es entfernend='d'
würden, gäbe es einenThe method print(boolean) in the type PrintStream is not applicable for the arguments ()
Fehler (und wenn Sie es entfernend=
würden, gäbe es einenThe blank final field d may not have been initialized
Fehler).Funktion ,
143142136 BytesDie Bewertung erfolgt wie gewohnt in UTF-8, da UTF-16 (aufgrund der Stückliste) zwei Byte größer wäre.
Daher habe ich eine Weile über eine Antwort von Funciton nachgedacht und mir gedacht, dass dies unmöglich ist, da Sie immer eine vollständige Zeile entfernen können und der Code immer noch einen gültigen Block bildet. Dann habe ich mit Timwi darüber gesprochen und er hat herausgefunden, dass man einfach die ganze Zahl in eine einzige Zeile setzen kann, so dass das Entfernen das Programm aufgrund des Fehlens eines Ausgangsanschlusses zum Erliegen bringt .
Literale in einer einzelnen Zeile sind jedoch bekanntermaßen teuer, sowohl wegen der größeren Zeichenanzahl als auch wegen der größeren Anzahl von Nicht-ASCII-Zeichen. Und seine Erwähnung eines "leeren Kommentar" -Blocks brachte mich zum Nachdenken ...
Also habe ich mir eine effizientere Lösung ausgedacht, die einen zusätzlichen leeren Kommentarblock verwendet, der kaputt geht, wenn Sie versuchen, alles zu entfernen, was den wörtlichen Block im Takt belassen würde:
Das lässt zwei Möglichkeiten (danke an Steve für den Hinweis):
19342823075080880373
decodiert wird, würde die entsprechende Zeichenfolge , die den Codepunkt enthalten ,0x18D53B
die kein gültiges Unicode - Zeichen ist,System.Char.ConvertFromUtf32
stürzt mit einArgumentOutOfRangeException
.508088037380718711
würde zwei ungültige Codepunkte enthalten0x1B0635
und0x140077
zur gleichen Ausnahme führen.Beachten Sie, dass das Entfernen der zweiten Zeile auch ohne den leeren Kommentarblock zu einem ungültigen Codepunkt führen würde. Der Kommentarblock verhindert jedoch, dass wir eine Zeile innerhalb der zweiten Zeile einfügen, um beispielsweise eine Ganzzahl zu erhalten
193428037380718711
, die keinen Fehler verursachen würde.quelle
Rubin, 36
Wir weisen
s="planet"
diese Zeichenfolge zu und schreiben sie dann an STDOUT. Dies gibt die Anzahl der geschriebenen Zeichen zurück. Wir xor das mit 6, so dass wir eine ganze Zahl ungleich Null erhalten, wenn etwas anderes als 6 Zeichen geschrieben wurden. Dann schneiden wirs
mit diesem Index hinein. Nur das 0. Zeichen vons
"p" ist eine gültige Codezeichenfolge (keine Operation). Wir übergeben dies aneval
, wobei wir die(*[argument])
Syntax verwenden, die nur mit der(argument)
Ausnahme äquivalent ist, dass sie außerhalb eines Methodenaufrufs nicht gültig ist.Programmgesteuert überprüfte Aktualität unter Ruby 1.9.3 und 2.2
quelle
*
?C #,
128118101 BytesIch dachte daran, die zusammenhängende Teilzeichenfolgenregel zu missbrauchen.
Der Code
Warum es funktioniert
class h
undstatic void Main()
sind erforderlich.'w','o','r','l','d'
verursacht einen Fehler, da das Zeichen- Array mit der Länge initialisiert wird1*5
.Vor dem Golfen und der Trennung
Bestätigt mit
https://ideone.com/wEdB54
BEARBEITEN:
#if !x
anstelle von gespeichert#if x #else
.=>
Funk-Syntax.#if!x
statt#if !x
. Dank an @JohnBot.=>
Funktionssyntax kann eine zusätzliche Preproc-Bedingung entfernt werden.quelle
static
anMain
.Main
ein Expression-bodied Funktionselement und 2 mehr durch Entfernen des Leerzeichen vor dem Präprozessor Zustand:class h{static void Main()=>System.Console.Write(new char[1\n#if!l\n*5]{'w','o','r','l','d'\n#if!o\n});\n#endif\n}\n#endif
. Das sind 115 nach meiner Zählung.MATLAB,
373633 BytesDa ich nicht sicher bin, ob wir auch ans = ausgeben dürfen , musste ich einige Umgehungsmöglichkeiten finden, um die Ausgabe in geeigneter Weise durchzuführen. Die Verwendung von fprintf an sich hat nicht funktioniert, da ich mich einfach geweigert habe, Fehler zu machen, egal was ich versuchte. Die Verwendung von disp an sich war keine Option, da es nur 1 Argument annehmen würde und dieses Argument offensichtlich auch fehlerfrei ausgeführt würde.
Wenn es kein Problem ist, ans = auch in die Ausgabe einzubeziehen, kann MATLAB mit 20 Bytes ausgeführt werden :
quelle
> <> , 17 Bytes
Probieren Sie es online!
Druckt "Erde".
Die einzige Möglichkeit, wie ein
><>
Programm ohne Fehler beendet wird, besteht in der Ausführung des;
Zeichens. Dies ist ein Problem, da Sie einfach alle Zeichen davor entfernen können, sodass;
das erste Zeichen ausgeführt wird. Sie können dies umgehen, indem Sie denp
Befehl verwenden, um das Programm so zu ändern, dass es;
während der Ausführung einbezogen wird . Sie alle Abschnitte des Codes zu entfernen bewirkt , dass die;
nie Fehler über die ungültigen Anweisungen erzeugt werden verursachtB
,h
undt
, Stapel Unterlauf und Endlosschleifen es schließlich machen über genügend Arbeitsspeicher ausgeführt. Ich musste nur sicherstellen, dass alle Endlosschleifen den Stapel füllten.Alle Varianten wurden mit diesem Python-Snippet getestet:
wurde dem offiziellen fish.py- Interpreter des Erstellers von> <> hinzugefügt (eine leicht modifizierte Version von) . Von 152 möglichen Unterprogrammen sind 92 aufgrund ungültiger Anweisungen fehlerhaft, 18 aufgrund eines Stapelunterlaufs und 42 aufgrund eines Speichermangels.
Witzige Fakten, die erste Version
e"ooooo6-c0pAhtra
hatte ein paar verrückte Unterprogramme, die es schafften, den Befehl put zu verwenden[
, um anstelle der ungültigen Anweisung einen zu platzieren, der den Stack löschtA
. "Earth" ist auch die einzige Phrase, die mit dieser Methode funktioniert, da der erste Buchstabee
eine gültige Anweisung in ist><>
. Andernfalls muss der"
Befehl an der Vorderseite des Programms platziert werden, und ein gültiges Unterprogramm kann sich"
von selbst befinden.quelle
Rubin, 34
Dies hat einige Komponenten:
eval(*[
expr])
stammt aus der Antwort von histocrat und ist makellos. Außerdem ist es ein gültiges Ruby-Programm, das keine Fehler verursacht, wenn der Rückgabewert von expr überprüft wird.method(*arr)
ist eine Ruby-Syntax, diemethod
mit den Werten vonarr
als Argument aufruft . Der Grund, warum dies hier erforderlich ist, ist, dass es nur als Parameter für eine Methode gültig ist, sodass ein Syntaxfehler vorliegt , wenneval
es entfernt(*[expr])
wird. Wenn expr entfernt wird, wirdeval
beanstandet, dass nicht genügend Argumente vorhanden sind$>.write("world")-1
kann nur innerhalb der Zeichenfolge und der Subtraktion entstellt werden.$>.write("world")
schreibt "world" nach STDOUT und gibt die Anzahl der geschriebenen Zeichen zurück, subtrahiert dann 1. Daher ist der Wert genau 4, wenn das Programm nicht entstellt ist . Wenn es verstümmelt ist (entweder wird das-1
entfernt oder die Zeichenfolge gekürzt), wird eines von -1,0,1,2,3 oder 5 zurückgegeben . Alle anderen Verstümmelungen führen zu einem Syntaxfehler.Wenn Sie
chr
eine Nummer anrufen, wird das durch diese Nummer dargestellte Zeichen zurückgegeben. Wenn also das Ergebnis des obigen Beispiels aufgerufen wird, tritt ein Fehler bei -1 auf und ansonsten wird eine Zeichenfolge mit einem einzelnen Zeichen zurückgegeben.Ich bin mir nicht sicher, warum das so ist, aber es scheint, dass Ruby
\x04
als Leerzeichen interpretiert wird , was bedeutet, dass der Ausdruck gültig ist (leere Ruby-Programme tun nichts). Alle anderen Zeichen (\x00
-\x03
und\x05
) führen jedoch zuInvalid char '\x01' in expression
. Ich fand das, indem ich einfach über mögliche Berechnungen iterierte, die ich mit der zurückgegebenen Zahl machen konnte. Zuvor hatte ich benutztWobei "planet" plus ein Zeilenumbruch 7 Zeichen war, mal 16, um 112 zu erhalten
p
, die einzige Einbuchstabenfunktion in Ruby, die standardmäßig definiert ist. Wenn keine Argumente angegeben werden, ist dies praktisch ein No-OpLobende Erwähnung:
$><<"%c"*5%%w(w o r l d)
ist sehr nah, aber nicht makellos. Das Entfernen von"%c"*5%
Ergebnissen führt zu keinen Fehlern. Mini-Erklärung:$>
ist stdout und<<
ist eine aufgerufene Funktion."%c"*5
generiert den Formatstring"%c%c%c%c%c"
, der dann versucht,%
durch ein Array formatiert zu werden ( ): Dies%w(w o r l d)
ist eine kürzere Version von['w','o','r','l','d']
. Wenn das Array zu wenige oder zu viele Elemente enthält, sodass sie nicht mit der Formatzeichenfolge übereinstimmen, wird ein Fehler ausgegeben. Die Achillesferse ist das"%c"*5
, und%w(w o r l d)
kann beide unabhängig voneinander existieren, und$><<
braucht nur ein Argument von einem. Es gibt also verschiedene Möglichkeiten, dieses Programm in fehlerfreie Cousins zu zerlegen.Damit validiert:
quelle
Python 3 , 43 Bytes
Probieren Sie es online!
Wie es funktioniert
Zum Schutz vor Löschungen von Teilzeichenfolgen verwenden wir
open(1,"w").write
anstelle vonprint
. Gibt in Python 3write
die Anzahl der geschriebenen Zeichen zurück, um5
sicherzustellen, dass kein Teil der Zeichenfolge gelöscht wurde. Wir tun dies, indem wir den Rückgabewert im Dictionary{5:[]}
nachschlagen und das Ergebnis mitfor[]in…:a
durchlaufen, was fehlschlägt, wenn wir kein leeres Iterable erhalten haben oder wenn diefor
Anweisung gelöscht wird.quelle
Javascript (Node.js),
93 bis95 BytesÜberprüfen Sie die eigene Größe zweimal, damit bei fehlenden Zeichen ein Fehler ausgegeben wird. Die Länge beträgt 156, da Node.js
function (exports, require, module, __filename, __dirname) {
dem Code zur Laufzeit vorangestellt wird .Vielen Dank an Martin Büttner für den Hinweis auf einen Fehler. Jetzt behoben.
quelle
Perl 5.10+,
7163 BytesDruck
world
mit einem Newline. Laufen Sie wie folgt:Dies
file
hängt von der Byteanzahl des Quellcodes ab und muss daher den obigen Code und nichts anderes enthalten (kein Schebang, kein abschließender Zeilenumbruch). Fürsay
und den defined-or-Operator wird Perl 5.10+ benötigt//
.Es ist unglaublich schwierig, mit Perl ein makelloses Programm zu erstellen, weil:
Jede Bareword Kennung (zB
foo
,a
,_
) ist eine gültige Anweisung mitno strict 'subs';
(Standardeinstellung). Dies bedeutet, dass das Programm weder mit einem Buchstaben, einer Ziffer oder einem Unterstrich beginnen noch enden kann.Wie tchrist erklärt , "haben über symbolische Dereferenzierung angegebene Bezeichner keinerlei Einschränkung bezüglich ihrer Namen." Das bedeutet , das Programm kann nicht mit einem der sigils beginnen
$
,@
,%
, oder*
, da alle , aber die erste und letzte Zeichen zu entfernen würde immer einen gültigen Variablennamen verlassen.Viele integrierte Funktionen (einschließlich der meisten Funktionen, die zur Ausgabe in der Lage sind) funktionieren
$_
standardmäßig, sodass Aufrufe häufig auch dann funktionieren, wenn Sie das Argument entfernen (z . B.say"world"
vs.say
).Wie es funktioniert
Diese Lösung wurde von Naouaks Antwort auf Node.j inspiriert , die ihre eigene Länge überprüft, um sicherzustellen, dass Zeichen nicht entfernt wurden.
Das Programm besteht aus zwei Abschnitten, einer in Klammern und der andere in einem Block:
Der erste Abschnitt liest die Quelldatei und stirbt, wenn sie weniger als 63 Zeichen lang ist. Der zweite Abschnitt prüft, ob die
read
Ausführung erfolgreich war. Wenn einer der Abschnitte entfernt wird (mit oder ohne die umgebenden Klammern oder geschweiften Klammern), löst der andere Abschnitt eine Ausnahme aus.Wenn Sie die mittlere oder linke oder rechte Seite des Programms entfernen, werden die Klammern und / oder geschweiften Klammern aus dem Gleichgewicht gebracht, was zu einem Syntaxfehler führt.
Wenn die erste
die
geändert wird (zud
,e
,di
,de
, oderie
, die alle gültigen Kennungen), die Längenprüfung wird:was auswertet zu:
Dies nimmt einen Verweis auf einen String und versucht, ihn als Array zu dereferenzieren, was zu einem Fehler führt:
Wenn eine andere Anweisung geändert wird, schlägt die Längenprüfung fehl und das Programm stirbt.
Mit folgendem Programm verifiziert:
quelle
Ruby + Coreutils,
332726 BytesProbieren Sie es online!
Backticks in Ruby führen den darin enthaltenen Befehl aus und geben alles zurück, was das Programm als String in STDOUT geschrieben hat. Die
#{expr}
Syntax ermöglicht das Einbetten von Ausdrücken in Zeichenfolgen und Backticks. Dieses Programm könnte umgeschrieben werden als:IO#write
Gibt die Anzahl der geschriebenen Bytes zurück. Wenn die Zeichenfolge also gekürzt wird, ist sie nicht die richtige Anzahl.#{}
Beim Einbetten wird die Zahl automatisch in eine Zeichenfolge eingefügt. Wenn ein Teil entfernt wird und dies nicht zu einem Syntaxfehler führt, wird der falsche Befehl ausgeführt. Wenn ein Teil von"world"
entfernt wird, versucht einer vonbase04
durchbase54
zu laufen.Der Zeilenumbruch, egal ob innerhalb oder außerhalb des Strings, ist erforderlich. Andernfalls können die ersten 5 Zeichen (
`base
) entfernt werden, wodurch die gesamte Zeile zu einem Kommentar wird. Außerdem müssen ein oder mehrere Zeichen zwischen dem ersten Backtick und stehen#
, andernfalls{
kann das entfernt werden, um das Ganze zu einem Shell- Kommentar zu machen.exec
Ersetzt den aktuellen Ruby-Prozess durch den angegebenen Befehl. Siehe meine andere Antwort für eine Erklärung dermeth(*[])
Syntax und der Notwendigkeit.(s="ec%co earth")
Weist der Variablen den String "ec% co earth" zus
. Zuweisungen geben das zurück, was zugewiesen wurde, sodass die Zeichenfolge auch zurückgegeben wird."format string %d" % 5
ist syntaktischer Zucker fürsprintf("format string %d",5)
, jedoch sind Leerzeichen um den%
nicht erforderlich.s[10]
Ruft das Zeichen in der Zeichenfolge bei Index 10 ab. Im nicht entstellten Zustand ist dieses Zeichen "h", der letzte Buchstabe in der Zeichenfolge. Das Entfernen von Zeichen in der Zeichenfolge bedeutet jedoch, dass die Zeichenfolge kürzer ist, sodass bei Index 10 kein Zeichen vorhanden ist.s[10]
Dahernil
wird zurückgegeben und"%c" % nil
ein Fehler verursacht.Wenn
%s[10]
entfernt wird, versucht Ruby, den Befehl auszuführen, derec%co earth
nicht funktioniert.Das Ändern
10
zu1
oder führt0
auch zu einem unbekannten Befehl (entwedereceo
oderecco
). Das vollständige Entfernen ist technisch gesehen kein Syntaxfehler, da es die Methode#[]
für den String aufruft , sich dann aber über nicht genügend Argumente beschwert.Ein Hinweis zur Lösung dieses Problems im Allgemeinen: Sie benötigen einen Wrapper, der den Code in einem abstrakten Sinne überprüft, während er selbst makellos ist. Zum Beispiel wird ein Programm mit Division am Ende (
blablabla/somevar
) niemals funktionieren, da eine Division immer entfernt werden kann (blablabla
). Dies sind einige solcher Wrapper, die ich bisher verwendet habe:eval(*[
Code])
von Histokraten und in meiner ersten Antwort verwendet. Überprüft, ob die Ausgabe ein gültiges Ruby-Programm istexec(*[
Der])
oben verwendete Code bestätigt, dass die Antwort ein gültiger Befehl ist`#{
Code}`
Die Backtick-Syntax führt auch einen Befehl aus (und überprüft daher, ob er gültig ist), STDOUT wird jedoch als Zeichenfolge erfasst, anstatt als STDOUT des übergeordneten Prozesses (Ruby's) ausgegeben zu werden.
Aus diesem Grund konnte ich es nicht für diese Antwort verwenden.BEARBEITEN: Ich habe es funktionieren lassen. Die oben aufgeführten Einschränkungen.Edit: Danke an @histocrat für den Hinweis auf einige Mängel
quelle
write
und am Anfang der Zeichenfolge entfernen , aber ich glaube nicht, dass dies die Reinheit beeinträchtigt. Außerdem wird auf meinem Rechnerbase64
auf Eingaben gewartet, was möglicherweise gegen die Regeln verstößt.$>.write"world"
funktioniert, danke! Das Warten auf Eingaben in base64 scheint je nach System zu variieren. TIO funktioniert gut. Das macht es noch unklarer, ob es den Regeln folgt.PowerShell, (97 Byte + 5 für Programmname) = 102 Byte
Überprüft sich selbst, bevor es sich selbst zerstört ... zweimal.
Erwartet gespeichert werden
c.ps1
und aus dem lokalen Verzeichnis als solche ausgeführt:PS C:\Tools\Scripts\Golfing\> .\c.ps1
.Der Alias
gc
ist eine Abkürzung fürGet-Content
und ähnelt demcat
Lesen einer Datei (in diesem Fall unserem Ausführungspfad.\c.ps1
). Wir holen das.Length
von der Datei, setzen es auf$a
und prüfen, ob es mit 97 nicht gleich ist-eq97
. Wenn es gleich ist (dh das Programm wurde nicht geändert), drucken wir mit"world"
und führen einen ungültigen Befehl ausa
. Dies zwingtcatch
zum Wirksamwerden, was es uns ermöglicht, uns erneut zu überprüfen. Wenn unser Code diesmal nicht 97 ist, geben wir einen ungültigen Befehl aus, sodass unser Programm einen Fehler aufweist und den Fehlertext in die Ausgabe druckt. Wir haben dannclear()
den Fehler undexit
normalerweise.Es ist offensichtlich, dass bei
if
Manipulation einer der beiden Anweisungen die andere fehlerhaft ist. Wenn ein Teil von"world";
manipuliertif
wird, verursacht der erste einen Fehler. Da es zusammenhängend sein muss, können wir nicht beideif
Anweisungen entfernen . Strings in der Mitte führen zu nicht übereinstimmenden Klammern oder dazu, dass die zweite{a}
ausgeführt wird. Dastry
/catch
soll den Fehler aus der erstenif
Anweisung abfangen, damit wir ihn richtig löschen können. Das Äußere"$( )"
verhindert, dass die Saiten an beiden Enden abgeschnitten werden. Das Letzte;a
ist zu verhindern, dass Teile der Mitte abgeschnitten werden, was zu gültigen Programmen führen würde (z. B."it}a)";a
die gedruckt werdenit}a)
und dann einen Fehler verursachen).Es gibt verschiedene besondere Umstände:
gc
,gc<space>
odergc .\
entfernt werden, Fehler wird das Programm schließlich mit etwas Geschmack eines aus Speicherfehler aus (aufgrund wiederholter Selbst Ausführung Anrufe) und wahrscheinlich Absturz die Schale (und vielleicht der Computer). Nicht getestet.<space>.\c.ps1
oder.\c.ps1
entfernt wird, stoppt das Programm und fordert zur Eingabe durch den Benutzer auf. Egal was der Benutzer eingibt, das Programm wird immer noch fehlerhaft sein, da die Anzahl der Größen falsch sein wird.$
und vor dem letzten endet,"
abgeschnitten wird, gibt das Programm alles aus, was übrig bleibt, und anschließend einen Fehler, da era
ungültig ist.Mit folgendem verifiziert:
(Danke an Martin für seine umfangreiche Unterstützung!)
quelle
C (gcc) (Linux
-Werror=undef
), 66 BytesProbieren Sie es online!
Große Herausforderung! Das war täuschend schwer, aber ich bin mir ziemlich sicher, dass ich jetzt ein gültiges Programm habe!
Verwendet einen Präprozessor-Befehl, damit keine Zeilenumbrüche entfernt werden können, da die schließende Klammer
main
nur enthalten ist, wenn__LINE__==6
. Es hält Sie auch davon ab, einfach nurmain
ganz auszuräumen, da dies#endif
schwebend bleibt (es ist also wichtig, dass#endif
es sich außerhalb von befindetmain
).Ich habe verwendet,
#else
weil ich ziemlich überzeugt bin, dass es keine Version gibt, bei der kein__LINE__==6
Teilstring entfernt werden kann und die trotzdem wahr ist, da beide6
und__LINE__
für sich genommen wahr sind. Es wird auch verwendet, damit-Werror=undef
so etwas#ifdef(LINE__)
nicht als falsch bewertet wird, sondern ein Fehler ist.Mit gcc (zumindest unter Linux) wird
puts
die Anzahl der gedruckten Zeichen (einschließlich der nachgestellten Zeilenumbrüche) zurückgegeben. Wenn Sie also einen beliebigen Teil der Zeichenfolge entfernen, wird der Wertputs("...")/6
zurückgegeben0
, sodass1/0
eine Gleitkomma-Ausnahme ausgelöst wird . Beachten Sie, dass diese Ausnahme nur verursacht wird, wenn1/0
sie einem bestimmten Element zugewiesena=
ist. Daher ist die erforderlich.Kein anderer Teil einer Zeile kann entfernt werden, ohne einen Fehler zu verursachen, normalerweise ein Syntaxfehler oder ein Verknüpfungsfehler.
Als Bonus gibt dies eine 86 - Byte - Lösung für C ++ ziemlich trivial, fügen Sie einfach
#include <cstdio>
und erklären ,a
wie einint
. Probieren Sie es online! (C ++)quelle
1/
während Sie die neue Zeile verlassen, und sie wird weiterhin ausgeführt .1
Ich glaube, in der vorherigen Zeile wurde angenommen.=1
. Ich denke, Sie müssen die 1 in eine eigene Zeile setzen.PHP, 73 Bytes
Explination
Ich gehe von der Standardkonfiguration von php.ini aus. Short_tags ist also deaktiviert. Dies bedeutet, dass Sie das nicht
=
aus dem Eröffnungs-Tag entfernen können .Das ist im Grunde genommen
<?=unserialize('s:5:"world"');
.Wenn Sie einen Teil der serialisierten Zeichenfolge entfernen, wird eine Fehlermeldung angezeigt.
Sie können es einfach entfernen
unserialize
und das Skript gibt nur den serialisierten String aus. Um dies zu überwinden, benutze ichcall_user_func
. Das Entfernen eines der Parameter führt zu einem Fehler.Sie können jedoch entfernen
un
, um dieserialize
Funktion aufzurufen . Also nehmen wir 'ns' raus. Das Entfernen von Zeichen würde nicht zu einem falschen Funktionsnamen führen.Wir werden eine Inline verwenden, um die variable Zuweisung mit dem Ausgabe-Tag zu verwenden. Anstatt zu verwenden, verwenden
&&
wir '|' zu verhindern, dass eine einzelne&
oder die$f
Zuordnung entfernt wirdSie könnten entfernen
='ns')&&($f="u{$p}erialize"
und am Ende mit($p)?$f:''
. Deshalb füge ich zusätzliche Klammern hinzu$f="u{$p}erialize"
.Hinweis
Technisch gesehen können Sie die öffnenden Tags entfernen, ohne einen Fehler zu verursachen. Dies ist dann aber kein PHP-Skript mehr, sondern nur noch eine reine Textdatei.
quelle
Matlab (77)
Versuch es
Hinweis:
Im Anschluss an @ Optimiser Rat von einer CPR oder etwas entwerfen, war ich auf unvorhergesehene Teilzeichenfolge konfrontiert , die Führung zu jedem Kompilierungsfehler den Ball hielt , wenn sie entfernt, Beispiel: Entfernen
arrayfun(@(x)a(x),prod(b,ismember(4,1:5))),
von diesem vorherigen bearbeitenfeval(@(a)arrayfun(@(x)a(x),prod(b,ismember(4,1:5))),'world')
tut jeder Fehler generieren! In der letzten Ausgabe gab es auch einige,bsxfun(@(a,b)arrayfun(@(x)(x),prod(b,ismember(4,b))),'world',1:5)
undbsxfun(@(a,b)a,'world',1:5)
wenn Sie gefragt haben, wie es mir ging, als ich sie in meiner Ausgabekonsole herausfand, weinte ich wie ein Baby. Hier ist das Programm:Ein Beispiel für ein nicht ursprüngliches Programm
bearbeiten:
quelle
SmileBASIC, 63 Bytes
quelle
Ein Birnbaum , 17 Bytes
Dieses Programm enthält Bytes mit gesetztem High-Bit (die nicht für UTF-8 gültig sind und daher nicht auf TIO gepostet werden können). Hier ist also ein
xxd
umkehrbarer Hexdump:Erläuterung
Dies ist nur
print'world'
mit einer angehängten Prüfsumme. Ich habe mit brutaler Gewalt überprüft, dass keine der möglichen Löschungen ein Programm mit einer gültigen Prüfsumme enthält, sodass Sie nach einer möglichen Löschung einen Fehler erhalten.Ziemlich langweilig, bindet aber den aktuellen Anführer, daher fand ich es lohnenswert, etwas zu posten.
quelle