Это 10 августа 2019 года, но ваша задача по-прежнему связана с Y2K. Странно, правда?
Создайте программу, которая печатает сама себя, с добавлением двухзначного числа. При первом запуске он должен добавить 00 к своему выводу (его исходный код, потому что это вариант quine). Когда вы запускаете этот вывод, исходная программа без двузначного числа, она должна выводить исходную программу, но с добавленным к ней 01. Запустите этот вывод, чтобы получить программу OG с добавленным 02, затем, чтобы получить программу с 03 ... Эта цепочка должна продолжаться до 99. Эта программа должна выводить BREAKING NEWS: WORLD ENDS
.
Если ваша программа Y2Kparanoia: yes
тогда:
- Должен выводить
Y2Kparanoia: yes00
- Этот вывод должен напечатать
Y2Kparanoia: yes01
- Этот вывод должен напечатать
Y2K paranoia: yes02
- Повторяйте до шага 100: эта программа выводит указанные новости о конце света
Это кодовый гольф, поэтому выигрывает самая короткая программа, которая может распечатать себя, следуя этим шагам.
2Kparanoia: yes97
и производить2Kparanoia: yes98
, так что не стоит (4) читатьRepeat to step 100, but step 101 will output "BREAKING NEWS: WORLD ENDS"
? (т.е.2Kparanoia: yes99
производит новости)Ответы:
Perl 6 ,
122 114106 байт-8 байт благодаря Shelvacu
Попробуйте онлайн!
Принимает стандартный формат quine и добавляет строку последних новостей, а также новый вызов функции с добавленным номером. Используется
END
для выполнения функции после завершения программы.источник
END
иour
переменной:END {<print $s-199??"END\{<$_>~~.EVAL};our\$s="~($s-1&&$s-99)+100!!"BREAKING NEWS: WORLD ENDS">~~.EVAL};our$s=1
Рубин,
158154146128122100 байтВдохновлен этим ответом .
РЕДАКТИРОВАТЬ: я был в состоянии удалить
(s.split(35.chr)[0]+35.chr).inspect
и заменить егоs[0..-2]
(диапазон каждого значения, кроме последнего) и%{ ... }
синтаксис строки, которую я использовал ранее. Сохранено 22 байта!Старая версия:
РЕДАКТИРОВАТЬ: Сохранение пары символов (и соответствующей пары в разделе данных), понимая, что
"BREAKING NEWS: WORLD ENDS"
это совершенно правильная строка формата, а ruby игнорирует любые параметры extraneos.При запуске этого я понял , что , так как число имеет идти в самом конце программы, и рубин не позволяет использовать переменные , прежде чем они будут объявлены, я бы сделать код , выполняемый после того, как цифры как - то. Я мог бы сделать что-то вроде
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]
Если бы я разбил это на немного более разумный код, это было бы:%
Оператор применяется к строке эффективенprintf
, с LHS является строкой формата и RHS быть аргументы.%{ ... (q=%%{%s}) ... S=1%02d}
У ruby есть интересный синтаксис для строк, который также позволяет парам фигурных скобок появляться внутри строки без экранирования, пока они сбалансированы. Это очень полезно, так как в противном случае подобный quine должен был бы избежать строки, чтобы поместить ее в себя как строковый литерал. Две замены в строке формата предназначены%s
для обычной строки и%02d
для числа, дополненного справа до размера 2 символом0
.Мои мысли о сокращении дальше:
Было бы неплохо иметь возможность использоватьРЕДАКТИРОВАТЬ: Константы являются глобальными и могут быть одним символом!s
вместо$s
, но определение ss=$s;
или создание функцииdef a(s) ...
используют больше байтов, чем они сохраняют, и я не могу придумать другого способа сделать это.S
всегда было меньше100
, так что его можно сравнить, используя 2-значные числа вместо 3-значных чисел. Однако, если я используюS=0
в конце, следующие две цифры интерпретируются как восьмеричные,8
и9
они недействительны, и все является пустым.S=
просто не действителен, и я не знаю другого способа сделать значение действительным как до, так и после добавления двух цифр. Следует отметить, что0
(и любое другое целое число) верно в рубине.Любые мысли о том, как сделать это короче, пожалуйста, дайте мне знать!
Попробуйте онлайн!
источник
s=100-1
? Тогдаs
будет 99, 0, -1 ...- 99, и-s
будет -99, 0 ... 99.Go,
382 366 354 340 305 298272 байтаНе выиграю, но я повеселился с вызовом.
Попробуйте это на игровой площадке Go!
Основано на квине. Если переменная
n
меньше 199, то она добавляет к строковой переменнойn
серьезный accent (\x60
), символ Go для многострочных строк, за которым следует запятая,
. Далее он печатает первые 147 символовs
(для предотвращения печати,,
потому что это происходит только в конце), затем печатаетs
целиком и, наконец, печатает,100
еслиn == 1
иn+1
иначе. В результате последовательные прогоны изменяют переменнуюn
в конце программы на 100, 101 и т. Д. Если переменнаяn
равна 199 или более, то она печатает последние новости.источник
Haskell ,
240232218216 байтПопробуйте онлайн!
Адаптировано из лозы
источник
JavaScript (ES6), 116 байт
94 байта, если разрешены строковые функции
источник
f=${f}
), это не квин, согласно codegolf.meta.stackexchange.com/a/4878/13400C # (интерактивный компилятор Visual C #) , 193 байта
Попробуйте онлайн!
источник
Pyth ,
8180 байтовПопробуйте онлайн!
Объяснение:
И код в строке (сокращенные новости):
источник