Napisz program, który potrafi się losowo wygenerować.
Musi to zrobić w oparciu o tokeny użyte w jego kodzie źródłowym. Jeśli kod źródłowy twojego programu składa się z 50 unikalnych tokenów i ma 60 tokenów, wówczas program powinien wypisać 60 tokenów, przy czym każdy token jest losowo wybierany z jednego z 50 unikalnych tokenów.
Na przykład ten program miałby szansę na odtworzenie się w 50–60.
Co to jest token? To zależy od języka. Na przykład identyfikatory ( foo_bar
), słowa kluczowe ( while
) i liczby ( 42
) byłyby liczone jako tokeny w większości języków. Białe znaki nie będą się liczyć w większości języków.
Dodatkowe zasady:
- Dane wyjściowe mogą zawierać tylko tokeny znalezione w kodzie źródłowym programu, oddzielone odpowiednim separatorem
- Dane wyjściowe muszą być tej samej długości co kod źródłowy programu, liczony według tokenów
- Można użyć tylko jednego języka programowania
- Kod źródłowy musi mieć co najmniej 3 unikalne tokeny
- Wyklucz komentarze z kodu źródłowego
- Program powinien mieć tylko jedną szansę na reprodukcję
Punktacja: Program, który ma najlepszą szansę na reprodukcję, wygrywa.
code-challenge
quine
Austin Henley
źródło
źródło
Odpowiedzi:
Python 2, 3 ^ -3 = 0,037
exec
nadużycie jest bardzo przydatne w celu zmniejszenia liczby tokenów. Teraz zaktualizowane, aby nie czytać pliku źródłowego!Dodatkowa
''
pomiędzyexec
i gigant potrójnie cytowany ciąg jest po prostu pad token liczyć do wymaganego minimum 3. Zostanie on włączony do drugiego łańcucha ze względu na niejawny strun dosłownym konkatenacji.Oryginalna wersja pliku źródłowego:
Ściśle mówiąc, gramatyka Python umieszcza token ENDMARKER na końcu pliku źródłowego, a my nie możemy stworzyć pliku źródłowego z losowo rozrzuconymi ENDMARKER-ami. Udajemy, że to nie istnieje.
źródło
".]';(?3 3 3){]`".;~({:,],{:,],6#{:)'';(?3 3 3){]`".;~({:,],{:,],6#{:)'''''''
.JavaScript, 102 tokeny, 33 unikalne, 7,73 × 10-154
Uwaga, to jest prawdziwa quine. Nie czyta pliku ani nie używa
eval
lubFunction.toString
źródło
Python: P (program generujący w 1 wersji próbnej) = 3,0317 * 10 ^ -123
34 unikalne żetony, 80 łącznych żetonów. Zauważ, że na końcu każdej linii jest spacja.
Przykładowe dane wyjściowe:
Dzięki drugiemu rozwiązaniu Python użytkownika user2357112 za przypomnienie, żebym odrzucił ostatni token i
__file__
którego nie znałem wcześniej.źródło
J - 1 na 11 17 = 1,978 x 10-18
J ma wiele przydatnych narzędzi do wykonywania tego rodzaju zadań.
Po pierwsze, dowolny ciąg liczb oddzielony spacjami jest jednym tokenem . Oznacza jednowymiarową tablicę tych liczb. Tak działa leksykon J. Nawiasem mówiąc, to siedemnaście
11
sekund, jeśli ktoś jest ciekawy.(,,,{:,{:)'QUINE'''
jest powszechną sztuczką quine w J, stworzoną tak, aby używać jak najmniejszej liczby żetonów:{:
oznacza Ogon , więc dodaje ciąg do siebie, a następnie dodaje dwie kopie ostatniego znaku na końcu tego. Ponieważ ostatnim znakiem jest pojedynczy cudzysłów (J używa ciągów w stylu Pascala), wynikiem jestQUINE'QUINE'''
.;:
jest tokenizerem i rozkłada ciąg wejściowy tak, jakby to był kod J, zwracając listę pól. Długość tego wyniku wynosi 17.~.
pobiera wszystkie unikalne elementy tej tablicy. Długość tego wyniku wynosi 11.?
nazywa się Roll . Dla każdej liczby całkowitej w argumencie wybiera losową liczbę dodatnią większą lub równą zero, mniejszą niż ta liczba. Więc tutaj J wygeneruje 17 liczb od 0 do 10 włącznie.{
używa losowych wskaźników do wybierania przedmiotów z naszej listy unikalnych tokenów w skrzynkach.;
otwiera wszystkie te pola i uruchamia wynik razem.Oto kilka przykładów. Wcięte linie są monitami o wprowadzenie danych, a linie w jednej linii z lewą stroną stanowią dane wyjściowe interpretera.
źródło
Postscriptum
To było zabawne
Istnieje 17 unikalnych żetonów i 54 żetonów łącznie za około 1 z szansy 3,6e-67.
źródło
Biała spacja ,
3 ^ -2053 ^ -1893 ^ -1813 ^ -132 ~ = 10 ^ -63Jest to program WhiteSpace, który, gdy jest zapełniony losowymi postaciami, ma szansę na reprodukcję 1 na 3 ^ 132 (3 różne tokeny, powtórzone 132 razy). Po uruchomieniu musi być zaszczepiony co najmniej 132 losowymi znakami (Whitespace nie ma wbudowanej funkcji losowej ani funkcji daty), np
some_whitespace_interpreter my_quine.ws <some_random_source >quine_output.ws
. Wynik zostałby poprawiony, gdyby ten program mógł być już golfem, ale jest to mój pierwszy „prawdziwy” program Whitespace, więc zostawię go z moją niewielką ilością gry w golfa.Zwykły kod białych znaków lub zobacz, jak się uruchamia : (aby go wypróbować, kliknij „edytuj”, skopiuj zawartość do tagów <pre>; powinien mieć 132 znaki w EOL w stylu uniksowym)
Kod opatrzony adnotacjami o tym, co jest poleceniem (nie jest to technicznie quine, ponieważ nie odtworzy komentarzy):
Jeśli ziarno jest po prostu równoważne (postacie są zabrane modem 3 do konwersji na tokeny), to się powiedzie:
Jest to dość prosty program, w przybliżeniu odpowiadający temu programowi Ruby:
źródło
Perl, 27 żetonów, P = 1,4779 x 10 -34
Ostatnia edycja: użyj
@ARGV=$0
zamiast,open*ARGV,$0
aby zapisać token.=
,/
,@
,$
)W
)Myślę więc, że to czyni prawdopodobieństwo (pow (2,2 * 4) * pow (4,4)) / pow (27,27), około 1,48E-34.
Jeśli kod źródłowy jest w pliku o nazwie
ARGV
, a następnie można użyć tego rozwiązania z tokena 26 P = ~ 2,193 x 10 -31 :źródło
P = (4 * 2! + 4!) / 27!
czyli około 1,7632684538487448 x 10 ^ -26Perl 6 ,1 w 3)3) = 0,037037 ...
(Wiem, że to nie jest golf golfowy, ale ...)
Wypróbuj online!
Podobnie jak odpowiedź w Pythonie, gdzie pierwszy token jest literałem ciągu, który jest obliczany. Tokeny są
Wyjaśnienie:
źródło