Ваша задача проста: написать как можно более длинную нетронутую программу на выбранном вами языке, используя только уникальные байты. (Полное определение нетронутой программы, скопированное по этой ссылке, находится внизу этого вопроса.)
Это верно, без каких-либо условий. Ваш код вообще ничего не должен делать, он просто выполняется без ошибок, соответствует требованиям для нетронутой программы (см. Ссылку выше) и не содержит дублирующихся байтов в используемой вами кодировке.
В целях вышеприведенного объяснения и связанного определения «нетронутой программы» ошибка определяется как что-либо, что приводит к тому, что программа либо полностью не запускается, либо завершается с ненулевым кодом выхода по истечении конечного промежутка времени.
Поскольку это кодовый боулинг , выигрывает самый длинный , а не самый короткий код (измеряется количеством байтов). Максимально теоретически возможная оценка равна 256, поскольку возможно 256 различных байтов. В случае ничьей побеждает первый ответ с наибольшим количеством очков.
Вот полное определение нетронутой программы, скопированное по ссылке выше:
Давайте определим нетронутую программу как программу, которая сама по себе не имеет ошибок, но выдаст ошибку, если вы измените ее, удалив любую смежную подстроку из N символов, где
1 <= N < program length
.Например, трехсимвольная программа Python 2
`8`
является нетронутой программой, потому что все программы, возникающие в результате удаления подстрок длины 1, вызывают ошибки (на самом деле синтаксические ошибки, но могут быть ошибки любого типа):
8` `` `8
а также все программы, возникающие в результате удаления подстрок длины 2, вызывают ошибки:
` `
Например,
`8
если бы программа была без ошибок,`8`
она не была бы нетронутой, потому что все результаты удаления подстроки должны содержать ошибки.
источник
JMP <address outside of the program's memory>
на сборку. В принципе, на реальном компьютере он может бесконечно зацикливаться или завершаться с ненулевой ошибкой, но обычно он вылетает эффектно.Ответы:
Желе ,
253 254256 байтПопробуйте онлайн! или проверить это!
Оказывается, языки игры в гольф могут чаша ...
‘
.Сейчас только«»
не используются«»
. Теперь получите оптимальный результат!Как?
Важнейшая особенность Jelly, которая делает это возможным, заключается в том, что открывающие и закрывающие символы для строковых литералов отличаются от почти всех других языков.
Структура программы выглядит следующим образом:
M <239 character long string> L»«’Ɗạ‘}237$¤¡
M
находит индексы своего аргумента, указывающие на максимальные элементы. Все, что имеет значение, это то, что без аргументов этой программы Jelly присваивает0
цепочке и Jelly ошибки, когда ониM
применяются к0
.Чтобы предотвратить
M
действие0
в полной программе, мы используем команду¡
quick, которая применяетсяM
несколько раз, определяемых результатом ссылки, непосредственно предшествующей ей. В этом случае эта ссылка есть<239 character long string> L»«’Ɗạ‘}237$¤
.L
берет длину этой строки (239) и»«’Ɗ
уменьшает ее до 238.»«
Часть ничего не делает, ноƊ
(последние три ссылки как монада) делает так, что если они будут удалены, произойдет ошибка. Затемạ
берется абсолютная разница между результатом»«’Ɗ
и монадой,‘}237$
примененной к строке.‘
увеличивается и является монадой, но}
превращает это в диаду и применяет ее к правильному аргументу237
, уступая238
. Таким образомạ
дает0
в полной программе.¤
ссылки на строковый литерал, образующие ниладу. Результатом этого является то0
, что онM
вообще не применяется, предотвращая любую ошибку.Возможные подпрограммы:
<string>..¤
она будет отлична от нуля иM
будет применена к ней0
, что приведет к ошибке.L»«’Ɗạ‘}237$
будет удалена, тоM
будет применена0
или между строкой и числом будут операции, в результате чегоTypeError
.¤¡
удален,M
применяется к0
.”
и оба из них’‘
удаляются и“
не удаляются , все послеM
превращается в строку, поэтомуM
будет действовать0
.”
и’
удаляется и“
не удаляется , все между”
и‘
превращается в список целых чисел.M
один удален, есть a,EOFError
потому что¡
ожидает ссылку перед предыдущим nilad.M“
и любое количество символов после его удаления, будет,EOFError
потому что¤
ищет предшествующую ему ниладу, но не находит ее.238
не считается, потому что это часть монады.Это в значительной степени охватывает все.
Ранее я не использовал,
«»‘
потому что последние два не могут быть включены в строку, потому что они соответствуют“
символу, чтобы сформировать вещи, отличные от строк.«
не может быть в“”
строке, но я не знаю почему.источник
Haskell ,
3945505260 байтИдентификатор
main
должен иметь типIO a
для некоторого типа a. Когда программа выполняется, вычислениеmain
выполняется, и его результат отбрасывается. В этом случае его типIO ((a,b)->a)
.Результатом является применение функции
(λ a b c d e f → return fst)
, константы с шестью аргументами, возвращающей функцию fst (которая дает первый элемент 2-кортежа), введенной в монаду IO. Шесть аргументовLT
(перечисление меньше чем),EQ
(перечисление равенства), пустой список[]
,3
,2
и1
.То, что будет пробелами, заменяется уникальными символами, которые считаются пробелами: табуляция, неразрывный пробел, подача формы, вертикальная табуляция, OGHAM SPACE MARK, обычный пробел, перевод строки и возврат каретки. Если какой-либо из них отсутствует, будет иметь место несоответствие в количестве аргументов. Имена параметров выбираются как трех- или четырехбайтовые символы UTF-8
𤶸陸ⵙ商ߜ新
, тщательно выбирая символы, которые не приводят к дублированию байтов.Спасибо @BMO за его ценный вклад.
Шестнадцатеричный дамп:
Попробуйте онлайн!
источник
'\109999'
похоже, действительно, по крайней мере, в GHC 8.2.2.'\10999a'
выдает лексическую ошибку.
выдает лексическую ошибку.maxBound :: Char
, т.е.'\1114111'
. Примечание: цифры десятичные по умолчанию, так что если вы хотите , шестигранника, вы должны Погружаетеx
после того , как\
, например'\x10999a'
.\x10ffff
работает нормально и\x110000
выдает ошибку вне допустимого диапазона, как и следовало ожидать.Python 2 ,
20 21 33 39 4550 байтСейчас очень много совместных усилий!
+2 благодаря Эйдану Ф. Пирсу (заменить
sorted({0})
наmap(long,{0})
)+8 благодаря dylnan (использование
\
и новая строка для замены пробела; предложения перейти от0
математического выражения; замена-1
на-True
; использование шестнадцатеричного числа)+11 благодаря Angs (
4*23+~91
->~4836+9*1075/2
потом позже~197836254+0xbCABdDF
->~875+0xDEAdFBCbc%1439/2*6
)Попробуйте онлайн! Или посмотрите пакет подтверждения
0xDEAdFBCbc
является шестнадцатеричным и оценивается как59775106236
.~
является побитовым дополнением, поэтому~875
оценивает-876
.%
является оператором по модулю, поэтому0xDEAdFBCbc%1439
оценивается в293
./
целочисленное деление, так что0xDEAdFBCbc%1439/2
оценивается как146
.*
умножение, так чтоxDEAdFBCbc%1439/2*6
оценивается в876
.+
это дополнение, так что~875+xDEAdFBCbc%1439/2*6
оценивает0
.... без зачистки версия также оценивается как
0
.{0}
являетсяset
содержащим единственным элементом,0
.Вызов
sorted
сset
аргументом a приводит к получению списка, который может быть проиндексирован с помощью[...]
.Без
sorted
кода({0})
просто выдаст,set
и это не может быть проиндексировано таким же образом,if({0})[-True]:q
поднял быTypeError
.Индексирование в Python основано на 0 и допускает отрицательное индексирование с обратной стороны и
True
эквивалентно1
, следовательно,sorted({0})[-True]
находит элемент0
, в то время какsorted({0})[True]
вызоветIndexError
, так как будетsorted({})[-True]
иsorted({0})[]
недопустимый синтаксис.0
, Который находится в falsey так телеif
,q
, никогда не выполняется, однако , если бы это было приподнять ,NameError
так какq
не была определена.Так как непустой список является правдивым, мы не можем урезать
if[-1]:q
ни то, ни другое.Посмотрите комплект подтверждения, чтобы увидеть: подтверждение того, что байты уникальны; все ошибки; и успех самого кода.
источник
C (tcc) , x86_64,
2931333940 байтВозвращает 0 . Спасибо @feersum за предложение прописных шестнадцатеричных цифр.
Попробуйте онлайн!
Как это устроено
Присвоение записывает два целых числа ( 184 и 49664 ) в ячейку памяти main . С 32-битными целыми числами и порядком байтов с прямым порядком байтов точные байты равны
b8 00 00 00 00 c2 00 00
.Поскольку tcc не объявляет определенный массив как .data ( как это делает большинство компиляторов), поэтому переход к main выполняет машинный код, на который он указывает.
b8 00 00 00 00
(mov eax, imm32
) сохраняет int 0 в регистре eax.c2 00 00
(ret imm16
) выталкивает 0 дополнительных байтов из стека и возвращает. (Значение в регистре eax является возвращаемым значением функции).источник
> <> , 122 байта
Попробуйте онлайн!
Ничего не делает. Основано на том же формате, что и мой ответ « Программирование нетронутого мира» .
Сначала мы проверяем, что длина кода равна 122, и, если это не так, выдают ошибку.
><>
Программы не могут завершиться без использования;
команды, но если эта команда находится в программе, мы можем просто удалить все перед ней, чтобы программа немедленно завершилась. Чтобы бороться с этим, мы используемp
команду для размещения;
в коде во время выполнения. Для этого мы вычитаем 6 изA
и помещаем его послеp
.Вероятно, я добавлю большинство других значений выше 127, как только выясню правильные двухбайтовые значения. Пропущены 5 значений
v^;
и две новые строки.Из 7502 подпрограмм 7417 из них допустили ошибку из-за недопустимых инструкций, 72 из-за переполнения памяти и 13 из-за нехватки памяти.
источник
JavaScript, 42 байта
i
,f
илиif
вызоветSyntaxError: missing ; before statement
;田
вызоветSyntaxError: expected expression, got end of script
;田
приведет кInvalid or unexpected token
;田
Показать фрагмент кода
источник
Brain-Flak , 2 байта
Попробуйте онлайн!
В качестве альтернативы,
[]
,{}
или()
. Снятие одного кронштейна приводит к тому, что другой кронштейн становится бесподобным.Доказательство того, что это оптимальное решение:
Программа Brain-Flak состоит из нилад (пара скобок самостоятельно) или монад (пара скобок, содержащих 1 или более нилад). Монада не может быть в нетронутой программе, так как вы можете просто удалить одну или несколько nilads. Точно так же вы не можете иметь более одной nilad в программе, так как вы можете удалить одну из них, не нарушая программу.
Таким образом, это может быть наименее оптимальный язык для нетронутого или уникального программирования.
источник
Ада, 110 байт (латиница 1)
Возможно, лучший ответ, который вы получите из любого языка, используемого в промышленности?
HexDump:
Скомпилируйте, сохранив любой файл, заканчивающийся
.ads
и работающийgcc -c <filename>
. Создает исполняемый файл, который ничего не делает. (Невозможно предоставить ссылку на TIO, поскольку TIO помещает код в.adb
файл иgcc
по умолчанию пытается найти для них подходящую спецификацию)В основном объявляет пакет с именем, в котором используются заглавные / строчные латинские буквы. Требуется различный символ пробела для каждого из пробелов, поэтому он использует пробел, CR, LF и TAB.
Как это выглядит в версии vim:
Как это устроено
В Аде даже спецификации могут быть скомпилированы. Спецификации похожи на заголовочные файлы c, но более полнофункциональны и могут компилировать некоторый основной код. Чтобы быть действительной, любая спецификация должна иметь формат:
package <NAME> is ... end <NAME>;
с<NAME>
соответствием. Хорошая вещь об Аде - то, что она полностью нечувствительна к регистру. Таким образом, пока ваше имя имеет прописные и строчные варианты, вам будет хорошо идти!Трудной частью было получить скомпилированный модуль. Обычно программы Ada имеют «основную» процедуру или функцию, лежащую вне любого пакета, который станет конечным исполняемым файлом. К сожалению, для процедур требуется
begin
ключевое слово, которое приводит к слишком большому числуe
s (известно только 2 случая), в то время как для функций требуетсяreturn
ключевое слово, которое приводит к слишком большому числуn
s. Таким образом, мне пришлось просто скомпилировать пакет.источник
C, 8 байтов
Ничего не делает.
Попробуйте онлайн!
источник
main(){short x;}
main(){short;}
компилируется только сwarning: useless type name in empty declaration
. Я думаю, что C99 и C ++ требуют явного возвращаемого типа, чтобыint main
(или, возможно,unsigned main
) мог работать, но не с gcc, который только предупреждает даже с-std=c11
.return 0;
может быть возможно с C89, где нетreturn 0
конца в концеmain
. Согласно другим ответам, выход с ненулевым статусом может считаться неудачей. Влияет ли добавление флагов компилятора, например,-Werror
на счет в боулинге кода? Потому что строгое соблюдение нарушений C11 может позволить гораздо более длительную программу. Хм,#include<>
что-то, а затем использовать это; вы не можете удалить и include, и использование, и если оно завершится неудачно без прототипа или макроса def, вы выиграете.main
иinclude
оба содержатi
, так что вы не можете иметь оба. Аналогично для объявления и использования функции. Кроме того, с помощьюreturn
вообще придумать это.int main
не может работать.JavaScript, 22 байта
Попробуйте онлайн!
Возможные ошибки
При изменении он выдаст одну из следующих ошибок 1 :
1. Точное количество явных ошибок зависит от двигателя. Этот список был создан с помощью SpiderMonkey (Firefox).
источник
Python 3 + Flask-Env ,
7131417 байтНет TIO, потому что он не имеет
flask-env
.Найдено самое длинное имя модуля, которое не имеет пересечения
import
и не имеет цифр в конце имени._sha256
длиннее, но256
само по себе не ошибка. Я нашел одну библиотеку,b3j0f.sync
которая на один байт длиннее, но я не смог заставить ее правильно импортировать.import
на\<newline>
. Вынос одного или обоих вызывает ошибку.Там все еще могут быть более длинные варианты, чем
flask_env
, я действительно не делал исчерпывающий поиск, но я просмотрел ~ 70 000 модулей. Открыт для предложений.источник
256
работает без ошибок.import *[hawkey]
и похожий, но, к сожалению, не работает ...R , 14 байтов
Попробуйте онлайн!
Это может быть самым длинным из возможных в R. Вызов любой функции обречен на неудачу, потому что вы сможете удалить все, кроме имени функции, что приведет к печати исходного кода функции. Это самый длинный именованный объект в настройке R по умолчанию без повторяющихся символов и имени объекта, оставшегося при удалении смежных символов.
Эта первая попытка не сработала, но я многому научился, пытаясь!
dontCheck({family;NROW})
источник
Perl 5, 3 байта
=>
это «толстая запятая», которая цитирует голое слово слева. Так что это эквивалентнокоторый ничего не делает.
Без жирной запятой
y
- оператор транслитерации, который недопустим, если три одинаковых символа не повторяются позже.Жирная запятая сама по себе тоже недействительна, как
=
и в>
одиночку.источник
брейкфук , 2 байта
Попробуйте онлайн!
Вдохновленный ответом Brain-Flak Джо Кинга . Это оптимально, потому что единственная ошибка в Brainfuck - это несоответствующие скобки. (Еще раз спасибо Джо Кингу за эту информацию.)
источник
Рубин , 28 байт
Попробуйте онлайн!
Проверьте это!
источник
Стандартный ML , 22 байта
Попробуйте онлайн!
op-(a,b)
это обезвоженная формаa-b
.~
обозначает унарный минус, поэтому мы на самом деле вычисления765+324
. Это выражение соответствует шаблону на константе1089
. Это совпадение успешно, если программа не была подделана и ничего не делает.Если совпадение не удается из-за того, что некоторые цифры были удалены, каждый получает
unhandled exception: Bind
. Удалениеop-
приводит к ошибке типа, потому что кортеж соответствуетint
. Все другие удаления должны привести к синтаксической ошибке.источник
Swift 4 , 19 байт
Попробуйте онлайн!
Все возможные ошибки, которые я нашел:
[
,]
,{
или}
приведет к синтаксической ошибке[].
приведет кUse of unresolved identifier 'contains'
.
приведет кConsecutive statements on a line must be separated by ';'
[]
приведет кReference to member 'contains' cannot be resolved without a contextual type
{1 !=␊0}
приведет кExpression resolves to an unused function
1 !=␊0
приведет кMissing return in a closure expected to return 'Bool'
'!=' is not a prefix unary operator
'=' must have consistent whitespace on both sides
!=
приведет кMissing return in a closure expected to return 'Bool'
Consecutive statements on a line must be separated by ';'
Contextual type for closure argument list expects 1 argument, which cannot be implicitly ignored
[].contains
приведет кClosure expression is unused
Некоторые другие интересные программы (по одной в каждой строке):
источник
a
sTcl , 6 байт
Попробуйте онлайн!
Tcl , 3 байта
Попробуйте онлайн!
Tcl , 2 байта
Попробуйте онлайн!
источник
Пакетный, 7 байтов
Хорошее начало
источник
Сетчатка , 2 байта
Я не удивлюсь, если это оптимально ...
Попробуйте онлайн!
Регулярное выражение содержит пустую группу. Удаление парен будет вызывать ошибку разбора из-за несоответствующих скобок.
Другие решения:
\(
,\)
,\[
,\]
,\*
,\+
,\?
,a]
источник
a]
не ошибкаC (gcc) ,
7375 байтовПопробуйте онлайн!
На основании ответа @Steadybox, спасибо @Angs за обнаружение серьезной ошибки.
Да, это грязная хак (потому что на самом деле использует
#define
с-DABCEGHIJKLMNOPQRSUVXYZabjkmopqrsvxz234567890=main
и-Dg=return
), но я не вижу никакого правила , которое запрещает такую опцию компилятора.источник
-DABCEGHIJKLMNOPQRSUVXYZabjkmopqrsvxz234567890=main
+-Dg=return
, так что я бы утверждать , что это использует выдуманный язык , специально разработанный для вызова , который запрещен по умолчанию.-1
без ошибок