Знайдіть незаконну рядок


81

Завдання полягає в тому, щоб знайти рядок символів, який не може відображатися в жодній юридичній програмі на обраній вами мові програмування. Це включає коментарі, рядки та інші "невиконані" частини.

Виклик

  • Ваша програма може бути специфічною для певної версії або реалізації середовища компілятора / інтерпретатора / часу виконання вашої мови. Якщо так, то вкажіть деталі.
  • Дозволені лише стандартні параметри компілятора / інтерпретатора / часу виконання. Ви не можете передати якийсь дивний прапор своєму компілятору для отримання конкретного результату (наприклад, передача прапора для перетворення попереджень у помилки).
  • Якщо ваша мова програмування вимагає певного кодування (наприклад, UTF-8), ваша рядок також повинна бути правильно закодована (тобто рядки, які виходять з ладу виключно через помилки декодування символів, не допускаються).
  • Кожен окремий персонаж у вашій заяві повинен бути прийнятним у юридичній програмі; тобто ви не можете просто використовувати символ, який завжди відкидається.
  • Компілятор / інтерпретатор / час виконання повинен дати помилку при наданні будь-якого вихідного коду, що містить рядок як підрядку. Помилка не повинна бути однаковою для програм - одне вбудовування рядка може спричинити помилку синтаксису, а інше - помилку виконання.

Оцінка балів

  • Найкоротший незаконний рядок для кожної мови виграє.
  • Ви повинні пояснити, чому ваш рядок незаконний (чому він не може з’являтися ніде в легальній програмі).
  • Оспорюйте неправильні рішення у коментарях. Більш конкретно, ви повинні надати посилання на TIO або еквівалент, що демонструє юридичну програму (тобто ту, яка не створює помилок), що містить запропоновану підрядку.
  • Деякі мови (наприклад, Bash, Batch, Perl) дозволяють додавати до програми довільні бінарні дані, не впливаючи на дійсність (наприклад, використання __DATA__в Perl). Для таких мов ви можете надіслати рішення, яке може з’являтися лише в такому розділі. Обов’язково занотуйте це у своїй відповіді. (Визначення цього "останнього розділу" залежить від мови, але загалом означає будь-який текст після того, як аналізатор повністю перестав читати сценарій).

Приклад

У Python я можу подати

