Przyrostowa Quine

23

Twoim zadaniem jest napisanie programu lub funkcji, która wypisze pierwszy znak kodu źródłowego, następnie drugi, a następnie trzeci ... przy każdym uruchomieniu.

Na przykład, jeśli twój program był foow języku barw pliku baz.bar, powinieneś otrzymać wynik podobny do tego:

λ bar baz.bar
f
λ bar baz.bar
o
λ bar baz.bar
o

Twój program może zrobić wszystko po zakończeniu drukowania kodu źródłowego w ten sposób. Możesz zmodyfikować kod źródłowy pliku, ale pamiętaj, że kod źródłowy do wydrukowania to oryginalny kod źródłowy.

To jest golf golfowy, więc wygrywa najkrótszy program w bajtach.

Conor O'Brien
źródło
1
Jeśli możemy zmodyfikować kod źródłowy pliku, czy to oznacza, że ​​możemy go również odczytać?
FlipTack,
1
@ Flp.Tkc Dobre pytanie. Szczerze nie mam pojęcia. Nie chcę, żebyś konstruował quine czytając źródło, ale nic mi nie jest, jeśli czytasz źródło tylko do modyfikacji pliku.
Conor O'Brien

Odpowiedzi:

6

Galaretka , 12 bajtów

“;⁾vṾ®ȯ©Ḣ”vṾ

To jest link niladyczny. Wypróbuj online! (Obejmuje kod do połączenia z linkiem dwanaście razy).

Jak to działa

“;⁾vṾ®ȯ©Ḣ”vṾ  Niladic link.

“;⁾vṾ®ȯ©Ḣ”    Set the left argument and the return value to s =: ';⁾vṾ®ȯ©Ḣ'.
           Ṿ  Uneval; yield r =: '“;⁾vṾ®ȯ©Ḣ”', a string representation of s.
          v   Eval; execute s as a Jelly program with argument r.

 ⁾vV          Yield 'vṾ'.
;             Concatenate r and 'vṾ', yielding q =: '“;⁾vṾ®ȯ©Ḣ”vṾ'.
    ®ȯ        Take the flat logical OR of the register (initially 0) and q.
              This replaces 0 with q in the first run, but it will yield the
              content of the register in subsequent runs.
      ©       Copy the result to the register.
       Ḣ      Head; pop and yield the first character of the register.
              This modifies the string in the register, so it holds one fewer
              character after each call.

Jako dodatkowy bonus, ponieważ rejestr będzie przechowywał pusty ciąg znaków po wywołaniu twelveth, jest to po raz kolejny fałsz, a link jest gotowy do rozpoczęcia od nowa. Wywołanie linku 24 razy spowoduje wyświetlenie kodu źródłowego dwa razy, wywołanie go 36 razy trzy razy itp.

Dennis
źródło
Nie znam galaretki, więc co dokładnie robi stopka? Dlaczego ^ 17?
Conor O'Brien,
Wywołaj link powyżej ( ¢), funkcję tożsamości ( ¹, która nie jest tak naprawdę potrzebna po pierwszym wywołaniu), ustaw wartość zwracaną na linefeed ( domyślnie drukuje poprzednią wartość zwracaną), powtórz. ¹i oba są indeksami górnymi, ale nie są ze sobą powiązane. Zastąpiłem je mniej mylącymi ¢;¢;¢;¢;¢;¢;¢;¢;¢;¢;¢;¢(zadzwoń, połącz, powtórz).
Dennis,
12

JavaScript - 26 bajtów

Określa, f()że kod źródłowy zwraca znak po znaku.

n=0;f=x=>("n=0;f="+f)[n++]

Zwraca niezdefiniowane po wyczerpaniu znaków.

n=0;f=x=>("n=0;f="+f)[n++]
for(i=0;i<30;i++){console.log(f())} //test harness

