Кратчайшая программа, которая выдает ошибку StackOverflow [закрыто]


75

Напишите программу, которая выдает ошибку StackOverflow или эквивалентную информацию на используемом языке. Например, в java программа должна скинуть java.lang.StackOverflowError.

Вам не разрешено определять функцию, которая вызывает себя или новый класс (кроме той, что содержится mainв Java). Следует использовать классы выбранного языка программирования.

И это не должно бросать ошибку явно.


4
Я не понимаю, "использовать классы выбранного языка программирования"
Принц Джон Уэсли

3
Это нормально, чтобы определить функцию, которая вызывает внутреннюю функцию, как это def s{def t=s;t}?
Принц Джон Уэсли

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

1
Самое смешное в том, что языки, которые требуют устранения хвостовой рекурсии (и реализации, которые поддерживают ее, когда языки этого не требуют) - что в очень хорошем смысле этого слова - находятся в невыгодном положении по этому поводу. Ответ TwiNight ссылается на версию этого, которая существует в переполнении стека с первых дней.
dmckee

1
Из документа Java: создается, когда переполнение стека происходит из-за слишком глубокого повторения приложения. docs.oracle.com/javase/6/docs/api/java/lang/…
jsedano

Ответы:


90

Befunge, 1

Я не знаю Befunge, но ...

1

из стека переполнения кода гольф


21
Объяснение: 1 - это числовой литерал, который помещается в стек при обнаружении. В Befunge поток управления вращается, пока не встретится, @чтобы завершить программу.
гистократ

6
Я не знал, что был такой вопрос на StackOverflow. Я искал только на этом сайте перед публикацией.
True Soft

31
Я слегка польщен, увидев мой ответ здесь.
Патрик

4
Это работает и в> <>.
Cruncher

49

Python (2.7.3), 35 символов

import sys
sys.setrecursionlimit(1)

Эта операция сама по себе успешна, но как RuntimeError: 'maximum recursion depth exceeded'следствие , и сценарий, и интерактив будут сразу же выброшены .

Вдохновлен ответом Эльссара.


Я подумал о том, чтобы вместо этого использовать это в качестве решения, но не был уверен, можно ли считать ошибку переполнением стека. Хотя, по сути, это то, что есть, верно?
Эльссар

2
@elssar: Я полагаю, что существует два способа переполнения стека: увеличить используемую часть стека или уменьшить неиспользуемую часть стека. Если вы представите, как ведро наполняется водой, вы можете переполнить его, добавив больше воды, но вы также можете переполнить его, сжимая ведро.

19

Coq

Compute 70000.

70000это просто синтаксический сахар для S (S ( ... (S O) ...))70000 S-х годов. Я думаю, что это проверка типов, которая вызывает переполнение стека.

Вот предупреждение, которое выводится перед выполнением команды:

Warning: Stack overflow or segmentation fault happens when working with large
numbers in nat (observed threshold may vary from 5000 to 70000 depending on
your system limits and on the command executed).

2
Это может заставить вас думать, что Coq - невероятно тупой язык ... забавный ...
перестал поворачиваться против часовой стрелки с

1
@leftaroundabout На самом деле нет. Тип Nat - это пиано-цифра уровня типа, которая должна действовать так, как если бы это был связанный список.
FUZxxl

1
@FUZxxl: мой комментарий вовсе не имел в виду иронию. Решите сами, хотите ли вы включить в это предложение классическую логику или предпочитаете оставаться конструктивным ...
перестал работать против часовой стрелки

2
@leftaroundabout Упс ... извините. Я забыл, что синтаксический анализатор уценки всегда ест те теги & lt; ирония & gt ;.
FUZxxl

19

Ява - 35

class S{static{new S();}{new S();}}

Разве ОП не сказал, что нет новых классов? Я не вижу public static void mainтам. Или я просто не понимаю Java?
Брэден Бест

4
@ B1KMusic Новых классов нет, есть только один класс (S). Код использует статический инициализатор, он выдает SO, прежде чем jvm обнаружит, что основного метода нет. Работает с Java 6.
Aditsu

1
Я понимаю статический блок. Но каков следующий блок?
Николас Барбулеско

