Quinos Ouroboros na poziomie n

11

Ten 128-językowy quine ouroboros (program, który wypisuje program w innym języku, który wypisuje program w innym języku (125 języków później), który wypisuje oryginalny program) jest imponujący. Ale niestety ma statyczną liczbę iteracji.

Napisz program, który wypisuje program (niekoniecznie w innym języku, ale może być), który wypisuje program, który wypisuje program itp., Który po n iteracjach wypisuje oryginalny program po raz pierwszy (tj. Bez pośredniego program powinien być taki sam jak oryginał, ponieważ w przeciwnym razie działałaby quine, która ignoruje jego wejście), gdzie n jest nieujemną liczbą całkowitą podaną jako wejście. Dane wejściowe nie mogą być tylko liczbą w oryginalnym kodzie źródłowym (np. Umieszczeniem x = <the value of n>na początku programu), powinna być jedną z następujących czynności:

  1. Przekazany jako argument wiersza polecenia
  2. Odczyt ze standardowego wejścia
  3. Przekazany jako argument funkcji, która zwraca / wyświetla nowy program.

W przypadku etapów pośrednich w naszymoboros, twój program może być albo w pełni funkcjonalnym programem, albo funkcją bez argumentów, która po wywołaniu zwróci / wyśle ​​następny.

Nie możesz czytać z samego pliku źródłowego ani używać żadnych wbudowanych podobnych do quine (nie sądzę, że istnieją takie, które by to zrobiły, ale mogą być)

Dla jasności, jeśli n = 0program powinien wypisać własny kod źródłowy.

Jeśli n = 1, program powinien wypisać inny program, który wypisuje oryginalny kod źródłowy.

I tak dalej...

Wygrywa najmniej bajtów!

Edytować:

Powinienem napisać: „Dla etapów pośrednich w naszymoboros, twój program może być albo w pełni funkcjonalnym programem bez danych wejściowych , albo funkcją bez argumentów”. Jeśli twój program wypisuje następny w łańcuchu, a następnie czeka na dane wejściowe, to dobrze, ale twój program nie powinien potrzebować oryginalnej wartości n.

Leo Tenenbaum
źródło
Powiązane , powiązane .
Kevin Cruijssen
Czy możemy 1 indeksować n? Więc n = 1 oznacza wydrukuj kod źródłowy, n = 2 oznacza wydrukuj kod, który wydrukuje kod źródłowy itp.
Data wygasła
1
Czy wersje iteracyjne będą miały początkowe dane wejściowe? Powiedzmy, że moje pierwsze wejście to 3, a ja uruchamiam program, który wypisuje. Czy nadal będzie wejście 3, czy w ogóle nie będzie wejścia? Jeśli nie ma danych wejściowych, myślę, że musimy sobie z tym poradzić w przypadku getInput()użycia czegoś podobnego bez żadnych danych wejściowych. Czy możemy powiedzieć, że wprowadzamy coś losowego, co nie jest wykorzystywane do późniejszych iteracji, aby zapobiec błędom getInput()? Czy aktualna odpowiedź w języku Python jest poprawna?
Kevin Cruijssen
Podejrzewam, że to, o co jesteśmy proszeni, to nuzyskanie danych liczbowych z programu, który jest „programem początkowym” naszego zbioru itobacji ni że nasza odpowiedź nie powinna być liczona jako jedna z niteracji. Czy to jest poprawne?
Erik the Outgolfer
@KevinCruijssen Prawdopodobnie powinienem był to wyjaśnić. Etapy pośrednie nie mogą mieć danych wejściowych w żadnej formie. Myślę, że jeśli program wyświetli następny, a następnie czeka na dane wejściowe, byłoby dobrze.
Leo Tenenbaum,

Odpowiedzi:

5

05AB1E , 28 bajtów

-4 bajty + poprawka dzięki Kevin Cruijssen

"34çìD«s<©di®ì"34çìD«s<©di®ì

Wypróbuj online!


Wyjaśnienie

Działa to poprzez dodanie pozostałej liczby do wydrukowania na początku kodu, co oznacza, że ​​jest dodawana do stosu w taki sam sposób, jak wejście. W podstawowym przypadku wprowadzenia „0” nie będzie konkatenacji 0 z przodu.

