Найти незаконную строку

81

Задача состоит в том, чтобы найти строку символов, которые не могут появиться ни в одной легальной программе на выбранном вами языке программирования. Это включает в себя комментарии, строки или другие «неисполняемые» части.

Вызов

  • Ваша программа может быть специфической для конкретной версии или реализации среды компилятора / интерпретатора / среды исполнения вашего языка. Если это так, пожалуйста, уточните подробности.
  • Разрешены только стандартные параметры компилятора / интерпретатора / среды выполнения. Вы не можете передать какой-то странный флаг своему компилятору, чтобы получить конкретный результат (например, передать флаг, чтобы преобразовать предупреждения в ошибки).
  • Если вашему языку программирования требуется определенная кодировка (например, UTF-8), ваша строка также должна быть правильно закодирована (то есть строки, которые терпят неудачу исключительно из-за ошибок декодирования символов, не допускаются).
  • Каждый отдельный персонаж в вашем представлении должен быть допустим в юридической программе; то есть вы не можете просто использовать символ, который всегда отвергается.
  • Компилятор / интерпретатор / среда выполнения должны выдавать ошибку при предоставлении любого исходного кода, который содержит вашу строку в качестве подстроки. Ошибка не обязательно должна быть одинаковой во всех программах - одно встраивание вашей строки может вызвать синтаксическую ошибку, а другое - ошибку времени выполнения.

счет

  • Кратчайшая незаконная строка для каждого языка выигрывает.
  • Вы должны объяснить, почему ваша строка недопустима (почему она не может появиться где-либо в легальной программе).
  • Оспорьте неверные решения в комментариях. Точнее говоря, вы должны предоставить ссылку на TIO или эквивалентную версию, демонстрирующую легальную программу (т.е. ту, которая не выдает никаких ошибок), которая содержит предложенную подстроку.
  • Некоторые языки (например, Bash, Batch, Perl) позволяют добавлять произвольные двоичные данные в программу, не влияя на достоверность (например, используя __DATA__в Perl). Для таких языков вы можете отправить решение, которое может появиться только в таком последнем разделе. Обязательно запишите это в своем ответе. (Определение этого «конечного раздела» зависит от языка, но обычно означает любой текст после того, как синтаксический анализатор полностью перестал читать сценарий).

пример

В Python я мог бы представить

