Auto cycler quine


11

Zrób quine, ale z niespodzianką.

Komunikat

Quine wypisuje swój kod, ale umieszcza swój pierwszy znak na końcu.
(Możesz to zrobić odwrotnie, ale dołącz tę notatkę do swojej odpowiedzi)
. Wyjściem musi być program, który również jest rozwiązaniem.

Przykład: Załóżmy, że kod był foobaruruchomiony, jego uruchomienie zwróci oobarfinny prawidłowy program.

foobar -> oobarf
oobarf -> obarfo
obarfo -> barfoo
barfoo -> arfoob
arfoob -> rfooba
rfooba -> foobar

Zasady

  • Twój kod nie może być wynikiem generowania kodu innej generacji, który oczywiście kradnie
  • Twój kod musi mieć więcej niż 2 znaki (więc krótki kod nie jest zabawny)
  • Twój kod musi zawierać co najmniej dwa różne znaki (np. +++Niepoprawny)

Punktacja

Jako wyzwanie do wygrywa najkrótszy kod.



3
@DomHastings Miałeś miesiące, aby to opublikować.
mbomb007,

2
@ IQuick143 Myślę, że> 2 znaki to dobry wymóg z podanego powodu
dylnan

5
Czy to by się liczyło jako „rotacyjny quine”? ; p
Kevin Cruijssen

3
@ mbomb007 Znalezienie języka, w którym jest to możliwe, jest częścią wyzwania
IQuick 143

Odpowiedzi:


19

Befunge-98 (PyFunge) , 2600 bajtów

