^"
>#001p#"<>:#,_@#1-8*3:-1*57+55-1*79*57:-1:*77**278\-1:*57$p:1: error: declaration expected
Probieren Sie es online !: Befunge-93 , C
Vielen Dank an randomdude999 für die Feststellung, dass für den Dateinamen passende Anführungszeichen erforderlich sind.
Muss unter dem Dateinamen gespeichert werden ^"\n>#001p#"<>:#,_@#1-8*3:-1*57+55-1*79*57:-1:*77**278\-1:*57$p
, wo \n
sich ein Zeilenumbruch befindet. Aus diesem Grund läuft das TIO für C nicht genau wie vorgesehen. Getestet, um an Lubuntu zu arbeiten.
Erklärung (C):
Das Programm kann nicht kompiliert werden und tcc gibt den Namen der Datei als Teil der Fehlermeldung aus. Abhängig vom Anfang des Codes können mehrere Kompilierungsfehler auftreten. ^
Am Anfang gibt uns eine declaration expected
, die kurz ist und keine problematischen Zeichen wie enthält "
. Andererseits sind die Entwickler von gcc und clang sehr pessimistisch und haben sich dafür entschieden, mehrere Fehler gleichzeitig auszugeben, was nicht sehr nett ist, sodass wir ihre Compiler nicht verwenden.
Erklärung (Befunge-93):
Befunge ist für Quines insofern praktisch, als sein Code dank des "
Befehls, mit dem der String-Modus umgeschaltet wird, auch als Zeichendaten verwendet werden kann . Zu Beginn führen wir einige nutzlose Stapeloperationen durch und geben dann einen p
(put-Befehl) aus, der ein NUL-Zeichen auf (0, 1) setzt. Dann spiegeln wir den Anweisungszeiger nach links und beginnen, alles als Zeichenfolge zu lesen. Dies muss aufgrund des LIFO-Charakters des Stacks auf der linken Seite erfolgen. Nach dem Umbrechen und erneutem Erreichen des "
Zeichens endet die Zeichenfolge. Beachten Sie, dass das Zeichen NUL das Zeichen ersetzt$
Zeichen, wodurch ein Trennzeichen in der Mitte der Zeichenfolge erstellt wird. Wir schieben dann 3 Zahlen auf den Stapel und springen über die NUL (da der Interpreter leider hängt, wenn er als Anweisung ausgeführt wird). Der statische Teil der Fehlermeldung muss hier ausgeführt werden. Die meisten seiner Zeichen sind No-Ops, aber der p
Befehl verbraucht drei Argumente (daher haben wir 3 Zahlen gedrückt, sonst würde ein Teil der Zeichenfolge hier gefressen), und :
& 1
Zeichen drücken insgesamt 4 Werte auf den Stapel, denen wir entgegenwirken mit a p
und a $
(pop and discard) Anweisung. Dann wird eine gewisse Arithmetik ausgeführt, um die ASCII-Codes zu verschieben, ^"\n>#001p#"
und schließlich druckt eine Schleife alle Werte auf dem Stapel als Zeichen aus, bis sie ein NUL-Zeichen findet und endet.