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ł foobar
uruchomiony, jego uruchomienie zwróci oobarf
inny 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 gry w golfa wygrywa najkrótszy kod.
Odpowiedzi:
Befunge-98 (PyFunge) , 2600 bajtów
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
@
lubq
a,
Problem : Żaden z tych symboli są dobrym punktem wyjścia Especialy od
@
iq
zakończyć program natychmiast.Rozwiązanie : Pozbądź się tych znaków w kodzie źródłowym
Problem : jak?
Rozwiązanie : Użyj
p
poleceń (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żywajg
polecenia oszukiwającego.Problem : (wzdycha, kiedy się to skończy)
Polecenie put wyskakuje z 3 wartości,
n x y
któ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ź :
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:
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,0
któ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:
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
źródło
p
niepoprawnych argumentów jest genialna.