ab*1'3:*2+*0pnd3*:::::::::::::::1'3:*3+*0p1'3:*5+*0p1'3:*d+*0p1'3:*f+*0p1'3:*fa++*0p1'3:*fd++*0p1'4'3*f-*0p1'4'3*7-*0p1'4'3*5-*0p6:*:*4-1p6:*:*4+1p6:*:*8+1p6:*:*a+1p6:*:*8+2p6:*:*f1++2p6:*:*f3++2pn75*1-:1'3:*4+*0p6:*:*f2++2pnaa*:::::::::::::::::1'3:*6+*0p1'3:*7+*0p1'3:*f1++*0p1'3:*f2++*0p1'3:*fe++*0p1'3:*ff++*0p1'4'3*e-*0p1'4'3*d-*0p1'4'3*4-*0p1'4'3*3-*0p6:*:*3-1p6:*:*2-1p6:*:*b+1p6:*:*c+1p6:*:*9+2p6:*:*a+2p6:*:*f4++2p6:*:*f5++2pn67*::::::::::1'3:*8+*0p1'3:*a+*0p1'3:*f4++*0p1'3:*f5++*0p1'4'3*f-5-*0p1'4'3*c-*0p1'4'3*2-*0p6:*:*1-1p6:*:*d+1p6:*:*b+2p6:*:*f6++2pna5*::1'3:*9+*0p1'3:*f3++*0p6:*:*1pn68*:::::1'3:*b+*0p1'3:*f8++*0p1'4'3*f-2-*0p1'4'3*9-*0p1'4'3*1+*0p6:*:*f7++2pne8*:::::::1'3:*c+*0p1'3:*f9++*0p1'4'3*f-1-*0p1'4'3*8-*0p1'4'3*2+*0p6:*:*f2++1p6:*:*f+2p6:*:*f8++2pnf4*:1'3:*e+*0p1'4'3*3+*2pn77*::::1'3:*f6++*0p1'4'3*f-4-*0p6:*:*f1++1p6:*:*c+2p6:*:*e+2pnb4*1-::1'3:*f7++*0p6:*:*f+1p6:*:*d+2pnf4*1-::1'3:*fb++*0p6:*:*7+2p1'3:*1+*2pnf4*2-1'3:*fc++*0pn95*:::1'4'3*f-3-*0p1'4'3*a-*0p1'4'3**0p6:*:*1+1pn87*1'4'3*b-*0pnac*2-:1'4'3*6-*0p1'4'3*3+*0pnf4*3-1'4'3*1-*0pn88*2-6:*:*5-1pnc9*1-6:*:*2+1pnb4*:6:*:*3+1p6:*:*6+1pn88*6:*:*9+1pnd4*1-6:*:*e+1pnc8*2-:1'3:**1p1'3:**2pnd7*2+6:*:*4+2pn75*6:*:*6+2pn>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ab*1'3:*2+*0pnd3*:::::::::::::::1'3:*3+*0p1'3:*5+*0p1'3:*d+*0p1'3:*f+*0p1'3:*fa++*0p1'3:*fd++*0p1'4'3*f-*0p1'4'3*7-*0p1'4'3*5-*0p6:*:*4-1p6:*:*4+1p6:*:*8+1p6:*:*a+1p6:*:*8+2p6:*:*f1++2p6:*:*f3++2pn75*1-:1'3:*4+*0p6:*:*f2++2pnaa*:::::::::::::::::1'3:*6+*0p1'3:*7+*0p1'3:*f1++*0p1'3:*f2++*0p1'3:*fe++*0p1'3:*ff++*0p1'4'3*e-*0p1'4'3*d-*0p1'4'3*4-*0p1'4'3*3-*0p6:*:*3-1p6:*:*2-1p6:*:*b+1p6:*:*c+1p6:*:*9+2p6:*:*a+2p6:*:*f4++2p6:*:*f5++2pn67*::::::::::1'3:*8+*0p1'3:*a+*0p1'3:*f4++*0p1'3:*f5++*0p1'4'3*f-5-*0p1'4'3*c-*0p1'4'3*2-*0p6:*:*1-1p6:*:*d+1p6:*:*b+2p6:*:*f6++2pna5*::1'3:*9+*0p1'3:*f3++*0p6:*:*1pn68*:::::1'3:*b+*0p1'3:*f8++*0p1'4'3*f-2-*0p1'4'3*9-*0p1'4'3*1+*0p6:*:*f7++2pne8*:::::::1'3:*c+*0p1'3:*f9++*0p1'4'3*f-1-*0p1'4'3*8-*0p1'4'3*2+*0p6:*:*f2++1p6:*:*f+2p6:*:*f8++2pnf4*:1'3:*e+*0p1'4'3*3+*2pn77*::::1'3:*f6++*0p1'4'3*f-4-*0p6:*:*f1++1p6:*:*c+2p6:*:*e+2pnb4*1-::1'3:*f7++*0p6:*:*f+1p6:*:*d+2pnf4*1-::1'3:*fb++*0p6:*:*7+2p1'3:*1+*2pnf4*2-1'3:*fc++*0pn95*:::1'4'3*f-3-*0p1'4'3*a-*0p1'4'3**0p6:*:*1+1pn87*1'4'3*b-*0pnac*2-:1'4'3*6-*0p1'4'3*3+*0pnf4*3-1'4'3*1-*0pn88*2-6:*:*5-1pnc9*1-6:*:*2+1pnb4*:6:*:*3+1p6:*:*6+1pn88*6:*:*9+1pnd4*1-6:*:*e+1pnc8*2-:1'3:**1p1'3:**2pnd7*2+6:*:*4+2pn75*6:*:*6+2pn>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Wypróbuj online!

To sprawiło, że było to piekielne święto.

Jak to działa:
Program jest zbiorem instrukcji put, które składają wokół siebie Program B, który następnie drukuje dwukrotnie bajt źródłowy przesunięty dwukrotnie.
Program składa się w rzeczywistości z 2 kopii programu o długości 1300 bajtów, dzięki czemu cały program o długości 1300 bajtów jest uruchamiany jako całość.

Lepsze wyjaśnienie:
Każdy befunge-98 Quine musi zawierać symbole taki @lub qa ,
Problem : Żaden z tych symboli są dobrym punktem wyjścia Especialy od @i qzakończyć program natychmiast.
Rozwiązanie : Pozbądź się tych znaków w kodzie źródłowym

Problem : jak?
Rozwiązanie : Użyj ppoleceń (wstaw), aby zmodyfikować kod źródłowy, tak aby zawierał wymagane znaki, które wydrukują zawartość kodu źródłowego przesuniętego o jeden bajt i nie używaj gpolecenia oszukiwającego.

Problem : (wzdycha, kiedy się to skończy)
Polecenie put wyskakuje z 3 wartości, n x yktóre określają znak, współrzędną x, współrzędną y, jednak gdy inicjalizacja tych wartości jest podzielona na pół, może zapisać złe znaki na początku kodu źródłowego, co czyni go bezużytecznym do quiningu.
Rozwiązanie : (ostatni obiecuję)
Użyj 2 kopii kodu źródłowego, przy czym ten ostatni jest „poprawny”, to przypadkowo rozwiązuje inny problem, którym jest to, że instrukcja put (polecenie p + stałe inicjalizatory), która jest podzielona na pół nie można wykonać, jest to naprawione przez posiadanie 2 kopii każdej instrukcji. Ostatnią rzeczą, którą musi to działać, jest to, jak zrobić cały kod źródłowy z połowy?

