Код выхода Гольф


55

Вдохновленный этим по умолчанию для IO .

Задание

Напишите программу, которая при вводе целого числа xот 0 до 255 завершается с кодом завершения x.

ограничения

  • Вы не можете вызывать ничего, что предназначено непосредственно для вывода кода выхода ( System.exit(x)возврата из mainи т. Д.). Вместо этого ваша программа должна вызвать ошибку или сбой, который с вероятностью 1 приведет к выходу программы с входным целым числом.
    • В этом случае слова «ошибка» и «сбой» означают, что программа вызвала неустранимое непреднамеренное исключение, при котором метод, операция или иное значение использовались неправильно, что привело к необратимому отказу.
    • Вы не можете напрямую вызвать ошибку, выбрасывая ее напрямую. Вы должны вызвать это, используя метод, функцию или иным образом, чье назначение служит другой функции (т. Е. Попытка выполнить запись файла в каталог только для чтения).
  • В вашей программе должно быть не менее двух кодов выхода.
  • Прекращение процесса с использованием сигналов запрещено. (Причины могут быть найдены в этом обсуждении )

счет

Оценка вашей программы определяется количеством поддерживаемых кодов выхода, где краткость кода является таймбрейкером. Победит наибольшее количество поддерживаемых кодов выхода!


Просто чтобы уточнить, если я выдвину ошибку, это незаконно, да?
Энтони Фам

@AnthonyPham Если вы напрямую поднимаете его ( throw new Exception()стиль), это незаконно. Если это побочный продукт неправильного использования существующей функции, то это нормально.
Эддисон Крамп

@VoteToClose Я думаю, я не достаточно ясно. Я согласен с вами, но предлагал, скажем, квадрат, а не факториал. Но что бы это ни имело значения, это было просто предложение
Малтысен

8
one zero zeroПриемлемо ли принимать ввод в виде прописных английских цифр (например, для 100)? У меня есть идея для этой задачи, но у языка есть несколько довольно необычных представлений о вводе / выводе, и это наиболее естественный формат ввода.

5
Я бы посчитал Exit Code Golfing заголовком с наживкой, хотя он и точный. <(° _ ° <)
RaisingAgent

Ответы:


48

Unix Shell (+ ncurses + утилиты BSD), 36, 26 байтов, 256 кодов выхода

Golfed

jot -bu0 $[252+$1]|tput -S

Если используется опция -S, tput проверяет наличие ошибок в каждой строке и, если обнаружены какие-либо ошибки, установит для кода выхода значение 4 плюс количество строк с ошибками. Если ошибок не найдено, код выхода равен 0. Указание того, какая строка не выполнена, не может быть указано, поэтому код выхода 1 никогда не появится. Коды выхода 2, 3 и 4 сохраняют свою обычную интерпретацию.

Когда код выхода tput превышает 255, он просто переполняется, поэтому 253 (ошибки при вводе) приведут к коду выхода 1 и т. Д., Таким образом, получая желаемое состояние выхода для всего диапазона входов.

Примечание : будет ли сбой tput при настройке / получении конкретной возможности, зависит от типа терминала, который я использовал:xterm with 256 colors

jot - это утилита BSD , которая печатает последовательные или случайные данные, и (AFAIK) также доступна из коробки в системах OSX.

Если вашей системы нет в jotналичии, вы можете использовать более длинную (29 байт) версию:

yes u0|sed $[252+$1]q|tput -S

Попробуйте онлайн! (версия 29 байтов)


Вау, это довольно хорошо. +1
Аддисон Крамп

45

Bash 4.2 + дополнения, 24 кода выхода

grep \#$1$ $0|sed 's:#.*::;s:T:tcc -run -<<<main=:;s:C:curl -L x.org/! :'|sh;exit
man#1
C-#2
C/#3
sed#4
C-x/#5
C_#6
C0#7
man /#16
C-f#22
C-o/#23
C-L3#35
C--capath /#60
C--max-filesize 1#63
C--cacert /#77
timeout 1e-9 w#124
/#126
-#127
T6\;#132
T204\;#133
$[2**63%-1]#136
{0..1000000000}#137
T0\;#139
exit _#255

