Ошибка 404: символ не найден

74

сценарий

Один из ваших друзей борется за домашнее задание. Ему нужна простая программа, которая печатает первые 404 натуральных числа:

1 2 3 4 5 6 7 8 9 10 11 ... 401 402 403 404

Ваша задача проста: написать эту программу для него.

Однако ваша связь ужасна, поэтому каждый случайный символ теряется при каждой отправке программы. Чтобы это не нарушало вашу программу, вы должны сделать так, чтобы удаление любого отдельного символа не имело никакого эффекта: программа работает независимо. (Оригинальная программа также должна работать.)

Поскольку соединение слишком слабое для отправки больших файлов, ваш код должен быть максимально коротким.

TL: DR - создать радиационно-стойкую программу для вывода чисел от 1 до 404


Правила / Подробнее

  • Вывод может быть списком целых чисел в любом приемлемом формате (разделенных пробелами, символами новой строки, запятыми и т. Д.). Тем не менее, ваш вывод должен быть согласованным и не изменяться при изменении программы.
  • Флаги командной строки, которые содержат логику, выполняют реальный код, генерируют список номеров и т. Д., Запрещены.
  • Это , поэтому выигрывает самое короткое представление (в байтах)!
FlipTack
источник
2
Связанные
FlipTack
16
Должна ли работать оригинальная программа (без удаления каких-либо символов)?
Аднан
5
Можно ли игнорировать ошибки, если программа все еще печатает 1 - 404?
jrich
4
Может быть, там должен быть ярлык типа радиации ?
Ви.
5
Голосуя за закрытие, мы не делаем вашу домашнюю работу для вас XD
チ ー ズ パ ン

Ответы:

16

05AB1E , 12 байтов

Код:

XX440044ÔÔŸŸ

Нормальное объяснение кода:

X             # Pushes the number 1.
 X            # Pushes the number 1 again.
  440044      # Pushes the number 440044.
        Ô     # Connected uniquify.
         Ô    # Connected uniquify.
          Ÿ   # Inclusive range of the top two elements.
           Ÿ  # Inclusive range on the array, which leaves it intact.

Это приводит к следующему коду для гольфа: X404Ÿименно этого мы хотим достичь.

Число 404 генерируется любым из этих вариантов:

440044ÔÔ
40044ÔÔ
44044ÔÔ
44004ÔÔ
440044Ô

Включающий диапазон работает следующим образом на двух числах:

`1 5Ÿ`             ->    [1, 2, 3, 4, 5]
[1, 5]Ÿ            ->    [1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]Ÿ   ->    [1, 2, 3, 4, 5]

Который всегда делает второй Ÿв не-оп .

Использует кодировку CP-1252 . Попробуйте онлайн!

Аднан
источник
34

JavaScript, 228 байт

etInterval=stInterval=seInterval=setnterval=setIterval=setInerval=setIntrval=setInteval=setInteral=setIntervl=setInterva=top=>4

setInterval
`405>(i=this.i?i:1)?alert(i++):0`///`
setInterval
`405>(i=this.i?i:1)?alert(i++):0`///`

объяснение

Оценка кода в программе setIntervalпозволяет программе продолжать работу даже в случае ошибки. Мы уверены, что переданный код выдаст ошибку, если удаляется какой-либо один символ. Синтаксис шаблонной строки можно использовать для вызова setIntervalс константной строкой без скобок. К счастью, даже если строка шаблона находится на следующей строке, она все равно анализируется как вызов функции с таким синтаксисом.

Первая проблема, с которой мы сталкиваемся, заключается в том, что setIntervalэто функция, и поэтому, если символ удаляется и setIntevalвместо этого программа пытается вызвать ее , она выдает ошибку. Конечно, поскольку существует два идентичных вызова функции setInterval, нам не нужно беспокоиться о ее правильной работе до тех пор, пока мы избегаем ошибки. Итак, первая строка определяет каждое возможное «написание» setTimeoutдопустимой функции.