Wygasły dane
źródło
djest nieujemny ( >=0) zamiast dodatniego ( >0). Problem polega na tym, że aby sprawdzić dbez wyskakiwania, musisz najpierw go zduplikować, ale potem trzeba go również wyrzucić podczas iteracji 0"quinsting", w przeciwnym razie wyśle ​​duplikat 0. :(
Kevin Cruijssen
"34çìD«s<©di®ì"34çìD«s<©di®ìmoże na 28 bajtów (co wciąż jest dość zbliżone do zamierzonego podejścia)? (Obawiam się, że aktualna wersja dla iteracji 0"34çìD«s<Ddiì"34çìD«s<Ddiìwyjść -1z Duplicate ..)
Kevin Cruijssen
4

Runiczne Zaklęcia , 39 bajtów

"3X4+kSql1=c*?S:1-}C'LA-}!i:0)2*?~!'´@

Wypróbuj online!

Byłby 4 bajty krótszy niż 05AB1E przy użyciu tej samej taktyki, jeśli dane wejściowe byłyby mniejsze lub równe 10. Ale ponieważ musimy wspierać arbitralnie duże wartości, staje się to bardziej skomplikowane.

Wartość liczbowa nzostaje umieszczona z przodu i przeanalizowana jako ciągłe użycie literału liczbowego ´. "3X4+kSqto podstawowy kod quine. Jeśli z przodu nie ma żadnej wartości, długość stosu będzie wynosić tylko 1 (quine), w przeciwnym razie 2, co pozwoli l1=d*?ustalić, jak sobie z tym poradzić.

  • Jeśli istnieje wartość, S:1-}'LA2+-}uruchamia: zamień wartość na górę, odejmij 1, powiel ją, pozostawiając kopię na dole stosu, uzyskaj dziennik 10 tej wartości razy 100 (co daje długość znaku o wartości plus 1 dla ´), usuń tyle znaków z końca łańcucha (skutecznie obcinając się z końca, zarówno tam , gdzie nie jest to potrzebne, jak i ponieważ ma niewłaściwą wartość). Cjest o jeden bajt krótszy niż 2+i daje tę samą wartość.

  • Jeśli nie ma żadnej wartości, przeczytaj jedną z danych wejściowych.

Niezależnie od tego: :0)2*?powiel i porównaj z zerem.

  • Jeśli niezerowe push ´.

  • Jeśli zero, wpisz wartość. Możemy oszukiwać za pomocą !zamiast 2?i zapisywać bajt, ponieważ gdy ´próbuje wykonać pierwszy bajt, widzi, że jest on nienumeryczny i natychmiast wypada z trybu liczbowego w tej samej pozycji.

Wydrukuj cały stos od góry do dołu.

Draco18s nie ufa już SE
źródło
3

Java 10, 145 bajtów

n->{Long N=n;var s="n->{Long N=%s;var s=%c%s%2$c;return s.format(s,N>0?N-1+%2$cL%2$c:%2$cn%2$c,34,s);}";return s.format(s,N>0?N-1+"L":"n",34,s);}

Wypróbuj online i zobacz wyniki niektórych iteracji .

Wyjaśnienie:

wyjaśnienie :

  • var sZawiera kod źródłowy niesformatowany
  • %s służy do umieszczenia tego ciągu w sobie s.format(...)
  • %c, %1$ci 34służą do formatowania podwójnych cudzysłowów
  • s.format(s,34,s) łączy to wszystko razem

Część wyzwania:

