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!
2Kparanoia: yes97dan memproduksi2Kparanoia: yes98, jadi tidak seharusnya (4) membacaRepeat to step 100, but step 101 will output "BREAKING NEWS: WORLD ENDS"? (Yaitu2Kparanoia: yes99menghasilkan berita)