W tym wyzwaniu napiszesz program, który wypisze program, który jest dwukrotnie dłuższy niż oryginalny program. Emitowany program powinien wypisać nowy program program podwoi swoją długość.
Przykłady
Jeśli moim programem jest a
:
< a
> aa
< aa
> aaaa
< aaaa
> aaaaaaaa
Zasady
- Brak wbudowanych quine
- Oryginalny program musi mieć co najmniej jeden bajt
- Sekwencja powinna teoretycznie działać w nieskończoność
- Twój program nie może czytać z niczego (plik, stdio)
Twój wynik to rozmiar oryginalnego programu.
code-golf
sequence
quine
code-generation
Downgoat
źródło
źródło
Odpowiedzi:
CJam, 10 bajtów
Sprawdź to tutaj.
Wyjaśnienie
źródło
JavaScript,
626137 bajtówDzięki @ Doᴡɴɢᴏᴀᴛ za pomoc!
Oryginalny [37 bajtów]:
Dziecko [74 bajty]:
Wnuk [148 bajtów]:
Alternatywnie (z drukowaniem do konsoli i jako pełny program):
Oryginalny [61 bajtów]:
Dziecko [122 bajty]:
Wnuk [244 bajty]:
Jak to działa!
1.
f=_=>
Zdefiniuj funkcję f jakoconsole.log(...)
2.
;f()
Uruchom funkcję f.3. (w funkcji f)
console.log(...)
Wydrukuj następujące:f=
dosłowny tekst „f =”${'_'.repeat((0+f).length+5)
„_” powtórzone dla długości f, zmienione w celu uwzględnienia znaków nieuwzględnionych w łańcuchu f+f}
Strukturyzacja funkcji f;f()
dosłowny tekst „; f ()”Notatki
console.log
jest konieczne zamiast,alert
ponieważalert
wydaje się, że nie gra dobrze z naprawdę długimi łańcuchami (przynajmniej w konfiguracji mojego komputera / przeglądarki)_
są wstawiane do nazwy (nieużywanego) parametru funkcji f, aby upewnić się, że są uwzględnione w łańcuchowaniu f.console.log
) pierwszego rozwiązania w stosunku do drugiego: dodanie10
do funkcji zamiast0
rzucania jej na łańcuch powoduje, że jest on o jeden bajt dłuższy, eliminując potrzebę dodawania 1 do długości później, oszczędzając bajt.źródło
0+f
powinien również pracować nad(f=_=>`(f=${'_'.repeat((0+f).length+5)+f})()`)()
Minkolang 0,15 ,
1914 bajtówOryginał , dziecko , wnuk .
Wyjaśnienie
To, co
r
robi bit pomiędzy s, powiela okres kończący tyle razy, aby spełnić kryterium podwojenia..
jest znakiem „zatrzymaj program”, więc wiele okresów na końcu nie robi nic poza byciem tam.źródło
CJam, 12 bajtów
Po uruchomieniu zostanie wydrukowane
który z kolei wydrukuje
i tak dalej.
Wypróbuj online!
źródło
Python 3, 51 bajtów
Obejmuje to końcowy znak nowej linii.
Które wyjścia:
źródło
GolfScript, 11 bajtów
Wypróbuj online!
Jak działa kod źródłowy
Jeśli powyższy kod źródłowy zostanie wykonany raz, stos zakończy się jako
gdzie pusty ciąg na początku odpowiada początkowemu stanowi stosu (puste wejście).
Dwie kopie kodu źródłowego pozostawiałyby końcowy stan
i tak dalej.
Co się potem dzieje
Po wykonaniu kodu źródłowego interpreter wykonuje następujące czynności:
Zawija cały stos w tablicę i wypycha tę tablicę na stos.
Dla pojedynczej kopii kodu źródłowego stos zawiera teraz
Wykonano go
puts
z zamiarem wydrukowania owiniętego stosu, a następnie podania linii.puts
jest zdefiniowany jako{print n print}
, więc wykonuje następujące czynności.print
drukuje zawiniętą kopię stosu bez sprawdzania go (tzn. bez konwertowania go do reprezentacji ciągu). To wysyłado STDOUT i wysuwa kopię stosu z góry stosu.
Stos zawiera teraz
wykonuje zdefiniowany wcześniej blok kodu.
:
zaczyna się od zapisania["" {: ".~"]} ".~"]
znaku spacji, a następnie".~"
przesuwa się i]
zawija stos w tablicę.n
wypycha ciąg składający się z pojedynczego kanału.Stos zawiera teraz
jest wykonywany ponownie. Zostało jednak na nowo zdefiniowane, gdy wywołaliśmy go po raz pierwszy i teraz zawiera tablicę, a nie blok kodu.
W rzeczywistości pcha
["" {: ".~"]} ".~"]
, pozostawiając stos jakoNa koniec
print
drukuje najwyższy element stosu bez sprawdzania go, wysyłającdo STDOUT.
źródło
𝔼𝕊𝕄𝕚𝕟, 26 znaków / 36 bajtów
Try it here (Firefox only).
Zauważ, że jest nowy znak końca.
Wyjaśnienie
Standardowy quine:
⟮ⒸⅩ222+ᶈ0
Modyfikacje:
ô
funkcji, aby wyświetlić quinesy wszystkie wyniki zamiast ostatniego wyniku (tak jak w przypadku niejawnego wyniku)\u27ee⦃ᶈ0}\u27ef\n
i zamknij blok kopiowania, aby zapobiec konfliktom z późniejszymi blokami kopiowania.ď2
aby powtórzyć ciąg dwa razy.źródło