Первая строка работает, назначая все эти «орфографические ошибки» функции top=>4. Обратите внимание на синтаксис ES6, он просто принимает параметр с именем «top» и возвращает 4. Почему «top»? Ну, первая строка никогда не должна выдавать ошибку, даже если символ удален. Если =удалить, чтобы сделать top>4, это логическое выражение будет действительным, так topкак предопределено в браузерах, просто уступая false. Если удалить 4, тело функции просто становится первым setIntervalсегментом, а второй работает без повреждений.

Теперь все, о чем нужно беспокоиться, это если `удален`.

Если удалить с самого начала, setIntervalпросто ничего не делает, оценивая себя как свое собственное выражение. Затем оставшаяся часть второй строки просто выполняет одну итерацию цикла, позволяя другому setIntervalфрагменту завершить работу. Если удалить из конца, оставшийся обратный удар берется из конца комментария.

Новые строки расположены так, что удаление одного не повлияет на поведение программы, но предотвращает ошибки в случае удаления некоторых символов, таких как начальный обратный удар.

jrich
источник
3
Я размышлял о том, что сломалось бы, если бы одна из цифр в a 405была удалена, но потом я понял: ничего, потому что либо все 404 числа уже напечатаны, либо второй цикл выведет пропущенные. Эффектная работа.
ETHproductions
Что произойдет, если часть "вершины" будет потеряна?
Scimonster
@Scimonster Он все еще анализируется как функция, возвращая 4, только с неиспользованным параметром с именем «to» или «op» или «tp»
jrich
1
@ jrich конечно. Спазм мозга : P
Scimonster
Что произойдет, если вы потеряете часть this?
дкудрявцев
25

Pyth - 16 байт

Основная идея заключается в том, что когда вы снимаете цифру 404, это только уменьшает число, поэтому нам просто нужно получить максимум два 404, чтобы убедиться, что у нас есть правильное число. Очевидно, что есть еще несколько увольнений.

