Schreiben Sie ein Programm mit folgenden Eigenschaften:
Wenn das Programm so ausgeführt wird, wie es ist, erzeugt es keine Ausgabe (dh 0 Bytes Ausgabe).
Es gibt eine Position innerhalb des Programms (nach Wahl: am Anfang, am Ende oder irgendwo in der Mitte) mit der folgenden Eigenschaft: Wenn Sie das Programm durch Platzieren einer beliebigen Zeichenfolge dort ändern, wird diese Zeichenfolge vom resultierenden Programm gedruckt, wenn hingerichtet.
Dies muss unabhängig davon funktionieren, ob die Zeichenfolge Anführungszeichen, umgekehrte Schrägstriche, Kommentarzeichen, Begrenzer, NUL-Bytes usw. enthält. Unabhängig davon, was Sie dort platzieren, wird die Zeichenfolge weiterhin als Zeichenfolge interpretiert und vollständig wörtlich gedruckt. Es kann jedoch vorkommen, dass sehr sehr lange Zeichenfolgen nicht verarbeitet werden, wenn dem Compiler der Speicherplatz ausgeht oder dergleichen (genauer gesagt, Sie sollten mindestens in der Lage sein, Zeichenfolgen mit einer Länge von bis zu 1000 Byte oder dem Dreifachen der Länge zu verarbeiten) Dauer Ihres Programms (je nachdem, welcher Zeitraum länger ist).
Ein Beispiel für eine ungültige Lösung wäre
print("");
# ^ text goes here
in Python, Perl, Ruby usw .; Obwohl es für viele Zeichenfolgen funktioniert, funktioniert es nicht für eine Zeichenfolge, die ein doppeltes Anführungszeichen enthält, oder für eine Zeichenfolge, die die Teilzeichenfolge enthält \n
(die als Zeilenvorschub interpretiert wird).
Beachten Sie, dass dieses Problem in den meisten Sprachen wahrscheinlich unmöglich ist. Die Herausforderung besteht zumindest teilweise darin, eine Sprache zu finden, in der sie funktioniert. Ihre gewählte Sprache muss eine Programmiersprache gemäß der Definition dieser Site sein , z. B. keine Einreichung einer Lösung in Text .
Da dies ein Code-Golf ist , gewinnt die kürzeste Programmvorlage. Lassen Sie sich jedoch nicht davon abhalten, Lösungen einzureichen, auch wenn sie den aktuellen Gewinner nicht schlagen können! Sie können immer noch um den zweiten, dritten usw. Platz kämpfen oder einfach so viele Antworten wie möglich finden. Sie sollten jedoch sicherstellen, dass Ihr Programm die gesamte Spezifikation erfüllt, bevor Sie es einreichen. ungefähre Lösungen würden den Punkt des Problems verfehlen.
AWK
,1
würde es einfach tun.Antworten:
Excel, 1 Byte
Ungolfed-Version
quelle
@
.Jolf, 6 Bytes
Erläuterung
quelle
Perl 5 ,
302119 BytesProbieren Sie es online!
Hinterer Zeilenumbruch. Hierbei wird eine Perl-Funktion verwendet, mit der beliebige Daten an die Quelldatei angehängt werden können, die dann über das
DATA
Dateihandle gelesen werden können . Wenn wir ein Dateihandle als Argument übergebenprint
, erhält es einen Listenkontext, der bewirkt, dass das Dateihandle eine Liste aller Zeilen in der Datei zurückgibt, einschließlich der Zeilenumbrüche (ebenso wird ein Zeilenumbruch in der letzten Zeile weggelassen).print
Verkettet sie dann implizit alle, macht die Aufteilung in Zeilen rückgängig und gibt uns die exakte ursprüngliche Zeichenfolge, unabhängig davon, wo sich die Zeilenumbrüche befanden.Dank @Dada, der erkannte, dass es nicht nötig war, die Zeilenumbrüche manuell zu bearbeiten, und @ninjalj und @b_jonas, die jeweils einen Charakter entdeckten, der abgespielt werden konnte.
quelle
undef$/
. Als Argument vonprint
,<DATA>
wird im Listenkontext aufgerufen, es sollte also jede Zeile gelesen werden, die es gibt.__END__
anstelle von verwenden__DATA__
.Zsh, 6 Bytes
Es gibt einen nachgestellten Zeilenumbruch. Der String wird am Ende des Programms eingefügt.
Bash,
2017 BytesVielen Dank an Adam für das Entfernen von 3 Bytes.
* Nix Shell-Skript,
2114 BytesVielen Dank an Adam für das Entfernen von 7 Bytes.
quelle
zsh
Lösung scheint korrekt zu sein; Die 9-Byte-bash
Lösung ist jedoch falsch (sie fügt eine nachgestellte Zeile hinzu, wenn die Datei keine hat).sed 1d
anstelle vontail -n+2
Brainfuck ( Unreadable Brainfuck ), 9 Bytes
Fügen Sie die Eingabe an das Ende an. Diesmal gibt es keinen nachgestellten Zeilenumbruch.
Auf der Suche nach Sprachen, die Eingaben am Ende des Programms akzeptieren würden, schien Brainfuck eine eindeutige Möglichkeit zu sein. Viele in Esolangs geschriebene Brainfuck-Interpreten nehmen sowohl das Programm als auch dessen Eingabe von der Standardeingabe und benötigen daher eine Möglichkeit, zwischen ihnen zu unterscheiden. Es gibt eine Konvention, die in diesem Fall verwendet wird, dass ein
!
Zeichen zwischen dem Programm und der Eingabe unterscheidet, ein Trick, der oft verwendet wird, um kurze Brainfuck-Programme wie z,[.,]!Hello, world!
. Dies erzeugt im Grunde genommen einen anderen Dialekt für Brainfuck, der!
eine andere Bedeutung als normal hat.Theoretisch könnten wir also nur einen dieser Interpreten finden und ihm ein
cat
Programm geben, um die Spezifikation zu erfüllen. Es gibt jedoch eine große Subtilität; Brainfuck verwendet normalerweise 256 Werte für jede Zelle, es gibt 256 Oktette und eines muss für EOF verwendet werden. Wenn wir also alle 256 Oktette buchstäblich wiedergeben möchten, können wir EOF überhaupt nicht erkennen und müssen das Programm auf eine andere Weise beenden. Mit anderen Worten, wir müssen eine Implementierung finden, die entweder den 256 Oktetten und EOF 257 unterschiedliche Werte gibt oder die bei EOF abstürzt.Geben Sie Unreadable ein . Es gibt einen Brainfuck-Interpreter in Unreadable, der dieser Herausforderung vorausgeht und Eingaben nach einem akzeptiert
!
. Außerdem werden im Gegensatz zu den meisten Brainfuck-Interpreten Bignum-Zellen und -1 für EOF verwendet, sodass EOF von den anderen 256 möglichen Oktetten unterschieden werden kann. Mit Unreadable Brainfuck als spezifischem Interpreter für das Programm können wir die Herausforderung in nur 9 Bytes lösen, indem wir ein Brainfuck-cat
Programm schreiben , das bei EOF = -1 anhält.Kann man es besser machen? Nun, wir könnten das folgende 7-Byte-Programm ausprobieren, das versucht, EOF am Ende des Strings auszugeben, bevor es aus der Schleife ausbricht:
Das Verhalten dieses Programms hängt vom Verhalten des Unreadable-Interpreters bei Fehlerbedingungen ab (daher hängt es nicht nur von der Implementierung von Brainfuck ab, sondern auch von der Implementierung, mit der die Implementierung von Brainfuck ausgeführt wird). Leider gibt der von mir verwendete unlesbare Interpreter Fehler in der Standardausgabe aus , was bedeutet, dass diese Speicherung nicht funktioniert. Wenn jemand einen unlesbaren Interpreter kennt, der bei dem Versuch, EOF auszugeben, beendet wird oder den Versuch stillschweigend überspringt, lassen Sie es mich wissen. Das wäre genau dort eine Sieben-Byte-Lösung.
quelle
,[.,]!
funktioniert hier und ist 6 Bytes (einfach das markierte Kästchen ankreuzen!
). Auch es endet.,
(Standardeingabe in das aktuelle Bandelement lesen) gefolgt von einer]
(Endeschleife, wenn das aktuelle Bandelement 0 ist). Das Lesen eines Eingangsbytes mit dem Wert 0 (dh NUL) würde somit die Schleife unterbrechen.!
), setzt er das aktuelle Bandelement automatisch auf 0 und beendet damit die Schleife.Dyalog APL , 11 Bytes
Das Folgende ist der Körper der Funktion f :
Es gibt einen abschließenden Zeilenumbruch, nach dem alles eingefügt werden kann.
2↓
lassen Sie die ersten beiden Zeilen (Überschrift und diese Zeile) von fallen⎕CR'f'
das C HARACTER R ePresentation von f⋄
dann→
Verlassenquelle
Ruby, 20 Bytes
Die Eingabe erfolgt am Ende (nach dem abschließenden Zeilenumbruch). Die
DATA
Redewendung ist eine von vielen, die Ruby von Perl gestohlen hat .Versuchen Sie es auf eval.in: https://eval.in/684370
quelle
JavaScript + HTML5 DOM, 163 Bytes
Sie können alles, was Sie möchten, direkt vor dem schließenden Body-Tag einfügen. Dies funktioniert, indem die Seitenquelle abgerufen und der Eröffnungscode und die schließenden Tags entfernt werden.
Der wahre Kicker war, herauszufinden, wie man einer Endlosschleife entkommt. Putten
while(true){}
der Seite werden alle Rückrufe für immer blockiert, die Ausführung wird eingefroren, und JavaScript hat keine Möglichkeit, den Hauptthread anzuhalten. Code, der nicht mehr vorhanden ist, wird jedoch nie ausgeführt, sodass der Dokumentkörper im allerletzten Befehl seppuku festschreibt und sich selbst löscht, während er auf das Laden seines Klons wartet.Ja, es ist lang und rund, aber die Tatsache, dass es in JS möglich ist, ist schon erstaunlich.
quelle
PHP, 46 Bytes
(einschließlich des abschließenden Zeilenumbruchs)
Ja, auch die
file
Funktion ist binärsicher.[""]+
Ersetzt den 0-Index (erste Zeile der Datei) durch eine leere Zeichenfolgequelle
gs2 , 4 bytes
Verwendet die CP437-Codierung. Die Zeichenfolge geht am Ende.
╥
Ruft den Quellcode ab,¶
drückt 4,=
löscht so viele führende Zeichen und beendet das Programm☼
.Probieren Sie es online!
quelle
PHP 94 Bytes
Platzieren Sie Ihre Zeichenfolge nach dem letzten Semikolon.
Yay für obskure Funktionen, denke ich? __halt_compiler () macht genau das, was Sie vom Namen erwarten. Der vorherige Code öffnet nur die Datei und schreibt alle Bytes nach dem letzten Semikolon an stdout. NUL, BEL usw. kommen gut raus. Unicode-Literale (♪) stören Windows, aber ich denke, das ist nur Windows cmd, das bei Unicode fehlschlägt.
quelle
false!==$c=...
braucht keine Klammern. 3)rb
braucht keine Anführungszeichen. 4) Sie können ein Byte mitfor($f=fopen(...),fseek($f,88);false!==(...);)echo$c;
5) zwei weiteren Bytes kürzer speichern :<?for($f=fopen(__FILE__,rb);false!==$s=fgets($f,86);)echo$i++?$s:"";__halt_compiler();
fgets
und der Vorlage einen nachgestellten Zeilenumbruch hinzufügen.Perl 6 , 23 Bytes
Die Zeichenfolge beginnt in der neuen Zeile nach
=finish
.quelle
PHP,
4860 BytesGerade wurde klar, dass das Schließen von PHP den String nicht daran hindert, ihn zu enthalten
<?
.quelle
<?die(substr(file_get_contents(__FILE__),48))?>STRING HERE
. Sollte arbeiten. Ich habe es mit versucht<?die('a')?>
und es hat funktioniert.die
druckt den Parameter nicht aus, sondern sendet ihn als Exit Code. Das müsste seindie(print ...)
.file
. Eigentlich fällt mir momentan gar nichts ein.die('text');
Binäre Lambda-Rechnung , 1 Byte
Das ist ein einzelnes Leerzeichen (0x20) vor dem Text.
Probieren Sie es online!
Wie es funktioniert
0x20 = 00100000 2 wird analysiert als
(Tatsächlich
!"#$%&\'()*+,-./
funktioniert also jeder der Charaktere gleich gut.)Da dies ein vollständiger Ausdruck ist, wird der Rest des Programms als Eingabedaten interpretiert, und unter den I / O-Konventionen der binären Lambda-Berechnung wird die Identitätsfunktion λ x. x kopiert die Eingabe direkt in die Ausgabe.
quelle
Bash, 17 Bytes
Entwickelt unabhängig von der Antwort von jimmy23013 .
quelle
$0
? Abgesehen davon denke ich, dass es funktioniert (ich habe bestätigt, dass es danach nichts mehr analysiertexit
).RProgN , 19 Bytes
Beachten Sie das nachfolgende Leerzeichen.
Fügen Sie einen beliebigen Text nach diesem Block ein, und es wird gedruckt.
Basierend auf Lynns gs2 Antwort .
Probieren Sie es online!
quelle
Excel VBA, 6 Bytes
Dies dient hauptsächlich der Beantwortung der Frage, wie der in Adams Antwort enthaltene Text gedruckt werden soll auf das Direktfenster in der VBA-Umgebung enthaltene werden soll
Grundeinstellung:
Verwenden Sie im aktiven Blatt in Zelle A1 die folgende Formel, um die zu druckende Zeichenfolge zu speichern. Um die Bytes zu zählen, wird 1 Byte addiert
z.B:
Sofortfensterfunktion, 5 + 1 = 6 Bytes
+1 Byte für a
'
in Zelle A1quelle
Vim (im Ex-Modus), 28 Bytes
28 Bytes enthalten die letzte Zeile.
quelle
Vim, 738 Bytes
Bindet alle Steuerzeichen im Einfügemodus erneut an
<c-v>
, gefolgt von dem Steuerzeichen, das sie buchstäblich . ^ _ (Einheitentrenner) scheint kein erneutes Binden zu erfordern, da es standardmäßig wörtlich ausgegeben wird.Der variable Text kommt natürlich am Ende.
quelle