Задача состоит в том, чтобы найти строку символов, которые не могут появиться ни в одной легальной программе на выбранном вами языке программирования. Это включает в себя комментарии, строки или другие «неисполняемые» части.
Вызов
- Ваша программа может быть специфической для конкретной версии или реализации среды компилятора / интерпретатора / среды исполнения вашего языка. Если это так, пожалуйста, уточните подробности.
- Разрешены только стандартные параметры компилятора / интерпретатора / среды выполнения. Вы не можете передать какой-то странный флаг своему компилятору, чтобы получить конкретный результат (например, передать флаг, чтобы преобразовать предупреждения в ошибки).
- Если вашему языку программирования требуется определенная кодировка (например, UTF-8), ваша строка также должна быть правильно закодирована (то есть строки, которые терпят неудачу исключительно из-за ошибок декодирования символов, не допускаются).
- Каждый отдельный персонаж в вашем представлении должен быть допустим в юридической программе; то есть вы не можете просто использовать символ, который всегда отвергается.
- Компилятор / интерпретатор / среда выполнения должны выдавать ошибку при предоставлении любого исходного кода, который содержит вашу строку в качестве подстроки. Ошибка не обязательно должна быть одинаковой во всех программах - одно встраивание вашей строки может вызвать синтаксическую ошибку, а другое - ошибку времени выполнения.
счет
- Кратчайшая незаконная строка для каждого языка выигрывает.
- Вы должны объяснить, почему ваша строка недопустима (почему она не может появиться где-либо в легальной программе).
- Оспорьте неверные решения в комментариях. Точнее говоря, вы должны предоставить ссылку на TIO или эквивалентную версию, демонстрирующую легальную программу (т.е. ту, которая не выдает никаких ошибок), которая содержит предложенную подстроку.
- Некоторые языки (например, Bash, Batch, Perl) позволяют добавлять произвольные двоичные данные в программу, не влияя на достоверность (например, используя
__DATA__
в Perl). Для таких языков вы можете отправить решение, которое может появиться только в таком последнем разделе. Обязательно запишите это в своем ответе. (Определение этого «конечного раздела» зависит от языка, но обычно означает любой текст после того, как синтаксический анализатор полностью перестал читать сценарий).
пример
В Python я мог бы представить
x
"""
'''
но это может быть встроено в большую программу
"""
x
"""
'''
y
'''
так что это не допустимо.
code-challenge
restricted-source
nneonneo
источник
источник
Ответы:
Перевертыш , 2 байта
Это два перевода строки. Допустимая перестановка всегда должна образовывать идеальный квадрат печатных символов ASCII, поэтому она не может содержать два перевода строки подряд.
Ошибка всегда является ошибкой парсера и всегда одинакова:
сопровождается кодом выхода 1 .
Попробуйте онлайн!
источник
Java, 4 байта
Попробуйте онлайн!
Это недопустимая escape-последовательность Unicode и приведет к ошибке в компиляторе.
источник
"\\u;"
.\uXXXX
прежде чем делать что - либо еще, так что да, это будет работать даже внутри comments.zaCOBOL (GNU) , 8 байт
Во-первых, перевод строки, чтобы вы не поместили мое слово в закомментированную строку.
Затем, исторически, программы на языке COBOL печатались на листах кодирования, компилятор в значительной степени опирается на 80-символьные ограниченные строки, многострочных комментариев нет, а первые 6 символов - это комментарии (часто используемые в качестве редактируемых номеров строк), вы можете поместить туда практически все , НАСКОЛЬКО МНЕ ИЗВЕСТНО. Я выбрал
THEGAM
в начале следующей строки.Затем 7-й символ в любой строке принимает только очень ограниченный список символов: пробел (без эффекта), звездочка (комментирует оставшуюся часть строки), дефис, косая черта, могут быть другие, но, конечно, нет
E
.Например, ошибка, переданная GnuCobol:
Попробуйте онлайн!
Кроме того, вы только что проиграли игру.
источник
Also, you just lost the game.
Я почти понизилсяJavaScript, 7 байт
Обратите внимание на ведущий перевод строки.
\u)
недопустимая escape-последовательность Unicode, и именно поэтому эта строка недопустима//
в начале все равно не будет работать из-за ведущего символа новой строки, оставляя вторую строку без комментариев/*
не будет полностью раскомментировать строку из-за закрытия,*/
которое завершает ее, оставляя\u)
открытыми/
после строки ставится символ «а», поэтому, располагая)
перед символом «\u
мы», мы можем гарантировать, что литерал регулярного выражения всегда будет недействительным1||1(string)/
бы избежать необходимости оценивать регулярное выражение. Точка с запятой в начале второй строки останавливает это, завершая выражение1||1
до того, как оно попадет во вторую строку, вызывая тем самым SyntaxError с помощью;*
.Попробуй!
Показать фрагмент кода
источник
/* */\u0045 = 3
кажется допустимым кодом JavaScript.3 */\u;/
все еще в силе./
(не то, что вам нужно это исправлять). (Кроме того,;
он не вызывает синтаксический анализ плохого регулярного выражения, он вызывает синтаксическую ошибку с*
.)#if 0
как видно здесь: попробуйте онлайн!Python, 10 байт (не cpython)
Обратите внимание на ведущий перевод строки. Не может быть закомментировано из-за новой строки, и никакие комбинации строк в тройных кавычках не должны работать, если я правильно об этом подумал.
Насколько я могу судить, @feersum в комментариях полностью сломал любую программу cpython в Windows, добавив символ 0x1A в начало файла. Похоже, что (?) Это связано с тем, как этот символ обрабатывается операционной системой, по-видимому, переводится в EOF при прохождении через stdin из-за какого-то устаревшего стандарта DOS.
В очень реальном смысле это не проблема с python, а с операционной системой. Если вы создаете скрипт на python, который читает файл и использует встроенный
compile
в него файл , он дает более ожидаемое поведение при возникновении синтаксической ошибки. Pypy (который, вероятно, делает это внутренне) также выдает ошибку.Редактировать:
Из-за усердия @ feersum в поиске непонятных способов сломать интерпретатор Python, этот ответ совершенно недействителен для любой типичной среды cpython, насколько я могу судить! (Python 2 и 3 для Windows и Linux) Я все еще верю, что эти взломы не будут работать для Pypy на любой платформе (единственная другая реализация Python, которую я тестировал).
источник
"""?'''"""
C (лязг) , 16 байтов
Попробуйте онлайн!
*/
закрывает любой/*
комментарий, и ведущий пробел удостоверяется, что мы не только начали один. Новая//
строка закрывает любой комментарий и прерывает любой строковый литерал. Затем мы вызываем ошибку#else without #if
или#else after #else
(независимо от того, сколько#if 0
s мы можем быть внутри).источник
-std=c99
, но давайте попробуем перейти на Clang.R"foobar(...)foobar"
и только правую часть, за которой следует соответствующий разделитель и цитата закроет это.Pyth, 6 байт
¡
является нереализованным символом, означающим, что если анализатор Pyth когда-либо его оценит, он выдаст ошибку с PythParseError. Код гарантирует, что это произойдет на одном из¡
s.Существует три способа, которыми байт может присутствовать в программе Pyth и не анализироваться: в строковом литерале (
"
или."
, который анализируется эквивалентно), в литерале Python ($
) и сразу после a\
.Этот код не позволяет
\
выполнить его оценку без ошибок, поскольку это влияет только на непосредственно следующий байт и вторые¡
ошибки.$
встраивает код внутри$
s непосредственно в скомпилированный код Python. Я не делаю предположений о том, что может там произойти.Если программа достигает этого кода в
$
контексте, он заканчивается на$
, и¡
сразу после этого произойдет ошибка синтаксического анализатора. Python Python всегда заканчивается следующим$
, независимо от того, что может делать код Python.Если программа запускается в
"
контексте,"
конец строки завершится, а финал¡
выдаст ошибку синтаксического анализатора.источник
Ада - 2 байта
Я думаю, что это должно работать:
Это подчеркивание новой строки. Новая строка завершает комментарии и не допускается в строке. Подчеркивание не может следовать за пробелами; Раньше это разрешалось только после букв и цифр, но введение Unicode усложнило ситуацию.
источник
32-битный машинный код x86, 11 байт (и 64-битный код будущего)
Это
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-битном режиме.Интерпретация правил для исполняемого машинного кода :
Байты не могут быть перепрыгнуты (как, например, ограничение «не анализируется»), потому что процессоры не вызывают исключения до тех пор, пока они фактически не попытаются декодировать / выполнить (не спекулятивно).
Незаконное средство всегда вызывает исключение, например, исключение незаконного указания. (Реальные программы могут поймать это с помощью обработчика исключений на голом железе или установить обработчик сигнала ОС, но я думаю, что это отражает дух проблемы.)
Это работает, потому что более короткая строка байтов, заканчивающаяся на,
ud2
может появиться как imm32 и / или часть режима адресации для другой инструкции, или разбить на пару инструкций . Проще всего думать об этом с точки зрения того, что вы можете поместить перед строкой, чтобы «потреблять» байты как часть инструкции и оставлять то, что не будет ошибочным.Я думаю, что инструкция может потреблять не более 9 байтов произвольного материала: байт SIB, disp32 и imm32. т.е. первые 2 байта этой инструкции могут потреблять 8 NOP и ud2, но не 9.
Не могу победить 9 нопов:
64-битный режим:
Но байты для 8 NOP + ud2 (или
times 9 db 0x0e
) могут появляться как часть других insns:источник
ud2
? Кажется, вы говорите, что интерпретируете правила как запрещающие перепрыгивать через байты, такud2
что сработало бы само по себе, не так ли? Ох ... Я думаю, вы говорите, проблема в том, чтоud2
может появиться в качестве префикса к действующей инструкции? Вторая часть этого ответа была для меня немного трудной для понимания.ud2
могут появляться вimm32
любой инструкции. Я думал об этом с точки зрения того, какие байты вы можете поместить перед такой строкой, которая «потребляет»0f 0b
как часть более ранней инструкции вместо декодирования какud2
. Я не был полностью доволен тем, как я это представил, но я хотел показать, почемуnop
не хватило только 8 с, а что случилось с 9nop
с +ud2
.%else
/%else
может работать, чтобы победить%if 0
, что обычно может защитить любой недопустимый текст от анализа. (идея из ответа CPP)C #, 16 байт
Работает потому что:
//
комментарий не будет работать из-за новой строки/*
комментарий не будет работать из-за*/
#if false
в начало не будет работать из-за#endif
"
Закрывает любую строку буквальной<#@#>
Является безымянной директива так терпит неудачу для шаблонов T4./
на старте не обманет*/
Каждый вариант завершается с ошибкой компиляции.
источник
APL и MATL и Fortran , 3 байта
Newline, Quote, Newline всегда выдает ошибку, поскольку блочные комментарии не существуют:
unbalanced quotes
string literal not closed
Invalid character in name
источник
Грамотный Хаскелл , 15 байт
Восстановление удалённой попытки по nimi.
Попробуйте онлайн!
Первоначальная попытка nimi - это две последние строки, основанные на том, что Literate Haskell не позволяет
>
размещать код с буквенным стилем на соседней строке к строке с грамотным комментарием (5
здесь). Не удалось, потому что он может быть встроен в комментарий в альтернативном («LaTeX») стиле грамотного кодирования:Тем не менее,
\begin{code}
стиль грамотного Haskell делает не гнездо, ни в себе , ни в{- -}
многострочных комментариях, поэтому, поставив линию\end{code}
непосредственно перед прямым с5
, что обходной путь не удается, и я не вижу другой.источник
Свободный Паскаль, 18 байт
Сначала закройте все возможные комментарии, затем обработайте условную компиляцию.
Пожалуйста, прокомментируйте здесь, если я что-то забыл.
источник
begin end.
.end.
вступления в силу разрешены вопросом.Commodore 64 Basic, 2 байта
(это новая строка, за которой следует буква "B").
Любая строка в программе Commodore 64 должна начинаться либо с номера строки, либо с ключевым словом BASIC, а хранимые программы допускают только номера строк. Нет ключевых слов, начинающихся с «B» (или «H», «J», «K», «Q», «X», «Y» или «Z»).
источник
=0
то это просто станет оператором присваивания ...Brain-Hack (разновидность Brain-Flak ),
32 байтаСпасибо Wheat Wizard за то, что он указал, что Brain-Hack не поддерживает комментарии, сэкономив мне байт.
Попробуйте онлайн!
источник
#
TIO(()){()}
.CJam , 7 байтов
Попробуйте онлайн!
источник
VBA, 2 байта
Перевод строки, сопровождаемый подчеркиванием -
_
функционирует как символ продолжения строки в VBA, и так как в строке нет ничего слева или над продолжением строки, в сочетании с отсутствием многострочных комментариев в VBA означает, что это всегда будет вызывать компиляцию ошибка времениCompile Error:
Invalid character
источник
_
, только то, что нет никакой действительной строки слева или над нейmyfunction(
\n_
)
?Public Function Foo( ByVal bar as Integer, _
(Новая строка)bas as long) as double
- так что да, это приведет к ошибке, если выmyfunction( _
\n_
)
. Извините за путаницу. Другими словами, вы должны были использовать две новые строки.SmileBASIC, 2 байта
Ничто не продолжается после конца строки, поэтому все, что вам нужно, это разрыв строки, за которым следует что-то, что не может быть началом оператора.
!
является логическим оператором not, но вы не можете игнорировать результат выражения, поэтому даже что-то вроде!10
будет недопустимым (покаX=!10
работает, конечно)Подобные вещи будут работать на любом языке, где все заканчивается в конце строки, если он анализирует код перед его выполнением.
Здесь можно использовать множество альтернативных символов, поэтому я думаю, что было бы интереснее перечислить те, которые МОГУТ быть действительными.
@
например, начало метки@DATA
;(
может быть частью выражения, подобного(X)=1
которому по какой-то причине разрешено; любая буква или_
может быть именем переменнойX=1
, вызовом функцииLOCATE 10,2
или ключевым словомWHILE 1
;'
это комментарий; и?
сокращение отPRINT
.источник
INTERCAL , 12 байт
Попробуйте взломать это онлайн!
Подход 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
!AWK , 4 байта
Попробуйте онлайн!
Поскольку у
AWK
него нет способа делать многострочные комментарии, нужно 2 символа новой строки до и 1 после,/
чтобы предотвратить комментирование или преобразование в регулярное выражение, например, добавить1/
. Наиболее распространенным сообщением является `неожиданный перевод строки или конец строки.С предыдущей трещиной
источник
Фортран, 14 байтов
В Фортране нет многострочных комментариев или директив препроцессора.
источник
JavaScript (Node.js) ,
98 байтПопробуйте онлайн!
Я думаю, что это должно быть достаточно незаконно.
Предыдущие попытки JS в других ответах
объяснение
Это само по себе является недопустимым, а также блокирует все одинарные и двойные кавычки, потому что эти кавычки не могут охватывать строки без знака
\
в конце строки.а также
Блокирует комментарии, вводя недопустимые escape-последовательности
Блокирует начальный обратный тик, вводя не завершенный литерал RegExp
Блокирует помеченные литералы шаблона, вводя ожидаемый оператор между двумя обратными галочками
источник
Rockstar ,
45 байтВычеркнул 4 еще 4 :(
Rockstar - это очень ... многословный язык.
Хотя
"
может использоваться для определения строки, например, насколькоPut "Hello" into myVar
мне известно, 3 кавычки не могут появляться за пределами комментария, а закрывающая скобка гарантирует, что этого тоже не произойдет (комментарии в Rockstar заключены в круглые скобки, например: это).Rockstar также имеет поэтический буквальный синтаксис, в котором пунктуация игнорируется, поэтому новая строка проверяет, что 3 кавычки являются началом строки кода, которая всегда должна быть недействительной
источник
(()""")
, не будет ли это без операции?""")
анализируете его как код, который недопустимGoethe says )"""
это действительно .)
и"""
Powershell,
1081214131416 байт-2 байта благодаря Mazzy, находящему лучший способ сломать это
+4 -1 байта благодаря IsItGreyOrGray
Я надеюсь, что это работает.
'
и"
для защиты от кавычек,#>
прерывания блочного комментария, новых строк, чтобы остановить однострочный комментарий,'@
и"@
для того, чтобы перехватить другой стиль строк, а затем запускает неподходящий массив, чтобы вызвать синтаксическую ошибку.Логика в том, что они не могут использовать ни один набор кавычек для входа, они не могут его закомментировать, если
@"
он используется, он создаст здесь строку, которая впоследствии не может иметь токен, и если они оставьте это в покое, он попытается создать разбитый массив. Это утверждение хочет жить так усердно, что я все больше нахожу дыры в броне.источник
@=
Рунические чары, 3 байта
Один из многих возможных вариантов.
Попробуйте онлайн!
Руник использует юникод, комбинирующий символы в «
M
изменяет поведениеC
» (гдеC
это команда). Таким образом, никакие два модификатора не могут изменять одну и ту же команду, и анализатор выдаст ошибку, если такое вхождение будет найдено.Аналогично, некоторые команды, которые перенаправляют IP-адрес, не могут быть изменены каким-либо образом из-за наличия символов-модификаторов изменения направления (и обе в одной и той же ячейке не имеют смысла).
Невозможно экранировать или буквально выполнить строку, чтобы сделать ее действительной. Ссылка Tio содержит
;
, чтобы обойти высокоприоритетную ошибку «без терминатора».источник
TI-Basic (83 + / 84 + / SE, 24500 байт)
(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 байтов с
без перевода строки, но я не уверен, считается ли это, потому что
±
он действителен только в строковых константах.источник
Go , 6 байт
Попробуйте взломать это онлайн!
Могильный акцент (`) обозначает необработанный строковый литерал, внутри которого все символы, кроме`, включая перевод строки и обратную косую черту, интерпретируются буквально как часть строки. Три `s в строке являются ядром: литералы смежных строк недопустимы и` всегда закрывают ` строку, поэтому нет никакого смысла понимать их. Мне пришлось использовать еще 3 байта для обхода обхода, новую строку, чтобы мы не могли быть внутри однострочного комментария или обычной строки в кавычках, и * /, поэтому мы не можем быть внутри многострочного комментария.
источник
СИЛОС , 4 байта
Силосы конкурентоспособны \ о /
SILOS работает на двухпроходном интерпретаторе / компиляторе. Перед выполнением «компилятор» пытается упростить источник в массив, описывающий источник. Каждая строка обрабатывается отдельно. x + a - оператор присваивания, который добавит ea к значению x и сохранит его в x. Однако «компилятор» сломается. Поэтому мы берем эту строку и добавляем новую строку до и после того, как убедитесь, что она находится на отдельной строке и разбивает компилятор.
Попробуйте онлайн!
источник
ax+
ошибка?AutoHotkey , 5 байт
`является побегом. Вы можете только избежать "при назначении его переменной.
\ n * / предотвращает его закомментирование или присвоение переменной.
источник
JavaScript, 11 символов
Обратные пометки позволяют убивать строки шаблона, кавычки избавляются от строк, новая строка избегает закомментированных строк, конец комментария избегает комментариев блока, а последний обратный удар и escape (с!, Чтобы избежать добавления чисел) пытаются запустить недопустимый строка.
Попробуйте онлайн!
источник
)
после\u
, может быть, это будет работать здесь?