tło
Jak wie większość regularnych PPCG, quine to program, który po uruchomieniu wyświetla swój własny kod źródłowy; a odległość Levenshteina między dwoma łańcuchami to minimalna liczba wstawek, usunięć i edycji potrzebnych do zmiany jednego łańcucha na drugi. W tym wyzwaniu łączymy dwie koncepcje w „levenquine”: program, który wyświetla swój własny kod źródłowy, ale z jednym wystąpieniem jednego znaku wstawionego, usuniętego lub zastąpionego innym znakiem. (Innymi słowy, odległość Levenshteina między programem a jego wynikiem wynosi 1).
Zadanie
Napisz lewenquine w taki sposób, że jej wyjściem jest lewenquine, wyjściem tego programu jest również lewenquine i tak dalej. Ponadto w pewnym momencie sekwencja wielokrotnego uruchamiania programu, uruchamiania danych wyjściowych, uruchamiania danych wyjściowych itp. Musi ostatecznie powrócić do oryginalnego programu.
Jest jeszcze jedno dodatkowe ograniczenie, które znacznie utrudnia: muszą być gdzieś w tym cyklu dwa odrębne programy, które nie mają wspólnych znaków (innymi słowy, nie ma znaku, który istnieje w jednym programie, a także w innym programie). W związku z tym Twój program będzie musiał stopniowo przekształcić się w inny zestaw znaków iz powrotem.
Jeśli używasz języka programowania, który ma nieunikniony schemat, który jest wymagany w każdym programie, który generuje dane wyjściowe (np. Ma tylko jeden sposób na napisanie print
instrukcji i żadnych innych przydatnych form danych wyjściowych), możesz potraktować ten szablon jako nieistniejący w tym celu określania, które znaki mają dwa programy wspólne. Musisz jednak policzyć tę płytkę kotłową w celu ustalenia właściwości Levenquine kodu.
Wyjaśnienia
- Każdy z „programów” w cyklu może być pełnym programem lub funkcją. Nie wszystkie muszą być takie same, np. Niektóre mogą być pełnymi programami, a niektóre funkcjami.
- Nie wszystkie programy w cyklu muszą używać tej samej formy danych wyjściowych. Na przykład niektóre mogą generować za pośrednictwem standardowego wyjścia, a niektóre mogą generować za pomocą standardowego błędu.
- Twoje programy będą uruchamiane bez wprowadzania danych (lub w językach, które wymagają wprowadzania danych w celu zrobienia czegokolwiek, najprostsze z możliwych).
- Obowiązują właściwe zasady quine ; chociaż Levenquine nie jest prawdziwym quine, nie możesz robić niczego, co byłoby nielegalne, pisząc odpowiedni quine. W szczególności program zerowy nigdy nie jest prawidłowym wyjściem z właściwej Levenquine (i dlatego nie może być częścią twojego cyklu).
- Ograniczenie Levenquine jest mierzone raczej w postaci znaków niż bajtów (np.
ê
Jest jednym znakiem, nawet jeśli źródło jest zakodowane w UTF-8). Ograniczenie braku wspólnych znaków mierzy się również w kategoriach znaków. Warunek zwycięstwa liczy się jednak w bajtach.
Warunek zwycięstwa
Prześlij co najmniej następujące trzy programy z cyklu: najkrótszy program (mierzony w bajtach); oraz dwa programy z cyklu, które nie mają wspólnych znaków. Możliwe, że dwa z nich są takie same, a także możliwe, że wszystkie trzy są różne. Wynik oparty jest na długości w bajtach najkrótszego programu, przy czym krótszy jest lepszy, co czyni z tego rodzaju zawody w golfa kodowego .
Odpowiedzi:
Gol> <> ,
252167 bajtówWypróbuj online!
I wzajemnie odrębny program ( Weryfikacja ):
Wypróbuj online!
Jest to głównie zainspirowane moją odpowiedzią na wyzwanie wzajemnie wykluczających się Quines , z podziękowaniami dla Gol Bubblera > .
Oto program weryfikacyjny, który możesz uruchomić. Niestety upłynął limit czasu, ale możesz obserwować, jak jedna sekcja kodu buduje drugą, a następnie możesz skopiować ostatnią wydrukowaną wersję i wkleić ją do danych wejściowych, aby kontynuować. W końcu dotrzesz do pierwszego programu, który wprowadziłeś.
Wyjaśnienie
Obie sekcje kodu składają się z dwóch sekcji, rzeczywistej części wykonawczej i danych zawierających drugą sekcję kodu. Oba działają praktycznie identycznie:
Zależą od flagi (pierwszy znak kodu albo
1
albo0
). Jeśli flaga jest ustawiona, zaczną budować drugą sekcję kodu, usuwając 252 znak, dodając / odejmując28
od niego i dołączając go do kodu.Oto na przykład dwie pierwsze iteracje kodu po pierwszym programie powyżej:
W końcu, gdy osiągnie koniec bieżącej sekcji, odwraca drugi znak kodu (
<
do>
i z powrotem), aby wskazać drugą sekcję.Oto obie sekcje razem, które mają przejść z wykonywania pierwszej sekcji do wykonywania drugiej.
Wypróbuj online!
Flagi są przeciwne dla każdej sekcji, więc nowo wykonywana sekcja zacznie usuwać drugą sekcję kodu, aż osiągnie swój własny kod. W tym momencie odwraca flagę i cykl się powtarza.
źródło