Tworzenie wszechstronnej drukarki liczb całkowitych jest fajne, ale pisanie jednego kodu, który drukuje wiele różnych liczb, jest uciążliwe. Czy nie byłoby łatwiej stworzyć skrypt, który wypisuje liczbę, ale daje także nowy skrypt, aby uzyskać następny numer?
Wyzwanie:
Napisz kod, który wyświetli jedną liczbę całkowitą N
i kod wykonywalny. Następny kod powinien zostać wypisany, N+1
a kod, który może wypisać N+2
. Kontynuuj tę ścieżkę, aż dotrzesz N = 15
. (Ostatni wydrukowany numer powinien wynosić 15).
Zasady:
- Brak danych wejściowych (zakładając, że dane wejściowe są puste).
- Dozwolony jest pełny program lub funkcja lub inne wygodne formaty.
- Pierwszy kod powinien zostać wyprowadzony
1
. - Nie można wyprowadzać zer wiodących. Czyli nie można drukować
01
na1
. - Dane wyjściowe muszą mieć format
N, Code_for_N+1
. Zauważ, że dane wyjściowe są oddzielone przecinkiem i pojedynczą spacją. Kod dlaN+1
nie ma otaczających cudzysłowów.N , Code_for_N+1
nie jest akceptowane (spacja przed przecinkiem). Końcowe znaki nowej linii są w porządku. - Pierwszymi znakami danych wyjściowych musi być liczba. (Bez spacji wiodących lub
ans = N
). - Wydrukowany numer nie powinien być częścią następnego kodu (kod może zawierać ten numer, ale nie można traktować numeru wyjściowego jako części kodu)
- Przykład: wyjście
N=2
może być:2, printer 2
. W tym przypadkuprinter 2
jest kodN=3
. Nie możesz użyć całego wyniku:2, printer 2
jako kodu dlaN=3
.
- Przykład: wyjście
- Skrypty mogą być w różnych językach
- Typy danych są nieistotne (liczba może być ciągiem), ale nie może być otoczona niczym (cudzysłowy, nawiasy itp.).
- Jeśli jest wyprowadzany kod
N=15
, musi on albo wydrukowaćSTOP!
(patrz bonus), albo w ogóle nic nie wydrukować (nawet spacji lub nowego wiersza).- Kod parametru
N=15
nie może ulec awarii (ale wysyłanie do STDERR jest prawidłowe). - Jesteś zdyskwalifikowany, jeśli kod wyjściowy dla
N=15
wydruków16
lub cokolwiek innego (z wyjątkiem przypadku bonusowego).
- Kod parametru
- Wbudowane operatory quine są niedozwolone.
- Dostęp do pliku źródłowego za pośrednictwem systemu plików jest niedozwolony.
Premia:
-10 bajtów, jeśli kod, który drukuje 15, tworzy również kod, który drukuje „ STOP!
”
Przykłady wykorzystujące składnię Pythona: (oczywiście będą one działać tylko dla wybranych liczb całkowitych, a nie od 1 do 15.)
N = 1
print "1, print 2"
1, print 2
---
N = 15
print 15
15
---
N = 15 (Qualifies for the -10 bytes bonus)
print "15, print 'STOP!'"
15, print 'STOP!'
print 'STOP!'
STOP!
----
N = 15 (Qualifies for the -10 bytes bonus)
print "15, disp('STOP!')"
15, disp('STOP!') (disp('STOP!') outputs STOP! in MATLAB)
----
N = 15 (This one is not OK. The submission is disqualified)
print "15, print 16"
15, print 16
Obowiązują standardowe zasady gry w golfa! Wygrywa najmniejszy kod (dla N = 1) w bajtach!
f=>f+""
że byłby nieważny? (f+""
zwraca kod konstrukcyjny funkcji.)14, print(14+1)
czy nie?Odpowiedzi:
Pyth + ///, 15 bajtów - 10 = 5
Spowoduje to wydrukowanie
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, STOP!
w języku Pyth, pobranierange(1,15+1)
i usunięcie nawiasów początkowych i końcowych oraz wydrukowanie go, a następnie „, STOP!”.Następne czternaście programów znajduje się w ///, który bezpośrednio wyświetla wszystkie programy, które nie zawierają
/
lub\
. Więc drugi programdaje
2
i trzeci program3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
. Przedostatni program15, STOP!
drukuje15, STOP!
, więc ostatni program jest po prostuSTOP!
.źródło
cat
liczy się jako język?cat
nie wykonuje testu pierwotności, więc nie.JavaScript, 131238 - 10 = 131228 bajtów
Naiwne podejście okazało się gorsze niż oczekiwano. Z perspektywy czasu powinienem się tego spodziewać. Ale myślałem, że i tak to podzielę. Pełny kod tutaj.
Pomysł: Iteracyjnie ucieczka i dodanie
N-1, ...
źródło
CJam,
262524 bajtówWypróbuj online.
Kolejne programy mają po prostu zwiększoną pierwszą liczbę. Spowoduje to uruchomienie programu 16 razy.
Lub z premią za ten sam wynik:
Wypróbuj online.
Kolejne programy mają po prostu zwiększoną pierwszą liczbę. Spowoduje to uruchomienie programu 16 razy.
Alternatywne rozwiązanie dla premii:
źródło
</selfpromotion>
JavaScript (ES6),
6261 bajtów - 10 bonusów = 51 punktówWyjaśnienie
Rozwiązanie, które nie odczytuje własnego kodu źródłowego, a także nie jest absurdalnie długie.
Pierwszy program konstruuje wszystkie 15 innych programów i zagnieżdża je w sobie za pomocą funkcji rekurencyjnej. Rozwiązuję problem z odwrotnym ukośnikiem, zagnieżdżając same funkcje (które są następnie rzutowane na łańcuchy podczas wyjścia) zamiast łańcuchów.
Test
Pokaż fragment kodu
źródło
"" + (n=>m)
nie liczy się jako uzyskanie treści funkcjin=>m
?Matlab,
226212–10 = 202 bajtyDzięki @StewieGriffin za kilka bajtów =)
Pierwsza część to ciąg znaków reprezentujący drugą linię (poniżej), rzeczywisty kod (tylko przesunięty o 9). W Matlabie ciągi są macierzami wypełnionymi znakami, dzięki czemu można łatwo wykonywać zmiany, po prostu dodając / odejmując skalar. Tak więc program po prostu drukuje ponownie ten sam ciąg *, plus ten sam ciąg, ale został przesunięty, co skutkuje kodem.
* Niezupełnie: pierwszy bajt to licznik, który należy zwiększyć w każdej iteracji.
Quine trick ze sznurkiem został stąd bezwstydnie skradziony .
Oto kilka ostatnich wierszy sekwencji skopiowanych z konsoli:
źródło
JavaScript,
5047444244 * bajtówJest to funkcja, która wydobywa własne ciało (tylko
a
) i dokonuje w nim zamian. Uzyskanie treści funkcji wbudowanej funkcji JavaScript, choć nie jest jawnym operatorem quine (jeśli jest niepoprawna, usunie odpowiedź).W przypadku, gdy nie działa tam poprawnie osadzone (ponieważ dla mnie nie działa), możesz zobaczyć tam przykład .
* - wygląda na to, że fragment kodu daje wynik bez
a=
, uniemożliwiając dalsze połączeniaźródło
.replace(x++,x)
?a=_=>(x=1)+(x<15?`, ${a}`:"").replace(x,x+1)
działaPython 2.7.10,
196= 82 bajtówWhee !!! To było fajne. Teraz znacznie krótszy. : P
Wyjaśnienie:
Zacząłem od tego:
To tylko prosta quine. Po dodaniu licznika:
n
jest zmienną przeciwną, która jest drukowana na początku. Wtedy, gdy jego wydrukowanien=
części, zastępuje onn+1
dla%d
. Odtąd będzie się to liczyło w nieskończoność.A oto ostateczna wersja. Dodaje klauzulę if, aby zatrzymać o 15, i wypisuje „STOP!” także.
Stary kod:
Nigdy nie wygrywam, ale fajnie. : PO wiele krótszy, choć wciąż nie mam szans. : Pźródło
else
s nie ma spacji .PowerShell,
(215-10) = 205197167106104103 bajtów(Jeśli Twoim jedynym narzędziem jest PowerShell, każdy problem wygląda jak gwóźdź. Poczekaj ...)
Zasadniczo zaczynamy od ustawienia
$d
równego długiemu ciągowi olefiny prawie dziesięciu oryginalnego kodu. Wyprowadza1
a następnie$d
z operatorem formacie-f
poprawnie wypełnić{0}
,{1}
,{2}
stand-ins, zwiększając{2}
liczbę w,1*{2}
przekroju jeden za każdym razem.,x*y
Operacja w PowerShell tworzy nową tablicęy
elementów, z których każdy jest równyx
. Na przykład,,2*3
jest równoważne z@(2,2,2)
.Oznacza to, że pierwsze wyjście będzie
1, $c=(,1*2).length;$d=(etc...)
, więc gdy drugi kod jest wykonywany,$c
będzie równa rachubę tablicy@(1,1)
lub2
itp Zauważmy, że$c
nie są wykorzystywane jako zmienna w oryginalnym kodzie, tylko w kolejnych seriach.Zatrzymuje się, gdy drukuje 15, po prostu obliczając, czy
$c
jest równy,15
a następnie indeksując do tablicy, 0-ty element jest taki$c, $d
jak opisano powyżej, drugi jest po prostu15
. Tak więc, kiedy$c
ma 15 lat, będzie generować15
i nic więcej. Nie kwalifikuje się do premii, ponieważ"15, {0}STOP!{0}"
jest o 5 znaków za długi, aby wartość -10 była opłacalna.Wymaga terminala PowerShell o szerokości> ~ 150. Lub do ręcznego usunięcia dodatkowego łamania linii (że terminal jest pomocny wkładki na wyjściu opasania) podczas kopiowania wklejenie kodu. Lub w celu przechwycenia danych wyjściowych w zmiennej, a następnie ponownego uruchomienia tej zmiennej. Itp.
Edycja 1 - Zapisano niektóre bajty, usuwając „STOP!” sformułowanie.
Edytuj 2 - Durr, nie używaj .length za każdym razem, po prostu wywołaj go raz
Edytuj 3 - Nie musi to być quine, więc początkowy przebieg może być znacznie krótszy
Edytuj 4 - Zmieniono z używania ciągów na tablice do obliczenia
$c
, co pozwoliło zaoszczędzić dwa bajty. Jestem prawie pewien, że jest to prawie optymalne dla tego podejścia.Edycja 5 - Zapisano kolejny bajt, bezpośrednio licząc równość, a nie modując
źródło
JavaScript, 79–10 = 69 bajtów
Bez użycia
Function.prototype.toString
w jakikolwiek sposób.źródło
Befunge, 57-10 = 47 bajtów
Ten jest niesamowity. Wypróbuj tutaj .
źródło
STOP!
Partia, 73 + 5–10 = 68 bajtów
Wymaga,
CMD /V:ON
więc dodałem do tego 5 bajtów.źródło
Python 2.7, 107 znaków
Używając rekurencji, a nie writing a quine, I thought I could save a lot, which is true, but not good enough. Although not a winner, I think the approach is fun to share.
Zacząłem od utworzenia ciągu dla N = 4, unikając znaków
\
i"
.Następnie utworzyłem funkcję lambda, która tworzy ten ciąg, na podstawie indeksu początkowego i indeksu zatrzymującego, za pomocą rekurencji. To jest to:
Użyj tego w ten sposób:
Dane wyjściowe: [32902 znaków, za długi do obsługi]
Wygląda więc na to, że moje podejście do złożoności Kołmogorowa nie jest tak skuteczne ;-)
źródło
SMBF, 28 bytes
\x10
represents a literal byte (decimal value 16). The integer is output as an integer (byte). So the first character output is\x01
. The program then prints ", ". When printing its own source, it prints an extra+
at the beginning.Explanation:
Note that you cannot run this in a standard interpreter because it requires a hex literal in the input. You also need a special terminal for hex output to work properly.
źródło
Bash,
787473 - 10 = 63 bytes (Example, can't win)Coming in late, but saw bash hadn't been tried so gave it a go. First gulf challenge and quine-like puzzle. They're fun!
Explanation:
This works because
a
steps from 1 to 15 and is thenunset
along withp
. The script (stored inp
) prints them both out if they'reset
and "STOP!" otherwise. The initiallyunset
a
isset
to 0 because it appears in an arithmetic expansion.źródło
𝔼𝕊𝕄𝕚𝕟, 30 chars / 47 bytes (non-competitive)
Try it here (Firefox only).
Finally found a good ol' true quine for 𝔼𝕊𝕄𝕚𝕟.
Explanation
Here's the true quine that I used:
⟮ⒸⅩ222+ᶈ0
You see it in my answer? Hopefully, y'all will be able to expand from there.
źródło
Keg+PHP, 19-10=10 bytes
Counts from 1 to 15 and then stops. TIO
Keg, 13 bytes
źródło