Odpowiedź :
Obraz jest wart 1000 słów, które mówią.  Potem zrobili Piet.

Jest to wizualny dowód na to, dlaczego dwie kopie ciągu bajtowego przesunięto == Dwie kopie ciągu bajtowego przesunięto. Oznacza to, że możemy wziąć połowę kodu, przesunąć bajt, a następnie wydrukować dwa razy (LUB wziąć połowę kodu, przesunąć bajt, wydrukować, powtórzyć [Tak się właściwie dzieje])

Jak to jest realizowane : Załóżmy, że źródłem jest 0123456789abcdef

Pseudokod Befunge:

0123456789abcv;;"123456789abcdef" < go this way <--
             >PS'0,   repeat 2x   ^

PS oznacza Print Stack (nie jest to prawdziwa instrukcja). Pchamy połowę kodu źródłowego w odwrotnej kolejności na stosie, ""następnie drukujemy stos, a następnie pobieramy ( 'polecenie) pierwszy znak, 0który poruszamy przed' i drukujemy go na końcu, co powoduje przesunięcie bajtu, a następnie powtarzamy cykl jeszcze raz, aby wydrukować drugą kopię. Jedną z technik, którymi należy się zająć, są symbole wewnątrz źródła, może to powodować problemy, jeśli napiszemy go podczas wykonywania kodu źródłowego, obejdę to, dodając więcej instrukcji put, które zajmują się nim zewnętrznie.

To sprawia, że ​​kod wygląda mniej więcej tak: Kod

Objaśnienie :
Zielona podświetlenie: Kod, który zajmuje się dodawaniem znaków do źródła
Szare litery (przeprasza za słabą widoczność): Kod, który dodaje zielony kod
Czerwony Podświetlenie: Kod, który przenosi pierwszy znak drugiej połowy kodu źródłowego do obszaru Niebieskiego .
Niebieskie wyróżnienie: Zobacz Czerwone wyróżnienie
Pomarańczowe wyróżnienie: Kod, który gwarantuje, że zakończymy pracę po napisaniu 2-bajtowych przesuniętych kopii poprzez umieszczenie @polecenia (zakończ) w Żółtym obszarze.

Mamy nadzieję, że strzałki powinny wyjaśnić, jak przebiega przepływ kodu.

Oto ostatnia trudna część:
skąd pochodzi kod źródłowy niemowląt ?

Krótka odpowiedź: C # Magic
Długa odpowiedź: ponad 100 fragmentów kodu Befunge wykonanych ręcznie, skompilowanych przez kod C #. Ręcznie napisałem około 100 stałych inicjatorów (fragment kodu befunge, który wypycha pewną liczbę do stosu) ręcznie, a następnie użyłem niestandardowego programu C # do skompilowania go do 1300 bajtowego wyjścia Befunge, które następnie skopiowałem i wkleiłem dwa razy program.

Nadal tu jesteś? Świetnie dziękuję za przeczytanie! (lub przynajmniej przewijanie do końca)
Mam nadzieję, że moje złe dowcipy były zabawne i nie denerwujące.

Uwaga: Żadna instrukcja put w tym kodzie nie tworzy komendy ag, która oszukuje.

EDYCJA: Sprawdziłem kod za pomocą następującego kodu JavaScript w TIO przy użyciu narzędzi programistycznych

setInterval(()=>{document.getElementById("code").value = 
document.getElementById("output").value; 
document.getElementById("run").click();}, 2000);

Naprawdę nie mogę się doczekać pełnego wyjaśnienia, ale wydaje się, że to spore osiągnięcie i na pewno zasługuje na nagrodę!
Nathaniel,

1
@Nanielski Idzie pełne wyjaśnienie, mam nadzieję, że Ci się spodoba! : D
IQuick 143

1
Ta część rozwiązywania pniepoprawnych argumentów jest genialna.
leo3065

@ leo3065 Dzięki :)
IQuick 143

@lQuick rzeczywiście robię!
Nathaniel,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.