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
Bash 4.2 + дополнения, 24 кода выхода
Спасибо @KenY-N за 3 кода выхода. Спасибо @el.pescado за 1 код выхода.
Проверка
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.
||answer||
Все тесты проводились на openSUSE 13.2.
߀
2*
Ṁ¹Ŀ
RÇĿỌḊ?R
ИНТЕРКАЛ (C-INTERCAL), 15 кодов, 313+2=315 байт
Попробуйте онлайн! Все
пробелы здесь не имеют значения. (Исходная программа содержала табуляции, но я преобразовал их в пробелы, чтобы они правильно выстраивались в SE; для INTERCAL принято использовать ширину табуляции 8. Я тестировал версию программы со всеми табуляциями и пробелами. , а новые строки удалены, и все работает нормально.) require('readline').createInterface({input:process.stdin}).prompt("",i=>i&&x)
(2 byte penalty, because 0<0
Скомпилировать с
требуется, чтобы компилятор был детерминированным). 0<input()<x
for 0**-input()
.
Как обычно для INTERCAL, это требует числового ввода в формате, например,
Объяснение
Когда программа C-INTERCAL выдает ошибку, статусом выхода является код ошибки по модулю 256. В результате мы можем попытаться написать программу, способную выдавать как можно больше ошибок во время выполнения. В этой программе отсутствуют только две ошибки времени выполнения, которые не указывают на внутренние проблемы компилятора: ICL200I, поскольку для ее воспроизведения требуется использование внешних библиотек, совместимых только с однопоточной программой (а в многопоточных программах доступно больше ошибок); и ICL533I, потому что 533 имеет то же значение по модулю 256, что и 277, и программа способна выдавать ICL277I. 1/-1
) a value for the variable input()-1
Программа всегда запускается одинаково. Сначала мы вводим ( ~-input()
statement to create new syntax (here, 1/~-input()
. Затем мы используем вычисленный 1>>-input()
. Finally, in most cases we run our new 1>>-input()
1/~-input()
0<input()<x
); но поскольку он вычисляется, определение синтаксиса варьируется в зависимости от значения
оператор, который был определен как вызывающий ошибку; имеющаяся у нас таблица возможных определений содержит определения для каждой возможной ошибки времени выполнения (кроме исключений, перечисленных выше). ArrayIndexOutOfBoundsException
is not a valid line number, so if the user inputs '0'
Во-первых, из этой общей схемы есть два исключения. '1'
) to the fourth line by means of a computed '0'
, прыгаем со второй строки (с номером i->1/(i-1)
, which produces error interface I{static void main(String[]a){a[a[0].charAt(0)-48]="";}}
заявление. Затем это приводит к синтаксической ошибке 1 / 0
statement also has a side effect, even if no actual 1
. (В INTERCAL синтаксические ошибки случаются во время выполнения из-за тенденции отключения команд, переопределения синтаксиса под вас и т. д.). 0
to 1/(input()<'1')
происходит, создавая перегрузку операнда из
всякий раз, когда выполняется строка с номером строки; это используется позже при создании результата 21. (Случайные глобальные побочные эффекты довольно идиоматичны в INTERCAL.) eval
. There's no line number 1/-1
Другое исключение связано с вводом 1/0
. So I didn't have to write any code to cover that case at all.
в программе, поэтому мы получаем ошибку из-за отсутствующего номера строки, что
- 123 Вот другие ошибки и их причины:
1
stack overflow ( 1/0
это System.exit
statement needs other modifiers ( 1/(args(0).toInt-1)
). if(args(0)=="1")1/0
) in order to retroactively determine what sort of control statement it was. Not having those causes error ICL123I once there are 80 unresolved `NEXT statements.
- 222 или
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
)
in a use Test;plan $_=@*ARGS[0];ok try {open ""} for ^($_%255)
это переполнение тайника (
- 240 петля). Тайники ограничены только доступной памятью, но со временем она закончится, что приведет к ошибке ICL222I.
&&
means, and it causes error ICL240I.
- 241 измеряет массив до нулевого размера. Это именно то, что
&&
hasn't been allocated ( &&
вызвано присвоением за пределами массива. В этом случае,
- 19 используется для переменных типа массива в INTERCAL), поэтому его индексирование вызывает ошибку ICL241I.
+
) to a 16-bit variable "0"
присваивает 65536 (
- 21 . Он не подходит, вызывая ошибку ICL275I.
"1"
to process.argv
назначает f=i=>i&&f(i)
to mean +process.argv[2]&&a
. Это может показаться достаточно простым заданием, но мы перегрузили ?;(*
option on the command line causes error ICL277I.
- 148 ранее и пытаясь изменить значение 1 без
.
), which doesn't exist at this point in the program (we haven't run any commands to manipulate the choicepoint stack, so it's still empty). That causes error ICL404I.
- 180 пытается вернуться к верхней записи стека точек выбора (
!
from a nonexistent stash (because we didn't stash anything there in this branch of the program), causing error ICL436I.
- 50 попытки
!.(0
) forever in a ;
запрашивает ввод (
- 109 петля. В конце концов мы закончим чтение после EOF, что приведет к ошибке ICL562I.
?
, which is meaningless and specifically documented as causing an error (ICL621I).
- 120 запускает оператор
'[space]
. We haven't run that many ' ?;
запускает оператор
- 223 операторов еще нет, и поэтому мы получаем ошибку ICL120I. (Интересно, что эта конкретная ошибка определяется в документации INTERCAL как обычный выход из программы с последующей причиной ошибки, а не как выход из программы с ошибкой. Однако я не верю, что эти два случая заметно различаются.)
- 121 По сути, это сложная путаница примитивов многопоточности, все из которых указывают на строку 223, вызывая бесконечный цикл, который приводит к взрыву памяти. В конечном итоге в подсистеме многопоточности возникает нехватка памяти, что приводит к ошибке ICL991I.
на самом деле это допустимый оператор (это комментарий), но он появляется в конце программы. Таким образом, выполнение прерывается в конце программы сразу после ее выполнения, что приводит к ошибке ICL633I.
Некоторые ошибки связаны с намеренным запуском программы из-за нехватки памяти, поэтому я предлагаю установить довольно небольшие ограничения памяти. Вот команда оболочки, которую я использовал для тестирования программы (с добавлением новых строк для удобства чтения; удалите их, если запустите ее самостоятельно):
?;(*
А вот результат (номера строк и сообщения «ПОЖАЛУЙСТА ИСПРАВИТЕ ИСТОЧНИК» удалены для экономии места), который я добавил отчасти для того, чтобы продемонстрировать работу программы, но в основном для того, чтобы продемонстрировать глупые сообщения об ошибках INTERCAL:
!.(0
||answer||
C90 (gcc), 256 кодов выхода, 28 27 18 байт
' ?;
Я не уверен, умно это или обманчиво, но я не думаю, что это нарушает написанные правила: технически это не использует 5
, 3
или любой другой механизм выдачи ошибок, а просто полагается на неопределенное поведение и тот факт, что gcc делает что-то довольно удобное в этой задаче.
Попробуйте онлайн!
Как это работает
Это просто использует 1
to read one byte from STDIN. By itself, this does nothing.
Однако программа, совместимая с C90, должна заканчиваться 0
statement or something equivalent; everything else is undefined behavior. gcc ends the generated assembly with a 3
5
6
7
9
10
11
13
14
20
28
35
92
94
в любом случае, любое значение, случайно находившееся в регистре EAX, будет возвращено программой. К счастью, glibc n=
stores the byte it reads from STDIN in EAX, so the value of that byte is the exit code of our program.