Y2K… w 2019 roku?

18

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:

  1. Powinien wyjść Y2Kparanoia: yes00
  2. Ten wynik powinien zostać wydrukowany Y2Kparanoia: yes01
  3. Ten wynik powinien zostać wydrukowany Y2K paranoia: yes02
  4. 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.

Andrzej
źródło
7
Zgodnie z opisem, po raz 99 uruchomimy będziemy działać 2Kparanoia: yes97i 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: yes99produkuje wiadomości)
Jonathan Allan

Odpowiedzi:

7

Perl 6 , 122 114 106 bajtów

-8 bajtów dzięki Shelvacu

END {<print $!-199??"END \{<$_>~~.EVAL};\$!="~($!-1&&$!-99)+100!!"BREAKING NEWS: WORLD ENDS">~~.EVAL};$!=1

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 ENDdo wykonywania funkcji po zakończeniu programu.

Jo King
źródło
Możesz zapisać 3 kolejne bajty za pomocą ENDi ourzmiennej:END {<print $s-199??"END\{<$_>~~.EVAL};our\$s="~($s-1&&$s-99)+100!!"BREAKING NEWS: WORLD ENDS">~~.EVAL};our$s=1
Shelvacu
Na razie jest to obecny zwycięzca.
Andrew,
7

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).inspecti 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 1co by się stało ...end;a 100, jednak użycie mniej znanej ENDskładni Ruby zużywa mniej bajtów. Jednak blok wewnątrz ENDma inny zakres, więc Smusi być zmienną globalną lub stałą.

Wyjaśnienie:

  • END{ ... };S=1: Uruchom blok kodu tuż przed zakończeniem programu; Ustaw stałą Sna 1(lub 100- 199w 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 %szwykłym i %02dliczbą wyrównaną do znaku wielkości do 2 0.

Moje przemyślenia na temat dalszego skrócenia:

  • Byłoby miło móc szamiast 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 Szawsze 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=0na końcu, następne dwie cyfry są interpretowane jako ósemkowe 8i 9są 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!

Shelvacu
źródło
Może jeśli używałeś s=100-1? Wtedy sbędzie 99, 0, -1 ...- 99, i -sbędzie -99, 0 ... 99.
Purple P
@ PurpurP Bez względu na to, jak próbuję, nie mogę znaleźć sposobu, aby to zrobić i uratować postacie.
Shelvacu
5

Idź, 382 366 354 340 305 298 272 bajtów

Nie wygra, ale dobrze się bawiłem z tym wyzwaniem.

package main
func main(){if n<199{s+="\x60,"
print(s[:135],s,100+(n/100)*(n%100+1))}else{print("BREAKING NEWS: WORLD ENDS")}}
var s,n=`package main
func main(){if n<199{s+="\x60,"
print(s[:135],s,100+(n/100)*(n%100+1))}else{print("BREAKING NEWS: WORLD ENDS")}}
var s,n=`,1

Wypróbuj na boisku Go!

Na podstawie quine. Jeśli zmienna njest mniejsza niż 199, to dodaje do zmiennej łańcuchowej npoważny akcent ( \x60), znak Go dla ciągów wielowierszowych, po których następuje przecinek ,. Kontynuuje drukowanie pierwszych 147 znaków s(aby zapobiec drukowaniu, ,ponieważ występuje to tylko na końcu), a następnie drukuje sjako całość, a na końcu drukuje, 100jeśli n == 1i n+1inaczej. Powoduje to, że kolejne przebiegi zmieniają zmienną nna końcu programu na 100, 101 itd. Jeśli zmienna nma wartość 199 lub więcej, to drukuje najświeższe informacje.

Fioletowy P.
źródło
3

Haskell , 240 232 218 216 bajtów

p=putStr;h 1=100;h k=k+1;g _=p$"n="++show(h n);main|n>198=p"BREAKING NEWS: WORLD ENDS"|1>0=p<>print<>g$"p=putStr;h 1=100;h k=k+1;g _=p$\"n=\"++show(h n);main|n>198=p\"BREAKING NEWS: WORLD ENDS\"|1>0=p<>print<>g$"
n=1

Wypróbuj online!

Wykonane z quine

B. Mehta
źródło
2

JavaScript (ES6), 116 bajtów

setTimeout(s="alert((n-1?++n:n=100)-200?`setTimeout(s=${JSON.stringify(s)}),n=`+n:'BREAKING NEWS: WORLD ENDS')"),n=1

94 bajty, jeśli dozwolone jest tworzenie łańcuchów

f=_=>((p=`f=${f}`.split`|`)[4]=p[4]-1?-~p[4]:100)-200?p.join`|`:'BREAKING NEWS: WORLD ENDS'||1
Herman L.
źródło
2
Nie możesz odczytać własnego kodu źródłowego ( f=${f}), to nie jest quine według codegolf.meta.stackexchange.com/a/4878/13400
Shelvacu
1

C # (interaktywny kompilator Visual C #) , 193 bajty

x=>{var a=t>198?"BREAKING NEWS: WORLD ENDS":"x=>{{var a=t>198?{1}BREAKING NEWS: WORLD ENDS{1}:{1}{0}{1};Write(a,a,(char)34,t+(t<2?99:1));}};int t={2}";Write(a,a,(char)34,t+(t<2?99:1));};int t=1

Wypróbuj online!

Wcielenie ignorancji
źródło
1

Pyth , 81 80 bajtów

.vh,K"?>J198\"BREAKING NEWS: WORLD ENDS\"s[\".vh,K\"N:KN+C92NN\"J\"?<J2*TT+J1"J1

Wypróbuj online!

Wyjaśnienie:

.vh,K" ... "J1
.v               Eval pyth code
  h              Get the first item in list
   ,             Make a list of the next two items
            J1   Set J = 1 (J = 100 to 199 in future iterations)
    K" ... "     Set K to the given string

A kod w ciągu to (najnowsze wiadomości skrócone):

?>J198"BNWE"s[".vh,K"N:KN+C92NN"J"?<J2*TT+J1
?                                              Ternary: If A then B else C
 >J198                                         Test if J > 198
      "BNWE"                                   String literal; If ternary was true, return this (which is then implicitly printed)
            s[".vh,K"N:KN+C92NN"J"?<J2*TT+J1   ternary else
            s                                  concatenate list of strings
             [                                 create list
              ".vh,K"                          string literal, list[0]
                     N                         N is set to the double-quote character, list[1]
                      :KN+C92N                 list[2]
                      :                        Regex substitution. In A, replace B with C
                       K                       Variable K (set to the string being eval'd)
                        N                      N is double-quote
                         +C92N                 A backslash followed by a double-quote
                         +                     concat two strings
                          C92                  character with code point 92 (backslash)
                             N                 N is double-quote
                              N                N is double-quote, list[3]
                               "J"             String literal, list[4]
                                  ?<J2*TT+J1   Inner ternary, list[5]
                                   <J2         If J < 2 ..
                                      *TT      return T * T (10 * 10), else
                                          +J1  return J+1
Shelvacu
źródło