Рубі, 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
виробляє новини)