Twoim zadaniem jest stworzenie programu, który po uruchomieniu zwróci się jako wynik (jest to znane jako quine). Jednak ten quine musi, kiedy jest kopiowany n
razy, zwraca quine, ale z każdym jego znakiem powielonym w n
czasie, gdzie n
jest dodatnią liczbą całkowitą.
Jeśli twój oryginalny program to Derp
:
Derp -> Derp (must return itself as output to be a quine)
DerpDerp -> DDeerrpp
(the "Derp" is copied twice, so each character in the output has to be copied twice)
DerpDerpDerp -> DDDeeerrrppp
etc. etc.
Pamiętaj, że możesz mieć spacje w swoim programie „podstawowym”, ale są one liczone podczas „przeplatania”. Powiedz, że twój program to
Derp
{newline}
(Nowa linia oznacza nową linię, a po niej jest spacja Derp
). Gdy zostanie zduplikowany, aby zostać
Derp
Derp
{newline}
Musisz wyprowadzać
DDeerrpp
{newline}
{newline}
Pamiętaj, że 2
po DDeerrpp
.
Zasady i specyfikacje:
- Twój program musi zawierać co najmniej dwa różne znaki (co oznacza, że twój kod musi mieć co najmniej 2 bajty).
- Obowiązują standardowe zasady quine .
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach!
code-golf
quine
source-layout
clismique
źródło
źródło
Odpowiedzi:
Rozszczepienie , 6 bajtów
Wypróbuj online! Wypróbuj dwie kopie! Wypróbuj trzy!
Wyjaśnienie
To tylko standardowy quine Fission . Zdarza się, że działa na to wyzwanie, ponieważ Fission ma wyraźne punkty wejścia do programu. W szczególności, powielając program, dodajemy inny,
R
który dodaje kolejny atom (wskaźnik instrukcji). Ponieważ kod źródłowy jest toroidalny, wykonywany kod efektywny nie zmienia się inaczej - dla każdego atomu kod nadal wygląda lokalnie tak samo. Jednak atomy są wykonywane w kroku blokady, dzięki czemu rzeczy, które drukują, są przeplatane i otrzymujemy dodatkową kopię każdego znaku na wyjściu.Dla kompletności krótko powtórzę, jak działa sam program. Niezależnie od tego, czy powtarzamy program, czy nie (np.
'!+OR"'!+OR"'!+OR"
), Każdy atom widzi następujący kod:"
Tryb drukowania przełącza ciąg tak, że program uruchamia się poprzez drukowanie'!+OR
bezpośrednio na standardowe wyjście, które jest cały Quine'a wyjątkiem cytatu. Następnie'!
ustawia masę atomu na kod znaku!
,+
zwiększa ją, co daje"
iO
drukuje, jednocześnie niszcząc atom. Program kończy się, ponieważ nie ma już atomów.źródło
Python 2.7,
377310304194191 bajtów!To mój pierwszy golf, więc nie spodziewałem się, że będzie zbyt dobry. Ale pomyślałem, że pomysł w rozwiązaniu, które wymyśliłem, był nieco zabawny, więc i tak go publikuję.
Rzeczywiście, jest to quine; możesz spróbować tutaj . Dość mocno nadużywa modułu inspekcji.
Jeśli spróbujemy uruchomić go z tym samym kodem źródłowym x2, otrzymamy również odpowiednie wyjście; możesz spróbować tutaj . x3, x4 itp. działają zgodnie z oczekiwaniami.
Nieoznakowany z wyjaśnieniem:
źródło
inspect
? (patrz odpowiedni meta post ). W PPCG mamy określone definicje tego, co czyni quine ważną, a „czytanie źródła” jest zwykle uważane za oszustwo.import threading,inspect as i
możnaimport threading as T,inspect as i
CJam , 19 bajtów
Wypróbuj online!
Jak to działa
źródło
RProgN , 66 bajtów
Znaczącą białą spacją będzie moja śmierć
Wyjaśniono
Dobry Boże, jestem potworem ...
Wypróbuj online!
źródło
~["[%q]F01+`0=`.{0m}R"]F01+`0=`.{0m}R
ogólnie działa dobrze, nie jest to prawidłowe rozwiązanie, ponieważ nie ma sposobu na replikację znacznika ZSS.Perl 5, 107 bajtów
Nie golfowany:
Wypróbuj online!
źródło
Python 3 ,
122121112 bajtówWypróbuj online: jedna kopia | dwie kopie | trzy kopie | cztery kopie z automatyczną weryfikacją
Jak to działa
Wykorzystuje to standardową quine Python: Przechowuj kod, który chcesz wykonać w zmiennej (jako ciąg znaków); zawrzeć w tym ciągu trochę logiki, aby wydrukować się, wszystko przed nim i wszystko po nim; następnie wykonaj ten ciąg.
Kod wykonywany za pomocą ciągu s jest następujący.
Pierwszy wiersz bezwarunkowo importuje moduł atexit , który pozwoli nam zarejestrować moduł obsługi wyjścia. Wielokrotna próba zaimportowania tego samego modułu nie wpływa w żaden sposób na skrypt. Następnie próbuje zwiększyć wartość zmiennej n , aby śledzić, ile kopii kodu źródłowego zostało wykonanych.
Drugi wiersz jest wykonywany tylko wtedy, gdy pierwszy zawiera błąd. Tak będzie w pierwszej iteracji, ponieważ n jest wciąż niezdefiniowane. W tym przypadku inicjalizujemy n jako 1 i rejestrujemy lambda, która wykonuje rzeczywistą magię.
Zarejestrowany moduł obsługi wyjścia
zostanie wywołany tuż przed zakończeniem programu. Sam lambda tworzy ciąg
"s=%r;exec(s);"%s
-%r
tworzy reprezentację ciąg prawego argumentu ( ów ), który zawiera wszystko pomiędzy apostrofami i samych cytatów - to iteracje nad jej znaków. Dla każdego znaku c po prostu drukujemy n kopii c . Przechodzącc*n
jako nazwanego argumentuend
doprint
środków, które nie wysuwu wiersza zostaną załączone.źródło
CJam , 14 bajtów
Wypróbuj online!
Objaśnienia
źródło