Twoim zadaniem jest stworzenie programu, który wydrukuje własne źródło.
„Hej, mamy już to wyzwanie i mnóstwo jego odmian! Dlaczego robisz kolejne?” możesz zapytać, ale ten będzie jednym z najtrudniejszych (mam nadzieję, w każdym razie).
Twoja quine musi być „wzmocniona mutacją”, co oznacza, że nawet jeśli jeden z jej znaków jest zduplikowany, musi wyprowadzać kod źródłowy oryginalnego programu.
Na przykład, jeśli masz quine (poniższy przykład nie jest napisany w żadnym języku, to tylko pseudokod):
abcd
Wszystkie te programy muszą generować abcd
:
aabcd
abbcd
abccd
abcdd
(W każdym z tych programów a
, b
, c
i d
są powielane w każdym miejscu, co oznacza, że powielony znak został umieszczony bezpośrednio po pierwotnym charakterze.)
Zasady:
- Obowiązują standardowe zasady quine.
- Znak wielobajtowy liczy się jako jeden znak, a znak nie jest „dzielony” na odpowiadające im bajty po powieleniu.
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach!
źródło
0
a00
w CJam oba wyjścia0
.0
to nie jest właściwy quine.Odpowiedzi:
> <> , 56 bajtów
Wypróbuj online! lub zweryfikuj wszystkie mutacje .
Jak działa oryginalny program (nieaktualny)
Tłumacz rozpoczyna się w komórce (0, 0) .
^
ustawia kierunek w górę , więc wskaźnik instrukcji (IP) otacza komórkę (0, 20) .'
aktywuje tryb ciągu: do momentu'
napotkania następnego , wszystkie znaki pod adresem IP są wypychane na stos. To samo'
znajduje się ponownie po owinięciu, więc pchamyAdres IP wyląduje na (0, 19) , wciąż idąc w górę. Wykonanie
d3*}
wypycha 13 = 0xd , a następnie 3 , mnoży obie wartości ( 39 / pojedynczy cudzysłów ), a następnie obraca stos w prawo. To pozostawia stos w następujący sposób.Następne dwie instrukcje (
^
) nic nie robią w tym momencie.:84*=
duplikuje górę stosu, wypycha 8 i 4 , mnoży je ( 32 / spację ), a następnie testuje powieloną postać pod kątem równości ze spacją . W przypadku niezmienionego programu zawsze spowoduje to przesunięcie 0 .?
pomija następną instrukcję, jeśli górna część stosu to fałsz. W przypadku oryginalnego programu zawsze tak~
jest , więc zawsze jest pomijane.oao
wyskakuje i drukuje górę stosu, przesuwa 10 / linefeed , a następnie wyskakuje i drukuje linefeed .W końcu
0f.
skacze do komórki (0, 15) (najniższej^
), zaczynając od następnego znaku na stosie.Gdy stos będzie pusty, wydrukowany zostanie cały kod źródłowy.
:
zawiedzie i program zostanie zamknięty.Jak działają zmutowane programy (nieaktualne)
Powielenie dowolnego znaku nieciągłego spowoduje rozszerzenie programu tylko w poziomie. Ponieważ program jest wykonywany pionowo, te dodatkowe instrukcje nigdy nie zostaną wykonane.
Powielenie dowolnego przesuwu linii przed najniższym punktem
^
spowoduje przesunięcie komórek (0, 14) i (0, 15) do (0, 15) i (0, 16) .0f.
przeskoczy teraz do komórki przed najniższym poziomem^
, co również jest wartością^
, więc zmiana nie ma wpływu na program.Wreszcie, każdy powielony znak linii również zmieni ciąg. Krótkie linie są wypełnione spacjami, więc 32 / spacja zostanie wstawiona w miejscu wysuwu linii.
84*=
naciśnie 1 dla spacji, więc?
nie pomija następnej instrukcji. W takim przypadku~
wyskakuje i odrzuca spację , dlatego następujące polecenieo
wydrukuje znak powyżej spacji .źródło