Y2K ... tahun 2019?

18

Ini 10 Agustus 2019, tetapi tugas Anda masih melibatkan Y2K. Aneh, kan?

Buat program yang mencetak sendiri, dengan nomor dua digit ditambahkan padanya. Pertama kali Anda menjalankannya, ia harus menambahkan 00 ke outputnya (kode sumbernya, karena ini adalah varian quine). Ketika Anda menjalankan output itu, program asli tanpa nomor dua digit, itu harus menampilkan program asli, tetapi dengan 01 ditambahkan. Jalankan output itu untuk mendapatkan program OG dengan 02 ditambahkan, maka untuk mendapatkan program dengan 03 ... Rantai ini harus berlanjut hingga 99. Program itu harus di-output BREAKING NEWS: WORLD ENDS.

Jika program Anda adalah Y2Kparanoia: yes:

  1. Seharusnya output Y2Kparanoia: yes00
  2. Keluaran itu harus dicetak Y2Kparanoia: yes01
  3. Keluaran itu harus dicetak Y2K paranoia: yes02
  4. Ulangi hingga langkah 100: program ini menampilkan berita kiamat yang ditentukan

Ini adalah kode golf, sehingga program terpendek yang dapat mencetak sendiri sambil mengikuti langkah-langkah ini akan menang.

Andrew
sumber
7
Menurut deskripsi, 99 kali kita menjalankan kita akan berjalan 2Kparanoia: yes97dan memproduksi 2Kparanoia: yes98, jadi tidak seharusnya (4) membaca Repeat to step 100, but step 101 will output "BREAKING NEWS: WORLD ENDS"? (Yaitu 2Kparanoia: yes99menghasilkan berita)
Jonathan Allan

Jawaban:

7

Perl 6 , 122 114 106 byte

-8 Bytes berkat Shelvacu

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

Cobalah online!

Mengambil format quine standar dan menambahkan string berita yang melanggar serta panggilan fungsi baru dengan nomor yang ditambahkan. Ini digunakan ENDuntuk menjalankan fungsi ketika program berakhir.

Jo King
sumber
Anda dapat menyimpan 3 byte lebih banyak dengan menggunakan ENDdan ourvariabel:END {<print $s-199??"END\{<$_>~~.EVAL};our\$s="~($s-1&&$s-99)+100!!"BREAKING NEWS: WORLD ENDS">~~.EVAL};our$s=1
Shelvacu
Untuk saat ini, ini adalah pemenang saat ini.
Andrew
7

Ruby, 158 154 146 128 122 100 byte

Terinspirasi oleh jawaban ini .