x
"""
'''

але це можна вбудувати у більшу програму

"""
x
"""
'''
y
'''

тому це неприпустимо.


2
Чи може контр-приклад розраховувати на внесок STDIN?
Zacharý

5
Це зробило б хороший CnR?
CalculatorFeline

2
Я думаю, занадто пізно, але, схоже, це могло бути викликом для поліцейських та грабіжників. Багато спроб проявляється в спробах скласти дійсні програми, а також в першу чергу придумати рядки.
користувач2390246

4
Мої співчуття щодо спроб Perl. :)
Каз

2
Я майже впевнений, що це абсолютно неможливо в неграмотному Haskell, завдяки вкладеним коментарям.
dfeuer

Відповіді:


57

Зміна , 2 байти




Це два лінійки. Дійсна зміна завжди повинна утворювати ідеальний квадрат символів ASCII для друку, тому вона не може містити два канали рядків підряд.

Помилка - це завжди помилка аналізатора і завжди однакова:

This shape is unpleasant.

супроводжується кодом виходу 1 .

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


Це також працює з 2Col . Спробуйте в Інтернеті! . Але причина цього розриву в 2Col полягає в тому, що кожен рядок повинен складатися з точно двох символів, але порожній рядок це порушує.
Kritixi Lithos

2
+1, оскільки це автоматично переможець, оскільки однобайтні рішення заборонені, оскільки "ви не можете просто використовувати символ, який завжди відхиляється".
Zacharý

1
@Cowsquack tfw Я забув про власну мову
Skidsdev

1
@Skidsdev tfw Я знову забув про власну мову і забув про мене, забувши про свою рідну мову
Skidsdev

@ Zacharý Що з 0-байтовими рішеннями?
PyRulez

32

Java, 4 байти

;\u;

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

Це недійсна послідовність виходу Unicode і призведе до помилки у компіляторі.

error: illegal unicode escape

Не працює - можна мати такий буквений рядок "\\u;".
feersum

@feersum Виправлено ціною одного байта
Kritixi Lithos

21
@TheLethalCoder: Java попередньо обробляє вихідний код для зміни \uXXXXвтечі, перш ніж робити щось інше, так що так, це буде працювати навіть у коментарях.za
nneonneo

3
Я думаю, що це найкоротша відповідь Java в історії цього сайту досі ..
Magic Octopus Urn

1
@MagicOctopusUrn Насправді є відповідь Java на 0 байтів (що вже не актуально в поточному мета, оскільки він виводить на STDERR замість STDOUT). Хоча обидва досить дивовижні та розумні. :)
Кевін Круїссен

25

COBOL (GNU) , 8 байт


THEGAME

По-перше, стрічковий канал, щоб не допустити мого слова до коментованого рядка.

Тоді історично програми COBOL друкувались на аркушах кодування, компілятор значною мірою покладається на обмежені рядки з 80 символів, немає багатолінійних коментарів і перші 6 символів - це коментарі (часто використовуються як редаговані номери рядків), ви можете помістити там майже все , AFAIK. Я вибрав THEGAMна початку наступного рядка.

Тоді, 7-й символ у будь-якому рядку приймає лише дуже обмежений список символів: Пробіл (без ефекту), Зірочка (коментує решту рядка), Дефіс, Штрих, можуть бути й інші, але, звичайно, ні E.

Наприклад, помилка, подана GnuCobol:

error: invalid indicator 'E' at column 7

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

Також ви просто програли гру.


30
Also, you just lost the game.Я мало не прихильнився
Стівен

24

JavaScript, 7 байт


;*/\u)

Зверніть увагу на провідний новий рядок.

  • \u) є недійсною послідовністю відключення Unicode, і саме тому ця рядок недійсна
  • Додавання //на початку все ще не вийде через провідний новий рядок, а другий рядок залишиться без коментарів
  • Додавання /*заповіту не буде повністю коментувати рядок через закриття, */яке завершує його, залишаючи \u)відкритим
  • Як зазначає @tsh, нижній рядок може бути перетворений у регулярний вираз, маючи /рядок після, так що, маючи )перед собою \u, ми можемо гарантувати, що літеральний регулярний вираз завжди буде недійсним
  • Як зазначає @asgallant, можна було б 1||1(string)/уникнути необхідності оцінювати регулярний вираз. Напіво-двокрапка на початку другого рядка зупиняє те, що відбувається, припиняючи вираз 1||1до того, як він потрапить на другий рядок, тим самим змушуючи SyntaxError з ;*.

Спробуй це!


2
/* */\u0045 = 3видається дійсним JavaScript-код.
tsh

2
3 */\u;/діє досі.
tsh

3
Цікаво відзначити , що за станом на ES2018 (який не буде офіційним до кінця цього року) , ви можете просто обернути все це в зворотних лапках з - за цього . Ви, ймовірно, могли це виправити, просто вставивши backtick після /(не те, що вам потрібно виправити). (Крім того, ;не змушує синтаксичного розбору поганого регулярного виразу, він змушує SyntaxError з *.)
ETHproductions

1
@ Левшенко Але це не працює, #if 0як це бачиться тут: Спробуйте в Інтернеті!
Kritixi Lithos

3
У новіших версіях JS String.raw із рядком шаблону може змусити це не зламатись, оскільки недійсний параметр не працює. Буде: String.raw`code here`
iovoid

15

Python, 10 байт (не cpython)


?"""?'''?

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

Напевно @feersum у коментарях повністю зламав будь-яку програму cpython у Windows, наскільки я можу сказати, додавши символ початку 0x1A до початку файлу. Здається, що, можливо, (?) Це пов’язано з тим, як операційною системою обробляється цей персонаж, мабуть, перекладається на EOF, коли він проходить через stdin через якийсь спадковий стандарт DOS.

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

Редагувати:

Через старанність @ feersum у пошуку незрозумілих способів зламати інтерпретатора Python, наскільки я можу сказати, ця відповідь абсолютно недійсна для будь-якого типового середовища cpython! (Python 2 і 3 для Windows і Linux) Я все ще вважаю, що ці тріщини не працюватимуть для Pypy на будь-якій платформі (єдину іншу реалізацію Python, яку я протестував).


1
@officialaimm вважаю"""?'''"""
KSab

3
Я зробив програму з цією підрядкою, яка працює на моїй машині. Однак я думаю, що він не працює на багатьох інтерпретаторах / платформах / версіях. Чи можете ви вказати, на яку версію інтерпретатора Python та ОС націлена ця відповідь?
feersum

1
Python 3 в Windows 7 трапляється саме там, де працює моя тріщина. Пастебін з програмованою програмою base64
feersum

1
Я можу зламати і цю. Просто поставте символ 0x1A на початку файлу, а все інше його ігнорується (це фактично працює і для Python 3).
feersum

1
Я знаю, що це насправді старе, але, працюючи з деякими людьми в Python Discord, ми виявили цю тріщину , хоча я не знаю, чи зміна кодування може вважатися обманом
EdgyNerd

14

C (стук) , 16 байт

 */
#else
#else

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

*/закриває будь-який /*коментар, і провідний простір гарантує, що ми його не тільки починали. Новий рядок закриває будь-який //коментар і порушує будь-який літеральний рядок. Тоді ми викликаємо #else without #ifабо #else after #elseпомилку (незалежно від того, скільки #if 0ми можемо знаходитися всередині).



2
Оскільки, здається, що C ++ 11 необмежених рядків працює, рішення з GCC неможливо.
feersum

@feersum Huh, TIL, що GCC приймає ті, що містять код C. Я міг би вказати -std=c99, але спробуємо переключитися на кланг.
Anders Kaseorg

3
Я дуже здивований, що gcc приймає C ++ 11 необроблених рядків. Вказання версії або реалізації компілятора є цілком нормальним, тому, якщо це незаконне в Clang, це чесна гра.
nneonneo

1
@ l4m2 Я не можу розібратися у вашому запитанні (хто це, і що ви маєте на увазі ще раз?), але зауважте, що C ++ необмежений літеральний рядок підтримує користувацький деліметр: R"foobar(...)foobar"і лише правий батьків, за яким слідують відповідний деліметр і a цитата закриє її.
Anders Kaseorg

11

Pyth, 6 байт

¡¡$¡"¡

¡є безреалізованим символом, це означає, що якщо Pyth-аналізатор коли-небудь оцінить його, він помилиться з PythParseError. Код гарантує, що це станеться на одному з ¡s.

Існує три способи, як байт може бути присутнім у програмі Pyth, і не бути проаналізованим: У рядковому літералі ( "або .", який аналогічно розбирається), в літералі Python ( $) і відразу після a \.

Цей код не дозволяє \змусити його оцінювати без помилок, оскільки це впливає лише на одразу наступний байт та другу ¡помилку.

$вбудовує код в межах $s безпосередньо до компільованого коду Python. Я не припускаю, що там може статися.

Якщо програма досягне цього коду в $контексті, він закінчиться на $, і ¡щойно після нього зробить помилку аналізатора. Літерали Python Python завжди закінчуються в наступному $, незалежно від того, що може робити код Python.

Якщо програма запускається в "контексті, "заголовок завершить рядок, а фінал ¡зробить помилку аналізатора.


11

Ада - 2 байти

Я думаю, що це має спрацювати:


_

Це новий рядок - підкреслення. Новий рядок скасовує коментарі та заборонений у рядку. Підкреслення не може слідувати пробілів; це було дозволено лише після букв і цифр, але введення Unicode ускладнило справи.


2
Ласкаво просимо на сайт! :)
DJMcMayhem

9

32-розрядний машинний код x86, 11 байт (і 64-розрядний 64-розрядний)

90 90 90 90 90 90 90 90 90 0f 0b

Це times 9 nop/ ud2. Це в основному сани NOP , тому він як і раніше працює як 0 або більше nopс, а потім ud2створює виняток, незалежно від того, скільки 0x90байтів було використано в якості операндів попереднього коду. Інші однобайтові вказівки (на зразок times 9 xchg eax, ecx) теж спрацювали.

64-бітний машинний код x86, 10 байт (поточні процесори)

У 64-бітному режимі є деякі 1-байтові незаконні інструкції, поки якесь майбутнє розширення ISA не замінить їх як префікси або частини багатобайтових опкодів лише в 64-бітному режимі, окремо від їх значення в 32-бітному режимі. 0x0eзнаходиться push csв 32-бітному режимі, але незаконне для поточних процесорів (тестується на Intel Skylake) у 64-бітному.

0e 0e 0e 0e 0e 0e 0e 0e 0e 0e

Інтерпретація правил для виконавчого машинного коду :

  • Байти не можна перескакувати (як-от обмеження "не проаналізовано"), оскільки процесори не створюють винятків, поки вони насправді не намагаються розшифрувати / виконати (не спекулятивно).

  • Незаконні засоби завжди викликають виняток, наприклад виняток із незаконних інструкцій. (Реальні програми можуть це зрозуміти, за винятком обробника винятків на голому металі, або встановити обробник сигналу ОС, але я думаю, що це захоплює дух виклику.)


Це працює тому, що коротший байт-рядок, що закінчується на, ud2може виглядати як im32 та / або частина режиму адресації для іншої інструкції або розділятись на пару інструкцій . Найпростіше думати про це з точки зору того, що ви могли б поставити перед рядком, щоб "споживати" байти як частину інструкції, і залишити щось, що не помилиться.

Я думаю, що інструкція може споживати не більше 9 байт довільних речей: байт SIB, disp32 та im32. тобто перші 2 байти цієї інструкції можуть споживати 8 НОП і ud2, але не 9.

c7 84 4b 00 04 00 00 78 56 34 12        mov dword [rbx+rcx*2+0x400],0x12345678

Не можна обіграти 9 ніс:

    db 0xc7, 0x84   ; opcode + mod/rm byte: consumes 9 bytes (SIB + disp32 + imm32)
    times 9 nop          ; 1-byte xchg eax, ecx or whatever works, too
    ud2
  ----
   b:   c7 84 90 90 90 90 90 90 90 90 90        mov    DWORD PTR [rax+rdx*4-0x6f6f6f70],0x90909090
  16:   0f 0b                   ud2    

64-бітний режим:

 c7 84 0e 0e 0e 0e 0e 0e 0e 0e 0e        mov    DWORD PTR [rsi+rcx*1+0xe0e0e0e],0xe0e0e0e
 0e                      (bad)  

Але байти для 8 NOP + ud2 (або times 9 db 0x0e) можуть відображатися як частина інших inns:

    db 0xc7, 0x84   ; defender's opcode + mod/rm that consumes 9 bytes

    times 8 nop          ; attacker code
    ud2

    times 10 nop    ;; defenders's padding to be consumed by the 0b opcode (2nd half of ud2)
----
  18:   c7 84 90 90 90 90 90 90 90 90 0f        mov    DWORD PTR [rax+rdx*4-0x6f6f6f70],0xf909090
  23:   0b 90 90 90 90 90       or     edx,DWORD PTR [rax-0x6f6f6f70]
  29:   90                      nop
  2a:   90                      nop
  ...

Правила тут не були досить чіткими для мене, щоб розглянути можливість розміщення відповіді на код ASM / машини. Наприклад, чому ви не можете просто зробити це ud2? Здається, ви говорите, що ви інтерпретуєте правила як заборону перестрибувати через байти, так ud2що це буде добре самостійно, ні? О ... я думаю, ви говорите, що проблема полягає в тому, що він ud2може відображатись як префікс до дійсної інструкції? Друга частина цієї відповіді була мені трохи складною для розуміння.
Коді Грей

@CodyGray: Правильно, 2 байти, що кодують, ud2можуть з'явитися в imm32будь-якій інструкції. Я думав про це з точки зору того, які байти можна поставити перед таким рядком, який "споживає" 0f 0bяк частину попередньої інструкції, а не розшифровувати як ud2. Я не був абсолютно задоволений тим, як закінчив її презентувати, але хотів проілюструвати, чому лише 8 nopс не вистачило, і що сталося з 9 nops + ud2.
Пітер Кордес

@CodyGray: Програма джерела ASM була б абсолютно іншою відповіддю. Це повинно було б помилити аналізатор, що використовується асемблером, а не створити несправний машинний код. Таким чином, щось на кшталт %else/ %elseможе працювати, щоб перемогти %if 0, що може захистити недійсний текст від розбору. (ідея з відповіді CPP)
Пітер Кордес

Не зовсім задовольняю. Ваше рішення може бути лише у .data. (хоча це робить неможливим)
l4m2

@ l4m2: Щоб питання було відповідальним / цікавим, мені довелося обмежити його кодом, який виконується (а не перескакується). Дивіться правила мовлення інтерпретації правил у моїй відповіді. Це, звичайно, також виключає статичні дані. Тому що тоді це зовсім не машинний код, це лише дані. Це питання вимагало більшої адаптації, ніж більшість, щоб відповісти на машинний код мали сенс, тому що немає етапу компіляції / збирання, на якому можна помилити аналізатор, ми просто говоримо про байти, які вже є в пам'яті.
Пітер Кордес

7

C #, 16 байт


*/"
#endif<#@#>

Працює тому, що:

  • // коментар не працюватиме через новий рядок
  • /* коментар не працюватиме через */
  • Ви не можете мати лише константи в коді
  • Додавання #if falseдо початку не працюватиме через#endif
  • "Закриває будь-який рядок буквальною
  • <#@#>Є безіменній директива так зазнає невдачі для шаблонів T4.
  • Новий рядок хитрощів, тому, маючи /на початку, це не обдурить*/

Кожна з варіантів не вдається з помилкою компіляції.


1
Дивно, що ви вирішили включити у свій код шаблони T4. Чи не вважається Т4 окремою мовою?
Артуро Торрес Санчес

1
@ ArturoTorresSánchez Я не знаю, що я ніколи про них не чув. Хтось прокоментував, що це не спрацювало, коли ви включили шаблони T4, тому я додав виправлення.
TheLethalCoder


5

Грамотний Хаскелл , 15 байт

Відновлення видаленої спроби nimi.


\end{code}
5
>

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

Оригінальна спроба nimi - це останні два рядки, засновані на Literate Haskell, що не дозволяє >коду грамотного стилю знаходитись у сусідній лінії до грамотного рядка коментарів ( 5тут). Не вдалося, оскільки його можна вбудувати в коментар в альтернативному ("LaTeX") грамотному стилі кодування:

\begin{code}
{-
5
>
-}
\end{code}

Однак \begin{code}стиль грамотного Хаскелла не гніздиться ні сам по собі, ні в {- -}багаторядкових коментарях, тому, поставивши рядок \end{code}безпосередньо перед рядком із 5, цей спосіб не вдається, і я не бачу іншого.


4

Безкоштовний Паскаль, 18 байт


*)}{$else}{$else}

Спочатку закрийте всі можливі коментарі, потім обробіть умовний компіляцію.

Будь ласка, коментуйте тут, якщо я щось забув.


3
@ user902383 Чи містить ваш приклад провідний новий рядок його фрагмента?
Брайан Дж

@BrianJ nope, я думав, що це просто форматування проблеми, моє погано
user902383

Я не думаю, що це можливо у Free Pascal. Просто покладіть їх після begin end..
jimmy23013

@ jimmy23013, але, схоже, що коди після набуття end.дійсності дозволяються питанням.
tsh

4

Commodore 64 Basic, 2 байти


B

(це новий рядок з літерою "В").

Будь-який рядок у програмі Commodore 64 повинен починатися з номера рядка або ключового слова BASIC, а збережені програми дозволяють лише номери рядків. Немає ключових слів, що починаються з "B" (або "H", "J", "K", "Q", "X", "Y" або "Z").


Якщо я додаю, =0то це просто стає заявою про доручення ...
Ніл

1
@Neil, це була б дійсна команда негайного режиму, але не допустима програма.
Марк

4

Brain-Hack (варіація Brain-Flak ), 3 2 байти

Завдяки Wheat Wizard за те, що він зазначив, що Brain-Hack не підтримує коментарів, економлячи мене на байті.

(}

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


Як ви коментуєте Brain-Flak? Я не знаю жодного способу зробити це.
Ерік Аутгольфер

@EriktheOutgolfer # TIO
Райлі

Ху бездокументована поведінка.
Ерік Аутгольфер

@EriktheOutgolfer Я завжди припускав, що вони десь задокументовані. Подивлюся, як їх додати.
Райлі

Вам не потрібен новий рядок у BrainHack або Craneflak, Rain-Flak є єдиною з трьох версій, що мають коментарі до рядків. Хоча Craneflak розбирає на льоту так, що це неможливо вирішити в Craneflak, будь-яке рішення можна було побити заздалегідь (()){()}.
Sriotchilism O'Zaic


3

VBA, 2 байти

Подача рядка з подальшим підкресленням - _виконує функцію символу продовження рядка у VBA, і оскільки в рядку немає нічого ліворуч або над продовженням рядка, поєднане з відсутністю багато рядкових коментарів VBA означає, що це завжди буде кидати компіляцію помилка часуCompile Error: Invalid character


_

Ви залежаєте від вашого шаблону, починаючи з нового рядка ... тож додайте новий рядок.
Дедуплікатор

@Deduplicator у нього вже є новий рядок, - не важливо, що слід за цим _, лише те, що немає лівої чи лівої ліворуч над ним
Тейлор Скотт

Що робити, якщо вона вбудована так myfunction( \n_ ):?
Дедуплікатор

@Deduplicator Символ продовження рядка повинен бути на тому ж рядку, що і далі Public Function Foo( ByVal bar as Integer, _ (новий рядок) bas as long) as double- так що так, це призведе до помилки, якщо ви викликаєте описану вами функцію
Тейлор Скотт

Гаразд, у такому випадку це більше схоже myfunction( _ \n_ ). Вибачте за непорозуміння. Інакше кажучи, ви повинні використати два нових рядки.
Дедуплікатор

3

SmileBASIC, 2 байти


!

Ніщо не продовжується в кінці рядка, тому все, що вам потрібно, - це розрив рядка з подальшим тим, що не може бути початком заяви. !це логічний оператор, але ви не можете ігнорувати результат вираження, тому навіть щось на кшталт !10було б недійсним (хоча X=!10працює, звичайно)

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

Тут можна використовувати багато альтернативних символів, тому я думаю, що було б цікавіше перерахувати ті, які ДУЖЕ БУДІТЬ дійсні.

@- це початок мітки, наприклад @DATA,; (може бути частиною виразу, на зразок (X)=1якого дозволено чомусь; будь-яка літера або _може бути змінною назвою X=1, викликом функції LOCATE 10,2або ключовим словом WHILE 1; 'є коментар; і ?короткий для PRINT.


О, чомусь, коли я редагував пост, він дублювався ...
12Me21

3

INTERCAL , 12 байт

DOTRYAGAINDO

Спробуйте зламати його в Інтернеті!

Підхід INTERCAL до синтаксичних помилок є дещо особливим. По суті, недійсне твердження насправді не буде помилкою, якщо програма не спробує виконати його. Насправді ідіоматичний синтаксис коментарів - це починати з них PLEASE NOTE, який дійсно тільки починає висловлювання, заявляє, що його не потрібно виконувати, а потім починає його з листа E. Якщо ваш код знаходиться DODOв середині його, ви можете DOABSTAINFROM(1)(1)додати до кінця будь-яку дійсну заяву, і ви будете добре, якщо це DODODOви можете просто згорнути виконання навколо неї як (1)DON'TDODODOCOMEFROM(1). Навіть незважаючи на те, що INTERCAL не вистачає буквеного синтаксису рядків для їх уникнення, немає можливості використовувати синтаксичні помилки для створення незаконного рядка, навіть вичерпуючи кожен можливий номер рядка з(1)DO(2)DO...(65535)DODODO, оскільки видається, що дублювати номери рядків при COME FROMроботі з будь-яким із них можна.

Для того, щоб нелегальна рядок, ми на самому ділі потрібно використовувати зовсім дійсне твердження: TRY AGAIN. Навіть якщо вона не виконується, вона строго повинна бути останньою заявою в програмі, якщо вона взагалі є в програмі. Наскільки мені відомо, 12 байт - це найкоротший неправомірний рядок, який можна використати TRY AGAIN, тому що він повинен гарантувати, що після нього є повідомлення (виконане чи ні), тому DOTRYAGAINце просто звичайний код, і він повинен переконатися, що весь вислів насправді TRY AGAIN, тому TRYAGAINDOне працює, тому що його легко перетворити на ігноровану, нормальну синтаксичну помилку: DON'TRYAGAINDOGIVEUPабо PLEASE DO NOT TRY TO USE TRYAGAINDO NOT THAT IT WOULD WORK. Незалежно від того , що ви поклали на обидві сторони DOTRYAGAINDO, ви не будете помилка, або ICL993I I GAVE UP LONG AGO, ICL079I PROGRAMMER IS INSUFFICIENTLY POLITEабо ICL099I PROGRAMMER IS OVERLY POLITE.


Можливо, буде кілька інших помилок компіляції, які можуть виникнути раніше ICL993I I GAVE UP LONG AGO.
Непов'язані рядки

Якщо, використовуючи кожну мітку рядка, ви також і COME FROMкожну мітку рядка, може бути дещо складно переадресувати контрольний потік навколо блоку, але взагалі нічого не зупинить вас GIVING UP!
Непов'язані рядки

3

AWK , 4 байти



/

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

Оскільки AWKне існує способу робити багаторядкові коментарі, потрібні 2 нові рядки до та 1 після, /щоб запобігти коментування або перетворення цього в регулярний вираз, наприклад, додати 1/. Найпоширенішим повідомленням є `несподіваний новий рядок або кінець рядка.

З попередньою тріщиною


2

Фортран, 14 байт


end program
e

Немає багатолінійних коментарів або попередніх директив у Fortran.


1
Чи є хороший спосіб перевірити це в Інтернеті? Також, яка версія / компілятор Fortran?
Роберт Бенсон

2

JavaScript (Node.js) , 9 8 байт

`*/
\u`~

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

Я думаю, що це повинно бути досить незаконним.

Попередні спроби JS в інших відповідях

; * / \ u)

За крякання @Cows

Як відповідь ES5, це повинно бути дійсним, але в ES6 обгортання коду з парою задніх поверхонь укладає це. У результаті дійсні відповіді ES6 повинні містити зворотні посилання.

`
`* /} '" `\ u!

За допомогою @iovoid

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

Пояснення

`*/
\u`~

Це само по собі є незаконним, а також блокує всі одиничні та подвійні лапки, оскільки ці цитати не можуть охоплювати рядки без а \в кінці рядка

//`*/
\u`~

і

/*`*/
\u`~

Блокує коментарі, вводячи незаконні послідовності втечі

``*/
\u`~

Блокує початковий backtick, вводячи неприпинений RegExp literal

console.log`*/
\u`~

Блокує теги букварів шаблону, вводячи очікуваного оператора між двома задніми таблицями


2

Rockstar , 4 5 байт

Закреслено 4 все ще 4 :(

)
"""