1
@NicolasBarbulesco Это блок инициализатора, он выполняется при создании нового экземпляра.
aditsu

1
@LuigiCortese Я думаю, что это работает только с Java 6 или старше
aditsu

19

Javascript 24 символа

Ответ, зависящий от браузера (должен иметь доступ apply):

eval.apply(0,Array(999999))
  • eval было самое короткое имя глобальной функции, которое я мог найти (кто-нибудь знает одну, которая короче?)
  • applyпозволяет нам преобразовывать массив в параметры функции, причем первый параметр является контекстом функции ( this)
  • Array(999999)создаст массив с указанной длиной. Не уверен, что максимальное количество аргументов, но это меньше, чем это, и больше, чем99999

IE9:

SCRIPT28: Out of stack space 
SCRIPT2343: Stack overflow at line: 20 

Chrome 24:

Uncaught RangeError: Maximum call stack size exceeded 

FireFox 18

RangeError: arguments array passed to Function.prototype.apply is too large

Примечание. Из-за однопоточной природы javascript бесконечные циклы блокируют пользовательский интерфейс и никогда не вызывают исключение.

while(1);
for(;;);

Ни один из них не подходит.

Обновление - это сбривает три символа:

eval.apply(0,Array(1e7))

MDN говорит, что evalэто самый короткий.
Питер Тейлор

5
eval.apply(0,Array(1e6))экономит 3 символа, вы даже можете использовать их 9e9бесплатно
ThinkChaos

1
applyстандартная функция ECMAScript Нет ничего зависящего от браузера. Если вы не говорите о действительно старых браузерах, но в applyлюбом случае это не будет работать в гипотетическом Netscape 2 , потому что Arrayкласс не существует в Netscape 2.
Конрад Боровски,

1
новый самый короткий в ES6:eval(...Array(9e9))
Патрик Робертс

1
Наверное, нестандартно, кидает в Chrome с консоли. dir.apply(0,Array(1e7));
Пол Дж

17

Python 2.7 (12 символов)

exec('{'*99)

приводит к «переполнению стека парсера»


4
Я получаюSyntaxError: unexpected EOF while parsing
Мартин Тома

1
С exec('{'*101)я получаюMemoryError
Мартин Тома

4
В Python2 execэто утверждение, так что вы можете просто использовать exec'{'*999(99, кажется, недостаточно)
gnibbler

Вам нужно как минимум 100, чтобы вызвать MemoryError. И это переполнение стека
no --zɥʇʎԀʎ

13

Mathematica, 4 символа

x=2x

$ RecursionLimit :: reclim: глубина рекурсии 1024 превышена. >>


1
«Вы не можете определить функцию, которая вызывает себя»
Томас

13
Это не функция, это переменная (если она совсем не похожа).
AMK

Вы поняли мою идею.
PyRulez

12

Clojure, 12 символов

