In dieser Herausforderung sollten Sie ein Programm oder eine Funktion schreiben, die keine Eingabe akzeptiert und eine Zeichenfolge mit der gleichen Anzahl von Bytes wie das Programm selbst ausgibt oder zurückgibt. Es gibt einige Regeln:
- Sie dürfen nur Bytes im druckbaren ASCII-Bereich (0x20 bis einschließlich 0x7E) oder Newlines (0x0A oder 0x0D) ausgeben.
- Ihr Code darf kein Quine sein, daher müssen sich der Code und die Ausgabe in mindestens einem Byte unterscheiden.
- Ihr Code muss mindestens ein Byte lang sein.
- Wenn Ihre Ausgabe nachgestellte Zeilenumbrüche enthält, sind diese Teil der Bytezahl.
- Wenn für Ihren Code nicht standardmäßige Befehlszeilenflags erforderlich sind, zählen Sie diese wie gewohnt (dh, indem Sie die Differenz zu einem Standardaufruf der Implementierung Ihrer Sprache zur Byteanzahl hinzufügen), und die Länge der Ausgabe muss mit der Punktzahl Ihrer Lösung übereinstimmen. Wenn Ihr Programm beispielsweise
ab
ein nicht standardmäßiges Flag benötigt-n
(wir gehen davon aus, dass es nicht mit Standard-Flags kombiniert werden kann, also 3 Byte), sollten Sie insgesamt 5 Byte ausgeben. - Die Ausgabe muss nicht immer gleich sein, solange Sie nachweisen können, dass jede mögliche Ausgabe die oben genannten Anforderungen erfüllt.
- Übliche quine Regeln nicht gelten. Sie können den Quellcode oder seine Größe lesen, aber ich bezweifle, dass dies in den meisten Sprachen kürzer ist als das Hardcodieren.
Sie können ein Programm oder eine Funktion schreiben und eine der Standardmethoden zur Ausgabe verwenden. Beachten Sie, dass Sie beim Drucken des Ergebnisses entweder die Standardausgabe oder den Standardfehlerstrom verwenden können, aber nur einer von ihnen zählt.
Sie können jede Programmiersprache verwenden , beachten Sie jedoch, dass diese Lücken standardmäßig verboten sind.
Das ist Code-Golf , also gewinnt die kürzeste gültige Antwort - gemessen in Bytes .
Bestenliste
code-golf
self-referential
Martin Ender
quelle
quelle
Antworten:
C (modernes Linux), 19 Bytes
Beim Kompilieren und Ausführen wird Folgendes ausgegeben:
quelle
Excel, 11 Bytes
Norwegische Sprachversion:
Englische Sprachversion (12 Bytes):
Erzeugt eine n-stellige Zahl und konvertiert sie in Text, indem sie in Kleinbuchstaben konvertiert.
quelle
=9^7&""
was eine 7-stellige Zahl in jeder Sprache erzeugt und nur 7 Bytes beträgt.Labyrinth , 4 Bytes
Probieren Sie es online!
Druckt
0000
Erläuterung
quelle
Bash (nur Builtins), 8 Bytes
Drucke
cho cho
und eine Newline.quelle
Netzhaut , 2 Bytes
Probieren Sie es online!
Ausdrucke
0
und ein Zeilenvorschub.Es gibt viele 2-Byte-Lösungen, aber ich halte dies für optimal. Standardmäßig druckt die Netzhaut immer eine nachgestellte neue Zeile, und es dauert zu viele Bytes, bis sie entfernt ist. Wir müssten also ein 1-Byte-Programm finden, das die leere Eingabe unverändert lässt. Ich glaube, das einzige Programm, das dies tut, ist das Programm, das einen einzelnen Zeilenvorschub enthält, der daher der Ausgabe entspricht und daher von der Herausforderung nicht zugelassen wird.
Am einfachsten ist es, mit Retina zu leben, die eine einzelne Ziffer ausgibt (die Anzahl der Übereinstimmungen einiger regulärer Ausdrücke mit der leeren Eingabe), und dies können wir mit vielen fehlgeschlagenen (oder übereinstimmenden) 2-Byte-Mustern tun.
quelle
Mathematica, 2 Bytes
Fakultät
quelle
C 20 Bytes
Gibt eine Zahl aus, die mit Leerzeichen bis zu einer Länge von 20 aufgefüllt ist. (Welche Zahl? Was auch immer als Nächstes im Speicher vorkommt.)
Einige Beispiele laufen auf meinem System:
Es ist eine Schande, dass die Ausgabe keine willkürlichen Bytes sein kann, denn das hätte diese 19-Byte-Lösung ermöglicht:
Die Ausgabe von 19 Byte Junk beginnt bei
f
der Adresse.quelle
%esi
Registers.Bash unter Linux, 6
(gefolgt von einer neuen Zeile)
Ausgaben
Linux
gefolgt von einem Zeilenumbruch.quelle
uname
ist es keine Bash-Version - es ist eine separate ausführbare Dateiuname
als Bash Builtin? Jede Distribution, die ich gerade in die Hand nehmen kann, ist eine separate Binärdatei, einschließlich TIO . Umgekehrt ist, wie Ihre verknüpfte Antwort zeigt,umask
ein Bestandteil der meisten / aller Shells.uname
als builtin. Als ich "-1 und tatsächlich ein eingebautes" sagte, meinte ich "Diese Antwort verwendetumask
-1 Bytes undumask
ist tatsächlich ein eingebautes".Javascript ES6, 9 Bytes
Verwenden von Vorlagenzeichenfolgen
quelle
undefined
als Zeichenfolge angesehen?(_=>_+'')
.Pyramidenschema ,
744342 BytesDank Khuldraeseth na'Barya 31 Bytes gespart! Dank der überarbeiteten JoKing-Lösung 1 Byte gespart!
Probieren Sie es online! Gibt die 41-stellige Nummer aus
28^28 = 33145523113253374862572728253364605812736
, gefolgt von einer nachgestellten Zeile.Alte Version
Probieren Sie es online!
Ausgänge
71277303925397560663333806233294794013421332605135474842607729452115234375
=160651015 ** 9
oder ungefähr 10 74 .quelle
Python 2 , 9 Bytes
Dies druckt
set([1])
und ein Zeilenvorschub.Probieren Sie es online!
quelle
print
gibt es keine kürzeren Lösungen, und die einzigen 9 Bytes sind Varianten davon und von Luis Mendoprint 1e5
.Python 2 , 9 Bytes
Die angezeigte Ausgabe enthält eine nachgestellte Newline.
Probieren Sie es online!
quelle
Brainfuck , 25 Bytes
Probieren Sie es online! Anmerkung: Erfordert eine Implementierung mit 8-Bit-Zellen ohne Vorzeichen
Ausgabe:
Erläuterung
quelle
.
das das nicht druckbareNULL
Zeichen druckt ?C (Ideone), 14 Bytes
Auf Ideone , das seine ausführbare Datei benennt
prog
, wird das Folgende mit einem nachgestellten Zeilenumbruch ausgegeben.C (GCC), 15 Bytes
Da GCC
a.out
standardmäßig eine ausführbare Datei mit dem Namen schreibt (da keine zusätzlichen Flags vorhanden sind, die Byte kosten würden), wird die folgende Zeile mit einem nachgestellten Zeilenumbruch ausgegeben.quelle
C (gcc) ,
18 bis17 BytesBeachten Sie, dass sich zwischen und ein STX-Byte ( 0x02 ) befindet .
@
C
Probieren Sie es online!
Portabilität
Dies wurde mit gcc 6.3.1 und clang 3.9.1 unter Fedora 25, gcc 4.8.4 unter Ubuntu 14.04.4 und gcc 4.8.3 unter openSUSE 13.2 getestet und gibt die folgende Ausgabe aus.
Ich gehe davon aus, dass dies mit allen gcc-Versionen die gleiche Ausgabe liefert, sofern es zu einer ausführbaren Datei des folgenden Typs kompiliert wird.
Unterschiedliche Plattformen erfordern eine unterschiedliche Speicheradresse und möglicherweise eine unterschiedliche Reihenfolge für die Bytes in der aus mehreren Zeichen bestehenden Zeichenkonstante.
Zum Beispiel ersetzt
@\2C
mit@\2\4
drucktexec/ld-elf.so.1
und eine neue Zeile auf FreeBSD 11 mit Klirren 3.8.0.Offline-Überprüfung
Wie es funktioniert
Standardmäßig verwendet ld 0x400000 als Basisadresse des Textsegments, was bedeutet, dass der Inhalt des ELF ab der Speicheradresse 0x400000 gefunden wird .
Die ersten 640 Bytes des ELF sind weitgehend unabhängig vom eigentlichen Quellcode. Wenn beispielsweise die Erklärung von f durch folgt
main(){f();}
und nichts anderes, sie sehen aus wie folgt.Die Verwendung von beispielsweise
main(int c, char**v){f();}
ändert stattdessen einige Bytes, jedoch nicht den Versatz der Zeichenfolge/lib64/ld-linux-x86-64.so.2
, mit dem die Ausgabe erfolgt.Der Offset dieser Zeichenfolge beträgt 0x238 und ist 27 Byte lang. Wir wollen nur 17 Bytes ausgeben (und das letzte wird eine neue Zeile sein, wenn wir verwenden
puts
), also addieren wir 11 zum Offset, um 0x243 , den Offset von, zu erhalteninux-x86-64.so.2
. Das Hinzufügen von 0x400000 und 0x243 ergibt 0x400243 , den Speicherort voninux-x86-64.so.2
.Um diese Speicheradresse zu erhalten, können wir aus mehreren Zeichen bestehende Zeichenkonstanten verwenden, die ein implementierungsdefiniertes Verhalten aufweisen. 0x400243 ist (64) (2) (67) in der Basis 256, und die aus mehreren Zeichen bestehenden Zeichenkonstanten von gcc verwenden die Big-Endian-Bytereihenfolge, sodass
'@\2C'
die Speicheradresse der gewünschten Zeichenfolge ermittelt wird.Zum Schluss wird
puts
der (nullterminierte) String an diesem Speicherort und in einer nachgestellten Zeile ausgegeben, wodurch 17 Byte Ausgabe erstellt werden.quelle
U
beim Kompilieren mit-Df=main
.U
beim kompilieren mitmain(){f();}
.Selbstmodifizierender Brainfuck , 5 Bytes
Probieren Sie es online!
Ausgabe:
Erläuterung:
Ganz einfach, druckt die Quelle in umgekehrter Reihenfolge. In SMBF wird der Inhalt des Programms links von der Anfangsposition des Zeigers auf dem Band gespeichert. Wenn Sie nach links gleiten und drucken, wird der Quellcode rückwärts ausgegeben.
Da das Lesen von Quellen in dieser Challenge erlaubt ist, sollte dies definitiv innerhalb der Regeln liegen.
quelle
Grundrechenart , 2 Bytes
1=
Drucke
1.
oder:auf diesen albernen Siebensegmentanzeigen.
Um zu reproduzieren, nimm einen beliebigen Taschenrechner. Alle haben diese Programmiersprache irgendwie installiert.
quelle
1.
statt1x
? Auch dies ist eine Quine, die von den Regeln nicht zugelassen ist.1=
ich hab 's versaut. Ich meinte,1x
als implizit gleich, aber ich habe vergessen, dass=
das ein Knopf ist.1
auf meinem TI-36 und TI-84 CE ausgegeben. Zählen diese nicht zu den "Grundrechnern"?Fourier,
262220 BytesProbieren Sie es auf FourIDE!
Ausgänge:
Für eine korrekte Großschreibung sind es 4 zusätzliche Bytes:
Probieren Sie es auf FourIDE!
RIP Adam West
quelle
Brachylog , 1 Byte
Probieren Sie es online!
Erläuterung
w
ist das eingebaute "schreiben". Hier wird der Eingang geschrieben. Da die Eingabe eine freie Variable ist,w
wird sie vor dem Drucken als Ganzzahl gekennzeichnet. Die erste Ganzzahl, die es versucht, ist0
.quelle
Here, it will write the Input.
Ist 'the Input' das Programm selbst? Gilt das nicht als Lesen der Quelle, die standardmäßig in einem Quine betrügt?Java (OpenJDK 8) , 11 Byte
Probieren Sie es online!
Ausgabe:
Nur ein bisschen ausgefeilter als die offensichtliche Antwort
()->"".format("%23s",0)
.Speichert
quelle
()->1E10-1+""
,"9.999999999E9" (13)
spart drei weitere Bytes1e10
in1e9
oder 2 Byte durch Verwenden eines leeren Eingangs statt()
wieo->1e8-1+""
folgt9.9999999E7
speichern : (Ausgänge ; Länge & Byteanzahl 11 ).05AB1E , 1 Byte
Gibt einen einzelnen Zeilenumbruch aus.
õ
drückt eine leere Zeichenkette und wird implizit mit einem Zeilenumbruch ausgegeben.Probieren Sie es online!
Einige andere 2-Byte-Lösungen für Ihr Sehvergnügen (die Ausgabe befindet sich in den Klammern und alle Ausgaben haben eine nachgestellte Zeile):
Es gibt jedoch viel mehr 2-Byte-Lösungen.
quelle
V / Vim, 1 Byte
Dies gibt eine einzelne neue Zeile aus.
Probieren Sie es online!
Es gibt eine Reihe von Varianten, die auch funktionieren würden. Zum Beispiel,
in vim und
in V.
Es gibt auch viele, viele Drei-Byte-Lösungen. Zum Beispiel:
Diese sind alle spezifisch für V.
quelle
4ii<ESC>
jedoch V sein, das die Flucht am Ende des Programms implizit ausfüllt.Batch, 12 Bytes
Die Byteanzahl umfasst den Zeilenumbruch sowohl für das Skript als auch für die Ausgabe
quelle
cmd.exe
gibt natürlich eine CRLF nachWindows_NT
, also 12 Bytes.Hexagony , 3 Bytes
Probieren Sie es online!
Druckt
111
.Entfaltet:
Aber der Code wird wirklich nur in der Reihenfolge ausgeführt
o!@
.quelle
/// , 12 Bytes
Probieren Sie es online!
Dies wird gedruckt
bcdbcdbcdbcd
, und da dies 12 Byte sind, habe ich am Ende des Codes einen harmlosen/
Code hinzugefügt , um ihn aufzufüllen.quelle
R, 7 Bytes
Druckt "logisch"
quelle
MATL , 2 Bytes
Es gibt einen nachgestellten Zeilenumbruch.
Probieren Sie es online!
Erläuterung
Die Zwischenablage H enthält
2
standardmäßig eine Zahl .H
schiebt diesen Inhalt auf den Stapel, der implizit mit einer nachgestellten Newline angezeigt wird.quelle
Holzkohle , 2 Bytes
Probieren Sie es online!
Druckt eine horizontale Linie der Länge 1
-
nach rechts und eine neue Linie.quelle
Gelee , 1 Byte
Nicht wenige Jelly one-Bytes - dies ist eins - wertet das linke Argument aus, das, wenn nichts als Eingabe bereitgestellt wird, standardmäßig null ergibt, was wiederum null ergibt und das Ergebnis implizit gedruckt wird
0
. A.Probieren Sie es online!
In der Tat, der 256 Bytes im Code-Seite gibt es nur 95 , die noch nicht zur Zeit einen anderen Byteausgabe innerhalb des angegebenen Bereichs erzeugen , wenn sie als vollwertiges Programm ausführen; Dies sind (als Codepage-Zeichen in Byte-Reihenfolge):
Anmerkungen:
Die meisten 1-Byte-Programme drucken ein
0
(no-ops / Ergebnis einer Liste mit einer einzelnen Null in, die ein druckt0
), die meisten anderen drucken ein1
(0=0
und dergleichen)Ọ
das ein Programm ist , das tut ein anderes Byte ergeben, aber eine , die außerhalb des Bereichs gemäß der Spezifikation ist - es erzeugt den Null-Byte (wirft die0
auf Rolle)⁶
erzeugt ein Leerzeichen (ein Literal)⁷
Erzeugt einen Zeilenvorschub (ein Literal)Einige Bytes, die jetzt funktionieren, könnten dies in Zukunft nicht tun - es gibt ein paar Bytes, die (glaube ich) für niladische Werte reserviert sind, die, wenn sie zugewiesen werden, mit ziemlicher Sicherheit keine 1-Byte-Ausgabe erzeugen.
quelle
byte
Befunge , 2 Bytes
Probieren Sie es online!
Druckt
0
mit einem Leerzeichen nach. Funktioniert auch in Befunge 98.quelle