Inspirowane hiperprogramowaniem: N + N, N × N, N ^ N wszystko w jednym .
Dzięki @MartinEnder i @trichoplax za pomoc w piaskownicy.
Definicje
Hyperquines
Zdefiniuj hiperquinę rzędu n jako pełny program lub funkcję P przypominającą quine, która spełnia wszystkie reguły mające zastosowanie do odpowiednich quines, a ponadto ma następującą strukturę.
P jest konkatenacją znaków ‡ grup składających się z n kopii tego samego znaku. Kiedy P jest wykonywane, wynikiem jest konkatenacja tych samych grup, powiększona o jeszcze jedną kopię znaku.
Przykłady
W hipotetycznym języku programowania, w którym kod źródłowy
aabbcc
generuje dane wyjścioweaaabbbccc
, program ten stanowi hiperquinę rzędu 2 .Definicja nie wymaga, aby znaki z różnych grup były różne.
Jeśli kod źródłowy
aabbcc
generuje dane wyjścioweaaaabbbbcccc
, program jest hiperquine rzędu 1 ; kod źródłowy składa się z sześciu jednoznakowych grup, a wynik sześciu par znaków.W GS2 pusty program jest drukowany
\n
, a program jest\n
drukowany\n\n
. Jednak\n
ani\n\n
hiperquiny, ani te nie są, ponieważ nie spełniają one wszystkich właściwości właściwych quines ; żadna część kodu źródłowego nie koduje innej części wyniku.
Łańcuchy Hyperquine
Zdefiniuj hiperquinowy łańcuch długości n jako skończoną sekwencję n pełnych programów lub n funkcji
(P 1 ,…, P n ), która spełnia następujące ograniczenia.
Wyjściami P 1 ,…, P n-1 są odpowiednio P 2 ,…, P n .
P 1 ,…, P n są hiperkwinami.
Rzędy P 1 ,…, P n tworzą ściśle rosnącą sekwencję sąsiednich liczb całkowitych.
Na koniec zdefiniuj nieskończony łańcuch hiperquinowy jako nieskończoną sekwencję pełnych programów lub funkcji (P 1 , P 2 ,…) tak, aby każdy początkowy przedział (P 1 ,…, P n ) stanowił łańcuch hiperquinowy o długości n .
Przykłady
W hipotetycznym języku programowania, w którym kod źródłowy
aabbcc
generuje dane wyjścioweaaabbbccc
, które z kolei generują dane wyjścioweaaaabbbbcccc
, para (aabbcc
,aaabbbccc
) stanowi hiperquinowy łańcuch o długości 2 .Zauważ, że
aaaabbbbcccc
- wynik ostatniej hiperquiny w łańcuchu - nie musi generować określonego wyniku; nie musi to być nawet poprawny kod źródłowy.Kontynuując poprzedniego przykładu, jeśli
aaaabbbbcccc
wytwarza sygnał wyjściowyaaaaabbbbbccccc
, trójkę (aabbcc
,aaabbbccc
,aaaabbbbcccc
) stanowi łańcuch hyperquine długości 3 .Jeśli ten wzór trwa wiecznie, sekwencja (
aabbcc
,aaabbbccc
,aaaabbbbcccc
, ...) stanowi nieskończony łańcuch hyperquine.Para programów (
abc
,aabbcc
) z wyjściami (aabbcc
,aaaabbbbcccc
) nie jest łańcuchem hiperquin, ponieważ oba rzędy hiperquin są równe 1 , więc nie tworzą ściśle rosnącej sekwencji.Para programów (
aabbcc
,aaaabbbbcccc
) z wyjściami (aaaabbbbcccc
,aaaaabbbbbccccc
) nie jest łańcuchem hiperquin, ponieważ rzędy hiperquin to 1 i 4 , więc nie tworzą one sekwencji sąsiednich liczb całkowitych.
Zasady
Zadanie
W wybranym języku programowania napisz nietrywialny łańcuch hiperquinowy, tj. Łańcuch składający się z co najmniej 2 hiperkwin.
Jak zwykle, twoje programy nie mogą pobierać żadnych danych wejściowych ani uzyskiwać dostępu do własnego kodu źródłowego w żadnej formie.
Jeśli twój interpreter wypisuje ukrytą nową linię, hiperquiny muszą to uwzględnić.
Obowiązują wszystkie standardowe luki - zwłaszcza te związane z quinesami.
Punktacja
Najdłuższy łańcuch hiperquiny wygrywa. Jeśli dwa lub więcej zgłoszeń jest powiązanych, zgłoszenie spośród tych, które zaczyna się od najkrótszej hiperquiny (mierzonej w znakach ‡ ) wygrywa. Jak zwykle czas publikacji jest ostatecznym rozstrzygnięciem.
‡ Musisz użyć tego samego kodowania znaków dla kodu źródłowego, wyniku, liczby znaków i wykonania. Na przykład, program Python print 42
jest nie 2 znaków UTF-32 uległość, ponieważ interpreter traktuje każdy bajt jako pojedynczego znaku. Jeśli wybrany język nie jest oparty na znakach, wszystkie bajty należy traktować jak znaki.
Odpowiedzi:
Befunge-98 , nieskończony porządek,
54523836 bajtówDrugie podejście - nieskończony porządek, 36 bajtów
Ten program faktycznie pękłby na 34. hiperkwinie, ponieważ wartość ASCII
"
zakłóciłaby interpretację łańcucha (i na 59;
), ale przesunęliśmy zapis tej wartości do pozycji, która nigdy nie zostanie wykonana (tj.(0, 1)
Zamiast(0, 0)
).Wypróbuj online: 1 , 2 , 10 , 34 , 42
Wyjaśnienie
Pierwsze podejście - zamów 34, 52 bajty (wykorzystuje introspekcję, więc technicznie nie jest legalne)
Z powodu w powyższym poście program ten zepsuje się przy zamówieniu 34 (chociaż nie testowałem).
Wypróbuj online!
źródło
g
, który wydaje się bezpośrednio odczytywać kod źródłowy programu. To powiedziawszy, nie jestem ekspertem Befunge, więc mogę coś źle zrozumieć.g
tutaj do dwóch celów: do przechowywania danych i odczytu kodu źródłowego. Drugi może być trochę szkicowy, nawet jeśli esolangs.org/wiki/Befunge#Quine ma również przykład użyciag
do odczytu kodu źródłowego. W międzyczasie zobaczę, czy mogę stworzyć wersję, która nie korzysta z introspekcji.> <> , nieskończony porządek, 178 bajtów
Program zawiera końcowy kanał.
Wypróbuj online: 1 , 2 , 3 , 10 (Uruchomienie tego ostatniego zajmuje trochę czasu).
Skrypt Retina do generowania źródła z programu liniowego.
Wyjaśnienie
Główną ideą jest obrócenie go w pionie, aby powtórzenie nie wpłynęło na rzeczywisty przepływ sterowania. Np. Druga hiper-quina zaczyna się tak:
Ponieważ poruszamy się tylko w pierwszej kolumnie, nie musimy się martwić o powtarzające się postacie. Również gdy popchniemy większość kodu jako ciąg znaków
'
, spowoduje to wypchnięcie spacji dla każdej pustej linii, co daje nam sposób na określenie liczby powtórzeń. To powiedziawszy, istnieją pewne ograniczenia z powodu tych pustych linii:"
do wypychania dużych liczb jako kodów znaków w głównej części quine, ponieważ spowodowałoby to wypchnięcie dodatkowych liter,32
których nie chcieliśmy.?
lub!
ponieważ pomijają tylko następną postać, która w tym przypadku byłaby spacją (więc nie pominęliby następnego polecenia).Stąd cały przepływ sterowania odbywa się za pomocą jawnych skoków (zasadniczo goto 2D), których rzeczywiste przesunięcia musimy obliczyć na podstawie liczby powtórzeń.
Spójrzmy więc na rzeczywisty kod. Zaczynamy od,
^
więc kod jest wykonywany oddolnie. Aby ułatwić czytanie, wypiszmy aktualny kod w kolejności wykonania (i upuść,^
ponieważ nigdy więcej nie zostanie wykonany):Jest
'
to standardowa technika quiningu dla> <> (i, jak sądzę, Befunge). Przełącza się na tryb ciągów, co oznacza, że napotkane znaki są wypychane na stos aż do'
napotkania następnego . Puste linie są domyślnie wypełnione spacjami, dlatego otrzymujemy wszystkie spacje między nimi. Puste linie na końcu programu są ignorowane. Więc po tym, jak IP zawija się i uderza'
ponownie, mamy pierwszą kolumnę programu na stosie, z wyjątkiem'
samej.Zobaczmy, jak wykorzystujemy to do wydrukowania całego programu.
Program kończy się, gdy stos jest pusty, a pierwsza wewnętrzna pętla nie wypisuje innego znaku.
źródło