Programmvorlage zum Drucken von * beliebigen * Zeichenketten


40

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 , 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.


Der relevante Sandbox-Beitrag ist hier .

Können Sie den Zeichenbereich erläutern, den wir für die eingefügte Zeichenfolge benötigen? ASCII? ASCII + nicht druckbar? Alles von Unicode?
DJMcMayhem

3
Alle 256 Oktette. Ob Sie diese als Bytes oder als Unicode interpretieren, bleibt Ihnen überlassen. Es macht keinen großen Unterschied, wenn es gedruckt wird.

1
Die Absicht der Frage (und die Art und Weise, wie sie derzeit formuliert ist) ist, dass Sie keine zusätzlichen Ausgaben haben können. Hatten Sie eine Lösung im Sinn, die nicht angepasst werden kann, um sie zu vermeiden? (Die Verwendung zusätzlicher Bytes zur Vermeidung von Streuausgaben ist der Erstellung von

1
Wenn dies keine Codeänderung erfordern würde, wäre es trivial AWK, 1würde es einfach tun.
Robert Benson

Antworten:


37

Excel, 1 Byte

'

Ungolfed-Version

'        <-- print the following text,
             and exit the current formula

Ich glaube nicht, dass dies Zeilenumbrüche akzeptieren kann.
Conor O'Brien

3
@ ConorO'Brien tut es mit Shift + Enter
Adam

2
@MrPaulch Das war ziemlich viel Retrotechnik. Ich bin mir ziemlich sicher, dass dieser Befehl einige andere unbekannte Funktionen verbirgt, z. B. das Abstürzen des Systems.
Adam

1
Dies funktioniert auch mit OpenOffice Calc. Es wird automatisch verwendet, wenn Sie eine Zelle auf das Format einstellen @.
Ismael Miguel

1
Persönlich denke ich, dass diese Antwort in Ordnung ist. @Dennis hat meinen Mathematica-Beitrag gelöscht, der das gleiche Konzept verwendet. Das Frontend von Excel speichert test // "" "/// als nicht-wörtliche Zeichenfolge, daher sollte diese nach seiner Logik gelöscht werden. So wird sie gespeichert <Row> <Cell> <Data ss: Type =" Zeichenfolge "x: Ticked =" 1 "> test //" "" /// </ Data> </ Cell> </ Row>
Kelly Lowder

20

Jolf, 6 Bytes

a Lq6(

Erläuterung

a Lq6(
a       print
  L 6   all but the first 6 characters of
   q    the source code
     (  and exit

15

Perl 5 , 30 21 19 Bytes

print <DATA> __ END__

Probieren 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 DATADateihandle gelesen werden können . Wenn wir ein Dateihandle als Argument übergeben print, 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). printVerkettet 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.


2
Ich glaube nicht, dass du brauchst undef$/. Als Argument von print, <DATA>wird im Listenkontext aufgerufen, es sollte also jede Zeile gelesen werden, die es gibt.
Dada

Du hast recht. Die Eingabe wird zeilenweise gelesen, wobei die Zeilentrenner beibehalten und beim Drucken implizit alle verkettet werden, so dass es nicht erforderlich ist, zuerst zu schlürfen. Das spart ebenfalls 8 Byte. Ich werde die Post reparieren.

4
Sie können __END__anstelle von verwenden __DATA__.
Ninjalj

Was @ninjalj sagt, und Sie können den Zeilenumbruch nach dem Größer-als-Zeichen weglassen (aber Sie brauchen den Zeilenumbruch am Ende des Programms).
b_jonas

14

Zsh, 6 Bytes

<<'
'

Es gibt einen nachgestellten Zeilenumbruch. Der String wird am Ende des Programms eingefügt.

Bash, 20 17 Bytes

Vielen Dank an Adam für das Entfernen von 3 Bytes.

exec sed 1d "$0"

* Nix Shell-Skript, 21 14 Bytes

Vielen Dank an Adam für das Entfernen von 7 Bytes.

#!/bin/sed 1d

1
@Copper Es gibt einen nachgestellten Zeilenumbruch. Die Zeichenfolge wird danach eingefügt.
Jimmy23013

Ah ich sehe. Danke, dass du mich verbessert hast!
Kupfer

Die 6/9-Byte-Lösungen scheinen für mich einen Fehler im Interpreter auszunutzen (natürlich nicht, dass das nicht erlaubt ist). (AFAICT mit einigem Experimentieren suchen sie nach einer neuen Zeile in einer eigenen Zeile, aber die Zeilen werden durch Aufteilen in neue Zeilen definiert, so dass eine neue Zeile in einer eigenen Zeile niemals vorkommen kann.) Die zshLösung scheint korrekt zu sein; Die 9-Byte- bashLösung ist jedoch falsch (sie fügt eine nachgestellte Zeile hinzu, wenn die Datei keine hat).

@ ais523 Schien mir auch ein Fehler zu sein. Und ich hatte nicht damit gerechnet, dass sie von den Dolmetschern zugelassen werden. Die Bash-Lösung wurde entfernt.
Jimmy23013

1
Für Bash können Sie sed 1danstelle vontail -n+2
Adam

13

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 catProgramm 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- catProgramm 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.


1
,[.,]!funktioniert hier und ist 6 Bytes (einfach das markierte Kästchen ankreuzen !). Auch es endet.
FinW

@FinW: Ich kann nicht herausfinden, wie man ein NUL-Byte in diese Website eingibt, aber dieser Code würde definitiv vorzeitig enden, wenn er eines sehen würde.

es funktionierte gut ohne ein NUL-Byte, als ich es tat.
FinW

1
Sie haben buchstäblich eine ,(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.

Wenn der Interpreter jedoch keine Eingabe liest (z. B. das Ende der Zeichenfolge nach dem !), setzt er das aktuelle Bandelement automatisch auf 0 und beendet damit die Schleife.
FinW

9

Dyalog APL , 11 Bytes

Das Folgende ist der Körper der Funktion f :

2↓⎕CR'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

Verlassen



9

JavaScript + HTML5 DOM, 163 Bytes

<html><body><script>fetch(location).then((r)=>r.text().then((t)=>console.log(t.slice(145,t.lastIndexOf("</b")))));document.body.remove()</script></body></html>

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. Puttenwhile(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.


1
Chrome hat sich in letzter Zeit über Parser-Blocking-Skripte geärgert und beklagt sich darüber. Ich mag die Idee, den Parser absichtlich zu blockieren , um zu verhindern, dass ein Skript Ihren Druckversuch ruiniert.

7

PHP, 46 Bytes

(einschließlich des abschließenden Zeilenumbruchs)

<?=join([""]+file(__FILE__));halt_compiler();
STRING HERE

Ja, auch die fileFunktion ist binärsicher.

[""]+ Ersetzt den 0-Index (erste Zeile der Datei) durch eine leere Zeichenfolge


6

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!


5

PHP 94 Bytes

<?$f=fopen(__FILE__,'rb');fseek($f,93);while(false!==($c=fgetc($f)))echo$c;__halt_compiler();

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.


1) Ich zähle 93 Bytes, nicht 94. 2) false!==$c=...braucht keine Klammern. 3) rbbraucht keine Anführungszeichen. 4) Sie können ein Byte mit for($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();
Titus

6) und weitere zwei Bytes, wenn Sie den zweiten Parameter für weglassen fgetsund der Vorlage einen nachgestellten Zeilenumbruch hinzufügen.
Titus


3

PHP, 48 60 Bytes

<?=substr(file_get_contents(__FILE__),60);__halt_compiler();STRING HERE

Gerade wurde klar, dass das Schließen von PHP den String nicht daran hindert, ihn zu enthalten <?.


Sie haben eine falsch platzierte schließende Klammer. Sehr viel übersichtlicher als bei meinem Versuch, dachte ich, substr () würde an null Bytes ersticken - raten Sie nicht.
ToXik-yogHurt

Versuchen Sie folgendes: <?die(substr(file_get_contents(__FILE__),48))?>STRING HERE. Sollte arbeiten. Ich habe es mit versucht <?die('a')?>und es hat funktioniert.
Ismael Miguel

@IsmaelMiguel wird nicht funktionieren. diedruckt den Parameter nicht aus, sondern sendet ihn als Exit Code. Das müsste sein die(print ...).
Titus

@ ToXik-yogHurt Die meisten String-Funktionen sind binär sicher. sogar file. Eigentlich fällt mir momentan gar nichts ein.
Titus

@ Titus Trydie('text');
Ismael Miguel

2

Binäre Lambda-Rechnung , 1 Byte

 [text goes here]

Das ist ein einzelnes Leerzeichen (0x20) vor dem Text.

Probieren Sie es online!

Wie es funktioniert

0x20 = 00100000 2 wird analysiert als

00    λx.
01        x
0000  (ignored, can be anything)

(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.


Warum werden aus Interesse die nachgestellten Null-Bits zwischen der Identitätsfunktion und der Einfügung nicht wiedergegeben?

@ ais523 Der Interpreter liest jeweils ein Byte und einmal λ x . x wurde geparst, die Polsterung wurde bereits verbraucht.
Anders Kaseorg

2

Bash, 17 Bytes

tail -n+3 $0
exit
<string here>

Entwickelt unabhängig von der Antwort von jimmy23013 .


Meinst du nicht $0? Abgesehen davon denke ich, dass es funktioniert (ich habe bestätigt, dass es danach nichts mehr analysiert exit).

@ ais523 Behoben! Vielen Dank.
25.


1

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

'[Your Text Here]

z.B:

'Hello 
World

Sofortfensterfunktion, 5 + 1 = 6 Bytes

?[A1]

+1 Byte für a 'in Zelle A1


0

Vim (im Ex-Modus), 28 Bytes

#!/bin/ex -c ':1d' -c ':wq'
[string]

28 Bytes enthalten die letzte Zeile.


0

Vim, 738 Bytes

:imap <esc> <c-v><esc>
:imap <c-a> <c-v><c-a>
:imap <c-b> <c-v><c-b>
:imap <c-c> <c-v><c-c>
:imap <c-d> <c-v><c-d>
:imap <c-e> <c-v><c-e>
:imap <c-f> <c-v><c-f>
:imap <c-g> <c-v><c-g>
:imap <c-h> <c-v><c-h>
:imap <c-i> <c-v><c-i>
:imap <c-j> <c-v><c-j>
:imap <c-k> <c-v><c-k>
:imap <c-l> <c-v><c-l>
:imap <c-m> <c-v><c-m>
:imap <c-n> <c-v><c-n>
:imap <c-o> <c-v><c-o>
:imap <c-p> <c-v><c-p>
:imap <c-q> <c-v><c-q>
:imap <c-r> <c-v><c-r>
:imap <c-s> <c-v><c-s>
:imap <c-t> <c-v><c-t>
:imap <c-u> <c-v><c-u>
:imap <c-v> <c-v><c-v>
:imap <c-w> <c-v><c-w>
:imap <c-x> <c-v><c-x>
:imap <c-y> <c-v><c-y>
:imap <c-z> <c-v><c-z>
:imap <c-@> <c-v><c-@>
:imap <c-\> <c-v><c-\>
:imap <c-]> <c-v><c-]>
:imap <c-^> <c-v><c-^>
:imap <c-?> <c-v><c-?>
i

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.

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.