Rockstar - це дуже ... багатослівна мова.
Хоча "можна використовувати для визначення рядка, наприклад, наскільки Put "Hello" into myVarмені відомо, немає способу, щоб 3 лапки з’явилися поза коментарем, і близький батьків гарантує, що цього не відбудеться (Коментарі в Rockstar укладені в круглі дужки, наприклад це).

У Rockstar також є поетичний буквальний синтаксис, в якому пунктуація ігнорується, тому новий рядок гарантує, що 3 лапки є початком рядка коду, який завжди повинен бути недійсним


А як же (()"""), чи не буде це неоператором?
ბიმო

@BMO перший paren відкриває коментар, 2-й paren нічого не робить, оскільки його прокоментують, 3-й pare закриває коментар, потім ви """)розбираєте код, який є недійсним
Skidsdev

Хм, вкладених коментарів немає у специфікаціях. Коментарі, здається, в будь-якому випадку не рекомендують. Але ви переглядали поетичні літеральні рядки, які дозволяють будь-який рядок, так Goethe says )"""це дійсно .
ბიმო

@BMO хороший момент, можна виправити, вставивши між )"""
рядками

2

Powershell, 10 8 12 14 13 14 16 байт

-2 байти завдяки Mazzy знайти кращий спосіб розбити його
+4 -1 байт завдяки IsItGreyOrGray

