Рубин, 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
РЕДАКТИРОВАТЬ: я был в состоянии удалить (s.split(35.chr)[0]+35.chr).inspect
и заменить его s[0..-2]
(диапазон каждого значения, кроме последнего) и %{ ... }
синтаксис строки, которую я использовал ранее. Сохранено 22 байта!
Старая версия:
РЕДАКТИРОВАТЬ: Сохранение пары символов (и соответствующей пары в разделе данных), понимая, что "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
синтаксиса ruby использует меньше байтов. Однако блок внутри END
находится в другой области видимости, поэтому S
должен быть глобальной переменной или константой.
Объяснение:
END{ ... };S=1
: Запустить блок кода непосредственно перед завершением программы; Установить постоянный S
на 1
(или 100
- 199
в итерациях будущего)
$><<( ... )
: $>
это ярлык в ruby для 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 есть интересный синтаксис для строк, который также позволяет парам фигурных скобок появляться внутри строки без экранирования, пока они сбалансированы. Это очень полезно, так как в противном случае подобный quine должен был бы избежать строки, чтобы поместить ее в себя как строковый литерал. Две замены в строке формата предназначены %s
для обычной строки и %02d
для числа, дополненного справа до размера 2 символом 0
.
Мои мысли о сокращении дальше:
Было бы неплохо иметь возможность использовать s
вместо $s
, но определение s s=$s;
или создание функции def a(s) ...
используют больше байтов, чем они сохраняют, и я не могу придумать другого способа сделать это. РЕДАКТИРОВАТЬ: Константы являются глобальными и могут быть одним символом!
- Было бы хорошо, если бы
S
всегда было меньше 100
, так что его можно сравнить, используя 2-значные числа вместо 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
производит новости)