Napisz niepusty program lub funkcję, która po wywołaniu generuje pojedynczą wartość 1 lub 0, a po wielokrotnym wywołaniu liczby wyjściowe tworzą binarną reprezentację kodu źródłowego programu (na tej samej stronie kodowej, z której skompilowany jest kod / interpretowane).
Na przykład, jeśli kod źródłowy to abc
(w ASCII), dane wyjściowe byłyby:
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.
Binarna reprezentacja źródła musi zawierać co najmniej jeden bit 0 i jeden 1 bit.
Zamiast 1 i 0 można wygenerować dowolne dwie różne, spójne wartości (takie jak true
i false
).
Dozwolone są programy samomodyfikujące, które generują binarną reprezentację oryginalnego źródła, pod warunkiem, że nie czytają kodu źródłowego, aby dowiedzieć się, co wydrukować w następnej kolejności.
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
Bash , 105 bajtów
UWAGA : Upewnij się, że nie ma ważnego pliku o nazwie
f
w katalogu, który to testujesz.Jeśli chcesz to przetestować, możesz użyć następującego polecenia:
Co powinno dać taką samą wydajność
xxd -c1 -b path/to/script.sh|cut -d\ -f2|tr -d \\n
.Wyjaśnienie
Korzysta z tej
trap
sztuczki - wywołanietrap
wtrap
akcji po prostu wypisuje tę linię. Następnie dane wyjściowe są przesyłane potokowo, doxxd
którego konwertuje je na binarne (niestetyxxd -bp
nie działa - dlatego obejście zcut
&tr
):Od tego interesuje nas tylko jeden bit (powiedzmy
N
), który możemy wybraćcut -cN
.Aby dowiedzieć się
N
, z czego korzystamy (pamiętaj, że jest to część, którą należy zwiększyć po każdym wywołaniu), po prostu spróbuj ustawićx
zawartość pliku,f
a jeśli nie istnieje, ustaw go na 1:Ostatnią rzeczą do zrobienia jest aktualizacja pliku
f
- napisaniex+1
do niego:źródło
TI-Basic (seria TI-83),
592357309 bajtówTa tabela jest możliwym odniesieniem do binarnej reprezentacji kalkulatora kodu źródłowego, chociaż ostatecznie użyłem debuggera Virtual TI.
Dla porównania i / lub zainteresowania historycznego: pierwsze quiny napisane w TI-Basic .
Jak to działa
Str1
przechowuje kod źródłowy (teraz w chwalebnym systemie szesnastkowym, oszczędzając dużo miejsca w stosunku do poprzedniej wersji binarnej), pomijając bity, w których treśćStr1
byłaby reprezentowana.Zakładamy, że program uruchamia się na kalkulatorze, którego pamięć została właśnie wyczyszczone, tak
X
jest0
. Za każdym razem poprzez program zwiększamyX
.Zwykle po prostu wymyślamy pół bajta, z którego próbujemy trochę wydobyć, odczytać
Str1
, przekonwertować z szesnastkowego na binarny i wydrukować. Jeśli jesteśmy na części kodu źródłowego, który jest przechowującejStr1
(czyli dwie trzecie całkowitej długości programu), to pierwszy ruch do odpowiedniej części łańcucha przechowywania31
,32
i tak dalej.źródło
Java 8,
249241237234148 bajtówZ góry przepraszam za długie wyjaśnienia. :)
Wypróbuj tutaj.
Wyjaśnienie:
Dodatkowe wyjaśnienie:
quine -part:
String s
zawiera niesformatowany kod źródłowy%s
służy do umieszczenia tego ciągu w sobies.format(...)
%c
,%1$c
I34
są wykorzystywane do formatowania cudzysłowia ("
)s.format(s,34,s)
łączy to wszystkoWypróbuj to tutaj, gdy niektóre części zostały usunięte / zmodyfikowane, aby zweryfikować, że wyjście Quine'a ma własny kod źródłowy.
część binarna :
-i/8
będzie automatycznie obcinany przy dzieleniu liczb całkowitych, więc gdyi
wynosi od -7 do 0, stanie się0
; jeślii
wynosi -15 do -8, stanie się1
; itp.s.charAt(-i/8)
Bierze więc bieżący znak kodu źródłowego, osiem razy po sobie. Wypróbuj tutaj ze zmodyfikowaną wersją.--i&7
będzie7,6,5,4,3,2,1,0,7,6,5,4,3,2,1,0,...
, gdzie pierwszy7
jest kiedyi=0
(który staje się-1
pierwszy z powodu--i
i będzie się zmniejszał).s.charAt(-i/8)>>(--i&7)
produkuje sekwencje w zależności od postaci. Oto kilka przykładów ('A'
(65) do'E'
(69)):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
wyprowadza a,0
jeśli jest to liczba parzysta, a1
jeśli jest to liczba nieparzysta, co w połączeniu z powyższymi sekwencjami daje prawidłowy wynik.Odpowiedź na stare 233 bajty :
Wypróbuj tutaj.
Wyjaśnienie:
Dodatkowe wyjaśnienie:
quine -part:
To samo wyjaśnienie, co powyżej, z dodatkiem:
%%
jest ucieczką postaci znaku modulo (%
)Wypróbuj to tutaj, gdy niektóre części zostały usunięte / zmodyfikowane, aby zweryfikować, że wyjście Quine'a ma własny kod źródłowy.
część binarna :
i/8
będzie automatycznie obcinany przy dzieleniu liczb całkowitych, więc gdyi
wynosi 0-7, stanie się0
; jeślii
jest 8-15, stanie się1
; itp.s.charAt(i/8)
Bierze więc bieżący znak kodu źródłowego, osiem razy po sobie. Wypróbuj tutaj ze zmodyfikowaną wersją.255
to0xFF
lub11111111
(maksymalna wartość dla bajtu bez znaku)256
jest0x100
lub100000000
.&
Upcasts ASCII-znakowy do liczby całkowitej. W tym momencie jest to gdzieś pomiędzy0
i255
(00000000
do11111111
).Long.toString(...,2)
konwertuje go na 9-bitową reprezentację ciągu binarnego+256
i.substring(1)
upewni się, że są wiodące zera, i przekonwertuje 9-bit na 8-bit.Wypróbuj tutaj, gdy niektóre części zostały usunięte / zmodyfikowane, aby zweryfikować całe bajty.
źródło
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 bajtówWyjaśnienie
Podział kodu:
o=_=>
: zdefiniuj funkcję.`o=${o}`
: skonstruuj ciąg;o
jest konwertowany na ciąg znaków, który w tym przypadku jest kodem źródłowym funkcji..charCodeAt(
: pobierz znak w ciągu jako kod znaku ASCII.(o.n=1+o.n|0)/8
: wybierz postać. Jest to również miejsce, w którym licznik jest zwiększany.)>>(7-o.n%8)
: przesuń wynikowy kod znaku, aby żądany bit znalazł się we właściwej pozycji.&1
: ustaw wszystkie inne bity na 0.źródło
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
można użyć++n||(n=0)
lub++n?n:n=0
lubn=++n||0
lubn=1+n||0
które wykorzystują falsiness zNaN
który jest produkowany przez inkrementacjiundefined
o=_=>('o='+o).charCodeAt((o.n=1+o.n|0)/8)>>(~o.n&7)&1
q / kdb + , 45 bajtów
Rozwiązanie:
Przykład:
Wyjaśnienie:
Myślę , że zrozumiałem krótki opis.
Najpierw ustaw zmienną globalną
a
o wartości początkowej wynoszącej-1
. Funkcjaf
buduje binarną reprezentację ciągu reprezentującego funkcję (wszystko łącznie z{}
) poprzedzonąa:-1;f:
śmieciami i indeksuje do tej listy binarnej o indeksie a (który jest zwiększany przy każdym wywołaniu).źródło
Python 2 , 164 bajty
Wypróbuj online!
Wyjaśnienie
Zacznijmy od standardowej quine Python 2.
Okej, cóż, tak to wygląda. Potrzebujemy pliku binarnego!
Racja, to wszystko konwertuje wszystko na binarne. Ale tytuł mówi „po trochu”. Potrzebujemy czegoś, aby przetrwać przez wiele przebiegów. Wiem, zróbmy to funkcją!
Czekaj, to nie pomaga ... Hmm, w jaki sposób możemy śledzić indeks bitu potrzebnego do wyjścia? Ooh, ooh, miejmy liczbę całkowitą do śledzenia.
Um ... to zawsze wyprowadza pierwszy bit. Och, musimy zwiększyć moduł śledzący! O cholera, Python nie pozwala na modyfikowanie liczb całkowitych jako domyślnych argumentów. A przypisania nie są wyrażeniami w Pythonie, więc nie możesz tego zrobić w lambda. Welp, w Pythonie jest to niemożliwe, sprawa zamknięta.
... Niezupełnie. Python nie pozwalają list jako domyślne argumenty mają być modyfikowane. (I cały czas gryzie programistów Pythona.) Wykorzystajmy jego długość!
To wciąż nie modyfikuje modułu śledzącego ... Możemy do niego dołączyć, aby zwiększyć jego długość ... Ale jak? Ach, cóż, mamy
list.append
.lst.append(1)
jest równoważne zlst += [1]
. Świetny!Ups, pomija to pierwszy bit, ponieważ długość modułu śledzącego wynosi 1 przed wysłaniem bitu. Musimy zmniejszyć długość, w której jest używany.
Oto ludzie! Zagraj w golfa i masz moje rozwiązanie!
źródło
Perl 5 , 59 bajtów
Wypróbuj online!
źródło