Podobnie jak w przypadku innych zagadek z quine (a konkretniej tej ), napisz program, który sam wytwarza źródło.
Oto nowy zwrot: wygenerowany kod NIE powinien być identyczny ze źródłem. Zamiast tego powinien wypisać inny program, który utworzy pierwszy.
Wyzwanie związane z powyższym osiągnięto poprzez przeskakiwanie między dwoma językami. Myślę, że ten zostałby zrobiony tylko w jednym języku , ale dwie (lub więcej) wersje źródła powinny się znacznie różnić (patrz reguły poniżej). Przy takim ograniczeniu odpowiedzi jednoznakowe byłyby niedozwolone, co wymagałoby nieco więcej refleksji nad ostatecznym poddaniem się.
ZASADY
- Twój kod musi być napisany tylko w jednym języku. (Wiele zgłoszeń, po jednym dla każdego języka jest całkowicie do przyjęcia).
- Różne wersje kodu muszą być odrębne pod względem składniowym. Innymi słowy, jeśli narysujesz abstrakcyjne drzewo składniowe dla swojego kodu, powinien istnieć co najmniej jeden inny węzeł.
- Doprowadzania AST nie będzie konieczne, ale jeśli czujesz się skłonny dostarczyć po jednym dla każdego z programów, to by pomóc w ocenie.
- Możesz wykonać tyle iteracji, ile chcesz, o ile wszystkie pozostają odrębne pod względem składniowym. (Więcej pomoże w uzyskaniu wyniku, patrz poniżej.)
PUNKTACJA
Twój końcowy wynik będzie średnią długością wszystkich programów podzieloną przez liczbę programów.
Przykład 1:
A (źródło dla B) = 50 znaków
B (źródło dla A) = 75 znaków
Wynik końcowy = 31,25
Przykład 2:
A (źródło dla B) = 50 znaków
B (źródło dla C) = 75 znaków
C (źródło dla A) = 100 znaków
Wynik końcowy = 25
Odpowiedzi:
Python, 0 (limit (68 + 3 n ) / (16 n ))
Jeśli dwa abstrakcyjne drzewa składniowe są różne, jeśli mają różne stałe,
istnieje 16 n programów o długości najwyżej 68 + 3n, co daje wynik asymptotyczny równy 0.
Jeśli potrzebujesz programów o zmiennej strukturze, możemy zaimplementować adder binarny na n bitach. Tutaj są 2 n programów o długości O ( n 2 ). Idzie w cyklu z powodu upuszczonego bitu przenoszenia.
źródło
pass
zmieni się dot=n(t)
i z powrotem we wszystkich 2 ^ n kombinacjach.Perl, wynik 110,25
Muszę przyznać, że nie jestem zbyt dobry w quines. Jestem w 100% pewien, że jest miejsce na poprawę. Rozwiązanie opiera się na tej samej zasadzie rozwiązania elementu poniżej.
Pierwszy program ma 264 znaków.
Drugi program ma 177 znaków.
Pracuję nad AST dla tego wpisu (i wpisu Element).
Element , wynik 47,25
Pierwszy program ma 105 znaków.
Drugi program ma 84 znaki.
Jestem pewien, że jest wiele miejsca na ulepszenia.
W pierwszym programie jest jeden ciąg znaków (w którym każdy znak jest uciekany, pomimo dużej nadmiarowości), po którym następują części wykonywalne A i B. Część A robi kilka rzeczy: drukuje ciąg i ucieka z każdego znaku, drukuje ostatnią połowę ciągu (który jest źródłem części B), a następnie uniemożliwia zrobienie czegokolwiek następującej po nim części B.
Drugi program to ten sam ciąg, po którym następuje część B. Część B oparta jest na prostym quine; wypisuje ciąg poprzedzony jego ucieczką. Oznacza to, że drukuje ciąg oraz obie części A i B.
źródło
[]{}
dowolnego polecenia można umieścić w dowolnym miejscu w całym programie bez powodowania błędu składniowego. To jest idealne.VBA: (251 + 216) / 2/2 = 116,75
251
216
Jest to uruchamiane w MSAccess, aby skorzystać z
Module
obiektu. Moduł nosi nazwę"Q"
gry w golfa. Różnica w składni wynika zIf ... Then
braku w krótszej wersji.źródło
vbCrLF
navbCr
C ++, wynik 0,734194
Poniższy kod źródłowy wypisuje na konsoli metazwin 999 (wyjaśnienie poniżej):
Jedyny wiersz, który się zmienia, to pierwszy wiersz. Wartość
X
będzie wynosić 1000, 999, 998, ..., 3, 2, a następnie rozpocznie się od nowa. Jednak w celu uzyskania różnych drzew składniowych za każdym razemX
jest reprezentowany w kategoriach jego pierwszej faktoryzacji, gdzie każda liczba pierwsza jest zapisywana jako suma1
s. Wartości AST są różne, ponieważ rozkład na czynniki pierwsze liczb całkowitych jest różny dla każdej wartości.Program wydrukuje się sam, z wyjątkiem zmiany pierwszego wiersza i usunięcia ukośników odwrotnych, podziałów linii i wcięć
Q(...)
.Poniższy program oblicza wynik mojej odpowiedzi:
Wydrukował 0.734194 na konsoli. Oczywiście 1000 można zastąpić większymi liczbami całkowitymi, a wynik zbliży się do zera jako granicy. Matematyczny dowód na to, że funkcja Ziem Riemanna jest nieco skomplikowana. Zostawiam to jako ćwiczenie dla czytelnika. ;)
źródło
JavaScript,
84,56461Dwa programy, oba o długości
169128122.Zanim grałem w golfa, dla twojej przyjemności oglądania:
Zwraca nowy program i wyświetla bieżącą część!
Prawdopodobnie mógłbym go skrócić bez wyrażenia regularnego, ale ... nie chcę.źródło
J - (24 + 30) / 2/2 = 13,5 pkt
Należy zauważyć, że ciągi w J nie są backslash-uciekł, ale cytat-uciekł à la Pascal:
'I can''t breathe!'
.Program 1 ma AST,
noun verb hook noun
a program 2 ma ASTnoun
. Program 2 to cytowana wersja programu 1, który po uruchomieniu zwróci program 1, więc tej metody nie można łatwo rozszerzyć na trzy kopie: PProgram 1 działa, pobierając kopię części kodu źródła, z cytatem dołączonym z przodu i dodając pięć z tych cytatów na końcu (
(,5#{.)
). Następnie cyklicznie pobiera 30 znaków z tego 16-znakowego ciągu, co daje dokładnie Program 2 w rezultacie.źródło