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).inspectonu 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 1olacaktı ...end;a 100ancak Ruby'nin az bilinen kullanarak, ENDsözdizimi kullanır az bayt. Bununla birlikte, içerideki blok ENDfarklı bir kapsamdadır, bu nedenle Skü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 Solarak ayarlayın 1(veya 100- 199gelecek 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 printfLHS 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, %snormal bir dize ve %02dkarakterle 2 boyutuna sağa doğru doldurulmuş bir sayı içindir 0.
Kısaltma konusundaki düşüncelerim:
Bunun syerine 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
Szaman 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=0sonunda kullanırsam , sonraki iki basamak sekizlik olarak yorumlanır 8ve 9geç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: yes99haberleri üretir)