$#>
'@';
"@";
@=

Сподіваюся, це спрацює. 'і "захистити від лапок, #>зламати блок-коментар, нові рядки, щоб зупинити однорядковий коментар, обидва '@та "@вловлювати інший стиль рядків, а потім починає неправильний масив, щоб викинути синтаксичну помилку.

Логіка полягає в тому, що вони не можуть використовувати жоден набір лапок, щоб увійти, вони не можуть заблокувати коментування, якщо @"він використовується, він створить рядок тут, який не може мати маркер згодом, і якщо вони залиште його в спокої, він спробує скласти розбитий масив. Це твердження хоче жити так важко, я постійно знаходжу ще більше дірок у броні.


1
Або протектори +@=
mazzy

1
@IsItGreyOrGray AAAAAAAAAAAAck heck.
Веска

2
Схоже, що зміна #> на $ #> перерве це як "не розпізнане як ім'я командлету ..." Це може бути знову законним, але у мене немає способу. І все-таки. :)
GreyOrGray

1
@IsItGreyOrGray Sonofagun. Зараз ви маєте напівколонові броні?
Веська

1
Приємно! У мене нічого немає. Все, що я спробував, не вдалося.
GreyOrGray

2

Рунічні чари, 3 байти

Одна з багатьох можливих варіацій.

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

