Помилка 404: персонаж не знайдено


74

Сценарій

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

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

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

Однак ваш зв’язок жахливий, тому 1 раз випадковий символ втрачається щоразу, коли ви надсилаєте програму. Щоб цього не порушити вашу програму, ви повинні зробити так, що видалення будь-якого одного символу не матиме ніякого ефекту: програма працює незалежно. (Оригінальна програма також повинна працювати.)

Оскільки з'єднання надто слабке для надсилання великих файлів, ваш код повинен бути якомога коротшим.

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


Правила / подробиці

  • Вихідним може бути список цілих чисел у будь-якому розумному форматі (розділений пробілами, новими рядками, комами тощо). Однак ваш результат повинен бути послідовним і не змінюватися при зміні програми.
  • Прапори командного рядка, що містять логіку, виконують фактичний код, генерують список номерів тощо, заборонені.
  • Це , тому найкоротше подання (у байтах) виграє!


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, він просто бере параметр з назвою "верх" і повертає 4. Чому "верх"? Ну, перший рядок ніколи не повинен видавати помилку, навіть якщо символ видалений. Якщо для =видалення буде видалено top>4, цей булевий вираз буде дійсним, оскільки topвін визначений у браузерах, просто поступаючись false. Якщо 4 вилучено, функціональний орган просто стає першим setIntervalсегментом, а другий запускається неушкодженим.

Тепер все, що залишається турбуватися, - це якщо `видалити.

Якщо його видалити з початку, setIntervalпросто нічого не робить, оцінюючи себе як власне вираження. Потім решта другого рядка просто виконує одну ітерацію циклу, дозволяючи іншому setIntervalфрагменту закінчити роботу. Якщо вилучено з кінця, решту підтекстів збирають із кінця коментаря.

Нові рядки розміщуються так, що видалення не впливатиме на поведінку програми, але вони запобігають помилкам у випадку деяких видалень символів, таких як ведучий backtick.


3
Я розмірковував над тим, що зламається, якщо одну з цифр у a 405буде видалено, але тоді я зрозумів: нічого, бо або всі 404 номери вже надруковані, або другий цикл надрукує пропущені. Видовищна робота.
ETHproductions

Що станеться, якщо частина "верху" загубиться?
Scimonster

@Scimonster Він як і раніше розбирається як функція, повертаючи 4, просто з невикористаним параметром з назвою "в" або "op" або "tp"
jrich

1
@jrich звичайно. Мозок судом. : P
Scimonster

Що станеться, якщо ви втратите частину this?
dkudriavtsev

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

Спробуйте його онлайн тут .


23

Befunge-98 , 37 байт

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

Спробуйте в Інтернеті!

Пояснення

Створення коду, опроміненого радіацією в Befunge-98, не надто погано, оскільки ви можете встановити "дельта" (тобто розмір кроку вказівника) вручну x. Отже, якщо встановити дельту (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-му рядку не впливає на контроль програми, оскільки це лише виконання після видалення у другому рядку.

Програма також працює в тому випадку, якщо буде видалено розрив рядка:

Випадок 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)

Ви можете використовувати o" e"?
Мартін Ендер

І замість +1вас можна використовувати l. Також інтерпретатор fishlanguage.com трохи дивний (і дратівливий у використанні, хоча функція налагодження звичайно корисна). TIO використовує дещо безпечніший інтерпретатор Python, я думаю: tio.run/nexus/fish#@m9oqIAMysq4AMuxtrfVMslXUkhVssqzsrHBEPj/HwA
Мартін Ендер

@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до себе. Оскільки це цикл, він не має значення для виконання, і працює так, ніби нічого не змінилося.


1
Дійсно приємний спосіб зменшити його до 2 рядків. Єдина проблема, яку я бачу, це те, що це не 38 байт, а 42? Зведення внутрішнього коду до; ;? = * 4o "e": n: + 1l зменшить його до 38 байт. Це просто розміщує ваші 84 * у рядку "e", а не окремо.
Тілінг пелікан

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                                     ..

Дерево груші - це в основному похідне від Perl, має деякі "цікаві" особливості. Я зібрав це як жарт (щоб я міг сказати, що мій поліглот надрукований a partridgeу «Грушевому дереві»; насправді майже всі програми це роблять). Тим не менше, це Тьюрінг - цілком і насправді добрий у подібних завданнях.

Особливістю, яка нас найбільше хвилює, є те, що Pear Tree запускатиме програму лише у тому випадку, якщо в деяких підрядках коду є CRC-32 00000000. Код обертається, щоб поставити питання про підрядку на початку. Як це буває, дві (однакові) половини коду мають відповідну CRC-32 (через цей підозрілий бінарний коментар наприкінці), тож якщо ви видалите символ із джерела (порушивши CRC), інша половина повертається до початку, а #знак біля кінця коментує пошкоджену половину на додаток до двійкового сміття.

Ще одна особливість робить програму трохи меншою: хоча дерево груші в основному інтерпретується як Perl, воно має деякі незначні зміни, щоб зробити його більш схожим на Python. Тут є актуальним те, що на відміну від printтвердження Perl (який просто запускає числа разом), printзаява 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-адресу в <, що запускає ідентичний цикл (за винятком 2j^^якого уникає використання ^s в тандемі з [)

Оскільки є два нових рядки, це не має значення для коду, якщо його буде видалено (завдяки @ masterX244 за це!)


що відбувається з порожніми рядками в коді ?. Можливо, ви могли б подвоїти
перебіг прямих,

Ви абсолютно правильні @ masterX244 дякую! Не думав про це.
MildlyMilquetoast

хаха, ніколи не використовував цю мову взагалі, але чомусь шосте почуття дало мені цю ідею ...
masterX244

5

Befunge-93, 54 51 байт

Завдяки Mistah Figgins за те, що врятував мені 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)


@ Виправлено Flp.Tkc.
user2428118

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])
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.