Pierwsza funkcja lambda przyjmuje dane longwejściowe jako parametr.

  • Jest to ustawiane w zmiennej Long N=n;w pierwszej iteracji. Lub Long N=%s;na kolejne iteracje.
  • Kontrola trójskładnikowa N>0?N-1+"L":"n"wypełni tę %swartość N-1, dołączoną, Lponieważ jest długa, i przekonwertuje ją na Łańcuch %s, jeśli, jeśli Njest większy niż 1. Jeśli Nzamiast tego jest 0 (początkowe wejście było 0lub jest to ostatnia iteracja interquine- ” loop '), zamiast tego wypełni to %sinicjałem n.
Kevin Cruijssen
źródło
Specyfikacja mówi, że wyjścia pośrednie muszą być pełnym programem lub funkcją bez argumentów
Embodiment of Ignorance
@EmbodimentofIgnorance Wiem, właśnie to mam. Pierwsza funkcja lambda przyjmuje longparametr funkcyjny, a pozostałe funkcje lambda przyjmują nieużywany Voidparametr , którego zawsze używam w przypadku wyzwań stwierdzających brak wprowadzania danych, ponieważ v->jest o 1 bajt krótszy niż ()->.
Kevin Cruijssen
2

Haskell , 195 164 bajtów

main=putStr(x++show x++"\na=")>>(getLine:cycle[pure$show$a-1])!!a>>=putStr
x="main=putStr(x++show x++\"\\na=\")>>(getLine:cycle[pure$show$a-1])!!a>>=putStr\nx="
a=0

Wypróbuj online!

Wykorzystuje to dość prostą technikę quine. Modyfikujemy go za pomocą zmiennej, aktóra jest ustawiona na liczbę. Jeśli liczba ta wynosi zero (która jest na początku), pobieramy dane wejściowe i wyprowadzamy nasze źródło z austawioną liczbą wejściową. Jeśli anie jest zero, wyprowadzamy nasze źródło z austawioną wartością o jeden mniejszą. W ten sposób aodlicza się do zera przed wysłaniem oryginalnego źródła.

Ad Hoc Garf Hunter
źródło
2

R , 92 bajty

f=function(n=-1){gsub("\\s","",paste("f=",sub("-?\\d+",n-1,paste(deparse(f),collapse=""))))}

Wypróbuj online!

Jeśli deparsezostanie uznane za oszustwo, oto alternatywa:

R , 108 bajtów

function(n=-1){s="function(n=%d){s=%s%s%2$s;sprintf(s,n-1,intToUtf8(34),s)}";sprintf(s,n-1,intToUtf8(34),s)}

Wypróbuj online!

Nick Kennedy
źródło
1

Perl 6 , 44 bajtów

<say '<',S{\d+}=get||0-1,'>~~.EVAL'>~~.EVAL

Wypróbuj online!

Pobiera dane przez standardowe wejście i zwraca program, w którym jedyną zmienioną rzeczą jest pierwsza liczba. Każdy kolejny program wyświetli ten sam program, z wyjątkiem tego, że liczba ta została zmniejszona.

Jo King
źródło
1

C # (interaktywny kompilator Visual C #) , 112 bajtów

void f(int n=-1){var s="void f(int n={2}){{var s={0}{1}{0};Write(s,(char)34,s,n-1);}}";Write(s,(char)34,s,n-1);}

Zaoszczędź dużo bajtów dzięki @NickKennedy!

Wypróbuj online!

Wcielenie ignorancji
źródło
Wyjścia pośrednie nie są pełnym programem ani funkcją, która przyjmuje pojedynczy argument. Myślę też, że masz jakieś, nktóre powinny być l. Co powiesz na tio.run/##Sy7WTS7O/P@/…
Nick Kennedy
1

Python 3.8 (wersja wstępna) , 60 56 55 53 bajtów

lambda n=-1,s='lambda n=%d,s=%r:s%%(~-n,s)':s%(~-n,s)

Wypróbuj online!

-2 bajty dzięki Jo King

Od wersji 53-bajtowej działa również w Python 2 i Python 3.

ujemna siódemka
źródło
Funkcja pośrednia nie wydaje się być pełnym programem lub funkcją, która nie przyjmuje żadnych argumentów.
Nick Kennedy
Ten operator morsa :=jest mile widzianym dodatkiem do Pythona, to na pewno.
mbomb007
„W przypadku etapów pośrednich w naszymoboros twój program może być albo w pełni funkcjonalnym programem, albo funkcją bez argumentów , która po wywołaniu zwróci / wyśle ​​następny.”
mbomb007
@NickKennedy Zaktualizowano zgodnie ze specyfikacją i przypadkowo zapisano 4 bajty.
ujemna siódma
1
53 bajty bez użycia:=
Jo King