Runic використовує unicode, поєднуючи символи в " Mмодифікує поведінку C" (де Cкоманда). Таким чином, жодним двом модифікаторам не дозволяється змінювати одну і ту ж команду, і аналізатор видасть помилку, якщо таке явище буде знайдено.

Аналогічно, деякі команди, які перенаправляють IP, не можуть бути змінені жодним чином, через існування символів модифікатора модифікації напрямку (і обидва в одній клітині не мають сенсу).

Немає способу уникнути або буквально-ize рядка, щоб зробити його дійсним. Посилання Tio містить а ;, щоб обійти помилку "без термінатора" вищого пріоритету.


2

TI-Basic (83 + / 84 + / SE, 24500 байт)

A

(24500 разів)

TI (-83 + / 84 + / SE) -Basic виконує перевірку синтаксису лише на операторах, які він досягає, тому навіть 5000 Endвисловлювань поспіль можна пропустити з a Return. Це, навпаки, не може вписатися в ОЗУ TI-83 + / 84 + / SE, тому жодна програма не може містити цю рядок. Будучи трохи консервативним з цим числом персонажів.

У оригінальному TI-83 є 27000 байт оперативної пам’яті, тому Aв цьому випадку вам знадобиться 27500 с.

TI-Basic (89 / Ti / 92 + / V200, 3 байти)