(#(%%)#(%%))

Бег в репле:

user=> (#(%%)#(%%))
StackOverflowError   user/eval404/fn--407 (NO_SOURCE_FILE:1)

Это напоминает мне выражение лямбда-исчисления (\x.xx)(\x.xx), но я недостаточно хорошо знаю clojure, чтобы точно сказать, происходит ли это так. Я также не понимаю, почему вышеупомянутое выражение может привести к переполнению стека, поэтому, возможно, вы делаете какую-то хитрость с Y-комбинатором? Этот ответ меня интересует, и объяснение было бы неплохо.
Цвей

12

Java - 113 символов

Я думаю, что это соответствует духу правила «не называть себя». Он не делает это явно, и даже проходит через конструкцию языка Java.

public class S {
    public String toString() {
        return ""+this;
    }
    public static void main(String[] a) {
        new S().toString();
    }
}

Сжатая версия:

public class S{public String toString(){return ""+this;}public static void main(String[] a){new S().toString();}}

9
Ну, ""+thisна самом деле ""+this.toString(), так метод вызывает сам себя.
True Soft

1
@TrueSoft Я уверен, что Java добавляет StringBuilderтуда объект. toStringскорее всего будет вызван изнутри.
Cruncher

1
К тому времени, когда компилятор и оптимизатор будут готовы, toString()метод в конечном итоге будетpublic java.lang.String toString() { return this.toString(); }
Джонатан Каллен

12

C 19 байтов

main(){int i[~0u];}

4
@Thomas Да это переполнение стека на любом компьютере , где локальные переменные размещаются в стеке. Поскольку язык C не имеет понятия индикации переполнения стека (все это неопределенное поведение; один из них проявляется как segfault), это соответствует первоначальному требованию.
Jens

ОК, извините, принято.
Томас

3
это дает main.c:1:16: error: size of array 'i' is negativeмне на GCC 4.8.1. Версия без подписи main(){int i[~0U];}работает.
Csq

Не работает для меня после того, как я вручную настроил стек 4 ГБ.
FUZxxl

@FUZxxl Интересно; твои интты 32 битные? Если это так, sizeof(i)16 ГБ. Имеет ли значение использование ulили ullсуффикс? Некоторые системы перегружают память и дают сбой, только если в нее записана память.
Дженс

10

GolfScript (8 символов)

{]}333*`

Результат:

$ golfscript.rb overflow.gs 
golfscript.rb:246:in `initialize': stack level too deep (SystemStackError)
from /home/pjt33/bin/golfscript.rb:130:in `new'
from /home/pjt33/bin/golfscript.rb:130:in `ginspect'
from /home/pjt33/bin/golfscript.rb:130:in `ginspect'
from /home/pjt33/bin/golfscript.rb:130:in `map'
from /home/pjt33/bin/golfscript.rb:130:in `ginspect'
from /home/pjt33/bin/golfscript.rb:130:in `ginspect'
from /home/pjt33/bin/golfscript.rb:130:in `map'
from /home/pjt33/bin/golfscript.rb:130:in `ginspect'
 ... 993 levels...
from (eval):4
from /home/pjt33/bin/golfscript.rb:293:in `call'
from /home/pjt33/bin/golfscript.rb:293:in `go'
from /home/pjt33/bin/golfscript.rb:485

В основном это создает сильно вложенную структуру данных, а затем переполняет стек при попытке превратить его в строку.


Для меня это не ошибка, а вывод[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ [[[[[[[[[[[[[""]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] ]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] ]]]]]]]]]]]]]]]]] (and so on, output too long for comments)
ProgramFOX

@ProgramFOX, будет какое-то значение, которое вы можете заменить, 333и оно сломается. 333Это было наименьшее значение, которое мне не понравилось, но если у вас другая версия Ruby (или, может быть, та же версия в другой ОС, насколько я знаю), она может обработать другое количество стековых кадров перед переполнением.
Питер Тейлор

1
Разбивается на 3192 на моей машине, поэтому 6.?все равно работает без добавления символов.
Деннис

10

сборка x86, синтаксис NASM, 7 байтов

db"Pëý"

"Pëý" - 50 EB FD в шестнадцатеричном формате, и

_loop:
push eax
jmp _loop

в сборке х86.


8

Руби, 12

eval"[]"*9e3

дает

SystemStackError: stack level too deep

Предположительно, зависит от системы, но вы можете добавить порядки, увеличив последнюю цифру (не рекомендуется).

Редактировать для объяснения: Подобно некоторым другим примерам, это создает строку [][][]..., повторенную 9000 раз, затем оценивает ее: самый правый []анализируется как вызов функции для остальных и так далее. Если бы он действительно попал в начало, он бы выдал ArgumentError, потому что []это объект с []методом, который требует один аргумент, но моя машина выдает ошибку немного, прежде чем размер стека превысит девять тысяч.


хм ... разбился IRB: P
дверная ручка

Какая версия? ruby1.9.2 выдает «ArgumentError: неверное количество аргументов (0 для 1..2)».
manatwork

Нашел старый ruby1.8.7. Там размещенный код работает, как описано.
manatwork

Странно, это работает на моих 1.8.7, 1.9.2 и 1.9.3.
гистократ

Я бы сказалdef f;f;end;f
ЭМБЛЕМА

8

Реболь (11 символов)

do s:[do s]

Урожайность:

