Schreiben Sie ein nicht leeres Programm oder eine Funktion, die bei Aufruf einen einzelnen Wert (1 oder 0) ausgibt und bei mehrfachem Aufruf die Ausgabenummern die Binärdarstellung des Quellcodes Ihres Programms (auf derselben Codepage, aus der Ihr Code kompiliert wurde) erzeugt /interpretiert).
Wenn Ihr Quellcode beispielsweise abc
(in ASCII) wäre, wären die Ausgaben:
1st call: 0 // ASCII letter 'a'
2nd call: 1
3rd call: 1
4th call: 0
5th call: 0
6th call: 0
7th call: 0
8th call: 1
9th call: 0 // ASCII letter 'b'
10th call: 1
11th call: 1
12th call: 0
13th call: 0
14th call: 0
15th call: 1
16th call: 0
17th call: 0 // ASCII letter 'c'
18th call: 1
19th call: 1
20th call: 0
21st call: 0
22nd call: 0
23rd call: 1
24th call: 1
After the 24th call, the behaviour is undefined.
Die Binärdarstellung der Quelle muss mindestens ein 0-Bit und ein 1-Bit enthalten.
Anstelle von 1 und 0 können Sie auch zwei unterschiedliche, konsistente Werte (z. B. true
und false
) ausgeben .
Selbstmodifizierende Programme, die die Binärdarstellung der Originalquelle ausgeben, sind zulässig, sofern sie den Quellcode nicht lesen, um herauszufinden, was als Nächstes gedruckt werden soll.
Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
Bash , 105 Bytes
HINWEIS : Stellen Sie sicher, dass sich
f
in dem Verzeichnis, in dem Sie dies testen, keine wichtige Datei befindet .Wenn Sie dies testen möchten, können Sie den folgenden Befehl verwenden:
Welches sollte die gleiche Ausgabe geben
xxd -c1 -b path/to/script.sh|cut -d\ -f2|tr -d \\n
.Erläuterung
Hierfür wird der
trap
Trick verwendet, mit dem der Aufruftrap
innerhalb dertrap
Aktion einfach diese Zeile ausgibt. Als nächstes wird diese Ausgabe weitergeleitet,xxd
die sie in eine Binärdatei konvertiert (xxd -bp
funktioniert leider nicht - daher die Problemumgehung mitcut
&tr
):Davon interessiert uns nur ein Bit, mit
N
dem wir auswählen könnencut -cN
.Um herauszufinden, was
N
wir verwenden (denken Sie daran, dass dies der Teil ist, der nach jedem Aufruf erhöht werden muss), versuchen Sie einfachx
, den Inhalt der Datei festzulegen,f
und setzen Sie ihn auf 1, falls er nicht vorhanden ist:Als letztes müssen Sie die Datei aktualisieren
f
- schreibenx+1
Sie darauf:quelle
TI-Basic (TI-83-Serie),
592357309 ByteDiese Tabelle ist eine mögliche Referenz für die Binärdarstellung des Quellcodes durch den Taschenrechner, obwohl ich letztendlich gerade den Debugger von Virtual TI verwendet habe.
Zum Vergleich und / oder für historisches Interesse: die ersten in TI-Basic geschriebenen Quines .
Wie es funktioniert
Str1
speichert den Quellcode (jetzt in herrlichem Hexadezimalformat, spart viel Platz gegenüber der vorherigen Binärversion) und lässt die Bits weg, in denen der Inhalt von sichStr1
selbst dargestellt werden würde.Wir gehen davon aus, dass das Programm auf einem Rechner Speicher , das beginnt gelöscht hat gerade, so
X
ist0
. Jedes Mal, wenn wir das Programm durchlaufen, erhöhen wir esX
.Normalerweise berechnen wir nur das halbe Byte, aus dem wir ein bisschen extrahieren, aus dem wir es lesen
Str1
, von hexadezimal nach binär konvertieren und es drucken möchten. Wenn wir auf dem Teil des Quellcodes, die Lagerungs-Str1
(was zwei Drittel der Gesamtlänge des Programms), dann wir ersten Umzugs in dem entsprechenden Teil der Zeichenfolge zu speichern31
,32
und so weiter.quelle
Java 8,
249241237234148 BytesEntschuldigung im Voraus für die langen Erklärungen. :)
Probieren Sie es hier aus.
Erläuterung:
Zusätzliche Erklärung:
quine -Teil:
String s
enthält den unformatierten Quellcode%s
wird verwendet, um diesen String mit in sich selbst zu setzens.format(...)
%c
,%1$c
und34
dienen zum Formatieren der doppelten Anführungszeichen ("
)s.format(s,34,s)
setzt alles zusammenProbieren Sie es hier aus, wobei einige Teile entfernt / modifiziert wurden, um zu überprüfen, ob es sich um einen eigenen Quellcode handelt.
binär -Teil:
-i/8
wird automatisch bei ganzzahliger Division abgeschnitten, wenni
also -7 bis 0 ist, wird es0
; Wenni
-15 bis -8 ist, wird es werden1
; etc.s.charAt(-i/8)
das aktuelle Zeichen des Quellcodes achtmal hintereinander. Probieren Sie es hier mit einer modifizierten Version.--i&7
wird sein7,6,5,4,3,2,1,0,7,6,5,4,3,2,1,0,...
, wo das erste7
ist, wanni=0
(was-1
zuerst wird aufgrund der--i
und wird weiter abnehmen).s.charAt(-i/8)>>(--i&7)
wird Sequenzen in Abhängigkeit von den Zeichen produzieren. Einige Beispiele ('A'
(65) bis'E'
(69) sind):0,1,2,3,4,8,16,32,65,0,1,2,4,8,16,32,65,...
:;0,1,2,4,8,16,33,66,0,1,2,4,8,16,33,66,...
:;0,1,2,4,8,16,33,67,0,1,2,4,8,16,33,67,...
:;0,1,2,4,8,17,34,68,0,1,2,4,8,17,34,68,...
:;0,1,2,4,8,17,34,69,0,1,2,4,8,17,34,69,...
:;...&1
gibt dann a aus,0
wenn es eine gerade Zahl ist, und1
wenn es eine ungerade Zahl ist, die in Kombination mit den obigen Sequenzen das richtige Ergebnis ausgibt.Alte 233 Bytes Antwort:
Probieren Sie es hier aus.
Erläuterung:
Zusätzliche Erklärung:
quine -Teil:
Gleiche Erklärung wie oben, jedoch ergänzt durch:
%%
ist die maskierte Form des Modulo-Zeichens (%
)Probieren Sie es hier aus, wobei einige Teile entfernt / modifiziert wurden, um zu überprüfen, ob es sich um einen eigenen Quellcode handelt.
binär -Teil:
i/8
wird automatisch bei ganzzahliger Division abgeschnitten, wenni
also 0-7 ist, wird es0
; Wenni
8-15 ist, wird es werden1
; etc.s.charAt(i/8)
das aktuelle Zeichen des Quellcodes achtmal hintereinander. Probieren Sie es hier mit einer modifizierten Version.255
ist0xFF
oder11111111
(der maximale Wert für ein Byte ohne Vorzeichen)256
ist0x100
oder100000000
.&
überträgt das ASCII-Zeichen auf eine Ganzzahl. An diesem Punkt ist es irgendwo zwischen0
und255
(00000000
zu11111111
).Long.toString(...,2)
konvertiert es in die 9-Bit-Binär-String-Darstellung+256
und stellt.substring(1)
sicher, dass führende Nullen vorhanden sind, und konvertiert das 9-Bit in ein 8-Bit.Probieren Sie es hier aus, wobei einige Teile entfernt / geändert wurden, um die gesamten Bytes zu überprüfen.
quelle
int i;v->{String s="int i;v->{String s=%c%s%1$c;return 1&s.format(s,34,s).charAt(-i/8)>>(--i&7);}";return 1&s.format(s,34,s).charAt(-i/8)>>(--i&7);}
Javascript ES6,
735852 BytesErläuterung
Aufschlüsselung des Codes:
o=_=>
: definiere eine Funktion.`o=${o}`
: konstruiere einen String;o
wird in einen String konvertiert, der in diesem Fall der Quellcode der Funktion ist..charCodeAt(
: Ermittelt ein Zeichen in der Zeichenkette als ASCII-Zeichencode.(o.n=1+o.n|0)/8
: Wählen Sie einen Charakter. Hier wird auch der Zähler inkrementiert.)>>(7-o.n%8)
: Verschieben Sie den resultierenden Zeichencode so, dass sich das gewünschte Bit an der richtigen Position befindet.&1
: Alle anderen Bits auf 0 setzen.quelle
o=_=>(o+'').charCodeAt(('n'in top?++n:n=0)/8|0)>>(7-n%8)&1
o=_=>('o='+o).charCodeAt(('n'in top?++n:n=0)/8|0)>>(7-n%8)&1
'n'in top?++n:n=0
Sie verwenden können ,++n||(n=0)
oder++n?n:n=0
odern=++n||0
odern=1+n||0
die alle nutzen die falsiness vonNaN
der erzeugt wird durch Erhöhenundefined
o=_=>('o='+o).charCodeAt((o.n=1+o.n|0)/8)>>(~o.n&7)&1
q / kdb + 45 Bytes
Lösung:
Beispiel:
Erläuterung:
Ich glaube, ich habe den Auftrag verstanden.
Richten Sie zuerst eine globale Variable
a
mit dem Startwert von ein-1
. Function erstelltf
die Binärdarstellung der Zeichenfolgendarstellung der Funktion (einschließlich der{}
), der dera:-1;f:
Junk vorangestellt ist , und indiziert diese Binärliste bei Index a (der bei jedem Aufruf inkrementiert wird).quelle
Python 2 , 164 Bytes
Probieren Sie es online!
Erläuterung
Beginnen wir mit einem Standard-Python-2-Quine.
Okay, das gibt es einfach so aus. Wir brauchen Binär!
Richtig, das wandelt einfach alles in Binär um. Aber der Titel sagt "Stück für Stück". Wir brauchen etwas, um durch mehrere Läufe zu bestehen. Ich weiß, machen wir es zu einer Funktion!
Warten Sie, das hilft nicht ... Hmm, wie können wir den Index des Bits verfolgen, das ausgegeben werden soll? Oh, oh, lass uns eine ganze Zahl haben, um den Überblick zu behalten.
Ähm ... das gibt immer das erste Bit aus. Oh, wir müssen den Tracker erhöhen! Oh Mist, Python erlaubt nicht, dass Ganzzahlen als Standardargumente geändert werden. Und Zuweisungen sind in Python keine Ausdrücke, also können Sie das nicht in einem Lambda tun. Welp, das ist unmöglich in Python, Fall geschlossen.
...Nicht ganz. Python tut Listen können als Standardargumente geändert werden. (Und es beißt Python-Programmierer die ganze Zeit.) Lassen Sie uns seine Länge verwenden!
Der Tracker wird trotzdem nicht verändert ... Wir können etwas anhängen, um seine Länge zu erhöhen ... Aber wie? Ah, na ja, wir haben
list.append
.lst.append(1)
ist äquivalent zulst += [1]
. Groß!Whoops, dies überspringt das erste Bit, da die Länge des Trackers 1 ist, bevor das Bit ausgegeben wird. Wir müssen die Länge dort verringern, wo sie verwendet wird.
Da ist es, Leute! Golf it und du hast meine Lösung!
quelle
Perl 5 , 59 Bytes
Probieren Sie es online!
quelle