Вдохновленный этим по умолчанию для IO .
Задание
Напишите программу, которая при вводе целого числа x
от 0 до 255 завершается с кодом завершения x
.
ограничения
- Вы не можете вызывать ничего, что предназначено непосредственно для вывода кода выхода (
System.exit(x)
возврата изmain
и т. Д.). Вместо этого ваша программа должна вызвать ошибку или сбой, который с вероятностью 1 приведет к выходу программы с входным целым числом.- В этом случае слова «ошибка» и «сбой» означают, что программа вызвала неустранимое непреднамеренное исключение, при котором метод, операция или иное значение использовались неправильно, что привело к необратимому отказу.
- Вы не можете напрямую вызвать ошибку, выбрасывая ее напрямую. Вы должны вызвать это, используя метод, функцию или иным образом, чье назначение служит другой функции (т. Е. Попытка выполнить запись файла в каталог только для чтения).
- В вашей программе должно быть не менее двух кодов выхода.
- Прекращение процесса с использованием сигналов запрещено. (Причины могут быть найдены в этом обсуждении )
счет
Оценка вашей программы определяется количеством поддерживаемых кодов выхода, где краткость кода является таймбрейкером. Победит наибольшее количество поддерживаемых кодов выхода!
code-challenge
restricted-source
Аддисон Крамп
источник
источник
throw new Exception()
стиль), это незаконно. Если это побочный продукт неправильного использования существующей функции, то это нормально.one zero zero
Приемлемо ли принимать ввод в виде прописных английских цифр (например, для 100)? У меня есть идея для этой задачи, но у языка есть несколько довольно необычных представлений о вводе / выводе, и это наиболее естественный формат ввода.Ответы:
Unix Shell (+ ncurses + утилиты BSD),
36, 26 байтов, 256 кодов выходаGolfed
Когда код выхода tput превышает 255, он просто переполняется, поэтому 253 (ошибки при вводе) приведут к коду выхода 1 и т. Д., Таким образом, получая желаемое состояние выхода для всего диапазона входов.
Примечание : будет ли сбой tput при настройке / получении конкретной возможности, зависит от типа терминала, который я использовал:
xterm with 256 colors
jot - это утилита BSD , которая печатает последовательные или случайные данные, и (AFAIK) также доступна из коробки в системах OSX.
Если вашей системы нет в
jot
наличии, вы можете использовать более длинную (29 байт) версию:Попробуйте онлайн! (версия 29 байтов)
источник
Bash 4.2 + дополнения, 24 кода выхода
Спасибо @ KenY-N за 3 кода выхода. Спасибо @ el.pescado за 1 код выхода.
верификация
Все тесты были выполнены на openSUSE 13.2.
источник
http_proxy=fafa curl http://example.org
INTERCAL (C-INTERCAL), 15 кодов, 313 + 2 = 315 байт
Попробуйте онлайн!
Все пробелы здесь не имеют значения. (Оригинальная программа содержала вкладки, но я преобразовал их в пробелы, чтобы они правильно совмещались в SE; для INTERCAL обычно используется ширина табуляции 8. Я протестировал версию программы со всеми вкладками, пробелами и новые строки удалены, хотя и работает нормально.)
Компилировать с
-abm
(2-байтовое наказание, потому-b
что компилятор должен быть детерминированным).Как обычно для INTERCAL, для этого требуется числовой ввод в формате, например,
ONE TWO THREE
для123
.объяснение
Когда происходит ошибка программы C-INTERCAL, статусом выхода является код ошибки по модулю 256. В результате мы можем стремиться написать программу, способную выдавать как можно больше ошибок времени выполнения. Эта программа пропускает только две ошибки времени выполнения, которые не указывают на внутренние проблемы компилятора: ICL200I, потому что для его воспроизведения требуется использование внешних библиотек, которые совместимы только с однопоточной программой (а многопоточные программы имеют больше ошибок); и ICL533I, потому что 533 имеет то же значение по модулю 256, что и 277, и программа способна генерировать ICL277I.
Программа всегда запускается одинаково. Сначала мы вводим (
WRITE IN
) значение для переменной.1
. Затем мы используем вычисляемыйCREATE
оператор для создания нового синтаксиса (здесь,A
); но поскольку он вычисляется, определение синтаксиса варьируется в зависимости от значения.1
. Наконец, в большинстве случаев мы запускаем наш новыйA
оператор, который был определен, чтобы вызвать ошибку; таблица возможных определений, которую мы имеем, содержит определение для каждой возможной ошибки времени выполнения (кроме исключений, перечисленных выше).Во-первых, есть два исключения из этой общей схемы.
(0)
не является допустимым номером строки, поэтому, если пользователь вводитZERO
, мы переходим со второй строки (пронумерованной(8)
) на четвертую строку с помощью вычисляемогоCOME FROM
оператора. Затем это приводит к синтаксической ошибкеDO X
, которая приводит к ошибкеICL000I
. (В INTERCAL синтаксические ошибки возникают во время выполнения из-за тенденции отключать команды, переопределять синтаксис под вами и т. Д.).COME FROM
Утверждение также имеет побочный эффект, даже если фактическаяCOME FROM
не происходит, создавая перегрузку операнда из.1
к#1
всякий раз , когда строка с номером строки выполняется; это используется позже при создании вывода 21. (Случайные глобальные побочные эффекты довольно идиоматичны в INTERCAL.)Другое исключение с вводом
ONE TWO NINE
. В программе нет номера строки(129)
, поэтому мы получаем ошибку для отсутствующего номера строкиICL129I
. Поэтому мне не пришлось писать какой-либо код, чтобы покрыть этот случай вообще.Вот другие ошибки и причины их возникновения:
NEXT
переполнение стека (DO (123) NEXT
).NEXT
Утверждение нуждается в других модификаторов (FORGET
илиRESUME
) для того , чтобы задним числом определить , какого рода заявление управления было. Отсутствие этих причин приводит к ошибке ICL123I, если имеется 80 неразрешенных операторов `NEXT '.DO STASH .2
вCOME FROM
цикле). Тайники ограничены только доступной памятью, но это в конечном счете закончится, вызывая ошибку ICL222I.DO ,1 <- #0
означает, и это вызывает ошибку ICL240I.,1
он не был выделен (,
используется для переменных типа массива в INTERCAL), поэтому его индексация вызывает ошибку ICL241I.#256 $ #0
) 16-битной переменной.2
. Это не подходит, вызывая ошибку ICL275I.#2
в.1
. Это может выглядеть как достаточно простое назначение, но мы перегружены,.1
чтобы означать#1
ранее, и попытка изменить значение 1 без-v
параметра в командной строке вызывает ошибку ICL277I.GO BACK
), которого нет в данный момент в программе (мы не выполнили никаких команд для управления стеком точек выбора, поэтому он все еще пуст). Это вызывает ошибку ICL404I.RETRIEVE .2
из несуществующего хранилища (потому что мы ничего не хранили там в этой ветке программы), вызывая ошибку ICL436I.WRITE IN
) навсегда вCOME FROM
цикле. В конечном итоге мы закончим чтение EOF, что приведет к ошибке ICL562I.DO RESUME #0
, который не имеет смысла и специально задокументирован как вызывающий ошибку (ICL621I).DO RESUME #9
. Мы еще неNEXT
выполнили так много операторов, и поэтому получаем ошибку ICL120I. (Интересно, что эта конкретная ошибка определена в документации INTERCAL как выход из программы в нормальном режиме, а затем вызывает ошибку, а не выход из программы с ошибкой. Однако я не верю, что эти два случая заметно различаются.)верификация
Некоторые из ошибок связаны с преднамеренным запуском программы из памяти, поэтому я предлагаю установить довольно небольшие ограничения памяти. Вот команда оболочки, которую я использовал для тестирования программы (с добавлением новых строк для удобства чтения; удалите их, если вы запустите ее самостоятельно):
А вот вывод (с номерами строк и сообщениями «PLEASE CORRECT SOURCE», удаленными для экономии места), которые я добавил частично для демонстрации работы программы, но в основном для демонстрации глупых сообщений об ошибках INTERCAL:
источник
Perl, 108 байт, 256 кодов выхода
Эта программа (ab) использует модуль Test :: More . Он пытается открыть файл с именем
""
n раз, где n задано в качестве аргумента командной строки. Каждый раз происходит сбой, и каждый вызов рассматривается как тест. Test :: More возвращает количество неудачных тестов в качестве кода выхода.plan tests => $ARGV[0]%255
необходим для получения кода выхода 255.источник
perl -MTest::More -e'plan tests,$%%255if$%=<>;ok 0for 1..$%'
51 байт (38 байт + 13 байт-MTest::More<space>
). Принимает вход на стандартный ввод.C90 (gcc), 256 кодов выхода,
282718 байтовЯ не уверен , если это умный или cheaty, но я не думаю , что он нарушает правила , как написано: это технически не используется
exit
,return
или любая ошибка метания механизм, а просто опирается на неопределенное поведение , и тот факт , что ССАГПЗ делает что-то довольно удобное, насколько этот вызов идет.Попробуйте онлайн!
Как это устроено
Это просто использует
getchar
для чтения одного байта из STDIN. Само по себе это ничего не делает.Однако, совместимая программа C90 должна заканчиваться
return
оператором или чем-то эквивалентным; все остальное - неопределенное поведение. gcc вret
любом случае завершает сгенерированную сборку , поэтому любое значение, которое было случайно в регистре EAX, будет возвращено программой. К счастью, glibcgetchar
хранит байт, который он читает из STDIN в EAX, поэтому значение этого байта является кодом выхода нашей программы.источник
set -o fullexitcode
.return
илиexit
является ошибкой, поскольку стандарт C90 идет, и это приводит к коду выхода, который указывает на сбой. Это все, что крах делает в глубине души.C (gcc) под оболочкой bash на x86, 230 байтов, 8 кодов выхода
Добавлены новые строки для удобства чтения. Комментарии игнорируются в баллах.
Особенность оболочки bash:
Таким образом, все, что нам нужно сделать, это запустить различные сигналы из программы переменного тока. На данный момент, я предполагаю, что просто делать
kill(n-128);
запрещено. Поэтому вместо этого мы выполняем код, который запускает различные сигналы, что делает соответствующие коды ошибок доступными в вызывающей оболочке.Коды выхода: 0, 130, 133, 134, 136, 139, 141, 142.
Попробуйте онлайн . Разверните раздел «Отладка», чтобы увидеть код возврата.
Это, конечно, может быть в гольф глубже. Но я бы больше интересовался добавлением большего количества сигналов.
источник
__asm("UD2")
запускает x86 «неопределенную инструкцию», которая вызовет исключение ЦП, которое будет передано ядром программе в виде сигнала SIGILL. Дляsocketpair
примера, SIGPIPE будет послан ядром или Glibc , как мы пытаемсяwrite()
к трубе , которая былаclose()
D на другом конце.int3
а неint $3
2) один символ, если вы объявляетеv
какint**
, учитывая, что вы в основном не полагаетесь наchar
-ность типа данных в вашей арифметике указателей, плюс 3) два символа, если вы используете*p
вместоp[0]
, или 4) шесть символов, если вы готовы полагаться на предсказуемыеfd
числа возвращаемых всех системных вызовов , которые создают их, и заменитьp[0]
иp[1]
их вблизи определенных значений. Наконец,pipe(fd)
намного корочеsocketpair(...)
и генерирует ту же ошибку при закрытииfd[0]
и записи в.fd[1]
,&63
вместо-128
. 2) Заменитьsleep(2)
наfor(;;)
. 3) Заменитьc=*(int*)c
наatoi(0)
. 4) Заменитьc/=c-2
наc/=0
.Python 2, 13 байт, 2 кода выхода
Если вы введете 0, он попытается вывести,
1/-1
что -1, что совершенно нормально, то есть код выхода 0. Если вы введете 1, вы получите,1/0
который вызывает a,ZeroDivisionError
в котором есть код выхода 1. В моей IDE есть только 0 и 1 для кодов выхода ...Выходы:
источник
PHP, 15 байтов, 2 кода выхода
Без
die
/exit
PHP не может ничего возвратить, кроме0
или255
(afaik; вероятно~1
), так что ...Если аргумент командной строки ложный, он оценивается
1
и завершается с0
. Если нет, он пытается вызвать функцию и завершается с<b>Fatal error</b>: Uncaught Error: Call to undefined function p()
.Беги с
-r
.источник
exit()
устанавливает статус выхода ... который вы не можете использовать для этого вызова, предоставляется. Но ваш код также недействителен. Она устанавливает статус выхода до 2551
. Я искал список кодов выхода, но не смог его найти.Excel VBA,
414514 533 + 3 байта, 14 кодов выходаПринимает входной сигнал , как
Conditional Compilation Argument
,n=[input value]
и выдает ассоциированный код ошибки для номера.+3 за
n=[Value]
вызов условной компиляцииОбрабатывает входы где
n=
Примечание: VBA не имеет кодов выхода
0
или1
. Я включил решения для3
и5
, которые являются двумя кодами выхода с наименьшим номером, доступными VBA вместо них.источник
#
здесь делать?#if
и#ElseIf
являются условием, означающим, что следующие за ним операторы компилируются только в том случае, если условие истинно#
, где они будут компилироваться независимо от того, являются ли операторы истинными? Я знаю, какIf
работают операторы, но я плохо знаком с тем, что на самом деле компилируется , так что извините за такой простой вопрос.#if
используется вместоIf
илиSelect Case
какtruthy
фактически скомпилированы только условные операторы. В этом случае в частности, это удерживает программу от выхода с кодом ошибки3
,Return without GoSub
при каждом исполнении, а только выход с этим кодом , когдаn=3
Turtlèd, 4 байта, 2 кода выхода
Я не знаю, есть ли какие-нибудь способы получить больше кодов выхода ... есть ли еще какие-то способы на языке переводчика
Я нашел несколько четырех длинных ответов
Попробуйте онлайн!
Попробуйте онлайн!
Попробуйте онлайн!
Как это работает:
в моем переводчике, есть
ошибкафункция , которая не приводит к ошибкам , когда сетка в памяти имеет более чем одну строки, и имеет никаких символов без пробелов на нем. эта программа стирает * в исходной ячейке'[space]
, принимает неотрицательное целочисленное значение?
(на самом деле 0 или 1) и сдвигает это число на много;
, если оно равно нулю, у сетки будет только одна строка, а не ошибка, иначе она сместится вниз и ошибка произойдетСкобки и прочее не анализируются, они просто выполняются во время выполнения, что означает: «переходить к соответствующему парену, если символ ячейки не верен». в этой программе, inputting (
!
) заставляет программу записать ее в ячейку (.
), выполнить paren, которая проверяет, равен ли символ ячейки 0, попытаться перейти к соответствующей paren, но вместо этого выдать ошибку, поскольку ее нет , если он равен нулю, он записывает его, проверяет круглые скобки, находит себя в 0, а затем игнорирует его, и программа завершает работуимеет элементы предыдущего ответа и первого. он принимает неотрицательный целочисленный ввод, сдвигает это число вниз и проверяет, является ли ячейка '*', в поисках несуществующей дополнительной пары, если это не так. если ввод равен 1, он переместится за пределы начального пространства и обнаружит, что ячейка является пробелом, а ошибка, если он равен нулю, останется в начальном пространстве и проигнорирует парен.
источник
Javascript (узел), 19 байтов, 2 кода выхода
Полная программа:
Функция:
process.argv
массив, содержащий путь к исполняемому файлу узла, путь к исполняемому файлу javascript и аргументы командной строки. В этом случае, это будет либо"1"
или"0"
. Строка конвертируется в число с унарным+
оператором. Если число равно нулю, ленивый&&
оператор не будет вычислять правую часть, если число истинно (не ноль), вычисляется правая часть и выдается&&
ошибка, потому что она ссылается на неопределенную переменную, и программа существует с кодом выхода 1.Функция ожидает ввод в виде числа. Если ввод верен, функция вызывает себя и завершает работу узла с переполнением стека. Если входное значение равно 0, ленивый
&&
оператор возвращает 0 без оценки правой части.источник
+process.argv[2]&&a
.ReferenceError.prototype.name=process.argv[2]?a:0
силе?Perl 6 , 57 байт, 256 кодов выхода
Попробуйте.
Это перевод примера Perl 5.
расширенный
источник
Scala, 19 байтов, 2 кода выхода
if(args(0)=="1")1/0
1/(args(0).toInt-1)
JVM поддерживает только 1 и 0 в качестве кодов выхода, если вы не звоните
System.exit
.Первая программа пытается вычислить, есть
1/0
ли первый аргумент1
, что приведет к сбою JVM с кодом выхода 1. Если аргумент равен 0, он успешно завершится.Вторая программа, которая преобразует аргумент в целое число, вычитает единицу и пытается разделить 1 на это число. Если аргумент, если 1, он вычисляет
1/0
, поэтому JVM потерпит крах; если аргумент равен 0, он вычисляет1/-1
и завершает работу.источник
Python 3 , 15 байт, 2 кода выхода
Очевидно, это длиннее, чем решение Python 2 , потому что в Python 3 мы не можем получить буквальный ввод без вызова
eval
. Тем не менее, мы можем использовать методы сравнения строк интересно ...Входными данными будут либо строка,
0
либо1
- если оно равно 1, условие оценивается как 0 (ложь), что приводит к попытке вычислить,1 / 0
что, очевидно, дает сбой (код выхода 1). В противном случае ничего не происходит, и Python завершается с обычным кодом выхода 0.Насколько я знаю, Python неспособен к сбоям с другими кодами выхода.
источник
Java,
7166 байт, 2 кода выхода4 байта сохранены благодаря Хольгеру
Полная программа:
Функция, принимающая int в качестве аргумента:
Программа получает первый символ первого аргумента (либо,
'0'
либо'1'
и вычитает 48 (значение ascii'0'
), чтобы получить целое число (0 или 1). Затем она пытается установить аргумент в позиции этого целого числа в пустую строку. входное значение равно 1, программа завершается сArrayIndexOutOfBoundsException
ошибкой, поскольку массив аргументов имеет только один элемент в позиции 0 (с нулевым индексом).источник
a[a[0].equals("1")?1/0:1]="";
, который находится на одном уровне сint x=a[0].equals("1")?1/0:1;
. Но изменяя программу дальше, провоцируемArrayIndexOutOfBoundsException
вместо того, чтобыArithmeticException
экономить несколько байтов:interface I{static void main(String[]a){a[a[0].charAt(0)-'0']="";}}
Python 2, 11 байт, 2 кода выхода
Три разных 11-байтовых решения для трех разных ошибок! (Просто для удовольствия, это не дает очков.) По умолчанию, Python имеет только коды выхода 0 для успешного выхода и 1 для ошибки. Успешные заезды ничего не выводят.
На входе 1 выдает «ValueError: отрицательный счетчик сдвига». На входе 0 отсчет нулевого сдвига завершается успешно и дает 1.
На входе 1 выдает «ZeroDivisionError: целочисленное деление или по модулю на ноль» из-за того
~-input()
, что он равенinput()-1
0. На входе 11/-1
выдает -1.0**-input()
также будет работать.На входе 1 выдает «NameError: имя 'x' не определено». На входе 0 это первое неравенство
0<0
оценивается как False, поэтому остальное не оценивается, а результат - просто False.источник
Node.js (ES6), 77 байт, 2 кода выхода
источник
Желе , 4 кода выхода, 18 байтов
Поддерживает коды выхода 0 , 1 , 137 (уничтожено) и 139 (ошибка сегментации).
Попробуйте онлайн!
Как это устроено
источник
SmileBASIC, 640 байт, 39 кодов выхода (из 52)
Это определенно можно сделать короче. SB имеет только коды ошибок от 0 до 51, и некоторые из них невозможно вызвать.
источник
ZX81 BASIC> 255 кодов выхода - 52 байта (листинг)
Технически, это
N
может быть любое 24-битное число с плавающей точкой в пределах диапазона, но мы будем предполагать здесь целые числа. Строка 2 эквивалентна,IF N>0 AND N <=255 THEN GOTO 3: ELSE GOTO 1
если бы ZX81 BASIC имелIF/ELSE
в своих символических инструкциях.источник
the program caused some fatal unintended exception
? Это просто распечатывает текст и заканчивает выполнение.RAND USR N
приведет к непреднамеренным последствиям, так как вызов части ПЗУ из неожиданного места не является хорошей идеей, поэтомуRAND USR 0
был исключен, поскольку это слишком изящно.LD BC, 0000 RST 10 RET
0x1000, но он вызывается,RAND USR 4097
то вы пропустите операнд LD, и поэтому машинный код будет искажен. Я не помню все вызовы ПЗУ, но я проработаю все законные / изящные концы и исключу их позже.