>> do(s:[do s])    
** Internal error: stack overflow
** Where: do do do do do do do do do do do do do do do do 
do do do do do do do do do do do do do do do do do do do
do do do do do do do do do do do do do do do do do do do 
do do do do do do do do do do do do do do do do do do do
do do do do do do do do do do do do do do do do do do do
do do do do do do do do do do do do do do do do do do do
do do do do do do do do do do do do do do do do do do do
do do do do do do do do do do do do do do do do do do do
do do do do do do do do do do do do do do do do do do do
do do do do do do do do do do do do do do do do do do do
do do do do do do do do do do do do...

Хотя у Rebol есть функции, замыкания и объекты ... это не определяет ни одного из них. Он определяет структуру данных, которая в парадигме код-как-данные может рассматриваться как код с использованием DO.

Мы можем исследовать вопрос «что такое S» с REPL:

>> s: [do s]
== [do s]

>> type? s
== block!

>> length? s
== 2

>> type? first s
== word!

>> type? second s
== word!

DO никогда не превращает это в функцию, он вызывает оценщик в текущей среде структуры.


1
+1 ... Я не заметил, что мой ответ определял функцию, и это противоречило правилам, но отредактировал мой ответ, используя DO ..., а затем заметил, что вы уже отправили этот ответ. Поэтому я просто удалил свой, но так как я написал, почему это не определяет объект / функцию / замыкание, я решил добавить объяснение в ваше. Также я думаю, что do do do do довольно забавно и стоит того, чтобы его включить. :-) Надеюсь, все в порядке!
Доктор Ребму

7

C, 35 символов

main(){for(;;)*(int*)alloca(1)=0;}

Зачем хранить что-либо в отведенном месте?
Питер Тейлор

1
В этом случае невозможно решить эту проблему в C.
FUZxxl

3
@dmckee, Не все ошибки сегментации являются переполнением стека, но я бы сказал, что это так, потому что это результат превышения емкости стека.
Угорен

1
@dmckee, alloca выделяет из стека.
Угорен

1
@PeterTaylor: Вероятно, это зависит от реализации, но в моем случае alloca(1)это в основном перевод, sub $1, %espпоэтому стек не затрагивается.
Работа

7

Common Lisp, 7 символов

#1='#1#

Прекрасно ... Я планировал использовать #1=(#1#)для терминала и (print #1=(#1#)), но ваше решение намного лучше.
Протист

На самом деле это не переполняется во время чтения, только когда вы пытаетесь распечатать его. Так что, кроме разницы в 1 символ, твоя не лучше.
Протист

Вы правы, только что отредактировали это. Я не уверен, есть ли способ вызвать переполнение во время чтения.
Эрик Халевич

На самом деле, #. # 1 = '# 1 # вызывает переполнение во время чтения :-)
Эрик Халевич

7

Питон - 11 символов

exec'('*999

>>> exec'('*999
s_push: parser stack overflow
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
MemoryError

Очень умное решение.
mbomb007

7

Casio Calculator, 11 клавиш

В этом «языке» довольно сложно сосчитать байты / токены - я указал требуемое количество нажатий клавиш, за исключением Shift, Alpha (вторая клавиша Shift) и =в конце - это, безусловно, укладывается в 1 байт на нажатие клавиши.

Протестировано на модели fx-85GT PLUS , которая представляет собой стандартный не программируемый «непрограммируемый» научный калькулятор. Другие модели будут работать.

Просто сложите 11 кубических корней:

3√ 3√ 3√ 3√
3√ 3√ 3√ 3√
3√ 3√ 3√

Это даже не дает синтаксической ошибки о пропущенном числе под квадратным корнем.

Это не похоже на квадратные корни.

