Yakut, 158 154 146 128 122 100 bayt
Bu cevaptan esinlenildi .
eval s=%{$><<(D>198?'BREAKING NEWS: WORLD ENDS':'eval s=%%{%s}<<D=%d'%[s[0..-2],D<2?100:D+1])#}<<D=1
DÜZENLEME: Daha önce kullandığım dize sözdizimi ( son hariç her değerin aralığı) ve (s.split(35.chr)[0]+35.chr).inspect
onu kaldırabilir ve değiştirebildim . 22 bayt kaydedildi!s[0..-2]
%{ ... }
Eski versiyon:
EDIT: "BREAKING NEWS: WORLD ENDS"
Mükemmel geçerli bir biçim dizesi olduğunu fark ederek bir çift parens (ve veri bölümünde karşılık gelen çifti) kaydetti ve ruby herhangi bir extraneos parametresini yok sayar.
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
Numara beri fark bu ben başlatırken vardır programın en sonuna gitmek ve yakut, beyan önce değişkenleri kullanarak izin vermez, ben kod çalışmasını sağlamak zorunda kalacak sonra nasılsa basamak. Ben gibi bitti bir şey yapabilirdim def a(s) ... end;a 1
olacaktı ...end;a 100
ancak Ruby'nin az bilinen kullanarak, END
sözdizimi kullanır az bayt. Bununla birlikte, içerideki blok END
farklı bir kapsamdadır, bu nedenle S
küresel bir değişken veya sabit olmalıdır.
Açıklama:
END{ ... };S=1
: Program bitmeden hemen önce kod bloğunu çalıştırın; Sabit S
olarak ayarlayın 1
(veya 100
- 199
gelecek yinelemelerde)
$><<( ... )
: $>
stdout için ruby kısayoludur ve <<
IO'da IO'ya yazar. Parens gerekli, aksi takdirde olur($><<S)>198...
S>198?"BREAKING NEWS: WORLD ENDS":(q=...)%[q,S<2?0:S-99]
: Eğer biraz daha makul bir koda bu kırmak olsaydı olurdu:
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
%
Bir dize uygulanan operatör etkili bir olduğunu printf
LHS biçim dizesi olan ve RHS argümanlar olmak üzere.
%{ ... (q=%%{%s}) ... S=1%02d}
: ruby, dizeler için ilginç bir sözdizimine sahiptir, bu da kıvırcık parantez çiftlerinin dengelendiği sürece herhangi bir kaçış olmadan dizenin içinde görünmesini sağlar . Bu çok yararlıdır, aksi takdirde benzer bir kine, dizgi değişmezi olarak kendi içine koymak için dizeden kaçmak zorunda kalacaktır. Biçim dizesindeki iki ikame, %s
normal bir dize ve %02d
karakterle 2 boyutuna sağa doğru doldurulmuş bir sayı içindir 0
.
Kısaltma konusundaki düşüncelerim:
Bunun s
yerine kullanabilmek güzel olurdu $s
, ancak s'yi tanımlamak s=$s;
veya bir işlevi yapmak def a(s) ...
, kaydettiklerinden daha fazla bayt kullanır ve bunu yapmanın başka bir yolunu düşünemiyorum. EDIT: Sabitler küresel ve bir karakter olabilir!
- Her
S
zaman daha az olsaydı iyi olurdu 100
, böylece 3 basamaklı sayılar yerine 2 basamaklı sayılar kullanılarak karşılaştırılabilirdi. Ancak, S=0
sonunda kullanırsam , sonraki iki basamak sekizlik olarak yorumlanır 8
ve 9
geçersizdir ve hepsi ranzadır. S=
sadece geçerli değil ve bir değeri iki basamak eklemeden önce ve sonra geçerli kılmanın başka bir yolunu bilmiyorum. Not, 0
(ve diğer her tam sayı) yakutta doğrudur .
Bunu nasıl kısaltacağınız hakkında herhangi bir düşünce, lütfen bana bildirin!
Çevrimiçi deneyin!
2Kparanoia: yes97
üreteceğiz2Kparanoia: yes98
, bu yüzden okumamalıyız (4)Repeat to step 100, but step 101 will output "BREAKING NEWS: WORLD ENDS"
? (yani2Kparanoia: yes99
haberleri üretir)