SSsetSS[404  404

Объяснение:

SS                       First one does 1-index range, second one sorts, which is no-op 
 s                       If the e is there, this is no-op, if only t is there, it sums a one element list, which is the item
  et                     e picks last element in list, and if e is gone, then t gets you the list without the first element which is good enough when combined with s
   SS                    Sorting twice is no-op
    [                    Start list, this can't be two element because if we get rid of initial 4, the 0 becomes third element which neeeds to be captured
     404                 One of the 404's
     <space><space>404   Need two spaces for redundancy, because 404404 *is* bigger than 404

Попробуйте это онлайн здесь .

Maltysen
источник
23

Befunge-98 , 37 байт

20020xx##;;11++::''ee44**``kk@@::..;;

Попробуйте онлайн!

объяснение

Создание защищенного от радиации кода в Befunge-98 не так уж и плохо, потому что вы можете установить «delta» (то есть размер шага указателя инструкций) вручную с помощью x. Таким образом, если установить delta в значение (2,0), с этого момента все остальные символы пропускаются, и мы можем просто удвоить все команды. Хитрость заключается 2 0в том, чтобы надежно попасть на вершину стека. Нам нужно, 0 2 0чтобы остальная часть программы работала правильно, но мы это сделаем бесплатно. Вот как мы это делаем:

20020xx

Обратите внимание, что каждая цифра выдвигается сама собой, поэтому в полной программе будет запуск, 2 0который мы просто проигнорируем.

Следовательно, удаление первого или второго символа из программы не имеет значения, потому что мы все равно не будем использовать эти цифры. Аналогично, удаление третьего символа идентично удалению второго, поэтому нам не нужно беспокоиться об этом.

Давайте рассмотрим, что происходит в двух других случаях. Отбрасывание четвертого персонажа:

2000xx

Обратите внимание, что дельта установлена ​​на (0,0). Но это вовсе не перемещает указатель инструкций, поэтому то же самое xвыполняется сразу же снова, и на этот раз появляется « (2,0)все в порядке» (в наших последующих целях есть неявные нули в нижней части стека).

Давайте отбросим пятый символ вместо этого:

2002xx

Теперь дельта настроена на (0,2). Тем не менее, горизонтального движения по-прежнему нет, поэтому IP-адрес немедленно возвращается обратно xи снова устанавливается правильная дельта.

С этого момента мы можем в основном игнорировать дублирование символов, а также эту начальную часть, потому что она всегда будет пропущена:

...#;1+:'e4*`k@:.;

Это ;своего рода команда комментариев, которая пропускает все, пока ;не встретится следующая . Тем не менее, мы прыгаем над первым ;с #таким только часть между ;будет выполняться с этого момента и далее.

1+    Increment the top of the stack.
:     Duplicate it.
'e    Push 101.
4*    Multiply by 4 to get 404.
`     Greater-than check. Pushes 1 once the top
      reaches 405, otherwise 0.
k@    Terminate the program that many times.
:.    Print a copy of the top of the stack (and a space).
Мартин Эндер
источник
16

> <> , 103 60 51 байт

               vv
;?=*4o" e"n:ll<<
;?=*4o" e"n:ll<<

Проверено здесь.

Использует ту же тактику, что и эта программа . Если символ удален в первой строке, вторая строка все равно будет запущена. Если символ во 2-й строке удален, выполнение vпереместится на 3-ю строку, поскольку 2-я строка будет короче символа. Удаление в 3-й строке не влияет на управление программой, так как выполняется только после удаления в строке 2.

Программа также будет работать в случае удаления разрыва строки:

Дело 1:

2-я строка будет запущена.

               vv;?=*4o" e"n:ll<<
;?=*4o" e"n:ll<<

Случай 2:

Обе строки становятся одной строкой с двойной инструкцией.

               vv
;?=*4o" e"n:ll<<;?=*4o" e"n:ll<<

Объяснение:

Суть программы заключается в следующем. Обратите внимание, что a 1помещается в стек уже первой строкой.

ll:n        Push length of the stack twice, duplicate, print as number
"e "o       Push 101, 32, output 32 as space
4*          101 * 4 is 404
=?;         Pop twice, if equal, halt
            (Execution wraps around)
mbomb007
источник
Вы можете использовать o" e"?
Мартин Эндер
И вместо +1тебя можно использовать l. Также интерпретатор fishlanguage.com немного странный (и раздражающий в использовании, хотя, конечно, полезна функция отладки). Я думаю, что TIO
Мартин Эндер,
@MartinEnder Это не сработает, если вы удалите одну из 1s в первой строке.
mbomb007
Да,
Мартин Эндер,
12

> <> , 42 38 34 байта

Попробуйте онлайн!

Спасибо @Martin Ender и @Teal Pelican за то, что они сбрили 8 байтов!

<<;?=*4o" e"lnll/
 ;?=*4o" e"lnll<

Аналогичен ответу mbomb007 , но использует только 2 строки.

Вместо того, чтобы считать от 1 до 404, используя одно значение памяти, я непрерывно увеличивал длину стека. Это сделало так, что мне не нужно было помещать что-либо в стек до начала цикла, что значительно облегчало работу.

Оригинальный код

В <s повернуть IP вокруг, и /является не-оп, как IP обтекает и продолжается вдоль это нормальный путь. Таким образом, соответствующий код:

          lnll   Prints the size of the stack + 1 and pushes the stack size twice
     o" e"       Prints a space and pushes 101
   *4            Multiplies to get 404
;?=              If the number we just printed was 404, end the program

И это повторяется.

Удаление

Большой ключ здесь - зеркало /. Он ничего не делает, если вторая строка модифицирована - он только оборачивается вокруг себя и по сути не используется. Но если удалить символ из первой строки, строка сместится вниз, так что зеркало коснется стрелки <, ведущей в идентичный неизмененный цикл.

Единственным другим значительным удалением будет \nсимвол. Это также учитывается, поскольку он производит этот код:

<<;?=*4o" e"lnll/ ;?)*4o" e"lnll<

Теперь мы только что добавили копию оригинального цикла ;?=*4o" e"lnllк себе. Поскольку это цикл, он не имеет значения для выполнения и работает так, как будто ничего не изменилось.

MildlyMilquetoast
источник
1
Действительно хороший способ уменьшить его до 2 строк. Единственная проблема, которую я вижу, состоит в том, что это не 38 байтов, а 42? Сокращение внутреннего кода до; ;? = * 4o "e": n: + 1l уменьшит его до 38 байт. Это просто помещает ваши 84 * в строку «е» вместо отдельных.
Тил пеликан
1
Вы также можете заменить один :+1и другой :друг на lдруга.
Мартин Эндер
Да, спасибо вам обоим!
MildlyMilquetoast
;?=*4o" e"n:llтоже работает
mbomb007
11

Груша , 34 байта

Программа содержит управляющие символы, поэтому вот xxdдамп:

00000000: 7072 696e 7420 312e 2e34 3034 2327 108a  print 1..404#'..
00000010: af70 7269 6e74 2031 2e2e 3430 3423 2710  .print 1..404#'.
00000020: 8aaf                                     ..

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 разделяет аргументы пробелами и печатает последний перевод строки. Это дает нам красиво разделенный пробелами вывод, что означает, что нам не нужно тратить байты на форматирование. (Обратите внимание, что вам не нужно вводить программу; если язык получает ввод, по умолчанию предполагается, что он должен что-то с этим делать.)

Конечно, это не может конкурировать с реальными языками игры в гольф (и я бы этого не ожидал), но я думал, что люди могут найти это интересным.


источник
9

Befunge 98 , 34 байта

Попробуйте онлайн!

<<.:@k`*4e':+1[

2.:@k`*4e':+1<^^j

Это работает очень похоже на мой ответ> <> , но вместо зеркала /я использую операцию поворота влево, [а затем меняю направление IP, которое в этом случае функционально эквивалентно зеркалу.

Оригинальный код

<<                 Reverses code direction, sending IP to right
               [   Turns the IP left, into the ^, which reverses it.
                   It then hits this again, turning left to go West. (No-op)
            :+1    Adds 1 to the sum
        *4e'       Pushes 404
     @k`           Ends the program if (sum > 404)
   .:              Prints the sum

Удаление

Если что-то во второй строке будет удалено, оно сместится и вообще не повлияет на верх.

Если что-либо в первой строке будет удалено, то [IP отправит IP в <, который запускает идентичный цикл (за исключением того, 2j^^что избегает использования ^s в тандеме с [)

Поскольку есть две новые строки, для кода не имеет значения, если одна из них удалена (спасибо @ masterX244 за это!)

MildlyMilquetoast
источник
что происходит с пустыми строками в коде? Может быть, вы могли бы удвоить перевод строки, чтобы сделать его тоже невосприимчивым
masterX244
Вы совершенно правы @ masterX244 спасибо! Не думал об этом.
MildlyMilquetoast
лол, никогда не использовал язык вообще, но по какой-то причине шестое чувство дало мне эту идею ...
masterX244
5

Befunge-93, 54 51 байт

Спасибо Мисте Фиггинсу за то, что он спас мне 3 байта.

111111111111111vv
+1_@#-*4"e":.:<<
+1_@#-*4"e":.:<<

Попробуйте онлайн!

По сути, это тот же трюк, который использовался в соревновании 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 байта.
MildlyMilquetoast
5

JavaScript + HTML + фрагменты стека, 167 158 154 байта

Неправильное использование JavaScript в Stack Snippets размещается на веб-странице внутри <script>элемента.

or(x="",i=405,d=document;--i;)d[i]||(x=d[i]=i+' '+x);d.write(x)</script></script><script>for(x="",i=405,d=document;--i;)d[i]||(x=d[i]=i+' '+x);d.write(x)

user2428118
источник
@ Flp.Tkc Исправлено.
user2428118 16.12.16
4

На самом деле , 18 байт

:404::404kMkMMRRSS

На самом деле это основанный на стеке язык игры в гольф.

Объяснение задействованных команд (как они работают в вышеуказанном контексте):

Numbers are indicated by round brackets () and lists by square brackets []

:         - pushes the longest string of characters in '0123456789+-.ij' as a numeric
k         - pop all the elements on the stack into a list [l] and push [l]
M         - pop [l], push max([l])
            pop (a), push (a)
R         - pop [l], push reverse([l])
            pop (a), push range([1,a])
S         - pop [a], push sorted([a])
Коби
источник