сценарий
Один из ваших друзей борется за домашнее задание. Ему нужна простая программа, которая печатает первые 404 натуральных числа:
1 2 3 4 5 6 7 8 9 10 11 ... 401 402 403 404
Ваша задача проста: написать эту программу для него.
Однако ваша связь ужасна, поэтому каждый случайный символ теряется при каждой отправке программы. Чтобы это не нарушало вашу программу, вы должны сделать так, чтобы удаление любого отдельного символа не имело никакого эффекта: программа работает независимо. (Оригинальная программа также должна работать.)
Поскольку соединение слишком слабое для отправки больших файлов, ваш код должен быть максимально коротким.
TL: DR - создать радиационно-стойкую программу для вывода чисел от 1 до 404
Правила / Подробнее
- Вывод может быть списком целых чисел в любом приемлемом формате (разделенных пробелами, символами новой строки, запятыми и т. Д.). Тем не менее, ваш вывод должен быть согласованным и не изменяться при изменении программы.
- Флаги командной строки, которые содержат логику, выполняют реальный код, генерируют список номеров и т. Д., Запрещены.
- Это код-гольф , поэтому выигрывает самое короткое представление (в байтах)!
Ответы:
05AB1E , 12 байтов
Код:
Нормальное объяснение кода:
Это приводит к следующему коду для гольфа:
X404Ÿ
именно этого мы хотим достичь.Число 404 генерируется любым из этих вариантов:
Включающий диапазон работает следующим образом на двух числах:
Который всегда делает второй
Ÿ
в не-оп .Использует кодировку CP-1252 . Попробуйте онлайн!
источник
JavaScript, 228 байт
объяснение
Оценка кода в программе
setInterval
позволяет программе продолжать работу даже в случае ошибки. Мы уверены, что переданный код выдаст ошибку, если удаляется какой-либо один символ. Синтаксис шаблонной строки можно использовать для вызоваsetInterval
с константной строкой без скобок. К счастью, даже если строка шаблона находится на следующей строке, она все равно анализируется как вызов функции с таким синтаксисом.Первая проблема, с которой мы сталкиваемся, заключается в том, что
setInterval
это функция, и поэтому, если символ удаляется иsetInteval
вместо этого программа пытается вызвать ее , она выдает ошибку. Конечно, поскольку существует два идентичных вызова функцииsetInterval
, нам не нужно беспокоиться о ее правильной работе до тех пор, пока мы избегаем ошибки. Итак, первая строка определяет каждое возможное «написание»setTimeout
допустимой функции.Первая строка работает, назначая все эти «орфографические ошибки» функции
top=>4
. Обратите внимание на синтаксис ES6, он просто принимает параметр с именем «top» и возвращает 4. Почему «top»? Ну, первая строка никогда не должна выдавать ошибку, даже если символ удален. Если=
удалить, чтобы сделатьtop>4
, это логическое выражение будет действительным, такtop
как предопределено в браузерах, просто уступаяfalse
. Если удалить 4, тело функции просто становится первымsetInterval
сегментом, а второй работает без повреждений.Теперь все, о чем нужно беспокоиться, это если `удален`.
Если удалить с самого начала,
setInterval
просто ничего не делает, оценивая себя как свое собственное выражение. Затем оставшаяся часть второй строки просто выполняет одну итерацию цикла, позволяя другомуsetInterval
фрагменту завершить работу. Если удалить из конца, оставшийся обратный удар берется из конца комментария.Новые строки расположены так, что удаление одного не повлияет на поведение программы, но предотвращает ошибки в случае удаления некоторых символов, таких как начальный обратный удар.
источник
405
была удалена, но потом я понял: ничего, потому что либо все 404 числа уже напечатаны, либо второй цикл выведет пропущенные. Эффектная работа.this
?Pyth - 16 байт
Основная идея заключается в том, что когда вы снимаете цифру
404
, это только уменьшает число, поэтому нам просто нужно получить максимум два404
, чтобы убедиться, что у нас есть правильное число. Очевидно, что есть еще несколько увольнений.Объяснение:
Попробуйте это онлайн здесь .
источник
Befunge-98 , 37 байт
Попробуйте онлайн!
объяснение
Создание защищенного от радиации кода в Befunge-98 не так уж и плохо, потому что вы можете установить «delta» (то есть размер шага указателя инструкций) вручную с помощью
x
. Таким образом, если установить delta в значение(2,0)
, с этого момента все остальные символы пропускаются, и мы можем просто удвоить все команды. Хитрость заключается2 0
в том, чтобы надежно попасть на вершину стека. Нам нужно,0 2 0
чтобы остальная часть программы работала правильно, но мы это сделаем бесплатно. Вот как мы это делаем:Обратите внимание, что каждая цифра выдвигается сама собой, поэтому в полной программе будет запуск,
2 0
который мы просто проигнорируем.Следовательно, удаление первого или второго символа из программы не имеет значения, потому что мы все равно не будем использовать эти цифры. Аналогично, удаление третьего символа идентично удалению второго, поэтому нам не нужно беспокоиться об этом.
Давайте рассмотрим, что происходит в двух других случаях. Отбрасывание четвертого персонажа:
Обратите внимание, что дельта установлена на
(0,0)
. Но это вовсе не перемещает указатель инструкций, поэтому то же самоеx
выполняется сразу же снова, и на этот раз появляется «(2,0)
все в порядке» (в наших последующих целях есть неявные нули в нижней части стека).Давайте отбросим пятый символ вместо этого:
Теперь дельта настроена на
(0,2)
. Тем не менее, горизонтального движения по-прежнему нет, поэтому IP-адрес немедленно возвращается обратноx
и снова устанавливается правильная дельта.С этого момента мы можем в основном игнорировать дублирование символов, а также эту начальную часть, потому что она всегда будет пропущена:
Это
;
своего рода команда комментариев, которая пропускает все, пока;
не встретится следующая . Тем не менее, мы прыгаем над первым;
с#
таким только часть между;
будет выполняться с этого момента и далее.источник
> <> ,
1036051 байтПроверено здесь.
Использует ту же тактику, что и эта программа . Если символ удален в первой строке, вторая строка все равно будет запущена. Если символ во 2-й строке удален, выполнение
v
переместится на 3-ю строку, поскольку 2-я строка будет короче символа. Удаление в 3-й строке не влияет на управление программой, так как выполняется только после удаления в строке 2.Программа также будет работать в случае удаления разрыва строки:
Дело 1:
2-я строка будет запущена.
Случай 2:
Обе строки становятся одной строкой с двойной инструкцией.
Объяснение:
Суть программы заключается в следующем. Обратите внимание, что a
1
помещается в стек уже первой строкой.источник
o" e"
?+1
тебя можно использоватьl
. Также интерпретатор fishlanguage.com немного странный (и раздражающий в использовании, хотя, конечно, полезна функция отладки). Я думаю, что TIO1
s в первой строке.> <> ,
42 3834 байтаПопробуйте онлайн!
Спасибо @Martin Ender и @Teal Pelican за то, что они сбрили 8 байтов!
Аналогичен ответу mbomb007 , но использует только 2 строки.
Вместо того, чтобы считать от 1 до 404, используя одно значение памяти, я непрерывно увеличивал длину стека. Это сделало так, что мне не нужно было помещать что-либо в стек до начала цикла, что значительно облегчало работу.
Оригинальный код
В
<
s повернуть IP вокруг, и/
является не-оп, как IP обтекает и продолжается вдоль это нормальный путь. Таким образом, соответствующий код:И это повторяется.
Удаление
Большой ключ здесь - зеркало
/
. Он ничего не делает, если вторая строка модифицирована - он только оборачивается вокруг себя и по сути не используется. Но если удалить символ из первой строки, строка сместится вниз, так что зеркало коснется стрелки<
, ведущей в идентичный неизмененный цикл.Единственным другим значительным удалением будет
\n
символ. Это также учитывается, поскольку он производит этот код:Теперь мы только что добавили копию оригинального цикла
;?=*4o" e"lnll
к себе. Поскольку это цикл, он не имеет значения для выполнения и работает так, как будто ничего не изменилось.источник
:+1
и другой:
друг наl
друга.;?=*4o" e"n:ll
тоже работаетГруша , 34 байта
Программа содержит управляющие символы, поэтому вот
xxd
дамп:Pear Tree - это в основном производная от Perl с некоторыми «интересными» функциями. Я бросил это вместе в шутку (чтобы я мог сказать, что мой полиглот напечатан
a partridge
в A Pear Tree; на самом деле, почти все программы это делают). Тем не менее, он завершен по Тьюрингу и на самом деле довольно хорош в такого рода задачах.Особенность, которая нас больше всего волнует, заключается в том, что A Pear Tree будет запускать программу только в том случае, если какая-то подстрока кода имеет CRC-32
00000000
. Код поворачивается, чтобы поставить подстроку под вопрос в начале. Как это происходит, каждая из двух (идентичных) половин кода имеет соответствующий CRC-32 (из-за этого подозрительно выглядящего двоичного комментария в конце), поэтому, если вы удаляете символ из источника (нарушая CRC), другая половина поворачивается к началу, а#
знак рядом с концом будет комментировать поврежденную половину, в дополнение к двоичному мусору.Другая особенность делает программу немного меньше: хотя Pear Tree в основном интерпретируется как Perl, в него внесены незначительные изменения, чтобы сделать его более похожим на Python. Здесь уместно то, что в отличие от
print
оператора Perl (который просто запускает числа вместе),print
оператор A Pear Tree разделяет аргументы пробелами и печатает последний перевод строки. Это дает нам красиво разделенный пробелами вывод, что означает, что нам не нужно тратить байты на форматирование. (Обратите внимание, что вам не нужно вводить программу; если язык получает ввод, по умолчанию предполагается, что он должен что-то с этим делать.)Конечно, это не может конкурировать с реальными языками игры в гольф (и я бы этого не ожидал), но я думал, что люди могут найти это интересным.
источник
Befunge 98 , 34 байта
Попробуйте онлайн!
Это работает очень похоже на мой ответ> <> , но вместо зеркала
/
я использую операцию поворота влево,[
а затем меняю направление IP, которое в этом случае функционально эквивалентно зеркалу.Оригинальный код
Удаление
Если что-то во второй строке будет удалено, оно сместится и вообще не повлияет на верх.
Если что-либо в первой строке будет удалено, то
[
IP отправит IP в<
, который запускает идентичный цикл (за исключением того,2j^^
что избегает использования^
s в тандеме с[
)Поскольку есть две новые строки, для кода не имеет значения, если одна из них удалена (спасибо @ masterX244 за это!)
источник
Befunge-93,
5451 байтСпасибо Мисте Фиггинсу за то, что он спас мне 3 байта.
Попробуйте онлайн!
По сути, это тот же трюк, который использовался в соревновании Fault-Tolerant Hello World . Первая строка начинается с того, что на вершине стека стоит 1 для начала последовательности, а затем одна из
v
стрелок в конце строки перенаправляет путь кода к началу основной подпрограммы в строке 2. , выполняя справа налево.Удаление символа из первой строки просто сдвинет
v
стрелки на одну, но это все же позволяет коду успешно перенаправить на вторую строку. Удаление символа из второй строки приводит<
к смещению стрелки в конце строки из путиv
над ним, поэтому путь к коду будет перенаправлен в подпрограмму резервного копирования в строке 3.Удаление разрыва первой строки не вредит, потому что это просто перемещает третью строку на место, чтобы заменить вторую строку. И удаление чего-либо после конца второй строки не будет иметь никакого эффекта, потому что это всего лишь резервный код.
источник
The first line starts by making sure there is a 1 on the top of the stack...
Первая строка довольно уверена в этом отношении. Кроме того, вы можете сократить <code> _ @ #!</code> to
_ @ # - `и поместите его перед печатью, чтобы сохранить 3 байта.JavaScript + HTML + фрагменты стека,
167158154 байтаНеправильное использование JavaScript в Stack Snippets размещается на веб-странице внутри
<script>
элемента.источник
На самом деле , 18 байт
На самом деле это основанный на стеке язык игры в гольф.
Объяснение задействованных команд (как они работают в вышеуказанном контексте):
источник