Jest 10 sierpnia 2019 r., Ale twoje zadanie nadal dotyczy Y2K. Dziwne, prawda?
Utwórz program, który drukuje się sam, z dołączoną dwucyfrową liczbą. Przy pierwszym uruchomieniu powinien on dołączyć 00 do jego wyniku (do kodu źródłowego, ponieważ jest to wariant quine). Po uruchomieniu tego wyjścia oryginalny program bez dwucyfrowej liczby powinien wypisać oryginalny program, ale z dołączonym 01. Uruchom to wyjście, aby uzyskać program OG z dołączonym 02, a następnie to, aby uzyskać program z 03 ... Ten łańcuch powinien trwać do 99. Ten program powinien wyjść BREAKING NEWS: WORLD ENDS
.
Jeśli twój program to Y2Kparanoia: yes
:
- Powinien wyjść
Y2Kparanoia: yes00
- Ten wynik powinien zostać wydrukowany
Y2Kparanoia: yes01
- Ten wynik powinien zostać wydrukowany
Y2K paranoia: yes02
- Powtarzaj do kroku 100: ten program wyświetla określone wiadomości z terminem zagłady
Jest to kod golfowy, więc wygrywa najkrótszy program, który może sam się wydrukować podczas wykonywania tych kroków.
2Kparanoia: yes97
i produkować2Kparanoia: yes98
, więc nie powinniśmy (4) czytaćRepeat to step 100, but step 101 will output "BREAKING NEWS: WORLD ENDS"
? (tj.2Kparanoia: yes99
produkuje wiadomości)Odpowiedzi:
Perl 6 ,
122 114106 bajtów-8 bajtów dzięki Shelvacu
Wypróbuj online!
Pobiera standardowy format quine i dodaje ciąg wiadomości z ostatniej chwili, a także nowe wywołanie funkcji z dołączonym numerem. Służy
END
do wykonywania funkcji po zakończeniu programu.źródło
END
iour
zmiennej:END {<print $s-199??"END\{<$_>~~.EVAL};our\$s="~($s-1&&$s-99)+100!!"BREAKING NEWS: WORLD ENDS">~~.EVAL};our$s=1
Rubin,
158154146128122100 100 bajtówZainspirowany tą odpowiedzią .
EDYCJA: Byłem w stanie usunąć
(s.split(35.chr)[0]+35.chr).inspect
i zastąpić gos[0..-2]
(zakres każdej wartości oprócz ostatniej) i%{ ... }
składnię łańcucha, której użyłem wcześniej. Zapisano 22 bajtów!Stara wersja:
EDYCJA: Zapisałem parę parenów (i odpowiednią parę w sekcji danych), zdając sobie sprawę, że
"BREAKING NEWS: WORLD ENDS"
jest to doskonale poprawny ciąg formatu, a ruby ignoruje wszelkie parametry extraneos.Rozpoczynając to, zdałem sobie sprawę, że ponieważ liczba musi iść na samym końcu programu, a ruby nie zezwala na używanie zmiennych przed ich zadeklarowaniem, musiałbym jakoś uruchomić kod po cyfrach. Mógłbym zrobić coś takiego,
def a(s) ... end;a 1
co by się stało...end;a 100
, jednak użycie mniej znanejEND
składni Ruby zużywa mniej bajtów. Jednak blok wewnątrzEND
ma inny zakres, więcS
musi być zmienną globalną lub stałą.Wyjaśnienie:
END{ ... };S=1
: Uruchom blok kodu tuż przed zakończeniem programu; Ustaw stałąS
na1
(lub100
-199
w przyszłych iteracjach)$><<( ... )
:$>
jest skrótem ruby dla<<
standardowego wyjścia , a na IO pisze do IO. Pareny są wymagane, w przeciwnym razie stanie się($><<S)>198...
S>198?"BREAKING NEWS: WORLD ENDS":(q=...)%[q,S<2?0:S-99]
: Gdybym podzielił to na nieco bardziej rozsądny kod, byłoby to:%
Operator stosuje się ciąg jest faktycznieprintf
, z LHS jest ciąg formatu i RHS są argumenty.%{ ... (q=%%{%s}) ... S=1%02d}
: ruby ma interesującą składnię dla ciągów, która pozwala również na pojawienie się nawiasów klamrowych w ciągu bez ucieczki, o ile są one zrównoważone. Jest to bardzo pomocne, ponieważ w przeciwnym razie podobny quine musiałby uciec od łańcucha, aby umieścić go w sobie jako literał łańcucha. Dwie substytucje w ciągu formatu są ciągiem%s
zwykłym i%02d
liczbą wyrównaną do znaku wielkości do 20
.Moje przemyślenia na temat dalszego skrócenia:
Byłoby miło mócEDYCJA: Stałe są globalne i mogą być jedną postacią!s
zamiast tego używać$s
, ale zarówno definiowanie s, jaks=$s;
i tworzenie funkcji wymagadef a(s) ...
więcej bajtów, niż oszczędzają, i nie mogę wymyślić żadnego innego sposobu, aby to zrobić.S
zawsze był mniejszy100
, aby można go było porównać za pomocą liczb dwucyfrowych zamiast liczb 3-cyfrowych. Jeśli jednak użyjęS=0
na końcu, następne dwie cyfry są interpretowane jako ósemkowe8
i9
są niepoprawne, a wszystko jest piętrowe.S=
po prostu nie jest poprawny i nie znam żadnego innego sposobu, aby wartość była ważna zarówno przed, jak i po dodaniu dwóch cyfr. Warto zauważyć, że0
(i każda inna liczba całkowita) jest prawdziwa w rubinie.Daj mi znać, jak skrócić ten proces.
Wypróbuj online!
źródło
s=100-1
? Wtedys
będzie 99, 0, -1 ...- 99, i-s
będzie -99, 0 ... 99.Idź,
382 366 354 340 305 298272 bajtówNie wygra, ale dobrze się bawiłem z tym wyzwaniem.
Wypróbuj na boisku Go!
Na podstawie quine. Jeśli zmienna
n
jest mniejsza niż 199, to dodaje do zmiennej łańcuchowejn
poważny akcent (\x60
), znak Go dla ciągów wielowierszowych, po których następuje przecinek,
. Kontynuuje drukowanie pierwszych 147 znakóws
(aby zapobiec drukowaniu,,
ponieważ występuje to tylko na końcu), a następnie drukujes
jako całość, a na końcu drukuje,100
jeślin == 1
in+1
inaczej. Powoduje to, że kolejne przebiegi zmieniają zmiennąn
na końcu programu na 100, 101 itd. Jeśli zmiennan
ma wartość 199 lub więcej, to drukuje najświeższe informacje.źródło
Haskell ,
240232218216 bajtówWypróbuj online!
Wykonane z quine
źródło
JavaScript (ES6), 116 bajtów
94 bajty, jeśli dozwolone jest tworzenie łańcuchów
źródło
f=${f}
), to nie jest quine według codegolf.meta.stackexchange.com/a/4878/13400C # (interaktywny kompilator Visual C #) , 193 bajty
Wypróbuj online!
źródło
Pyth ,
8180 bajtówWypróbuj online!
Wyjaśnienie:
A kod w ciągu to (najnowsze wiadomości skrócone):
źródło