"

Новий рядок, цитата, новий рядок. Новий рядок закриває будь-які коментарі (і забороняє вбудовувати незаконний символ у рядок, оскільки багаторядкові константи AFAIK не дозволені), інший новий рядок забороняє закривати рядок, а цитата дає синтаксичну помилку.

Ви можете дістатися до 2 байт за допомогою

±

без нового рядка, але я не впевнений, чи зараховується це, оскільки ±діє лише в рядкових константах.


Готово, дякую :)
bb94

2

Ідіть , 6 байт


*/```

Спробуйте зламати його в Інтернеті!

Гробовий наголос (`) позначає необроблений рядковий літерал, усередині якого, крім` всіх символів ', включаючи нові рядки та зворотні риски, інтерпретується буквально як частина рядка. Три "підряд" є ядром: суміжні літеральні рядки є недійсними і "завжди закриває " рядок, тому немає можливості їх зрозуміти. Мені довелося використати ще 3 байти для запобігання обходу, новий рядок, тому ми не можемо опинитися в однорядковому коментарі чи звичайному цитуваному рядку та * /, тому ми не можемо опинитися у багаторядковому коментарі.


1

SILOS , 4 байти

Силоси конкурентні \ о /


x+

SILOS працює на двопропускному перекладачі / компіляторі. Перед виконанням "компілятор" намагається спростити джерело в масив, що описує джерело. Кожен рядок обробляється окремо. x + a - оператор присвоєння, який додасть ea до значення x і збереже його у x. Однак "компілятор" зламається. Тому ми беремо цей рядок і додаємо новий рядок до та після того, як переконаємося, що він знаходиться у власному рядку та розбиває компілятор.

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


Чому не виходить ax+помилка?
Ерік Аутгольфер

не визначена поведінка компілятора @EriktheOutgolfer
Rohan Jhunjhunwala

1

AutoHotkey , 5 байт

`- символ втечі. Ви можете уникнути "лише" при призначенні його змінної.

\ n * / не дозволяє коментувати або призначати змінну.


*/`"

1

JavaScript, 11 символів

`
`*/}'"`\u)

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

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



Відповідь ES5 використовувала відповідь )після \u, можливо, це спрацювало б тут?
Ніл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.