Rubin, 158 154 146 128 122 100 100 bajtów
Zainspirowany tą odpowiedzią .
eval s=%{$><<(D>198?'BREAKING NEWS: WORLD ENDS':'eval s=%%{%s}<<D=%d'%[s[0..-2],D<2?100:D+1])#}<<D=1
EDYCJA: Byłem w stanie usunąć (s.split(35.chr)[0]+35.chr).inspect
i zastąpić go s[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.
END{$><<(q=S>198?"BREAKING NEWS: WORLD ENDS":%{END{$><<(q=S>198?"BREAKING NEWS: WORLD ENDS":%%{%s})%%[q,S<2?0:S-99]}
S=1%02d})%[q,S<2?0:S-99]}
S=1
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 znanej END
składni Ruby zużywa mniej bajtów. Jednak blok wewnątrz END
ma inny zakres, więc S
musi być zmienną globalną lub stałą.
Wyjaśnienie:
END{ ... };S=1
: Uruchom blok kodu tuż przed zakończeniem programu; Ustaw stałą S
na 1
(lub 100
- 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:
if S > 198
"BREAKING NEWS: WORLD ENDS"
else
q = ...
number_to_append = if S < 2
0
else
S - 100 + 1
end
q % [q, number_to_append]
end
%
Operator stosuje się ciąg jest faktycznie printf
, 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 2 0
.
Moje przemyślenia na temat dalszego skrócenia:
Byłoby miło móc s
zamiast tego używać $s
, ale zarówno definiowanie s, jak s=$s;
i tworzenie funkcji wymaga def a(s) ...
więcej bajtów, niż oszczędzają, i nie mogę wymyślić żadnego innego sposobu, aby to zrobić. EDYCJA: Stałe są globalne i mogą być jedną postacią!
- Byłoby miło, gdyby
S
zawsze był mniejszy 100
, 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 ósemkowe 8
i 9
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ć, że 0
(i każda inna liczba całkowita) jest prawdziwa w rubinie.
Daj mi znać, jak skrócić ten proces.
Wypróbuj online!
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)