Langjähriger Lauerer, erstmaliges Poster. Also geht es los.
Auf der Wikipedia-Seite für quine heißt es, dass "ein quine als 'betrügerisch' angesehen wird, wenn es seinen eigenen Quellcode betrachtet." Ihre Aufgabe ist es, eine dieser "Cheating Quines" zu erstellen, die ihren eigenen Quellcode liest.
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes - in jeder Sprache . Dies bedeutet, dass ein 5-Byte-Python-Skript kein 21-Byte-Python-Skript übertrifft, sondern ein 15-Byte-Python-Skript.
Sie müssen Datei-E / A verwenden, um den Quellcode zu lesen. Daher ist der folgende JavaScript-Code von der offiziellen Wikipedia-Seite ungültig:
function a() {
document.write(a, "a()");
}
a()
Es muss auf den Quellcode der Datei auf der Festplatte zugreifen .
Sie dürfen den Dateinamen nicht angeben. Sie müssen dafür sorgen, dass der Dateiname selbst erkannt wird.
Jeder klar? Gehen!
Antworten:
Zsh , 4 Bytes
Die Z-Shell verfügt über integrierte Funktionen für Katzen. Das vierte Zeichen ist ein Zeilenvorschub.
Probieren Sie es online!
Der Code hängt in keiner Weise vom Dateinamen ab. Dies funktioniert auch dann, wenn der Dateiname Sonderzeichen wie Leerzeichen oder Zeilenumbrüche enthält.
Testlauf
quelle
feline functionalities
:)Bash, 6 Bytes
Grundsätzlich gilt.
quelle
cat
fügt keine neue Zeile hinzu (zumindest auf meinem System).cat
druckt den Inhalt der angegebenen Datei byteweise aus.cat
Lösung statt einerbash
Lösung? Und Katze nicht wirklich als Programmiersprache zu qualifizieren-e
?Ausführbarer UNIX-Loader, 10 Byte
Wenn Ihnen Spam bei Standardfehlern egal ist, können Sie ihn um ein Byte kürzer machen:
quelle
cat
. Und ich denke, wenn Sie sehr spezifisch sein wollen,cat
druckt sich ein Programm einfach von selbst und ist mit jedem existierenden Dateiformat kompatibel :)sudo install /bin/cat /c
. Weißt du, nur für den Fall, dass/bin
es sich nicht um das Root-Dateisystem handelt.cat
Muss ich in Singleuser haben ...C 52
Dies liest natürlich den Quellcode und nicht das kompilierte Programm - ich gehe davon aus, dass dies innerhalb der Spezifikation liegt.
quelle
printf
stattdessen verwendenputs
, um eine nachgestellte Zeile zu vermeiden.puts
kann verwendet werden, dass Sie nurread
weniger Zeichen benötigen .PHP, 21 Bytes
file
Liest eine Datei zeilenweise in ein Array und die Datei hat nur eine Zeile. Das spart ein Byte im Vergleich zureadfile(__FILE__)
.quelle
readfile
ist auch 21:<?readfile(__FILE__);
.<?=
Perl, 15 Bytes
3 Bytes gespart dank @ ThisSuitIsBlackNot !
quelle
open 0;print<0>
0
$0
perldoc -f open
: "Als Abkürzung übernimmt ein Aufruf mit einem Argument den Dateinamen von der globalen skalaren Variablen mit demselben Namen wie das Dateihandle:$ARTICLE = 100; open(ARTICLE) or die "Can't find article $ARTICLE: $!\n";
"Perl 6, 20 Bytes
Ich habe nicht sehr lange mit Perl 6 gearbeitet, daher bin ich mir nicht sicher, ob es irgendwelche Tricks gibt, um dies zu verkürzen.
quelle
osascript (AppleScript von der Kommandozeile),
403332 BytesAusführen einer Datei mit dem Namen a mit
osascript a
.Ruft den ersten Absatz (die erste Zeile) der Datei ab und druckt ihn mit einer nachfolgenden neuen Zeile in STDOUT aus, daher die neue Zeile im Code.
quelle
read path to me
scheint für mich zu arbeiten. El Cap.Python 2, 32 Bytes
Am Ende der Datei befindet sich eine neue Zeile.
Python 3, 33 Bytes
Am Ende der Datei befindet sich eine neue Zeile.
Dank feersum für das Auffangen eines Problems und das Bereitstellen von Informationen
__file__
, Loovjo für einen neuen Ansatz für die Python 2-Lösung, mit der 17 Byte eingespart wurden, und Skyler für eine Lösung, mit der noch ein weiteres Byte eingespart wurde und die sowohl in Python 2 als auch in Python 3print
funktioniert hat (anhängig , eine Funktion in Python zu sein) 3)!Doku-Link für
readline
quelle
end
Parameter verwerfen könnten .print
?print(open(__file__).readline())
eine neue Zeile folgen.Stapel,
98 BytesEin Byte dank @Joshua gespeichert
quelle
Python 2.7, 30 Bytes
Bearbeiten: Nur um klar zu sein, der obige Code soll am Ende eine neue Zeile als 30. Byte haben. Ich kenne Markdown nicht gut genug, um herauszufinden, wie es im Codeblock angezeigt wird.
Ich verwende hier den gleichen Trick wie in meiner C-Vorlage. Dadurch wird die gesamte Quelldatei mit Ausnahme der nachfolgenden Zeile gelesen, um den zusätzlichen Zeilenumbruch zu berücksichtigen, der
print
an die Ausgabe angehängt wird.quelle
print
nicht überflüssig wird.Java,
212196 Bytes (171 Bytes mit fragwürdigen Hardcodierungsregeln)Vielen Dank an @Cruncher für die Kürzung um ~ 15 Bytes!
Ich habe keinen Zweifel, dass dies Golf gespielt werden kann.
Oder eine andere Methode mit der statischen Methode (und dem Namen der Klasse), ich bekomme 171 Bytes. Ich bin mir jedoch nicht sicher, ob dies als fest codiert qualifiziert ist.
Verwendet einen Konstruktor, um den Klassennamen mit einer nicht statischen Methode abzurufen. Die Verwendung einer statischen Methode (
A.class.getName()
) war wirklich hart codiert, daher habe ich die "richtige" Methode verwendet. Bei Verwendung vonA.class.getName()
wird dieser Code auf 171 Byte verkürzt.Lesbare Versionen:
Konstruktor verwenden und
this.getClass()
:Mit statischer Methode
A.class.getName()
:Erfasst alle Bytes der Datei auf einmal und gibt sie an STDOUT aus. Ziemlich einfach.
quelle
A.class.getName()
?AutoIt, 34 Bytes
Gibt sich in die Zwischenablage aus:
quelle
Rubin, 14
quelle
.
Klammern zu vermeidenGo,
111105 BytesMein erstes Code-Golf in Go - nur ein paar Tricks, die Sie hier anwenden können, denke ich.
quelle
PowerShell,
39363125 BytesEtwa so eng wie ich es kriegen kann:
gc $MyInvocation.MyCommand.Path | oh
Aufgrund der großen Nachfrage wurde dies geändert in:
Druckt auf die aktuelle Standardausgabe der
Host-Shell.quelle
gc $MyInvocation.MyCommand.Path
reicht. Es wird automatisch ausgedruckt.gc
ein Alias war und nur verwendet werden solltecat
, also hattest du sowieso ein Byte bei mir.gc $PSCommandPath
für 17 Bytes verwenden. Das Problem, das ich sehe, ist, dass dies eine neue Zeile ausspuckt (die in der Quelle nicht existiert). Es ist jetzt mehrdeutig, ob der Zeilenumbruch in Ordnung ist oder nicht ... je nachdem, wie diese Regeln lauten, müssen wir möglicherweisegc $PSCommandPath|write-host -n
für 31 Bytes etwas Kniffliges tun .Ruby, 15 Bytes
Quelle: https://stackoverflow.com/questions/2474861/shortest-ruby-quine
quelle
C 49 Bytes
Bearbeiten: Zur Verdeutlichung ist das 49. Byte eine neue Zeile.
Dies liest den Quellcode abzüglich der Newline am Ende, um die Newline zu berücksichtigen
puts
, die am Ende der Ausgabe angehängt wird.quelle
int main() {*0;}
möglicherweise sogar auf vorhandenen Compilern, da sie undefiniertes Verhalten enthalten. In ähnlicher Weise xsot Lösung könnte auf bestehende Compiler arbeiten, da es nicht definiertes Verhalten enthält. Keiner von beiden ist garantiert, um das Problem zu lösen. (Obwohl xsot ist freilich mehr ist wahrscheinlich , dies zu tun, es könnte genauso einfach abstürzen). Mein eigentliches Argument ist, dass wir Lösungen zulassen sollten, die von implementierungsabhängigem oder nicht spezifiziertem Verhalten abhängen, aber nicht von undefiniertem Verhalten.Mathematica, 16 Bytes
Führen Sie es im Skriptmodus aus .
quelle
Pyth, 25 Bytes
Dies liest seinen Dateinamen. Im Wesentlichen sucht es argv, öffnet die Datei, die dem letzten Argument entspricht, und gibt die erste Zeile aus.
quelle
h'$__file__$
?NameError: name '__file__' is not defined
. Pyth wird in Python kompiliert und anschließend die resultierende Zeichenfolge ausgeführt. Ich würde also nicht erwarten, dass das funktioniert.Los, 133 Bytes
quelle
r"runtime"
.> <> , 13 Bytes
Getestet sowohl mit Online- als auch Offline-Dolmetschern. Der
g
Befehl kommt dem Lesen aus der Quelldatei am nächsten. Wenn er für diese Herausforderung nicht zählt, markiere ich meinen Eintrag als nicht konkurrierend. Ich glaube, es wird normalerweise als "Betrug" für Quines angesehen.Probieren Sie es online aus.
quelle
Haskell, 63 Bytes
Für die Wissenschaft!
quelle
runhaskell
Befehl. Sehr cool> <> 31 Bytes
Haftungsausschluss: Es gibt keine Datei-E / A in> <>, ich fand es jedoch interessant, die von Befunge geerbten Codespace-E / A zu präsentieren, eine der Sprachen, die> <> inspiriert hat.
Eine selbstlesende Quine, die ich vor einiger Zeit gemacht habe, können Sie hier ausprobieren .
Ich habe gerade gesehen, dass es eine kürzere Quine gibt, die sich selbst liest . Während es in Code-Golf-Standards eindeutig besser ist, möchte ich darauf hinweisen, dass es eine fest codierte Codelänge hat, während meines zusätzliche Codezeilen oder -spalten kopieren würde (solange sie nicht den ursprünglichen Code brechen).
quelle
F #, 54 Bytes
Verwendungszweck:
quelle
Perl 5,
1513 BytesWir danken der Bash-Lösung, die dies inspiriert hat:
EDIT: Benötigen Sie nicht das Semikolon oder das erste Leerzeichen.
quelle
cat
vorhanden und auffindbar in der$PATH
. Wenn es jedoch vorhanden ist, kann es als nur ein Befehl angenommen werden, der verfügbarperl
ist. Warum also nicht?Node.js,
6663 Bytesconsole.log
Wird nicht verwendet , wodurch eine neue Zeile angehängt wird.quelle
p=process;p.stdout.write(require('fs').readFileSync(p.argv[1]))
console.log(require('fs').readFileSync(process.argv[1]))\n
für 57 Bytes?test.js
. Es ist gültig, es durch Ausführen aufzurufennode test
, wodurch ein Fehler ausgelöst wird.C 31 Bytes
Die Bash-Lösung ist so kurz, warum also nicht eine C-Lösung darauf aufbauen?
quelle
Haskell , 49 Bytes
Probieren Sie es online!
(GHC) Haskell verfügt über eine Erweiterung für die Verwendung des C-Präprozessors (häufig für die Portabilität zwischen Versionen und Architekturen verwendet). Hoffentlich selbsterklärend.
quelle
HTML mit JavaScript, 115 Bytes (zählt nicht wirklich)
Zählt das? Es macht mir nichts aus, es hat Spaß gemacht :)
Technisch gesehen öffnet es keine Datei. Es ist auch ein wohlgeformtes HTML5-Dokument. Der XMLSerializer war das einzige Tool, das auch den DOCTYPE-Teil zurückgab, der jedoch nicht dem Standard entspricht. Trotzdem funktioniert es mit Chrome und Firefox, und ich wette, andere Browser.
Und als Bonus:
JavaScript, 41 Bytes
quelle