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).inspect
dan 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 1
yang akan terjadi ...end;a 100
, namun menggunakan END
sintaks Ruby yang kurang dikenal menggunakan byte lebih sedikit. Namun, blok di dalamnya END
berada dalam cakupan yang berbeda, jadi S
harus berupa variabel global atau konstan.
Penjelasan:
END{ ... };S=1
: Jalankan blok kode tepat sebelum program berakhir; Tetapkan konstan S
ke 1
(atau 100
- 199
di 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 %s
untuk string biasa dan %02d
untuk jumlah yang tepat ke ukuran 2 dengan karakter 0
.
Pikiran saya tentang memperpendek lebih lanjut:
Akan lebih baik untuk dapat menggunakan, s
bukan $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
S
selalu kurang dari itu 100
, sehingga bisa dibandingkan dengan menggunakan angka 2 digit, bukan angka 3 digit. Namun, jika saya gunakan S=0
di akhir, dua digit berikutnya ditafsirkan sebagai oktal, 8
dan 9
tidak 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: yes97
dan memproduksi2Kparanoia: yes98
, jadi tidak seharusnya (4) membacaRepeat to step 100, but step 101 will output "BREAKING NEWS: WORLD ENDS"
? (Yaitu2Kparanoia: yes99
menghasilkan berita)