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:
- Przekazany jako argument wiersza polecenia
- Odczyt ze standardowego wejścia
- 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 = 0
program 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.
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łędomgetInput()
? Czy aktualna odpowiedź w języku Python jest poprawna?n
uzyskanie danych liczbowych z programu, który jest „programem początkowym” naszego zbioru itobacjin
i że nasza odpowiedź nie powinna być liczona jako jedna zn
iteracji. Czy to jest poprawne?Odpowiedzi:
05AB1E , 28 bajtów
-4 bajty + poprawka dzięki Kevin Cruijssen
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.
źródło
d
jest nieujemny (>=0
) zamiast dodatniego (>0
). Problem polega na tym, że aby sprawdzićd
bez wyskakiwania, musisz najpierw go zduplikować, ale potem trzeba go również wyrzucić podczas iteracji0"quinsting"
, w przeciwnym razie wyśle duplikat0
. :("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 iteracji0"34çìD«s<Ddiì"34çìD«s<Ddiì
wyjść-1
zD
uplicate ..)Runiczne Zaklęcia , 39 bajtów
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
n
zostaje umieszczona z przodu i przeanalizowana jako ciągłe użycie literału liczbowego´
."3X4+kSq
to 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 pozwolil1=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ść).C
jest 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ą
!
zamiast2?
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.
źródło
Java 10, 145 bajtów
Wypróbuj online i zobacz wyniki niektórych iteracji .
Wyjaśnienie:
wyjaśnienie quine :
var s
Zawiera kod źródłowy niesformatowany%s
służy do umieszczenia tego ciągu w sobies.format(...)
%c
,%1$c
i34
służą do formatowania podwójnych cudzysłowóws.format(s,34,s)
łączy to wszystko razemCzęść wyzwania:
Pierwsza funkcja lambda przyjmuje dane
long
wejściowe jako parametr.Long N=n;
w pierwszej iteracji. LubLong N=%s;
na kolejne iteracje.N>0?N-1+"L":"n"
wypełni tę%s
wartośćN-1
, dołączoną,L
ponieważ jest długa, i przekonwertuje ją na Łańcuch%s
, jeśli, jeśliN
jest większy niż 1. JeśliN
zamiast tego jest 0 (początkowe wejście było0
lub jest to ostatnia iteracja interquine- ” loop '), zamiast tego wypełni to%s
inicjałemn
.źródło
long
parametr funkcyjny, a pozostałe funkcje lambda przyjmują nieużywanyVoid
parametr , którego zawsze używam w przypadku wyzwań stwierdzających brak wprowadzania danych, ponieważv->
jest o 1 bajt krótszy niż()->
.Haskell ,
195164 bajtówWypróbuj online!
Wykorzystuje to dość prostą technikę quine. Modyfikujemy go za pomocą zmiennej,
a
któ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 za
ustawioną liczbą wejściową. Jeślia
nie jest zero, wyprowadzamy nasze źródło za
ustawioną wartością o jeden mniejszą. W ten sposóba
odlicza się do zera przed wysłaniem oryginalnego źródła.źródło
Galaretka ,
2220 bajtówWypróbuj online!
Spróbuj powtarzać wywołania kodu
źródło
R , 92 bajty
Wypróbuj online!
Jeśli
deparse
zostanie uznane za oszustwo, oto alternatywa:R , 108 bajtów
Wypróbuj online!
źródło
Perl 6 , 44 bajtów
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.
źródło
C # (interaktywny kompilator Visual C #) , 112 bajtów
Zaoszczędź dużo bajtów dzięki @NickKennedy!
Wypróbuj online!
źródło
n
które powinny byćl
. Co powiesz na tio.run/##Sy7WTS7O/P@/…Python 3.8 (wersja wstępna) ,
60565553 bajtówWypróbuj online!
-2 bajty dzięki Jo King
Od wersji 53-bajtowej działa również w Python 2 i Python 3.
źródło
:=
jest mile widzianym dodatkiem do Pythona, to na pewno.:=