Рубі, 158 154 146 128 122 100 байт
Натхненний цією відповіддю .
eval s=%{$><<(D>198?'BREAKING NEWS: WORLD ENDS':'eval s=%%{%s}<<D=%d'%[s[0..-2],D<2?100:D+1])#}<<D=1
EDIT: мені вдалося видалити (s.split(35.chr)[0]+35.chr).inspectта замінити його s[0..-2](діапазон кожного значення, крім останнього) та %{ ... }синтаксис рядків, який я використовував раніше. Збережено 22 байти!
Стара версія:
EDIT: Збережено пару паролів (і відповідну пару в розділі даних), зрозумівши, що "BREAKING NEWS: WORLD ENDS"це ідеально правильний рядок формату, а ruby ігнорує будь-які параметри 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
При запуску цього я зрозумів , що , так як число має йти в самому кінці програми, і рубін не дозволяє використовувати змінні , перш ніж вони будуть оголошені, я б зробити код , що виконується після того, як цифри як - то. Я міг би зробити щось подібне, def a(s) ... end;a 1що стане ...end;a 100, проте, використовуючи менш відомий ENDсинтаксис рубіна, використовується менше байтів. Однак блок всередині ENDзнаходиться в іншій області, тому Sповинен бути глобальною змінною або постійною.
Пояснення:
END{ ... };S=1: Запустити блок коду перед тим, як програма закінчиться; Встановити константу Sна 1(або 100- 199у наступних ітераціях)
$><<( ... ): $>- це ярлик в рубіні для stdout, а <<на IO пише в IO. Парені потрібні, інакше це стає($><<S)>198...
S>198?"BREAKING NEWS: WORLD ENDS":(q=...)%[q,S<2?0:S-99]: Якби я розбив це на трохи більш розумний код, це було б:
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
%Оператор застосовується до рядка ефективний printf, з LHS є рядком формату і RHS бути аргументи.
%{ ... (q=%%{%s}) ... S=1%02d}: ruby має цікавий синтаксис для рядків, який також дозволяє парам фігурних дужок з'являтися всередині рядка без будь-якого виходу, поки вони врівноважені. Це дуже корисно, оскільки в іншому випадку схожий квінт повинен був би уникнути рядка, щоб укласти його в себе як літеральний рядок. Дві заміни в рядку формату призначені %sдля звичайної рядка та %02dдля числа, розміщеного праворуч до розміру 2 із символом 0.
Мої думки щодо подальшого скорочення:
Було б непогано мати можливість використовувати sзамість $s, але визначаючи s s=$s;або робити функцію, def a(s) ...обидва використовують більше байтів, ніж вони економить, і я не можу придумати іншого способу зробити це.EDIT: Константи глобальні і можуть бути одним символом!
- Було б добре, якби
Sзавжди було менше 100, щоб можна було порівняти, використовуючи двоцифрові числа замість 3-значних чисел. Однак якщо я використовую S=0в кінці, наступні дві цифри інтерпретуються як восьмеричні, 8і 9є недійсними, і все є двояковим. S=просто недійсний, і я не знаю іншого способу зробити значення дійсним до і після додавання двох цифр. Зауважимо, що 0(і будь-яке інше ціле число) є трибуном у рубіні.
Будь-які думки щодо того, як зробити це коротше, будь ласка, повідомте мене!
Спробуйте в Інтернеті!
2Kparanoia: yes97і створювати2Kparanoia: yes98, так чи не слід (4) читатиRepeat to step 100, but step 101 will output "BREAKING NEWS: WORLD ENDS"? (тобто2Kparanoia: yes99виробляє новини)