Спасибо @ KenY-N за 3 кода выхода. Спасибо @ el.pescado за 1 код выхода.

верификация

Все тесты были выполнены на openSUSE 13.2.

$ for n in {0..255}; do bash exit.sh $n; (($? == $n)) && echo $n >&0; done &> /dev/null
0
1
2
3
4
6
7
16
22
23
35
60
63
77
124
126
127
132
133
136
137
139
255

1
Код выхода 5:http_proxy=fafa curl http://example.org
el.pescado

1
@ el.pescado Это заняло у меня больше года, но я наконец-то реализовал ваше предложение. Спасибо!
Деннис

30

INTERCAL (C-INTERCAL), 15 кодов, 313 + 2 = 315 байт

        PLEASE WRITE IN .1
(8)     PLEASE CREATE .1 A
        PLEASE A
        PLEASE COME FROM #2$!1/#1'

        DO X
(123)   DO (123) NEXT
        DO COME FROM (222)
(222)   DO STASH .2
(240)   DO ,1 <- #0
(241)   DO ,1 SUB #0 <- #1
(19)    DO .2 <- #256 $ #0
(21)    DO .1 <- #2
(148)   DO GO BACK
(180)   DO RETRIEVE .2
        DO COME FROM (50)
(50)    DO WRITE IN .2
(109)   DO RESUME #0
(120)   DO RESUME #9
        MAYBE COME FROM (223)
(223)   DO COME FROM (223)
(121)   PLEASE NOT X

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