eval s=%{$><<(D>198?'BREAKING NEWS: WORLD ENDS':'eval s=%%{%s}<<D=%d'%[s[0..-2],D<2?100:D+1])#}<<D=1

EDIT: Saya dapat menghapus (s.split(35.chr)[0]+35.chr).inspectdan menggantinya dengan s[0..-2](rentang setiap nilai kecuali yang terakhir) dan %{ ... }sintaks string yang saya gunakan sebelumnya. Disimpan 22 byte!

Versi lama:

EDIT: Menyimpan sepasang parens (dan pasangan yang sesuai di bagian data) dengan menyadari bahwa itu "BREAKING NEWS: WORLD ENDS"adalah format string yang benar-benar valid, dan ruby ​​mengabaikan parameter 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

Ketika mulai ini saya menyadari bahwa karena nomor harus pergi di akhir program, dan ruby ​​tidak mengizinkan menggunakan variabel sebelum mereka dinyatakan, saya harus membuat kode berjalan setelah angka entah bagaimana. Saya bisa melakukan sesuatu seperti def a(s) ... end;a 1yang akan terjadi ...end;a 100, namun menggunakan ENDsintaks Ruby yang kurang dikenal menggunakan byte lebih sedikit. Namun, blok di dalamnya ENDberada dalam cakupan yang berbeda, jadi Sharus berupa variabel global atau konstan.

Penjelasan:

  • END{ ... };S=1: Jalankan blok kode tepat sebelum program berakhir; Tetapkan konstan Ske 1(atau 100- 199di iterasi berikutnya)
  • $><<( ... ): $>adalah jalan pintas di ruby ​​untuk stdout, dan <<pada IO menulis ke IO. Diperlukan parens, jika tidak demikian($><<S)>198...
  • S>198?"BREAKING NEWS: WORLD ENDS":(q=...)%[q,S<2?0:S-99]: Jika saya memecah ini menjadi kode yang sedikit lebih masuk akal itu akan menjadi:

    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

    The %Operator diterapkan string secara efektif printf, dengan LHS menjadi format string dan RHS menjadi argumen.

  • %{ ... (q=%%{%s}) ... S=1%02d}: ruby ​​memiliki sintaks yang menarik untuk string yang juga memungkinkan pasangan kurung keriting muncul di dalam string tanpa keluar selama mereka seimbang. Ini sangat membantu, karena jika tidak, quine yang sama harus melarikan diri dari string untuk menjadikannya sebagai string literal. Dua pergantian dalam string format adalah %suntuk string biasa dan %02duntuk jumlah yang tepat ke ukuran 2 dengan karakter 0.

Pikiran saya tentang memperpendek lebih lanjut:

  • Akan lebih baik untuk dapat menggunakan, sbukan $s, tetapi mendefinisikan s=$s;atau membuat fungsi def a(s) ...keduanya menggunakan lebih banyak byte daripada yang mereka simpan, dan saya tidak bisa memikirkan cara lain untuk melakukannya. EDIT: Konstanta bersifat global dan dapat menjadi satu karakter!
  • Akan lebih baik jika Sselalu kurang dari itu 100, sehingga bisa dibandingkan dengan menggunakan angka 2 digit, bukan angka 3 digit. Namun, jika saya gunakan S=0di akhir, dua digit berikutnya ditafsirkan sebagai oktal, 8dan 9tidak valid dan semuanya adalah bunk. S=sama sekali tidak valid, dan saya tidak tahu cara lain untuk membuat nilai valid baik sebelum dan sesudah menambahkan dua digit. Dari catatan, 0(dan setiap bilangan bulat lainnya) adalah truthy di ruby.

Setiap pemikiran tentang bagaimana membuat ini lebih pendek, tolong beri tahu saya!

Cobalah online!

Shelvacu
sumber
Mungkin jika Anda menggunakan s=100-1? Maka sakan menjadi 99, 0, -1 ...- 99, dan -sakan menjadi -99, 0 ... 99.
Purple P
@PurpleP Tidak peduli bagaimana saya mencoba, saya tidak dapat menemukan cara untuk melakukan itu dan menyimpan karakter.
Shelvacu
5

Pergi, 382 366 354 340 305 298 272 byte

Tidak akan menang tetapi saya bersenang-senang dengan tantangan.

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

Cobalah di Go Playground!

Berdasarkan quine. Jika variabel nkurang dari 199, maka itu menambah variabel string naksen kubur ( \x60), karakter Go untuk string multiline, diikuti oleh koma ,. Ini berlanjut dengan mencetak 147 karakter pertama s(untuk mencegah pencetakan ,karena itu hanya terjadi di akhir) kemudian mencetak ssecara keseluruhan, dan akhirnya mencetak 100jika n == 1dan n+1sebaliknya. Hasilnya adalah berturut-turut berjalan mengubah variabel ndi akhir program menjadi 100, 101, dll. Jika variabelnya n199 atau lebih, maka ia mencetak berita.

Ungu P
sumber
3

Haskell , 240 232 218 216 byte

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

Cobalah online!

Diadaptasi dari quine

B. Mehta
sumber
2

JavaScript (ES6), 116 byte

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

94 byte, jika fungsi pengerasan diizinkan

f=_=>((p=`f=${f}`.split`|`)[4]=p[4]-1?-~p[4]:100)-200?p.join`|`:'BREAKING NEWS: WORLD ENDS'||1
Herman L.
sumber
2
Anda tidak dapat membaca kode sumber Anda sendiri ( f=${f}), itu bukan quine menurut codegolf.meta.stackexchange.com/a/4878/13400
Shelvacu
1

C # (Visual C # Interactive Compiler) , 193 byte

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

Cobalah online!

Perwujudan Ketidaktahuan
sumber
1

Pyth , 81 80 byte

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

Cobalah online!

Penjelasan:

.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

Dan kode dalam string adalah (berita singkat):

?>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
sumber