Maltysen
źródło
Jeśli się nie mylę, musisz dołączyć wywołanie funkcji jako część kodu.
Mama Fun Roll
@MamaFunRoll link do odpowiedniego meta postu?
Downgoat,
Nic nie wiem: P Zawsze jednak myślałem, że samo wywołanie funkcji było częścią quine; może coś mi brakuje?
Mama Fun Roll
@MamaFunRoll Specyfikacja zezwala na funkcje, więc wywołanie nie powinno być potrzebne. Zresztą to szczególne wyzwanie nie miałoby sensu.
Dennis,
W porządku, tylko upewniam się.
Mama Fun Roll
2

skumulowane , niekonkurencyjne, 34 bajty

[tostr ':!' + execCounter # out]:!

Odmiana standardowego quine. To jest pełny program. Służy execCounterdo określenia, ile razy konkretnie ten program był uruchamiany. Błędy po wydrukowaniu wszystkiego.

Wypróbuj tutaj!

Conor O'Brien
źródło
2

Pip , 31 bajtów

{Y"{Y (yRsRPy++v)}"(yRsRPy++v)}

Anonimowa funkcja. Przetestuj na TIO!

Wyjaśnienie

Zacznij od tego standardowego Pip Quine:

Y"Y yRsRPy"yRsRPy
Y"Y yRsRPy"        Yank that string into y
           yRsRPy  In y, replace the space with repr(y)

Zawiń to w nawiasy klamrowe, aby uczynić to funkcją. Teraz zamiast zwracać całe źródło, musimy się do niego indeksować. Użycie zmiennej globalnej dla indeksu i zwiększenie jej za każdym razem spełni wymóg „następny znak za każdym razem, gdy się nazywa”. vjest najlepszym kandydatem, ponieważ jest wstępnie zainicjowany -1. Zwiększenie go za pierwszym razem daje indeks 0, następnym razem 1itp.

Pip ma cykliczne indeksowanie, więc gdy funkcja wypisze ostatni znak, zacznie od początku.

DLosc
źródło
1

Python, 90 bajtów

Rozszerzenie standardowej quine Python (mile widziane wskazówki dotyczące gry w golfa):

def f(n=0,s='def f(n=0,s=%r):\n while 1:yield(s%%s)[n];n+=1'):
 while 1:yield(s%s)[n];n+=1

Jest to funkcja generatora python , co oznacza, że wykonujesz iterację, a każda iteracja zapewnia następny znak w kodzie źródłowym. Gdy wszystkie postacie zostały zwrócone, następuje awaria IndexError.

Do testowania wystarczy dołączyć ten skrypt na końcu programu:

source = ''
try:
    # Call generator, add characters to the string
    for char in f():
        source += char
except IndexError:
    # Generator has reached end of source code
    pass

print(source)

Lub wypróbuj online!

FlipTack
źródło
1

*> <> , 13 21 bajtów

" r:2+a1Fi1+:1F1+[ro;

Tworzy plik o nazwie \numożliwiającej śledzenie indeksu.

To może być więcej golfa, ale nic nie wyskakuje na mnie natychmiast ...

Wydajność

$ starfish incrementalquine.sf 
"$ starfish incrementalquine.sf 
 $ starfish incrementalquine.sf 
r$ starfish incrementalquine.sf 
:$ starfish incrementalquine.sf 
2$ starfish incrementalquine.sf 
+$ starfish incrementalquine.sf 
a$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
F$ starfish incrementalquine.sf 
i$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
+$ starfish incrementalquine.sf 
:$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
F$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
+$ starfish incrementalquine.sf 
[$ starfish incrementalquine.sf 
r$ starfish incrementalquine.sf 
o$ starfish incrementalquine.sf 
;$ starfish incrementalquine.sf

Wyjaśnienie

" r:2+                 build the quine
      a1F              open file named "\n"
         i1+:          read input, increment by 1, duplicate
             1F        save incremented input to file
               1+[     increment input, copy that many values to a new stack
                  ro   output the character at the beginning of the new stack
                    ;  end

Oszukiwanie Przyrostowa Quine

a1Fi1+:0go1F;

Wyjaśnienie

a1F            open file named "\n"
   i1+         read input and add 1 to it
      :0g      push the value at (input,0) to the stack
         o     output the value
          1F   save the incremented input to the file
            ;  exit
redstarcoder
źródło
haha, nie miałem pojęcia, że ​​możesz nazwać plik „\ n”. Chociaż to technicznie czyta kod źródłowy, według ginstrukcji.
Conor O'Brien
@ ConorO'Brien, ah fair. hmm ...
redstarcoder,
Czy *> <> ma jakieś indeksowanie stosu? Czy powtarzanie poleceń? Następnie możesz użyć standardowej struktury quine "your code goes here;dla> <>, a następnie uzyskać dostęp do n-tego członka na stosie
Conor O'Brien
@ ConorO'Brien tak Teal Pelican pokazał mi ten wariant quine na mojej innej oszukańczej odpowiedzi :).
redstarcoder,
1
@ redstarcoder Pracowałem więcej nad quinesami (TAK!) i wymyśliłem niezłą sztuczkę, jeśli zastąpisz r dla # możesz: 1- the # like; #; lub [+ 1F1: + 1iF1a-1: "W tej chwili nie mogę tego przetestować, ale uważam, że wycina 1 bajt z twojego kodu.> <> quines można zrobić tak jak #o <-1:" itp .: D
Teal pelikan
1

Mathematica, 91 bajtów

Komentarze bardzo mile widziane; Wciąż uczę się lin o tym, jakie quines są odpowiednimi quinesami.

(If[!NumberQ[q], q = 0]; StringTake[ToString[#0]<>FromCharacterCode[{91, 93}], {++q}]) & []

Definiuje funkcję wywoływaną wielokrotnie bez argumentów. Po 91. wywołaniu pojawia się duży błąd i zwraca nieocenioną wartość.

Do rozwiązania były dwa problemy: po pierwsze, chciałem po prostu użyć StringTake[ToString[#0]<>"[]"], ale ToString[]wydaje się, że usuwam cudzysłowy; więc musiałem zastąpić "[]"przez FromCharacterCode[{91, 93}]. Po drugie, zmienne Mathematica zaczynają się od niezainicjowanej, więc nie mogę zadzwonić ++qwcześniej, qjest zdefiniowane; dlatego If[!NumberQ[q], q = 0]potrzebna jest inicjał .

Nieistotna koda: patrząc w górę NumberQdowiedziałem się, że Mathematica ma funkcję o nazwie TrueQ... która, tak, zwraca, Truejeśli argument jest, Truea Falseargument jest False! (Narzędzie polega na tym, że zwraca również Falsewszystkie inne argumenty.)

Greg Martin
źródło
1

Microscript II, 40 33 bajtów

Literał bloku kodu, najbliższy odpowiednik języka dla funkcji:

{ss1K+>K>s#<v{o}sl*v!(123v)lKp<o}

Po uruchomieniu ponownie włącza się, xaby ułatwić ponowne wywołanie.

SuperJedi224
źródło
0

Bash (i zsh, ksh), 39 bajtów

a=`<$0`;pwd>>0;echo ${a:`wc -l<0`-1:1}

Po wydrukowaniu programu nic nie jest drukowane.

Upewnij się, 0że nie istnieje w bieżącym katalogu i uruchom:

bash iquine.bash
Kaito Udagawa
źródło
Witamy w PPCG! Masz sprytny pomysł na zwiększenie indeksu. Niestety wygląda na to, że ta odpowiedź działa poprzez odczytanie własnego kodu źródłowego, co oznacza, że ​​nie jest to prawidłowy quine według naszych standardów . Jeśli zmodyfikujesz go, aby używał innych technik niż czytanie własnego źródła, będzie to dobra odpowiedź.
DLosc