Все пробелы здесь не имеют значения. (Оригинальная программа содержала вкладки, но я преобразовал их в пробелы, чтобы они правильно совмещались в 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. Поэтому мне не пришлось писать какой-либо код, чтобы покрыть этот случай вообще.

Вот другие ошибки и причины их возникновения:

  • 123 - NEXTпереполнение стека ( DO (123) NEXT). NEXTУтверждение нуждается в других модификаторов ( FORGETили RESUME) для того , чтобы задним числом определить , какого рода заявление управления было. Отсутствие этих причин приводит к ошибке ICL123I, если имеется 80 неразрешенных операторов `NEXT '.
  • 222 - переполнение тайника ( DO STASH .2в COME FROMцикле). Тайники ограничены только доступной памятью, но это в конечном счете закончится, вызывая ошибку ICL222I.
  • 240 - это размеры массива до нулевого размера. Это именно то, что DO ,1 <- #0означает, и это вызывает ошибку ICL240I.
  • 241 вызвано присваиванием за пределы массива. В этом случае ,1он не был выделен ( ,используется для переменных типа массива в INTERCAL), поэтому его индексация вызывает ошибку ICL241I.
  • 19 присваивает 65536 ( #256 $ #0) 16-битной переменной .2. Это не подходит, вызывая ошибку ICL275I.
  • 21 правопреемников #2в .1. Это может выглядеть как достаточно простое назначение, но мы перегружены, .1чтобы означать #1ранее, и попытка изменить значение 1 без -vпараметра в командной строке вызывает ошибку ICL277I.
  • 148 пытается вернуться к верхнему элементу стека выбора точек ( GO BACK), которого нет в данный момент в программе (мы не выполнили никаких команд для управления стеком точек выбора, поэтому он все еще пуст). Это вызывает ошибку ICL404I.
  • 180 попыток RETRIEVE .2из несуществующего хранилища (потому что мы ничего не хранили там в этой ветке программы), вызывая ошибку ICL436I.
  • 50 запросов input ( WRITE IN) навсегда в COME FROMцикле. В конечном итоге мы закончим чтение EOF, что приведет к ошибке ICL562I.
  • 109 выполняет оператор DO RESUME #0, который не имеет смысла и специально задокументирован как вызывающий ошибку (ICL621I).
  • 120 запускает заявление DO RESUME #9. Мы еще не NEXTвыполнили так много операторов, и поэтому получаем ошибку ICL120I. (Интересно, что эта конкретная ошибка определена в документации INTERCAL как выход из программы в нормальном режиме, а затем вызывает ошибку, а не выход из программы с ошибкой. Однако я не верю, что эти два случая заметно различаются.)
  • 223 представляет собой сложный клубок многопоточных примитивов, которые все указывают на строку 223, вызывая бесконечный цикл, который взрывает память. В конце концов, в многопоточной подсистеме происходит исчерпание памяти, что приводит к ошибке ICL991I.
  • 121 на самом деле является действительным утверждением (это комментарий), но он появляется в конце программы. Таким образом, выполнение программы прекращается сразу же после ее запуска, вызывая ошибку ICL633I.

верификация

Некоторые из ошибок связаны с преднамеренным запуском программы из памяти, поэтому я предлагаю установить довольно небольшие ограничения памяти. Вот команда оболочки, которую я использовал для тестирования программы (с добавлением новых строк для удобства чтения; удалите их, если вы запустите ее самостоятельно):

for x in "ZERO" "ONE NINE" "TWO ONE" "FIVE ZERO" "ONE ZERO NINE"
         "ONE TWO ZERO" "ONE TWO ONE" "ONE TWO THREE" "ONE TWO NINE"
         "ONE FOUR EIGHT" "ONE EIGHT ZERO" "TWO TWO TWO"
         "TWO TWO THREE" "TWO FOUR ZERO" "TWO FOUR ONE";
do  echo;
    echo $x;
    echo $x | (ulimit -Sd 40000; ulimit -Sv 40000; ulimit -Ss 40000;
               ./errors; echo $?);
done

А вот вывод (с номерами строк и сообщениями «PLEASE CORRECT SOURCE», удаленными для экономии места), которые я добавил частично для демонстрации работы программы, но в основном для демонстрации глупых сообщений об ошибках INTERCAL:

ZERO
ICL000I PLEASEWRITEIN.1(8)PLEASECREATE.1APLEASEAPLEASECOMEFROM#2$!1/#1'DOX(123)DO(123)NEXTDOCOMEFROM(222)(222)DOSTASH.2(240)DO,1<-#0(241)DO,1SUB#0<-#1(19)DO.2<-#256$#0(21)DO.1<-#2(148)DOGOBACK(180)DORETRIEVE.2DOCOMEFROM(50)(50)DOWRITEIN.2(109)DORESUME#0(120)DORESUME#9MAYBECOMEFROM(223)(223)DOCOMEFROM(223)(121)PLEASENOTX
0

ONE NINE
ICL275I DON'T BYTE OFF MORE THAN YOU CAN CHEW
19

TWO ONE
ICL277I YOU CAN ONLY DISTORT THE LAWS OF MATHEMATICS SO FAR
21

FIVE ZERO
ICL562I I DO NOT COMPUTE
50

ONE ZERO NINE
ICL621I ERROR TYPE 621 ENCOUNTERED
109

ONE TWO ZERO
ICL632I THE NEXT STACK RUPTURES.  ALL DIE.  OH, THE EMBARRASSMENT!
120

ONE TWO ONE
ICL633I PROGRAM FELL OFF THE EDGE
121

ONE TWO THREE
ICL123I PROGRAM HAS DISAPPEARED INTO THE BLACK LAGOON
123

ONE TWO NINE
ICL129I PROGRAM HAS GOTTEN LOST
129

ONE FOUR EIGHT
ICL404I I'M ALL OUT OF CHOICES!
148

ONE EIGHT ZERO
ICL436I THROW STICK BEFORE RETRIEVING!
180

TWO TWO TWO
ICL222I BUMMER, DUDE!
222

TWO TWO THREE
ICL991I YOU HAVE TOO MUCH ROPE TO HANG YOURSELF
223

TWO FOUR ZERO
ICL240I ERROR HANDLER PRINTED SNIDE REMARK
240

TWO FOUR ONE
ICL241I VARIABLES MAY NOT BE STORED IN WEST HYPERSPACE
241

4
Возможно, это самая лучшая программа INTERCAL, которую я когда-либо видел.
Скайлер

27

Perl, 108 байт, 256 кодов выхода

Эта программа (ab) использует модуль Test :: More . Он пытается открыть файл с именем "" n раз, где n задано в качестве аргумента командной строки. Каждый раз происходит сбой, и каждый вызов рассматривается как тест. Test :: More возвращает количество неудачных тестов в качестве кода выхода. plan tests => $ARGV[0]%255необходим для получения кода выхода 255.

#!/usr/bin/perl
use Test::More;
plan tests => $ARGV[0]%255 if($ARGV[0]>0);
ok(open(F,"")) for (1..$ARGV[0])

Гольф: perl -MTest::More -e'plan tests,$%%255if$%=<>;ok 0for 1..$%'51 байт (38 байт + 13 байт -MTest::More<space>). Принимает вход на стандартный ввод.
ThisSuitIsBlackNot

27

C90 (gcc), 256 кодов выхода, 28 27 18 байтов

main(){getchar();}

Я не уверен , если это умный или cheaty, но я не думаю , что он нарушает правила , как написано: это технически не используется exit, returnили любая ошибка метания механизм, а просто опирается на неопределенное поведение , и тот факт , что ССАГПЗ делает что-то довольно удобное, насколько этот вызов идет.

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

Как это устроено

Это просто использует getcharдля чтения одного байта из STDIN. Само по себе это ничего не делает.

Однако, совместимая программа C90 должна заканчиваться returnоператором или чем-то эквивалентным; все остальное - неопределенное поведение. gcc в retлюбом случае завершает сгенерированную сборку , поэтому любое значение, которое было случайно в регистре EAX, будет возвращено программой. К счастью, glibc getcharхранит байт, который он читает из STDIN в EAX, поэтому значение этого байта является кодом выхода нашей программы.


Было бы интересно посмотреть, можно ли это изменить, чтобы преодолеть 8-битный барьер, используя оболочку типа jsh , которая поддерживает set -o fullexitcode.
Цеппелин

1
Это умно. Но тогда программа на самом деле не падает. Он возвращает нормально, является ли спецификация «причиной фатального исключения / необратимого сбоя / сбоя»
dim

В любом случае, это круто.
Квентин

4
@ Я думаю, это зависит от твоего определения крушения. Не конец main с returnили exitявляется ошибкой, поскольку стандарт C90 идет, и это приводит к коду выхода, который указывает на сбой. Это все, что крах делает в глубине души.
Деннис

Авария - это остановка программы для правильной работы. Ваша программа делает все, что вы сказали, чтобы она делала правильно, она читает один символ из ввода и затем останавливается. Таким образом, несмотря на то, что код выхода указывает на ошибку, она не вылетала.
findusl

19

C (gcc) под оболочкой bash на x86, 230 байтов, 8 кодов выхода

Добавлены новые строки для удобства чтения. Комментарии игнорируются в баллах.

main(int c, char **v){
int p[2];
switch(atoi(v[1])-128){
case 2:__asm("UD2");        /* SIGILL: x86 undefined instruction */
case 5:__asm("int $3");     /* SIGTRAP: x86 breakpoint instruction */
case 6:abort();             /* SIGABRT: raise() is called under the covers */
case 8:c/=c-2;              /* SIGFPE: divide by 0 (c-2) */
case 11:c=*(int *)c;        /* SIGSEGV: dereference of invalid pointer */
                            /* SIGPIPE: write() to a pipe closed at the other end */
case 13:socketpair(1,1,0,p);close(p[1]);write(p[0],v,1);
case 14:alarm(1);sleep(2);  /* SIGALRM: kernel will send alarm signal after 1 sec */
}
}

Особенность оболочки bash:

Когда команда завершается с фатальным сигналом N, bash использует значение 128 + N в качестве состояния выхода.

Таким образом, все, что нам нужно сделать, это запустить различные сигналы из программы переменного тока. На данный момент, я предполагаю, что просто делать kill(n-128);запрещено. Поэтому вместо этого мы выполняем код, который запускает различные сигналы, что делает соответствующие коды ошибок доступными в вызывающей оболочке.

Коды выхода: 0, 130, 133, 134, 136, 139, 141, 142.

Попробуйте онлайн . Разверните раздел «Отладка», чтобы увидеть код возврата.

Это, конечно, может быть в гольф глубже. Но я бы больше интересовался добавлением большего количества сигналов.


Буду ли я прав, предполагая, что сигналы вызываются вне вашего кода ранее существовавшими функциями или операциями?
Эддисон Крамп

1
@VoteToЗакрыть да, все верно. Например, __asm("UD2")запускает x86 «неопределенную инструкцию», которая вызовет исключение ЦП, которое будет передано ядром программе в виде сигнала SIGILL. Для socketpairпримера, SIGPIPE будет послан ядром или Glibc , как мы пытаемся write()к трубе , которая была close()D на другом конце.
Цифровая травма

1
Тогда у меня нет проблем с этим. : P
Эддисон Крамп

1
Вы можете сыграть в гольф 1) два символа, если вы используете, int3а не int $32) один символ, если вы объявляете vкак int**, учитывая, что вы в основном не полагаетесь на char-ность типа данных в вашей арифметике указателей, плюс 3) два символа, если вы используете *pвместо p[0], или 4) шесть символов, если вы готовы полагаться на предсказуемые fdчисла возвращаемых всех системных вызовов , которые создают их, и заменить p[0]и p[1]их вблизи определенных значений. Наконец, pipe(fd)намного короче socketpair(...)и генерирует ту же ошибку при закрытии fd[0]и записи в. fd[1],
Иваннотексист Идонотексист

2
Несколько дополнительных предложений для игры в гольф: 1) Используйте &63вместо -128. 2) Заменить sleep(2)на for(;;). 3) Заменить c=*(int*)cна atoi(0). 4) Заменить c/=c-2на c/=0.
nwellnhof

10

Python 2, 13 байт, 2 кода выхода

1/(input()-1)

Если вы введете 0, он попытается вывести, 1/-1что -1, что совершенно нормально, то есть код выхода 0. Если вы введете 1, вы получите, 1/0который вызывает a, ZeroDivisionErrorв котором есть код выхода 1. В моей IDE есть только 0 и 1 для кодов выхода ...

Выходы:


введите описание изображения здесь


введите описание изображения здесь


10

PHP, 15 байтов, 2 кода выхода

Без die/ exitPHP не может ничего возвратить, кроме 0или 255(afaik; вероятно ~1), так что ...

!$argv[1]?:p();

Если аргумент командной строки ложный, он оценивается 1и завершается с 0. Если нет, он пытается вызвать функцию и завершается с <b>Fatal error</b>: Uncaught Error: Call to undefined function p().

Беги с -r.


5
Это не правда. exit()устанавливает статус выхода ... который вы не можете использовать для этого вызова, предоставляется. Но ваш код также недействителен. Она устанавливает статус выхода до 255
aross

@aross: Хм, я всегда предполагал, что ошибка завершится с 1. Я искал список кодов выхода, но не смог его найти.
Тит

10

Excel VBA, 414 514 533 + 3 байта, 14 кодов выхода

Принимает входной сигнал , как Conditional Compilation Argument, n=[input value]и выдает ассоциированный код ошибки для номера.

Sub e()
Dim a As Application, b As Byte, s As String, v(), x
Set a=Application
#If n=3 Then
Return
#ElseIf n=5 Then
b=a.CommandBars("")
#ElseIf n=6 Then
b=2^8
#ElseIf n=7 Then
ReDim v(9^9)
#ElseIf n=9 Then
v=Sheets("")
#ElseIf n=10 Then
v=Array(1)
For Each x In v
ReDim v(9)
Next
#ElseIf n=11 Then
b=1/0
#ElseIf n=13 Then
Debug.?Int("X")
#ElseIf n=14 Then
Debug.?String(9E8,1)
#ElseIf n=20 Then
Resume
#ElseIf n=28 Then
f 256
#ElseIf n=35 Then
Call c
#ElseIf n=92 Then
For Each x In v
ReDim v(9)
Next
#ElseIf n=94 Then
b=Null
#End If
End Sub

Sub f(n):DoEvents:f n-1:End Sub

+3 за n=[Value]вызов условной компиляции

Обрабатывает входы где n=

3
5
6
7
9
10
11
13
14
20
28
35
92
94    

Примечание: VBA не имеет кодов выхода 0или 1. Я включил решения для 3и 5, которые являются двумя кодами выхода с наименьшим номером, доступными VBA вместо них.


1
Я не буду запрещать этот ответ, потому что для меня это синоним запрета из-за языковых возможностей для типов вывода.
Эддисон Крамп

1
Что #здесь делать?
Брюс Уэйн

Операторы условной компиляции #ifи #ElseIfявляются условием, означающим, что следующие за ним операторы компилируются только в том случае, если условие истинно
Тейлор Скотт

1
Итак, если они не соответствуют действительности, операторы не компилируются ... это отличается от того, что не используется #, где они будут компилироваться независимо от того, являются ли операторы истинными? Я знаю, как Ifработают операторы, но я плохо знаком с тем, что на самом деле компилируется , так что извините за такой простой вопрос.
Брюс Уэйн

1
@BruceWayne, да, это именно так. Поскольку эти строки предназначены для выдачи определенных ошибок, необходимо, чтобы в определенный момент времени компилировались только строки, которые выдают желаемый код ошибки. Для этого #ifиспользуется вместо Ifили Select Caseкак truthyфактически скомпилированы только условные операторы. В этом случае в частности, это удерживает программу от выхода с кодом ошибки 3, Return without GoSubпри каждом исполнении, а только выход с этим кодом , когдаn=3
Тейлор Скотт

7

Turtlèd, 4 байта, 2 кода выхода

Я не знаю, есть ли какие-нибудь способы получить больше кодов выхода ... есть ли еще какие-то способы на языке переводчика

Я нашел несколько четырех длинных ответов

' ?;

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

!.(0

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

?;(*

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

Как это работает:

' ?;

в моем переводчике, есть ошибка функция , которая не приводит к ошибкам , когда сетка в памяти имеет более чем одну строки, и имеет никаких символов без пробелов на нем. эта программа стирает * в исходной ячейке '[space], принимает неотрицательное целочисленное значение ?(на самом деле 0 или 1) и сдвигает это число на много ;, если оно равно нулю, у сетки будет только одна строка, а не ошибка, иначе она сместится вниз и ошибка произойдет

!.(0

Скобки и прочее не анализируются, они просто выполняются во время выполнения, что означает: «переходить к соответствующему парену, если символ ячейки не верен». в этой программе, inputting ( !) заставляет программу записать ее в ячейку ( .), выполнить paren, которая проверяет, равен ли символ ячейки 0, попытаться перейти к соответствующей paren, но вместо этого выдать ошибку, поскольку ее нет , если он равен нулю, он записывает его, проверяет круглые скобки, находит себя в 0, а затем игнорирует его, и программа завершает работу

?;(*

имеет элементы предыдущего ответа и первого. он принимает неотрицательный целочисленный ввод, сдвигает это число вниз и проверяет, является ли ячейка '*', в поисках несуществующей дополнительной пары, если это не так. если ввод равен 1, он переместится за пределы начального пространства и обнаружит, что ячейка является пробелом, а ошибка, если он равен нулю, останется в начальном пространстве и проигнорирует парен.


7

Javascript (узел), 19 байтов, 2 кода выхода

Полная программа:

+process.argv[2]&&a

Функция:

f=i=>i&&f(i)

process.argvмассив, содержащий путь к исполняемому файлу узла, путь к исполняемому файлу javascript и аргументы командной строки. В этом случае, это будет либо "1"или "0". Строка конвертируется в число с унарным +оператором. Если число равно нулю, ленивый &&оператор не будет вычислять правую часть, если число истинно (не ноль), вычисляется правая часть и выдается &&ошибка, потому что она ссылается на неопределенную переменную, и программа существует с кодом выхода 1.

Функция ожидает ввод в виде числа. Если ввод верен, функция вызывает себя и завершает работу узла с переполнением стека. Если входное значение равно 0, ленивый &&оператор возвращает 0 без оценки правой части.


@VoteToClose Изменил его на неопределенную переменную
corvus_192

Это работает. : P
Эддисон Крамп

Полная программа может быть сокращена до +process.argv[2]&&a.
user2428118

@ user2428118 Вы правы
corvus_192

Просто из любопытства, будет в ReferenceError.prototype.name=process.argv[2]?a:0силе?
Патрик Робертс

6

Perl 6 , 57 байт, 256 кодов выхода

use Test;plan $_=@*ARGS[0];ok try {open ""} for ^($_%255)

Попробуйте.
Это перевод примера Perl 5.

расширенный

use Test;  # bring in 「plan」 and 「ok」

plan $_ = @*ARGS[0]; # plan on having the input number of tests
                     # only actually needed for the 255 case
                     # if the plan is greater than the number of tests
                     # it fails with exitcode 255


  ok                 # increment the failure counter if the following is False
    try {            # don't let this kill the whole program
      open ""        # fails to open a file
    }

for                  # repeatedly do that

  ^(                 # upto Range
    $_ % 255         # either the input number of times, or 0 times for 255
  )

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и завершает работу.


5

Python 3 , 15 байт, 2 кода выхода

Очевидно, это длиннее, чем решение Python 2 , потому что в Python 3 мы не можем получить буквальный ввод без вызова eval. Тем не менее, мы можем использовать методы сравнения строк интересно ...

1/(input()<'1')

Входными данными будут либо строка, 0либо 1- если оно равно 1, условие оценивается как 0 (ложь), что приводит к попытке вычислить, 1 / 0что, очевидно, дает сбой (код выхода 1). В противном случае ничего не происходит, и Python завершается с обычным кодом выхода 0.

Насколько я знаю, Python неспособен к сбоям с другими кодами выхода.


5

Java, 71 66 байт, 2 кода выхода

4 байта сохранены благодаря Хольгеру

Полная программа:

interface I{static void main(String[]a){a[a[0].charAt(0)-48]="";}}

Функция, принимающая int в качестве аргумента:

i->1/(i-1)

Программа получает первый символ первого аргумента (либо, '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']="";}}
Хольгер

4

Python 2, 11 байт, 2 кода выхода

1>>-input()
1/~-input()
0<input()<x

Три разных 11-байтовых решения для трех разных ошибок! (Просто для удовольствия, это не дает очков.) По умолчанию, Python имеет только коды выхода 0 для успешного выхода и 1 для ошибки. Успешные заезды ничего не выводят.

 1>>-input()

На входе 1 выдает «ValueError: отрицательный счетчик сдвига». На входе 0 отсчет нулевого сдвига завершается успешно и дает 1.

1/~-input()

На входе 1 выдает «ZeroDivisionError: целочисленное деление или по модулю на ноль» из-за того ~-input(), что он равен input()-10. На входе 1 1/-1выдает -1. 0**-input()также будет работать.

0<input()<x

На входе 1 выдает «NameError: имя 'x' не определено». На входе 0 это первое неравенство 0<0оценивается как False, поэтому остальное не оценивается, а результат - просто False.


2

Node.js (ES6), 77 байт, 2 кода выхода

require('readline').createInterface({input:process.stdin}).prompt("",i=>i&&x)

2

Желе , 4 кода выхода, 18 байтов

߀
2*
Ṁ¹Ŀ
RÇĿỌḊ?R

Поддерживает коды выхода 0 , 1 , 137 (уничтожено) и 139 (ошибка сегментации).

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

Как это устроено

RÇĿỌḊ?R  Main link. Argument: n (integer)

R        Range; yield [1, ..., n] if n > 1 or [] if n = 0.
    Ḋ?   If the dequeued range, i.e., [2, ..., n] is non-empty:
 Ç         Call the third helper link.
  Ŀ        Execute the k-th helper link, where k is the the integer returned by Ç.
         Else, i.e., if n is 0 or 1:
   Ọ       Unordinal; yield [] for n = 0 and "\x01" for n = 1.
      R  Range. This maps [] to [] and causes and error (exit code 1) for "\x01".


Ṁ¹Ŀ      Third helper link. Argument: r (range)

Ṁ        Maximum; retrieve n from r = [1, ..., n].
 ¹Ŀ      Call the n-th helper link (modular).
         When n = 139, since 139 % 3 = 1, this calls the first helper link.
         When n = 137, since 137 % 3 = 2, this calls the second helper link.


2*       Second helper link. Argument: k

2*       Return 2**k.
         Since 2**137 % 3 = 174224571863520493293247799005065324265472 % 3 = 2,
         ÇĿ in the main link will once again call the second helper link.
         Trying to compute 2**2**137, a 174224571863520493293247799005065324265472-
         bit number, will get the program killed for excessive memory usage.


߀       First helper link. Argument: k

߀       Recursively map the first helper link over [1, ..., k].
         This creates infinite recursion. Due to Jelly's high recursion limit,
         a segmentation fault will be triggered.

2

SmileBASIC, 640 байт, 39 кодов выхода (из 52)

SPSET.,0INPUT C$GOTO"@"+C$@0
STOP@3
A
@4
CLS.@5@A
GOSUB@A@7?1/A@8
X$=3@9
A%=POW(2,31)@10
BEEP-1@11
DIM B[#ZL*#R]@13
READ A
@15
V"OPTION STRICT?X
@16
CALL@D@17
V@A*2
@18
V"VAR A,A
@19
V"DEF A:END:DEF A
@20
V"FOR I=0TO
@21
V"NEXT
@22
V"REPEAT
@23
V"UNTIL
@24
V"WHILE.
@25
V"WEND
@26
V"IF.THEN
@27
V"IF.THEN"+CHR$(10)+"ELSE
@28
V"ENDIF
@29
V"DEF X
@30
RETURN@31
DIM E[-1]@32
V"DEF A:DEF
@34
GOTO"|
@36
XOFF MIC
MICSTOP
@37
XOFF MOTION
GYROSYNC
@38
PRGDEL
@39
DIM F[66]SPANIM.,1,F
@40
DIM G[2]SPANIM.,1,G
@42
MPSTART 2,@A@L
MPSEND"A"GOTO@L@44
PROJECT
@46
USE"PRG1:A
@47
BGMPLAY"`
@48
X=
@51
DLCOPEN"
DEF V C
PRGEDIT 1PRGDEL-1PRGSET C
EXEC 1
END

Это определенно можно сделать короче. SB имеет только коды ошибок от 0 до 51, и некоторые из них невозможно вызвать.


0

ZX81 BASIC> 255 кодов выхода - 52 байта (листинг)

1 INPUT N
2 GOTO 1+(2*(N>0 AND N <=255))
3 PRINT "EXIT CODE ";N
4 RAND USR N

Технически, это Nможет быть любое 24-битное число с плавающей точкой в ​​пределах диапазона, но мы будем предполагать здесь целые числа. Строка 2 эквивалентна, IF N>0 AND N <=255 THEN GOTO 3: ELSE GOTO 1если бы ZX81 BASIC имел IF/ELSEв своих символических инструкциях.


3
Как это удовлетворяет the program caused some fatal unintended exception? Это просто распечатывает текст и заканчивает выполнение.
AdmBorkBork

Вы правы - мне нужно больше просыпаться по утрам.
Шон Бебберс,

RAND USR Nприведет к непреднамеренным последствиям, так как вызов части ПЗУ из неожиданного места не является хорошей идеей, поэтому RAND USR 0был исключен, поскольку это слишком изящно.
Шон Бебберс

Не могли бы вы подробнее рассказать о том, как это на самом деле вызывает сбой программы? Я не очень хорошо знаком с ZX81 BASIC.
AdmBorkBork

ROM находится в диапазоне от 0x0000 до 0x1fff; вызов программ ПЗУ будет работать, если вы начнете в нужном месте. Запуск одного или нескольких байтов в любой подпрограмме машинного кода в Z80 вызовет неожиданные эффекты. Если у вас есть простой номер LD BC, 0000 RST 10 RET0x1000, но он вызывается, RAND USR 4097то вы пропустите операнд LD, и поэтому машинный код будет искажен. Я не помню все вызовы ПЗУ, но я проработаю все законные / изящные концы и исключу их позже.
Шон Бебберс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.