Wyzwanie
Twoim celem jest napisanie programu, który wydrukuje inny program. Ten wydrukowany program powinien wydrukować inny program, a nowy program powinien wydrukować inny program, aż do końca.
Zasady
- Każdy program musi mieć mniej niż 256 bajtów. (Jeśli trzeba to zmienić, zostaw komentarz)
- Ostatni program musi być pustym programem.
- Musi istnieć skończona liczba programów, więc program nie może być quine.
- Wszystkie programy muszą działać w tym samym języku.
- Wejście nie jest dozwolone.
- Zwycięski program to program, który drukuje tyle programów, ile to możliwe, sam się licząc.
Powodzenia!
2^2048
lub3.2317e616
.a*10^b
gdzie1<=a<10
ib
jest liczbą naturalną.1.2673e614
.Odpowiedzi:
CJam, 4,56 x 10 526 programów
Dokładny wynik: 254 219 + 254 192 + 254 166 + 254 140 + 254 114 + 254 88 + 254 63 + 254 38 + 254 13 + 3
Wszystkie programy muszą zostać zapisane przy użyciu kodowania ISO-8859-1, aby zachować zgodność z limitem rozmiaru pliku.
Dzięki @ChrisDrost, który zwrócił uwagę na błąd i zasugerował sposób zagnieżdżenia.
Wypróbuj online w interpretatorze CJam .
254 219 + 2 ≈ 4,56 × 10526 programów
Podział wyniku na linię można osiągnąć w następującym, znacznie prostszym programie 1 .
Uruchomienie tego programu powoduje powstanie programu
a po 254 219 - 1 kolejnych iteracjach program
Ten ostatni niepusty program kończy działanie z błędem 2 i nic nie drukuje (pusty program).
Jak to działa
Załóżmy, że łańcuch jest już na stosie.
254 192 ≈ 5,35 × 10 461 innych programów
To tutaj trochę się wariuje.
Pierwszy program jest wysoce ściśliwy. Pisząc podobny program, który zamiast pustego programu ostatecznie tworzy pierwszy program z powyższej sekcji, możemy poprawić wynik o 254 192 programów 3 .
Program
jest podobny do pierwszego programu z poprzedniej sekcji, a uruchomienie pierwszego i jego wyniku dla 254 192 iteracji powoduje powstanie drugiego.
Załóżmy, że ciąg znaków znajduje się już na stosie:
Programy Moar
Pierwszy program z poprzedniej sekcji jest nadal wysoce ściśliwy, więc możemy zastosować podobną metodę i napisać program, który po 254 166 iteracjach tworzy wspomniany program.
Powtarzając tę technikę w kółko, dopóki nie osiągniemy limitu 255 bajtów, możemy dodać w sumie 254 166 + 254 140 + 254 114 + 254 88 + 254 63 + 254 38 + 254 13 + 1 ≈ 1,59 × 10 399 programów do te z poprzednich sekcji.
Dodano 1 nową linię dla przejrzystości.
2 Na konsensus w sprawie Meta , jest to domyślnie dozwolone.
3 lub 0,00000000000000000000000000000000000000000000000000000000000000%
źródło
JavaScript, 1000 programów
To, czy jest to ważne, zależy od tego, jak dokładnie zrozumieć trzecią zasadę.
źródło
Ruby, 1.628 × 10 ^ 237 programów
Takie samo podejście jak moja odpowiedź na Perla, ale ponieważ Ruby już obsługuje duże ints, łatwiej jest przechowywać jako hex.
Ruby, 9.277 × 10 ^ 90 programów
Więc ta próba jest nieco inną odmianą w porównaniu do poprzedniej wersji quine, ale ze względu na wszystkie dodatkowe funkcje nie dostaję liczby tak blisko jak ta druga ... Ciekawe było jednak spróbować innego podejścia!
źródło
Programy w języku Python 2, 9,7 * 10 ^ 229
źródło
C, 2,2 * 10 ^ 177 programów
To nie jest idealne, ale całkiem dobre. Mam na myśli, że ma dokładnie
255
bajty długości i generuje programy o tej samej długości. Prawdopodobnie mógłbyś jeszcze trochę pobawić się, aby uzyskać więcej programów, ale na razie zostawię to tak, jak jest.Program oparty jest na prostym języku C. Dodatkowo istnieje dość prosty algorytm liczenia, który zlicza wszystkie możliwe wartości tablicy char
n
. Mamy tyle programów, ile permutacji ciągun
.Zakres znakowania jest ograniczony do zakresu od
#
(= 35) do[
= (91). To dlatego, że nie chcę żadnego"
ani\
ciągu, ponieważ trzeba ich uciec.Generowanie programu kończy się, gdy wszystkie wartości w tablicy char
n
są[
. Następnie wyświetla prosty program zastępczymain(){}
, który sam nic nie wypisuje.Jako demonstracja, że powinien on pracować Właśnie zmienił granice, więc tylko znaki ASCII-Code
35
i36
są używane i tylko 4 elementy tablicy.Powstałe programy to
Daje to
2^4 + 1 = 17
różne programy.Tak więc powyższy program generuje
((91-35)+1)^101 + 1 = 57^101 + 1 ~= 2.2 * 10^177
różne programy. Nie jestem całkowicie pewien, czy to się liczy, czy nawet moje obliczenia są prawidłoweźródło
2.2 * 10^177
(dla tych, którzy chcą porównać)?Perl, 1 × 10 ^ 163
W przeciwnym razie jest to dość podstawowy quine, zredukowany do jak najmniejszej liczby znaków, który działa tylko wtedy, gdy licznik nie
0
.źródło
Common Lisp, 10 113 -1
Liczba dziewiątek jest ograniczona przez maksymalny rozmiar kodu, 256, biorąc pod uwagę spacje wprowadzone przez drukarkę.
źródło
Perl, 1,4 * 10 ^ 225
Podobne podejście do Pythona; ten sam wynik!
źródło
> <> , 65534 (?) Programy
Dodałem znak zapytania obok 65533, ponieważ muszę jeszcze zweryfikować, czy można wydrukować 65533 (chociaż mam powody, by sądzić, że powinien). Kiedy będę miał trochę więcej czasu, wymyślę sposób, aby to przetestować.
Możesz spróbować online tutaj .
Istotą tego programu jest to, że zmienia on wyjście znaku na samym końcu, a następnie zmniejsza jego wartość liczbową przed wydrukowaniem. Mam 65534 programy, ponieważ wartość ascii znaku na końcu kodu to 65533, więc licząc pierwszy program, mamy 65534 (jeśli liczyć pusty program 65535, tak myślę). Ostatni „zwrócony” program jest niczym; kończy się po prostu, gdy wartość znaku wynosi 0.
Jestem pewien, że będzie w stanie wydrukować znak dla wszystkich iteracji: Nie mogłem znaleźć ostatecznego źródła dla liczby znaków> <>, które można wydrukować, ale są liczby bezpośrednio poniżej 65533, liczbowo.
Daj mi znać, jeśli występują jakiekolwiek problemy z tym wdrożeniem; Nie jestem pewien, czy mój wpis jest ważny.
Wyjaśnienie
Bezwstydnie ukradłem pomysł użycia pojedynczego cudzysłowu do stworzenia pseudo-quinu z wiki> <> i komentarza, który widziałem tutaj raz.
To, co robi, to parsuje wszystko po znaku cudzysłowu jako znaki, a następnie zmniejsza ostatni. Stamtąd odwraca stos (aby drukować we właściwej kolejności), wypycha znak stosu na stos, a następnie drukuje, aż stos będzie pusty.
źródło
Python, 1 × 10 ^ 194 programów
To musi być uruchomione z pliku, a nie interaktywnej repliki. To nie jest quine.
Dzięki @The Turtle za pomoc w oszczędzaniu 3 bajtów, czyli więcej miejsca na dziewiątki!
Dzięki @poke za pomoc w oszczędzaniu 2 bajtów, co oznacza więcej miejsca dla dziewiątek!
źródło
if n!=0
jest zbędny. Możesz po prostu pisaćif n
.if n:
i pomiędzyreplace
argumentami.Bash, 52 programy
Zupełnie niezainspirowany i (miejmy nadzieję) solidnie na ostatnim miejscu.
źródło