x
"""
'''

но это может быть встроено в большую программу

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

так что это не допустимо.

nneonneo
источник
2
Может ли контрпример быть основан на вводе из STDIN?
Захари
5
Это сделало бы хороший CnR?
CalculatorFeline
2
Я полагаю, слишком поздно, но, похоже, это могла быть задача полицейских и грабителей. В попытках создавать правильные программы, а также в первую очередь придумывать строки, есть большой навык.
user2390246
4
Мои соболезнования попыткам Perl. :)
Kaz
2
Я почти уверен, что это невозможно в неграмотном Хаскеле, благодаря вложенным комментариям.
dfeuer

Ответы:

57

Перевертыш , 2 байта




Это два перевода строки. Допустимая перестановка всегда должна образовывать идеальный квадрат печатных символов ASCII, поэтому она не может содержать два перевода строки подряд.

Ошибка всегда является ошибкой парсера и всегда одинакова:

This shape is unpleasant.

сопровождается кодом выхода 1 .

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

Деннис
источник
Это также работает с 2Col . Попробуйте онлайн! , Но причина, по которой это ломается в 2Col, состоит в том, что каждая строка должна состоять ровно из 2 символов, а пустая строка разрывает это.
Критиси Литос
2
+1, потому что это автоматически победитель, так как однобайтовые решения не разрешены, потому что «вы не можете просто использовать символ, который всегда отклоняется».
Захари
1
@ Cowsquack tfw Я забыл о своем родном языке
Скидсдев
1
@Skidsdev tfw Я снова забыл о своем родном языке и забыл о себе, забыв о своем родном языке
Skidsdev
@ Zacharý А как насчет 0-байтовых решений?
PyRulez
32

Java, 4 байта

;\u;

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

Это недопустимая escape-последовательность Unicode и приведет к ошибке в компиляторе.

error: illegal unicode escape
Kritixi Lithos
источник
Не работает - один может иметь строковый литерал , как "\\u;".
feersum
@feersum Исправлено за счет одного байта
Kritixi Lithos
21
@TheLethalCoder: Java предварительно обрабатывает исходный код, чтобы изменить escape-коды, \uXXXXпрежде чем делать что - либо еще, так что да, это будет работать даже внутри comments.za
nneonneo
3
Я думаю, что это самый короткий ответ Java в истории этого сайта до сих пор ..
Волшебный осьминог Urn
1
@MagicOctopusUrn На самом деле, это Java-ответ с 0 байтами (который больше не актуален в текущей мета-версии, поскольку он выводит в STDERR вместо STDOUT). Хотя оба довольно удивительны и умны. :)
Кевин Круйссен
25

COBOL (GNU) , 8 байт


THEGAME

Во-первых, перевод строки, чтобы вы не поместили мое слово в закомментированную строку.

Затем, исторически, программы на языке COBOL печатались на листах кодирования, компилятор в значительной степени опирается на 80-символьные ограниченные строки, многострочных комментариев нет, а первые 6 символов - это комментарии (часто используемые в качестве редактируемых номеров строк), вы можете поместить туда практически все , НАСКОЛЬКО МНЕ ИЗВЕСТНО. Я выбрал THEGAMв начале следующей строки.

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

Например, ошибка, переданная GnuCobol:

error: invalid indicator 'E' at column 7

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

Кроме того, вы только что проиграли игру.

PhilDenfer
источник
30
Also, you just lost the game.Я почти понизился
Стивен
24

JavaScript, 7 байт


;*/\u)

Обратите внимание на ведущий перевод строки.

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

Попробуй!

Kritixi Lithos
источник
2
/* */\u0045 = 3кажется допустимым кодом JavaScript.
TSH
2
3 */\u;/все еще в силе.
TSH
3
Интересно отметить, что с ES2018 (которая не будет официальной до конца этого года) вы можете просто обернуть все это в кавычки из-за этого . Вы, вероятно, могли бы это исправить, просто вставив обратную галочку после /(не то, что вам нужно это исправлять). (Кроме того, ;он не вызывает синтаксический анализ плохого регулярного выражения, он вызывает синтаксическую ошибку с *.)
ETHproductions
1
@Leushenko Но это не работает против, #if 0как видно здесь: попробуйте онлайн!
Kritixi Lithos
3
В более новых версиях JS String.raw со строкой шаблона может сделать это не разрывом, потому что сбой неверного escape. Было бы: String.raw `код здесь`
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, которую я тестировал).

KSab
источник
1
@officialaimm рассмотреть"""?'''"""
KSab
3
Я сделал программу с этой подстрокой, которая работает на моей машине. Тем не менее, я думаю, что он не работает на многих интерпретаторах / платформах / версиях. Можете ли вы указать, на какую версию интерпретатора Python и ОС предназначен этот ответ?
feersum
1
Python 3 в Windows 7 оказался именно там, где работает мой кряк. Pastebin из программы, закодированной в base64
feersum
1
Я тоже могу взломать этот. Просто поместите символ 0x1A в начале файла, а все остальное игнорируется (на самом деле это работает и для Python 3).
feersum
1
Я знаю, что это действительно старо, но после работы с некоторыми людьми в Python Discord мы нашли этот треск , хотя я не знаю, можно ли считать изменение кодировки обманом
EdgyNerd
14

C (лязг) , 16 байтов

 */
#else
#else

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

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

Андерс Касеорг
источник
2
Также, поскольку кажется, что исходные строки в C ++ 11 работают, решение с gcc невозможно.
feersum
@feersum Да, пока GCC принимает их в коде C. Я мог бы указать -std=c99, но давайте попробуем перейти на Clang.
Андерс Касеорг
3
Я действительно удивлен, что gcc принимает строки C ++ 11 raw. Указание версии или реализации компилятора совершенно нормально, так что если это нелегально в Clang, это честная игра.
nneonneo
1
@ l4m2 Я не могу разобрать ваш вопрос (кто они, и что вы подразумеваете под этим снова?), но обратите внимание, что необработанный строковый литерал C ++ поддерживает пользовательский разделитель: R"foobar(...)foobar"и только правую часть, за которой следует соответствующий разделитель и цитата закроет это.
Андерс Касеорг
11

Pyth, 6 байт

¡¡$¡"¡

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

Существует три способа, которыми байт может присутствовать в программе Pyth и не анализироваться: в строковом литерале ( "или .", который анализируется эквивалентно), в литерале Python ( $) и сразу после a \.

Этот код не позволяет \выполнить его оценку без ошибок, поскольку это влияет только на непосредственно следующий байт и вторые ¡ошибки.

$встраивает код внутри $s непосредственно в скомпилированный код Python. Я не делаю предположений о том, что может там произойти.

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

Если программа запускается в "контексте, "конец строки завершится, а финал ¡выдаст ошибку синтаксического анализатора.

isaacg
источник
11

Ада - 2 байта

Я думаю, что это должно работать:


_

Это подчеркивание новой строки. Новая строка завершает комментарии и не допускается в строке. Подчеркивание не может следовать за пробелами; Раньше это разрешалось только после букв и цифр, но введение Unicode усложнило ситуацию.

xaambru
источник
2
Добро пожаловать на сайт! :)
DJMcMayhem
9

32-битный машинный код x86, 11 байт (и 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-битном режиме существуют недопустимые однобайтовые инструкции, пока какое-либо будущее расширение ISA не использует их как префиксы или части многобайтовых кодов операций только в 64-битном режиме, независимо от их значения в 32-битном режиме. 0x0eнаходится push csв 32-битном режиме, но недопустимо на текущих процессорах (протестировано на Intel Skylake) в 64-битном режиме.

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

Интерпретация правил для исполняемого машинного кода :

  • Байты не могут быть перепрыгнуты (как, например, ограничение «не анализируется»), потому что процессоры не вызывают исключения до тех пор, пока они фактически не попытаются декодировать / выполнить (не спекулятивно).

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


Это работает, потому что более короткая строка байтов, заканчивающаяся на, ud2может появиться как imm32 и / или часть режима адресации для другой инструкции, или разбить на пару инструкций . Проще всего думать об этом с точки зрения того, что вы можете поместить перед строкой, чтобы «потреблять» байты как часть инструкции и оставлять то, что не будет ошибочным.

Я думаю, что инструкция может потреблять не более 9 байтов произвольного материала: байт SIB, disp32 и imm32. т.е. первые 2 байта этой инструкции могут потреблять 8 NOP и 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) могут появляться как часть других insns:

    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 / machine code. Например, почему ты не можешь просто сделать ud2? Кажется, вы говорите, что интерпретируете правила как запрещающие перепрыгивать через байты, так ud2что сработало бы само по себе, не так ли? Ох ... Я думаю, вы говорите, проблема в том, что ud2может появиться в качестве префикса к действующей инструкции? Вторая часть этого ответа была для меня немного трудной для понимания.
Коди Грей,
@CodyGray: верно, 2 байта, которые кодируют, ud2могут появляться в imm32любой инструкции. Я думал об этом с точки зрения того, какие байты вы можете поместить перед такой строкой, которая «потребляет» 0f 0bкак часть более ранней инструкции вместо декодирования как ud2. Я не был полностью доволен тем, как я это представил, но я хотел показать, почему nopне хватило только 8 с, а что случилось с 9 nopс + ud2.
Питер Кордес
@CodyGray: исходная программа asm была бы совершенно другим ответом. Это должно привести к ошибке синтаксического анализатора, используемого ассемблером, а не к ошибочному машинному коду. Таким образом, что-то вроде %else/ %elseможет работать, чтобы победить %if 0, что обычно может защитить любой недопустимый текст от анализа. (идея из ответа CPP)
Питер Кордес
Не совсем удовлетворяю Ваше решение может быть только в .data. (хотя это делает это невозможным)
l4m2
@ l4m2: чтобы сделать ответ ответственным / интересным, я должен был ограничить его выполненным кодом (а не перепрыгивать). См. Пункты в толковании правил в моем ответе. Это также исключило бы статические данные, конечно. Потому что тогда это вовсе не машинный код, это просто данные. Этот вопрос требовал большей адаптации, чем большинство, чтобы ответ на машинный код имел смысл, потому что нет стадии компиляции / сборки, где вы можете ошибиться в синтаксическом анализаторе, мы просто говорим о байтах, уже находящихся в памяти.
Питер Кордес
7

C #, 16 байт


*/"
#endif<#@#>

Работает потому что:

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

Каждый вариант завершается с ошибкой компиляции.

TheLethalCoder
источник
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}стиль грамотного Haskell делает не гнездо, ни в себе , ни в {- -}многострочных комментариях, поэтому, поставив линию \end{code}непосредственно перед прямым с 5, что обходной путь не удается, и я не вижу другой.

Орджан Йохансен
источник
4

Свободный Паскаль, 18 байт


*)}{$else}{$else}

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

Пожалуйста, прокомментируйте здесь, если я что-то забыл.

ТТГ
источник
3
@ user902383 Содержит ли ваш пример символ новой строки в его фрагменте?
Брайан Дж
@BrianJ Нет, я думал, что это просто проблема с форматированием, мой плохой
user902383
Я не думаю, что это возможно в Free Pascal. Просто поставь их после begin end..
jimmy23013
@ jimmy23013 но кажется, что коды после end.вступления в силу разрешены вопросом.
TSH
4

Commodore 64 Basic, 2 байта


B

(это новая строка, за которой следует буква "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? Я не знаю, как это сделать.
Эрик Outgolfer
@EriktheOutgolfer # TIO
Райли
Да, недокументированное поведение.
Эрик Outgolfer
@EriktheOutgolfer Я всегда предполагал, что они были где-то задокументированы. Я посмотрю на их добавление.
Райли
Вам не нужна новая строка в BrainHack или Craneflak, Rain-Flak - единственная из трех версий, в которой есть строчные комментарии. Хотя Craneflak анализирует на лету, так что в Craneflak это невозможно решить, любое решение может быть побеждено с помощью предварительного запроса (()){()}.
Пшеничный волшебник
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 байта


!

Ничто не продолжается после конца строки, поэтому все, что вам нужно, это разрыв строки, за которым следует что-то, что не может быть началом оператора. !является логическим оператором not, но вы не можете игнорировать результат выражения, поэтому даже что-то вроде !10будет недопустимым (пока X=!10работает, конечно)

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

Здесь можно использовать множество альтернативных символов, поэтому я думаю, что было бы интереснее перечислить те, которые МОГУТ быть действительными.

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

12Me21
источник
о, почему-то, когда я редактировал сообщение, оно было продублировано ...
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

В Фортране нет многострочных комментариев или директив препроцессора.

Steadybox
источник
1
Есть хороший способ проверить это онлайн? Кроме того, какая версия / компилятор Фортрана?
Роберт Бенсон
2

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

`*/
\u`~

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

Я думаю, что это должно быть достаточно незаконно.

Предыдущие попытки JS в других ответах

; * / \ И)

По @Cows шарлатан

В качестве ответа ES5 это должно быть допустимо, но в ES6 обертывание кода парой обратных символов разрушает это. В результате действительные ответы ES6 должны включать обратные пометки.

`
`* /} '" `\ У!

@Iovoid

Это улучшенная версия с использованием обратных галочек. Однако, один /после кода нарушает это (он становится литералом шаблона, умноженным на регулярное выражение, бесполезным, но синтаксически действительным.) @Neil сделал предложение, что изменился !на ). Теоретически это должно работать, потому что добавление /в конце больше не работает (из-за неправильного выражения).

объяснение

`*/
\u`~

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

//`*/
\u`~

а также

/*`*/
\u`~

Блокирует комментарии, вводя недопустимые escape-последовательности

``*/
\u`~

Блокирует начальный обратный тик, вводя не завершенный литерал RegExp

console.log`*/
\u`~

Блокирует помеченные литералы шаблона, вводя ожидаемый оператор между двумя обратными галочками

Сиеру Асакото
источник
2

Rockstar , 4 5 байт

Вычеркнул 4 еще 4 :(

)
"""

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

Rockstar также имеет поэтический буквальный синтаксис, в котором пунктуация игнорируется, поэтому новая строка проверяет, что 3 кавычки являются началом строки кода, которая всегда должна быть недействительной

Skidsdev
источник
Как насчет того (()"""), не будет ли это без операции?
ბიმო
@BMO первый участник открывает комментарий, 2-й участник ничего не делает, потому что он закомментирован, 3-й участник закрывает комментарий, а затем вы """)анализируете его как код, который недопустим
Skidsdev
Хм, вложенные комментарии не в спецификациях. В любом случае комментарии не приветствуются. Но вы присматривали за поэтическими строковыми литералами, которые допускают любую строку, так что Goethe says )"""это действительно .
ბიმო
@ Хорошая точка зрения БМО, может быть исправлена ​​путем вставки новой строки между ними )и"""
Skidsdev
2

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

-2 байта благодаря Mazzy, находящему лучший способ сломать это
+4 -1 байта благодаря IsItGreyOrGray

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

Я надеюсь, что это работает. 'и "для защиты от кавычек, #>прерывания блочного комментария, новых строк, чтобы остановить однострочный комментарий, '@и "@для того, чтобы перехватить другой стиль строк, а затем запускает неподходящий массив, чтобы вызвать синтаксическую ошибку.

Логика в том, что они не могут использовать ни один набор кавычек для входа, они не могут его закомментировать, если @"он используется, он создаст здесь строку, которая впоследствии не может иметь токен, и если они оставьте это в покое, он попытается создать разбитый массив. Это утверждение хочет жить так усердно, что я все больше нахожу дыры в броне.

Veskah
источник
1
Или протекторы +@=
Маззи
1
@IsItGreyOrGray AAAAAAAAAAAw черт.
Веска
2
Похоже, что изменение #> на $ #> нарушит его как «не распознается как имя командлета ...». Это может быть как-то снова разрешено, но у меня нет пути. Все же. :)
GreyOrGray
1
@IsItGreyOrGray Sonofagun. Теперь с доспехами?
Веска
1
Приятно! У меня ничего нет. Все, что я пробовал, провалилось.
GreyOrGray
2

Рунические чары, 3 байта

Один из многих возможных вариантов.

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

Руник использует юникод, комбинирующий символы в « Mизменяет поведение C» (где Cэто команда). Таким образом, никакие два модификатора не могут изменять одну и ту же команду, и анализатор выдаст ошибку, если такое вхождение будет найдено.

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

Невозможно экранировать или буквально выполнить строку, чтобы сделать ее действительной. Ссылка Tio содержит ;, чтобы обойти высокоприоритетную ошибку «без терминатора».

Draco18s
источник
2

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

A

(24500 раз)

TI (-83 + / 84 + / SE) -Basic выполняет проверку синтаксиса только для операторов, которых он достигает, поэтому даже 5000 Endоператоров в строке могут быть пропущены с помощью Return. Это, напротив, не может поместиться в ОЗУ TI-83 + / 84 + / SE, поэтому ни одна программа не может содержать эту строку. Быть немного консервативным с количеством персонажей здесь.

Оригинальный TI-83 имеет 27000 байт оперативной памяти, поэтому Aв этом случае вам потребуется 27500 с.

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

"

Новая строка, цитата, новая строка. Новая строка закрывает любые комментарии (и запрещает встраивание недопустимого символа в строку, так как многострочные строковые константы AFAIK недопустимы), другая новая строка запрещает закрытие строки, а в кавычке выдается синтаксическая ошибка.

Вы можете получить до 2 байтов с

±

без перевода строки, но я не уверен, считается ли это, потому что ±он действителен только в строковых константах.

bb94
источник
Готово, спасибо :)
bb94
2

Go , 6 байт


*/```

Попробуйте взломать это онлайн!

Могильный акцент (`) обозначает необработанный строковый литерал, внутри которого все символы, кроме`, включая перевод строки и обратную косую черту, интерпретируются буквально как часть строки. Три `s в строке являются ядром: литералы смежных строк недопустимы и` всегда закрывают ` строку, поэтому нет никакого смысла понимать их. Мне пришлось использовать еще 3 байта для обхода обхода, новую строку, чтобы мы не могли быть внутри однострочного комментария или обычной строки в кавычках, и * /, поэтому мы не можем быть внутри многострочного комментария.

Фиолетовый П
источник
1

СИЛОС , 4 байта

Силосы конкурентоспособны \ о /


x+

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

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

Рохан Джунджхунвала
источник
Почему не ax+ошибка?
Эрик Аутгольфер,
неопределенное поведение компилятора @EriktheOutgolfer
Rohan Jhunjhunwala
1

AutoHotkey , 5 байт

`является побегом. Вы можете только избежать "при назначении его переменной.

\ n * / предотвращает его закомментирование или присвоение переменной.


*/`"
nelsontruran
источник
1

JavaScript, 11 символов

`
`*/}'"`\u)

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

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

iovoid
источник
Ответ ES5 использовал )после \u, может быть, это будет работать здесь?
Нил