Utwardzona mutacją quine

15

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, ci dsą 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 , więc wygrywa najkrótszy kod w bajtach!

clismique
źródło
Czy to się liczy? 0a 00w CJam oba wyjścia 0.
geokavel
Nie, 0to nie jest właściwy quine.
Dennis
2
Myślę, że byłoby to bardzo interesujące jako kręgle kodu
Mr. Xcoder
Czy problem mutacji kodu jest ogólnie możliwy do rozwiązania? chyba że mutacja zdarzy się na znak w cytowanym ciągu, zwykle spowoduje to uszkodzenie programu.
hasen
Czy tytuł nie jest trochę mylący? „Mutacja” sugeruje zmianę postaci, a nie powtarzanie jej
Luis Mendo,

Odpowiedzi:

18

> <> , 56 bajtów

^
.
+
8
f
0
o
a
o
~
:
?
~
:
?
:
-
*
4
8
:
^
^
}
*
3
d
'

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 pchamy

d3*}^^:84*=?~oao0f.^

Adres 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.

'd3*}^^:84*=?~oao0f.^

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.

oaowyskakuje 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 polecenie owydrukuje znak powyżej spacji .

Dennis
źródło
Możesz powielić dowolną nową linię, a ona nadal będzie działać.
Dennis
3
Och, nie przeczytałem poprawnie postu: P (Cholera Dennis, dlaczego jesteś taki dobry)
clismique
4
Pęknięty.
jimmy23013
@ jimmy23013 Powinien zostać naprawiony.
Dennis