Как вариант, повторите cos(31 раз.

Выход

Stack ERROR

[AC]  :Cancel
[<][>]:Goto

Я считаю, что это квалифицируется как переполнение стека. Стек кажется крошечным ...


Я всегда думал, что это вызвано ошибкой стека, потому что вы «сложили» слишком много корней: P
FlipTack

Мой калькулятор Canon выдает ошибку стека практически с любым оператором (кроме как минимум +, -, * и /), если она повторяется 25 или более раз. Например, это вызывает ошибку стека (без синтаксической ошибки):(((((((((((((((((((((((((
Steadybox

7

FORTH, 13 байтов

BEGIN 1 AGAIN

переполняет стек значений


: X X ; X(9) должен переполнить возвращаемый стек
AMK

не будет работать (X не определен при определении вызова, и это самостоятельная ссылка / рекурсия
трещотка урод

@ratchetfreak, эти контрольные слова могут использоваться только в состоянии компиляции, поэтому их нужно заключить в :... ;определение слова. Это добавляет как минимум 6 символов, плюс еще как минимум 2 для выполнения этой программы. Вы могли бы быть в состоянии сделать это короче, но вот пример: : F BEGIN 1 AGAIN ; F. Я предлагаю это, потому что вопрос задает: «Написать программу». В любом случае, дал вам голосование за Форт, независимо от количества символов! :-)
Даррен Стоун

6

Постскриптум, 7

{1}loop

Например.

$ gsnd
GPL Ghostscript 9.06 (2012-08-08)
Copyright (C) 2012 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
GS>{1}loop
Error: /stackoverflow in 1
Operand stack:
   --nostringval--
Execution stack:
   %interp_exit   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   %loop_continue   --nostringval--   --nostringval--   false   1   %stopped_push   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   %loop_continue
Dictionary stack:
   --dict:1168/1684(ro)(G)--   --dict:0/20(G)--   --dict:77/200(L)--
Current allocation mode is local
Last OS error: No such file or directory
Current file position is 8
GS<1>

6

Haskell (GHC, без оптимизации), 25

main=print$sum[1..999999]

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


я всегда думал, что сумма была реализована с использованием foldl '. не так ли?
гордый haskeller


6

Латекс: 8 символов

\end\end

Это тот же код, который используется в этом ответе . По существу, \endмакро расширяет себя многократно, в результате чего переполнение стека: TeX capacity exceeded, sorry [input stack size=5000]. Более подробное объяснение можно найти здесь .


5

PHP 5.4, 33 символа

for($n=1e5;$n--;)$a=(object)[$a];

Это вызывает переполнение стека, когда вложенные объекты stdClass автоматически уничтожаются:

$ gdb -q php
Reading symbols from /usr/bin/php...(no debugging symbols found)...done.
(gdb) set pagination 0
(gdb) r -nr 'for($n=1e5;$n--;)$a=(object)[$a];'
Starting program: /usr/bin/php -nr 'for($n=1e5;$n--;)$a=(object)[$a];'
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Program received signal SIGSEGV, Segmentation fault.
0x00000000006debce in zend_objects_store_del_ref_by_handle_ex ()
(gdb) bt
#0  0x00000000006debce in zend_objects_store_del_ref_by_handle_ex ()
#1  0x00000000006dee73 in zend_objects_store_del_ref ()
#2  0x00000000006a91ca in _zval_ptr_dtor ()
#3  0x00000000006c5f78 in zend_hash_destroy ()
#4  0x00000000006d909c in zend_object_std_dtor ()
#5  0x00000000006d9129 in zend_objects_free_object_storage ()
#6  0x00000000006dee53 in zend_objects_store_del_ref_by_handle_ex ()
#7  0x00000000006dee73 in zend_objects_store_del_ref ()
#8  0x00000000006a91ca in _zval_ptr_dtor ()
#9  0x00000000006c5f78 in zend_hash_destroy ()
#10 0x00000000006d909c in zend_object_std_dtor ()
#11 0x00000000006d9129 in zend_objects_free_object_storage ()
[...]
#125694 0x00000000006dee53 in zend_objects_store_del_ref_by_handle_ex ()
#125695 0x00000000006dee73 in zend_objects_store_del_ref ()
#125696 0x00000000006a91ca in _zval_ptr_dtor ()
#125697 0x00000000006c5f78 in zend_hash_destroy ()
#125698 0x00000000006d909c in zend_object_std_dtor ()
#125699 0x00000000006d9129 in zend_objects_free_object_storage ()
#125700 0x00000000006dee53 in zend_objects_store_del_ref_by_handle_ex ()
#125701 0x00000000006dee73 in zend_objects_store_del_ref ()
#125702 0x00000000006a91ca in _zval_ptr_dtor ()
#125703 0x00000000006c4945 in ?? ()
#125704 0x00000000006c6481 in zend_hash_reverse_apply ()
#125705 0x00000000006a94e1 in ?? ()
#125706 0x00000000006b80e7 in ?? ()
#125707 0x0000000000657ae5 in php_request_shutdown ()
#125708 0x0000000000761a18 in ?? ()
#125709 0x000000000042c420 in ?? ()
#125710 0x00007ffff5b6976d in __libc_start_main (main=0x42bf50, argc=3, ubp_av=0x7fffffffe738, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffe728) at libc-start.c:226
#125711 0x000000000042c4b5 in _start ()

2
+1 за то, что должно быть вторым появлением PHP на CodeGolf!
Bojangles

5

Q / K (16 символов)

Не уверен, что это в духе задачи, но я не думаю, что это нарушает правила:

s:{f`};f:{s`};f`

Обидно, C # требует так много печатать, ты вдохновил мой ответ!
Эндрю Грей,

5

Связка в том же стиле:

Python, 30

(lambda x:x(x))(lambda y:y(y))

Javascript, 38

(function(x){x(x)})(function(y){y(y)})

Луа, 44

(function(x) x(x) end)(function(y) y(y) end)

В Python x=lambda y:y(y);x(x)короче (20 символов). Эта функция не является рекурсивной. x вызывает любую функцию, переданную ему в качестве аргумента.
AMK

Ruby 2.0 -->x{x[x]}[->y{y[y]}]
Джон Дворжак

Mathematica#@#&[#@#&]
алефальфа

Вы просто используете рекурсию, тогда почему бы не сделать это, например, в JS: (function x () {x ()}) ()?
xem

@xem Требования говорят, что нет рекурсии, вот почему.
Дэнни

5

C #: 106 86 58 46 32 28

32 : добытчики могут ТАК легко ваша машина в C #:

public int a{get{return a;}}

1
Нет необходимости в сеттереpublic int a {get{return a;}}
Майк Кодер

3
Это нарушает правило «Вам не разрешено определять функцию, которая вызывает себя». По общему признанию это скрыто за синтаксическим сахаром, но это все еще не решает проблему.
Питер Тейлор

Добавление сеттера несколько обходит правило, потому что теперь у вас есть две функции, вызывающие друг друга. Но мне интересно: это все еще нарушает намерения ОП, стоящие за этим вызовом?
Эндрю Грей,

1
Насколько я понимаю, идея состоит в том, чтобы найти некоторую чрезмерно вложенную рекурсию в интерпретаторе или стандартном API языка. Это может быть не так просто в C #.
Питер Тейлор

1
Почему "публичная строка"? "int" работает так же хорошо:int a { get { return a; } }
NPSF3000

5

INTERCAL, 12 байт

(1)DO(1)NEXT

Объяснение:

NEXTявляется версией вызова подпрограммы INTERCAL (или, по крайней мере, ближайшей, которую вы можете получить). Он помещает текущую позицию в NEXTстек и переходит к данной метке.

Однако, если NEXTдлина стека превышает 80, вы получите то, что в значительной степени является INTERCAL-версией переполнения стека:

ICL123I PROGRAM HAS DISAPPEARED INTO THE BLACK LAGOON
    ON THE WAY TO 1
        CORRECT SOURCE AND RESUBNIT

Попробуйте это на Ideone. ,


6
«Исчезла в чёрной лагуне», что это, Арнольд?
Эддисон Крамп

5

Морнингтон Полумесяц, 139 133

Take Northern Line to Bank
Take Circle Line to Temple
Take Circle Line to Temple
Take Circle Line to Bank
Take Northern Line to Angel

4

Сборка X86 (AT & T), 33 символа

Обратите внимание, что хотя я использую метку mainв качестве цели перехода, это не рекурсивная функция.

.globl main
main:push $0;jmp main

Хорошая идея: это своего рода рекурсия без рекурсии!
Андреа Корбеллини

используя a86: dd 0fdeb6010 символов!
Skizz

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.