Какой самый короткий код вызывает переполнение стека?
160 Chris Jester-Young [2008-09-15 14:17:00]
В ознаменование публичного запуска Stack Overflow, какой самый короткий код вызывает переполнение стека? Любые приветствия.
ETA: просто чтобы понять этот вопрос, поскольку я являюсь случайным пользователем Схемы: "рекурсия" хвоста - это действительно итерация, и любое решение, которое может быть превращено в итеративное решение относительно тривиально приличным компилятором не будет учитываться.:-P
ETA2: теперь я выбрал "лучший ответ"; см. этот пост для обоснования. Спасибо всем, кто внес свой вклад!: -)
language-agnostic code-golf
129 ответов
213 Решение Patrick [2008-09-15 23:43:00]
Все эти ответы и отсутствие Befunge? Я бы поставил справедливое количество его кратчайшего решения из всех:
1
Не шучу. Попробуйте сами: http://www.quirkster.com/iano/js/befunge.html
EDIT: Думаю, мне нужно объяснить это. 1 операнд подталкивает 1 к внутреннему стеку Befunge, а отсутствие чего-либо еще помещает его в цикл по правилам языка.
Используя предоставленный интерпретатор, вы в конечном итоге - и я подразумеваем в конце концов - попадаем в точку, где массив Javascript, представляющий стек Befunge, становится слишком большим для перераспределения браузера. Если у вас был простой интерпретатор Befunge с меньшим и ограниченным стеком - как в случае с большинством языков ниже - эта программа приведет к более заметному переполнению быстрее.
292 jrudolph [2008-09-15 19:05:00]
Прочитайте эту строку и сделайте то, что она говорит дважды.
174 GateKiller [2008-09-15 14:53:00]
Вы также можете попробовать это на С#.net
throw new StackOverflowException();
160 Cody Brocious [2008-09-15 15:25:00]
Nemerle
Этот выдает компилятор с помощью StackOverflowException:
def o(){[o()]}
119 Chris Jester-Young [2008-09-15 14:17:00]
Мое самое лучшее (в сборке x86):
push eax
jmp short $-1
что приводит к 3 байтам объектного кода (50 EB FD
). Для 16-битного кода это также возможно:
call $
что также приводит к 3 байтам (E8 FD FF
).
113 Adam Davis [2009-02-28 05:17:00]
PIC18
Ответ PIC18, заданный TK, приводит к следующим инструкциям (двоичным):
overflow
PUSH
0000 0000 0000 0101
CALL overflow
1110 1100 0000 0000
0000 0000 0000 0000
Однако CALL самостоятельно выполняет переполнение стека:
CALL $
1110 1100 0000 0000
0000 0000 0000 0000
Меньше, быстрее PIC18
Но RCALL (относительный вызов) по-прежнему меньше (не глобальная память, поэтому нет необходимости в дополнительных 2 байтах):
RCALL $
1101 1000 0000 0000
Итак, самый маленький на PIC18 - это одна команда, 16 бит (два байта). Это займет 2 цикла инструкций для каждого цикла. В течение 4 тактов за цикл инструкций у вас есть 8 тактов. PIC18 имеет 31 уровень стека, поэтому после 32-го цикла он переполнит стек в 256 тактов. На 64 МГц вы бы переполнили стек в 4 микросекунды и 2 байта.
PIC16F5x (еще меньше и быстрее)
Однако в серии PIC16F5x используются 12-битные команды:
CALL $
1001 0000 0000
Опять же, два цикла инструкций для каждого цикла, 4 такта на инструкцию, так что 8 тактов за цикл.
Однако PIC16F5x имеет двухуровневый стек, поэтому в третьем цикле он будет переполняться в 24 инструкциях. На 20 МГц он будет переполняться в 1,2 микросекундах и 1,5 байта.
Intel 4004
Intel 4004 содержит инструкцию подпрограммы 8 бит:
CALL $
0101 0000
Для любопытного, что соответствует ascii 'P'. С трехуровневым стекем, который занимает 24 тактовых цикла в общей сложности 32,4 микросекунды и один байт. (Если вы не разгоняете свой 4004 - продолжайте, вы знаете, что хотите.)
Который такой же маленький, как и ожидающий ответ, но намного, намного быстрее, чем код befunge, запущенный в текущих интерпретаторах.
77 aku [2008-09-15 14:21:00]
С#:
public int Foo { get { return Foo; } }
57 Juliet [2010-04-21 04:25:00]
Переполнение Hoot!
// v___v
let rec f o = f(o);(o)
// ['---']
// -"---"-
56 Konrad Rudolph [2008-09-16 11:36:00]
Каждая задача нуждается в правильном инструменте. Знакомьтесь с SO Overflow, оптимизированным для создания:
so
42 Pi. [2008-09-16 04:10:00]
TeX:
\def~{~.}~
Результаты в:
! TeX capacity exceeded, sorry [input stack size=5000]. ~->~ . ~->~ . ~->~ . ~->~ . ~->~ . ~->~ . ... <*> \def~{~.}~
LaTeX:
\end\end
Результаты в:
! TeX capacity exceeded, sorry [input stack size=5000]. \end #1->\csname end#1 \endcsname \@checkend {#1}\expandafter \endgroup \if@e... <*> \end\end
35 Dennis Munsie [2008-09-15 20:00:00]
Ассемблер Z-80 - в ячейке памяти 0x0000:
rst 00
один байт - 0xC7 - бесконечный цикл нажатия текущего ПК в стек и переход к адресу 0x0000.
29 Kemal [2008-09-15 23:03:00]
Другой пример PHP:
<?
require(__FILE__);
29 Vinko Vrsalovic [2008-09-15 14:39:00]
По-английски:
recursion = n. See recursion.
26 stusmith [2008-09-15 15:24:00]
Как насчет следующего в BASIC:
10 GOSUB 10
(У меня нет интерпретатора BASIC, я боюсь, так что думаю).
26 Chris Jester-Young [2008-09-15 15:33:00]
Я любил Cody ответить кучи, так что вот мой аналогичный вклад, в С++:
template <int i>
class Overflow {
typedef typename Overflow<i + 1>::type type;
};
typedef Overflow<0>::type Kaboom;
Не для входа в гольф для кодов каким-либо образом, но все же, для переполнения мета-стека!:-P
21 Chris Jester-Young [2008-09-15 14:46:00]
Здесь мой вклад C, весом в 18 символов:
void o(){o();o();}
Это намного сложнее оптимизировать хвост!:-P
19 Jude Allred [2008-09-16 05:48:00]
Использование пакетного файла Window с именем "s.bat":
call s
17 Travis Wilson [2008-09-15 20:15:00]
Javascript
Чтобы обрезать еще несколько персонажей и вытащить себя из большего количества магазинов программного обеспечения, отпустите:
eval(i='eval(i)');
15 Chris Broadfoot [2008-09-15 19:24:00]
Groovy:
main()
$groovy stack.groovy:
Caught: java.lang.StackOverflowError
at stack.main(stack.groovy)
at stack.run(stack.groovy:1)
...
14 Ryan Fox [2008-09-16 05:38:00]
Person JeffAtwood;
Person JoelSpolsky;
JeffAtwood.TalkTo(JoelSpolsky);
Здесь надеюсь на отсутствие рекурсии хвоста!
12 bk1e [2008-09-15 18:14:00]
C - это не кратчайший, но без рекурсии. Он также не переносится: он падает в Solaris, но некоторые реализации alloca() могут возвращать здесь ошибку (или вызвать malloc()). Требуется вызов printf().
#include <stdio.h>
#include <alloca.h>
#include <sys/resource.h>
int main(int argc, char *argv[]) {
struct rlimit rl = {0};
getrlimit(RLIMIT_STACK, &rl);
(void) alloca(rl.rlim_cur);
printf("Goodbye, world\n");
return 0;
}
11 user8456 [2008-09-15 19:18:00]
попробуйте поставить более 4 пирожков на одном гамбургере. переполнение стека.
11 Cody Brocious [2008-09-15 14:30:00]
Python
so=lambda:so();so()
В качестве альтернативы:
def so():so()
so()
И если оптимизированные хвосты Python...:
o=lambda:map(o,o());o()
11 asksol [2008-09-15 15:39:00]
perl в 12 символах:
$_=sub{&$_};&$_
bash в 10 символах (важно место в функции):
i(){ i;};i
10 Chris Jester-Young [2008-09-16 15:48:00]
Я выбираю "лучший ответ" после этого сообщения. Но сначала я хотел бы отметить некоторые очень оригинальные вклады:
- aku. Каждый из них исследует новый и оригинальный способ возникновения. Идея делать f (x) ⇒ f (f (x)) является той, которую я расскажу в следующей статье ниже.: -)
- Cody, который дал компилятору Nemerle переполнение стека.
- И (немного неохотно), GateKiller один о том, чтобы выбросить исключение. -Р
Как мне нравится вышеизложенное, задача состоит в том, чтобы делать код в гольф, и, чтобы быть справедливым для респондентов, я должен присудить "лучший ответ" кратчайшему коду, который является записью Befunge; Я не верю, что кто-то сможет победить это (хотя Конрад, конечно же, попытался), так поздравляю Патрика!
Увидев большое количество решений, я удивлен, что никто (на момент написания письма) не поднял Y combinator (см. эссе Dick Gabriel, Почему Y, для праймера). У меня есть рекурсивное решение, которое использует подход Y combinator, а также aku f (f (x)).: -)
((Y (lambda (f) (lambda (x) (f (f x))))) #f)
8 Adam Rosenfield [2008-09-16 22:26:00]
Вот еще один интересный из Схемы:
((lambda (x) (x x)) (lambda (x) (x x)))
7 Misha [2008-09-15 17:41:00]
Java
Немного более короткая версия решения Java.
class X{public static void main(String[]a){main(a);}}
5 Anders Sandvig [2008-09-15 16:22:00]
3 байта:
label:
pusha
jmp label
Обновление
Согласно (старой?) документации Intel (?), это также 3 байта:
label:
call label
4 Evan DeMond [2008-09-15 17:15:00]
В Lua:
function f()return 1+f()end f()
Вам нужно что-то сделать для результата рекурсивного вызова, иначе оптимизация хвостовых вызовов позволит ему зацикливаться навсегда. Слабый для кодового гольфа, но приятно иметь!
Я предполагаю, что и длинные ключевые слова означают, что Lua в ближайшее время не выиграет гольф-код.
4 Manrico Corazzi [2008-09-15 15:43:00]
Java (смущение):
public class SO
{
private void killme()
{
killme();
}
public static void main(String[] args)
{
new SO().killme();
}
}
ИЗМЕНИТЬ Конечно, это может быть значительно сокращено:
class SO
{
public static void main(String[] a)
{
main(null);
}
}
4 Pi. [2008-09-15 22:41:00]
Forth:
: a 1 recurse ; a
Внутри интерпретатора gforth
:
: a 1 recurse ; a
*the terminal*:1: Return stack overflow
: a 1 recurse ; a
^
Backtrace:
На Power Mac G4 в приглашении Open Firmware это просто повесит машину.:)
3 Tim Ring [2008-09-15 16:47:00]
Выход GWBASIC...
OK
10 i=0
20 print i;
30 i=i+1
40 gosub 20
run
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
22 23 24 25 26 27 28 29 30 31 32 33
Out of memory in 30
Ok
Не так много глубины стека: -)
3 dr_bonzo [2008-09-15 15:26:00]
Ruby:
def s() s() end; s()
3 Kyle Cronin [2008-09-15 17:43:00]
В схеме это приведет к тому, что у интерпретатора закончится нехватка памяти:
(define (x)
((x)))
(x)
3 Jay Bazuzi [2008-09-15 23:34:00]
С#
class _{static void Main(){Main();}}
Обратите внимание, что моя - это компилируемая программа, а не только одна функция. Я также удалил лишние пробелы.
Для таланта я сделал имя класса как можно меньше.
3 user4010 [2008-09-16 02:54:00]
Если вы считаете, что кадр вызова является процессом, а стек - вашей машиной Unix, вы можете считать, что вилка-бомба является параллельной программой для создания условия. Попробуйте этот 13-символьный номер bash. Не требуется сохранение файла.
:(){ :|:& };:
3 tomdemuyt [2008-09-15 17:16:00]
пакетная программа, называемая call.cmd;
вызов call.cmd
****** B A T C H R E C U R S I O N exceeds STACK limits ******
Recursion Count=1240, Stack Usage=90 percent
****** B A T C H PROCESSING IS A B O R T E D ******
3 Wouter Coekaerts [2008-09-16 10:49:00]
В Irssi (клиент на основе терминала IRC, а не "действительно" язык программирования), $L означает текущую командную строку. Таким образом, вы можете вызвать переполнение стека ( "максимальный предел рекурсии" ) с помощью:
/eval $L
3 Ramin [2008-09-16 23:51:00]
2 KirarinSnow [2010-02-07 09:21:00]
PostScript, 7 символов
{/}loop
При запуске в GhostScript выдает это исключение:
GS>{/}loop
Error: /stackoverflow in --execute--
Operand stack:
--nostringval--
Execution stack:
%interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- %loop_continue 1753 2 3 %oparray_pop --nostringval-- --nostringval-- false 1 %stopped_push .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- %loop_continue
Dictionary stack:
--dict:1150/1684(ro)(G)-- --dict:0/20(G)-- --dict:70/200(L)--
Current allocation mode is local
Last OS error: 11
Current file position is 8
Здесь рекурсивная версия без использования переменных (51 символ):
[{/[aload 8 1 roll]cvx exec}aload 8 1 roll]cvx exec
2 Draemon [2010-02-27 21:48:00]
Java:
class X{static{new X();}{new X();}}
На самом деле вызывает переполнение стека, инициализирующее класс X. Перед вызовом main() JVM должен загрузить класс, а когда он делает это, он запускает любые анонимные статические кодовые блоки:
static {
new X();
}
Который, как вы можете видеть, создает экземпляр X, используя конструктор по умолчанию. JVM будет вызывать анонимные блоки кода еще до конструктора:
{
new X();
}
Какая рекурсивная часть.
2 gha.st [2010-01-20 17:07:00]
С#
class Program
{
class StackOverflowExceptionOverflow : System.Exception
{
public StackOverflowExceptionOverflow()
{
throw new StackOverflowExceptionOverflow();
}
}
static void Main(string[] args)
{
throw new StackOverflowExceptionOverflow();
}
}
Я понимаю, что это не самый короткий (и даже код в гольф не близок к тому, чтобы быть рядом с коротким), но я просто не мог удержаться от исключения, что при броске выбрасывает исключение stackoverflowexception, прежде чем оно сможет завершить сама среда выполнения ^^
2 Andrew Johnson [2008-09-15 15:37:00]
a{return a*a;};
Скомпилировать с помощью:
gcc -D"a=main()" so.c
Расширяется до:
main() {
return main()*main();
}
2 TK. [2008-09-15 14:34:00]
PIC18:
Переполнение
PUSH CALL overflow
2 Robert S. [2008-09-15 17:53:00]
В пробеле, я думаю:
Вероятно, он не появится.:/
2 Ozgur Ozcitak [2008-09-15 15:35:00]
Lisp
(defun x() (x)) (x)
2 Ming-Tang [2010-07-17 22:03:00]
Java: 35 символов
Я думаю, что это слишком поздно, но я все равно напишу свою идею:
class A{{new A();}static{new A();}}
Использование функций инициализатора статического инициализатора и экземпляра.
Вот вывод на моем компьютере (обратите внимание, что он показал два сообщения об ошибках):
Exception in thread "main" java.lang.StackOverflowError
at A.<init>(A.java:1)
......
at A.<init>(A.java:1)
Could not find the main class: A. Program will exit.
Смотрите также: http://download.oracle.com/docs/cd/E17409_01/javase/tutorial/java/javaOO/initial.html
2 Joshua Carmody [2008-09-15 21:04:00]
Ну, никто еще не упомянул Coldfusion, так что...
<cfinclude template="#ListLast(CGI.SCRIPT_NAME, "/\")#">
Это должно сделать это.
2 matyr [2008-09-17 08:45:00]
Groovy (5B):
run()
2 Cody Brocious [2008-09-15 14:53:00]
КСС /MSIL
loop: ldc.i4.0
br loop
Код объекта:
16 2B FD
2 mattiast [2008-09-15 20:45:00]
Haskell:
let x = x
print x
2 Ming-Tang [2010-08-31 04:02:00]
Сообщение об ошибке компилятора С++
template<int n>struct f{f<n+1>a;};f<0>::a;
выход:
$ g++ test.cpp;
test.cpp:1: error: template instantiation depth exceeds maximum of 500 (use -ftemplate-depth-NN to increase the maximum) instantiating ‘struct f<500>’
test.cpp:1: instantiated from ‘f<499>’
test.cpp:1: instantiated from ‘f<498>’
......
Даже если компилятор прошел через шаблон, появится следующая ошибка: missing main
.
2 aku [2008-09-15 16:51:00]
F #
Люди продолжают спрашивать: "Для чего полезно F #?"
let rec f n =
f (n)
оптимизированная по производительности версия (будет работать быстрее:))
let rec f n =
f (f(n))
2 clahey [2008-09-16 01:31:00]
Если не существует языка, в котором пустая программа вызывает переполнение стека, следующее должно быть как можно короче.
Befunge:
:
Дублирует значение верхнего стека снова и снова.
изменить: Патрик лучше. Заполнение стека 1 сек лучше, чем заполнение стека 0, поскольку интерпретатор может оптимизировать нажатие 0s на пустой стек как нет-op.
1 Agnel Kurian [2008-09-15 14:42:00]
/* In C/C++ (second attempt) */
int main(){
int a = main() + 1;
return a;
}
1 botismarius [2008-09-15 19:45:00]
В языке ассемблера (процессоры x86, 16 или 32-битный режим):
call $
который будет генерировать:
-
в 32-битном режиме: 0xe8; 0xfb; 0xff; 0xff; 0xff
-
в 16-битном режиме: 0xe8; 0xfd; 0xff
в C/С++:
int main( ) {
return main( );
}
0 wash [2010-06-12 18:55:00]
Dyalog APL
fib←{
⍵∊0 1:⍵
+/∇¨⍵-1 2
}
В сборке x86 поместите инструкцию деления на 0 в место в памяти обработчика прерываний для деления на 0!
Довольно много любой оболочки:
sh $0
(5 символов, работает только при запуске из файла)
0 Kibbee [2008-09-15 21:14:00]
VB.Net
Function StackOverflow() As Integer
Return StackOverflow()
End Function
0 Carlos Gutiérrez [2010-02-26 21:10:00]
Еще один пакет Windows:
:a
@call :a
0 Kaarel [2009-02-25 00:21:00]
Prolog
Эта программа аварийно завершает работу с SWI-Prolog и Sicstus Prolog.
p :- p, q.
:- p.
-1 Daniel Spiewak [2008-09-16 04:24:00]
Я думаю, что это будет работать на Java (не проверено):
enum A{B.values()}
enum B{A.values()}
Должен переполняться в статической инициализации, прежде чем он даже получит шанс выйти из строя из-за отсутствия основного (String []).
-1 WaldWolf [2008-09-15 23:12:00]
Prolog
р:-p.
= 5 символов
затем запустите его и запросите p
Я думаю, что он довольно мал и заканчивается в прологе.
запрос только переменной в прологе swi производит:
? - X. %... 1 000 000............ 10 000 000 лет спустя % % → 42 < (последний выпуск дает вопрос)
и вот еще одна боковая вилка bash: :() {: |: & };
-4 Oscar Cabrero [2009-02-28 04:52:00]
Redmond.Microsoft.Core.Windows.Start()
Упс, я не знаю, я никогда не писал код, который вызывает переполнение стека;)
0 Daniel Băluţă [2010-06-12 19:07:00]
int main(void) { return main(); }
0 Artur Gaspar [2010-07-12 20:19:00]
Python:
import sys
sys.setrecursionlimit(sys.maxint)
def so():
so()
so()
0 Agnel Kurian [2008-09-15 14:36:00]
int main(){
int a = 20;
return main();
}
0 GateKiller [2008-09-15 14:47:00]
С#, выполненный в 20 символах (исключая пробелы):
int s(){
return s();
}
0 N 1.1 [2010-02-27 00:36:00]
main(){
main();
}
Простое и приятное C. Чувствует себя достаточно интуитивным для меня.
0 PersistenceOfVision [2008-09-15 23:05:00]
Для развлечения мне пришлось посмотреть сборку Motorolla HC11:
org $100
Loop nop
jsr Loop
В ячейке spus нет переполнений стека, поэтому нет необходимости в рекурсии, мы можем просто стереть указатель стека.
asm ( "andi $1, $1, 0" );
0 user11039 [2008-09-16 07:23:00]
В С# это создаст stackoverflow...
static void Main()
{
Main();
}
0 Despatcher [2008-09-16 01:53:00]
Я думаю, что это мошенничество, с которым я никогда не играл раньше;), но здесь идет
8086 ассемблер:
org Int3VectorAdrress - это обман?
int 3
1 байт - или 5 символов, которые генерируют код, что скажете?
0 RFelix [2008-09-16 03:25:00]
Ruby, хотя и не такой короткий:
class Overflow
def initialize
Overflow.new
end
end
Overflow.new
0 st0le [2010-07-27 16:12:00]
JavaScript (17 байт)
eval(t="eval(t)")
VB Script (25 байт)
t="Execute(t)":Execute(t)
0 mike511 [2008-09-16 08:22:00]
почему не
mov sp,0
(стек растет)
0 Mark Nold [2008-09-16 08:37:00]
В файле PostScript, который называется so.ps, вызывает execstackoverflow
%!PS
/increase {1 add} def
1 increase
(so.ps) run
0 David B [2008-09-15 18:17:00]
С# с 27 символами без пробелов - включает вызов.
Action a = null;
a = () => a();
a();
0 bgee [2008-09-15 16:48:00]
//lang = C++... it joke, of course
//Pay attention how
void StackOverflow(){printf("StackOverflow!");}
int main()
{
StackOverflow(); //called StackOverflow, right?
}
0 Jonas Gulle [2008-09-15 19:27:00]
Пять байтов в 16-разрядном asm, которые вызовут переполнение стека.
push cs
push $-1
ret
0 F'x [2010-03-07 17:46:00]
Фортран, 13 и 20 символов
real n(0)
n(1)=0
end
или
call main
end
Второй случай зависит от компилятора; для GNU Fortran его нужно будет скомпилировать с помощью -fno-underscoring
.
(Оба подсчета включают требуемые символы перевода строки)
0 defmeta [2008-09-17 01:46:00]
ActionScript 3: все сделано с массивами...
var i=[];
i[i.push(i)]=i;
trace(i);
Возможно, не самый маленький, но я думаю, что это мило. Особенно метод push возвращает новую длину массива!
0 Huppie [2008-09-15 14:37:00]
JavaScript:
function i(){ i(); }
i();
С++ Использование указателя функции:
int main(){
int (*f)() = &main;
f();
}
0 jkramer [2010-05-25 14:40:00]
Haskell:
main = print $ x 1 where x y = x y + 1
0 davidnicol [2008-09-15 17:27:00]
MS-DOS:
copy CON so.bat
so.bat
^Z
so.bat
0 Niyaz [2008-09-15 14:20:00]
С++
int overflow(int n)
{
return overflow(1);
}
0 BCS [2009-04-22 23:36:00]
Мета-проблема в D:
class C(int i) { C!(i+1) c; }
C!(1) c;
Слишком много времени
0 Tolgahan Albayrak [2009-05-11 17:55:00]
_asm t: call t;
0 JWHEAT [2008-09-15 16:35:00]
PHP - рекурсия просто для удовольствия. Я предполагаю, что PHP-интерпретатор выводит его из работы, но эй - это приведет к сбою.
function a() { a(); } a();
0 Kinjal Dixit [2008-09-15 16:01:00]
рекурсия - старая шляпа. вот взаимная рекурсия. начать с вызова любой из функций.
a()
{
b();
}
b()
{
a();
}
PS: но вы просили кратчайший путь... не самый креативный путь!
0 Graphics Noob [2009-11-15 00:34:00]
OCaml
let rec f l = f l@l;;
Это немного другое. В стеке есть только один стек стека (поскольку он рекурсивно хвост), но он продолжает расти, пока не переполнит стек. Просто позвоните f
с таким непустым списком (в приглашении переводчика):
# f [0];;
Qaru during evaluation (looping recursion?).
0 Sean Cameron [2008-09-15 15:41:00]
Clarion:
Poke(0)
0 finnw [2010-01-31 22:39:00]
ruby (снова):
def a(x);x.gsub(/./){a$0};end;a"x"
Есть много рубиновых решений уже, но я думал, что я бы выбрал регулярное выражение для хорошей оценки.
1 aku [2008-09-15 15:37:00]
С# снова:
class Foo { public Foo() {new Foo(); } }
1 Antti Sykäri [2008-09-15 15:46:00]
so.c в 15 символов:
main(){main();}
Результат:
antti@blah:~$ gcc so.c -o so
antti@blah:~$ ./so
Segmentation fault (core dumped)
Изменить. Хорошо, он дает предупреждения с -Wall и не вызывает переполнение стека с -O2. Но это работает!
1 Michal [2008-09-15 16:13:00]
Java (полное содержимое X.java):
class X {
public static void main(String[] args) {
main(null);
}}
Учитывая весь синтаксический сахар, мне интересно, можно ли сделать что-то более короткое в Java. Кто-нибудь?
РЕДАКТИРОВАТЬ: Ой, я пропустил, уже отправлено почти идентичное решение.
РЕДАКТИРОВАТЬ 2: Я бы сказал, что этот (как мудрый) самый короткий
class X{public static void main(String[]a){main(null);}}
РЕДАКТИРОВАТЬ 3: Благодаря Anders для указания нулевого значения не является оптимальным аргументом, поэтому сделать это короче:
class X{public static void main(String[]a){main(a);}}
1 Jesse Millikan [2008-09-15 16:59:00]
У меня есть список из них в Бесконечный цикл на E2 - см. только те, которые обозначены как "Переполнение стека" в заголовке.
Я думаю, что самый короткий из них -
[dx]dx
в dc. Может быть более короткое решение в False.
EDIT: По-видимому, это не работает... По крайней мере, на GNU dc. Возможно, это было в версии BSD.
1 Antti Sykäri [2008-09-15 17:44:00]
Shell script решение в 10 символов, включая символы новой строки:
Ну, технически не переполнение стека, а логически так, если вы рассматриваете возможность создания нового процесса как создания нового фрейма стека.
#!sh
./so
Результат:
antti@blah:~$ ./so
[disconnected]
Упс. Примечание: не пробуйте это дома
1 Joseph Bui [2008-09-15 21:50:00]
TCL:
proc a {} a
У меня нет интерпретатора tclsh, который может выполнять хвостовую рекурсию, но это может обмануть такую вещь:
proc a {} "a;a"
1 JosephStyons [2008-09-15 15:40:00]
Завершить программу Delphi.
program Project1;
{$APPTYPE CONSOLE}
uses SysUtils;
begin
raise EStackOverflow.Create('Stack Overflow');
end.
1 Leo Lännenmäki [2008-09-15 16:00:00]
Javasript:
Huppies отвечают на одну строку:
(function i(){ i(); })()
То же количество символов, но не новая строка:)
1 x0n [2008-09-15 18:36:00]
PowerShell
$F = {& $F}; & $е
"Ошибка script из-за переполнения глубины вызова. Глубина вызова достигла 1001, а максимальная - 1000.
1 Leo Lännenmäki [2008-09-16 16:04:00]
Другой в JavaScript:
(function() { arguments.callee() })()
1 Aardappel [2008-09-18 11:41:00]
False
[1] [1] #
(False - это язык стека: # - это цикл while, который принимает 2 замыкания, условное и тело. Тело - это тот, который вызывает переполнение).
1 squadette [2008-09-16 22:21:00]
Короткое решение в K & R C может быть скомпилировано:
main(){main()}
14 байт
1 user10178 [2008-09-16 04:35:00]
не будет самым коротким, но мне пришлось попробовать что-то... С#
string [] f = новая строка [0]; Основной (е);
бит короче
static void Main(){Main();}
1 RFelix [2008-09-16 13:14:00]
Здесь другой ответ Ruby, этот использует lambdas:
(a=lambda{a.call}).call
1 Javier [2008-09-16 17:35:00]
VB6
Public Property Let x(ByVal y As Long)
x = y
End Property
Private Sub Class_Initialize()
x = 0
End Sub
В ответ на комментарий Y combinator я мог бы также пройти через Y-combinator в исчислении SKI:
S (K (S I I)) (S (S (K S) K) (K (S I I)))
Нет никаких интерпретаторов SKI, о которых я знаю, но однажды написал графический пример примерно через час в ActionScript. Я бы хотел опубликовать, если есть интерес (хотя я никогда не получал макет, работающий очень эффективно)
прочитайте все о нем здесь: http://en.wikipedia.org/wiki/SKI_combinator_calculus
1 dsm [2008-09-18 09:31:00]
в perl:
`$0`
По сути, это будет работать с любой оболочкой, которая поддерживает синтаксис backquote-command и сохраняет свое собственное имя в $0
1 Jonas Kölker [2009-03-03 13:55:00]
В Haskell
fix (1+)
Это пытается найти точку исправления функции (1+) (λ n → n + 1
). Реализация исправления
fix f = (let x = f(x) in x)
Итак,
fix (1+)
становится
(1+) ((1+) ((1+) ...))
Обратите внимание, что
fix (+1)
просто петли.
1 nobar [2010-02-27 21:08:00]
GNU make:
Создайте файл под названием "Makefile" со следующим содержимым:
a:
make
Затем запустите make:
$ make
Обратите внимание, что для смещения слова "make" следует использовать символ табуляции. Этот файл имеет 9 символов, включая 2 символа конца строки и 1 символ табуляции.
Я полагаю, вы могли бы сделать аналогичную вещь с bash, но, вероятно, слишком легко быть интересным:
Создайте имя файла "b" и отметьте его как исполняемый файл (chmod + x b):
b ## ties the winning entry with only one character (does not require end-of-line)
Теперь выполните файл с
$ ( PATH=$PATH:. ; b )
Трудно сказать, технически ли этот подход приводит к переполнению стека, но он создает стек, который будет расти до тех пор, пока машина не исчерпает ресурсы. Замечательная вещь о том, как это сделать с GNU make, заключается в том, что вы можете смотреть информацию о статусе вывода, когда он создает и уничтожает стек (если вы нажмете ^ C в какой-то момент до возникновения сбоя).
0 Tim Ring [2009-12-31 18:04:00]
Язык ассемблера Z80...
.org 1000
loop: call loop
это генерирует 3 байта кода в месте 1000....
1000 CD 00 10
0 Thevs [2008-09-15 23:29:00]
Не очень короткий, но эффективный! (JavaScript)
setTimeout(1, function() {while(1) a=1;});
0 Svante [2009-02-28 06:49:00]
Оптимизация звонков может быть саботирована, а не вызывает вызов. В Common Lisp:
(defun f () (1+ (f)))
0 Graphics Noob [2009-11-16 00:26:00]
Даже если на самом деле он не имеет стека...
brainf * ck 5 char
+[>+]
0 davidnicol [2008-09-15 17:21:00]
Perl в 10 символах
sub x{&x}x
В конечном итоге использует всю доступную память.
0 Alnitak [2008-09-15 15:57:00]
Я попытался сделать это в Erlang:
c(N)->c(N+1)+c(N-1).
c(0).
Двойной вызов самого себя увеличивает использование памяти O(n^2)
, а не O(n)
.
Однако интерпретатору Erlang, похоже, не удается сбой.