Jaki jest najkrótszy kod powodujący przepełnienie stosu? [zamknięte]
Obecnie pytanie to nie pasuje do naszego formatu pytań i odpowiedzi. Oczekujemy, że odpowiedzi będą poparte faktami, referencjami lub wiedzą specjalistyczną, ale to pytanie będzie prawdopodobnie wywoływało debatę, argumenty, ankiety lub rozszerzoną dyskusję. Jeśli uważasz, że to pytanie można poprawić i ewentualnie ponownie otworzyć, odwiedź Pomoc centrum dla wskazówek. Zamknięty 9 lat temu . zamknięte. To pytanie i jego odpowiedzi są zamknięte , ponieważ pytanie jest off-topic, ale ma znaczenie historyczne. Obecnie nie przyjmuje nowych odpowiedzi ani interakcji.
Aby upamiętnić publiczne uruchomienie Stack Overflow, jaki jest najkrótszy kod, aby spowodować przepełnienie stosu? Każdy język mile widziany.
ETA: tak dla jasności, ponieważ jestem sporadycznym użytkownikiem schematów: tail-call "recursion" jest naprawdę iteracją, a każde rozwiązanie, które może być przekonwertowane na rozwiązanie iteracyjne stosunkowo trywialnie przez porządny kompilator, nie będzie liczone. :- P
ETA2: Teraz wybrałem "najlepszą odpowiedź"; zobacz ten post dla uzasadnienia. Dziękujemy wszystkim, którzy przyczynili się do tego! :-)
30 answers
Wszystkie te odpowiedzi i żadnego Befunge ' a? Założę się, że to najkrótsze rozwiązanie z nich wszystkich:
1
Nie żartuję. Spróbuj sam: http://www.quirkster.com/iano/js/befunge.html
EDIT: chyba muszę to wyjaśnić. Operand 1 wypycha 1 na wewnętrzny stos Befunge, a brak czegokolwiek innego powoduje, że jest on zapętlony zgodnie z regułami języka.
Używając dostarczonego tłumacza, w końcu ... i mam na myśli W końcu ... uderzysz punkt, w którym tablica Javascript reprezentująca stos Befunge staje się zbyt duża, aby przeglądarka mogła się ponownie przydzielić. Gdybyś miał prosty interpreter Befunge z mniejszym i ograniczonym stosem-jak to ma miejsce w przypadku większości poniższych języków-ten program spowodowałby szybsze zauważalne przepełnienie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-16 23:07:42
Przeczytaj ten wiersz i zrób to, co mówi dwa razy .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 16:16:56
Możesz też spróbować tego w C#.net
throw new StackOverflowException();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 11:53:38
Nemerle :
To rozbija kompilator ze Stoskoverflowexception:
def o(){[o()]}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 19:46:46
Mój obecny najlepszy (w x86 assembly) to:
push eax
jmp short $-1
, co daje 3 bajty kodu obiektowego (50 EB FD
). Dla kodu 16-bitowego jest to również możliwe:
call $
, co daje również 3 bajty (E8 FD FF
).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 11:17:47
PIC18
Odpowiedź PIC18 udzielona przez TK daje następujące instrukcje (binarne):
overflow
PUSH
0000 0000 0000 0101
CALL overflow
1110 1100 0000 0000
0000 0000 0000 0000
Jednak samo wywołanie wykona przepełnienie stosu:
CALL $
1110 1100 0000 0000
0000 0000 0000 0000
Mniejszy, szybszy PIC18
Ale rcall (względne wywołanie) jest nadal mniejszy (Nie pamięć globalna, więc nie potrzeba dodatkowych 2 bajtów):
RCALL $
1101 1000 0000 0000
Tak więc najmniejsza na PIC18 jest pojedynczą instrukcją, 16 bitów (dwa bajty). Zajęłoby to 2 cykle instrukcji na pętlę. Przy 4 cyklach zegara na cykl instrukcji masz 8 cykli zegara. PIC18 ma stos 31 poziomów, więc po 32 pętli przepełni stos, w 256 cyklach zegara. Przy 64MHz, można by przepełnić stos w 4 mikro sekund i 2 bajty.
PIC16F5x (jeszcze mniejszy i szybszy) Jednak seria PIC16F5x używa 12-bitowych instrukcji:CALL $
1001 0000 0000
Ponownie, dwa cykle instrukcji na pętlę, 4 zegary na instrukcję, więc 8 cykli zegara na pętlę.
[[7]}jednak PIC16F5x ma dwupoziomowy stos, więc na trzeciej pętli przepełni się, w 24 instrukcjach. W 20MHz przepełnia się w 1.2 mikro sekund i 1.5 bajtów .Intel 4004
Intel 4004 ma 8-bitową instrukcję podprogramu wywołania:
CALL $
0101 0000
Dla ciekawskich, które odpowiadają ASCII 'P'. Ze stosem 3 poziomów, który zajmuje 24 cykle zegara w sumie 32,4 mikro sekund i jeden bajt. (Chyba, że podkręcasz swój 4004-daj spokój, wiesz, że chcesz za.)
Który jest tak mały jak odpowiedź befunge, ale dużo, dużo szybszy niż kod befunge działający w obecnych interpreterach.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:10
C#:
public int Foo { get { return Foo; } }
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-22 18:24:56
Hoot overflow!
// v___v
let rec f o = f(o);(o)
// ['---']
// -"---"-
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-21 12:59:38
Każde zadanie wymaga odpowiedniego narzędzia. Poznaj język so Overflow , zoptymalizowany do tworzenia przepełnień stosu:
so
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 08:36:39
TeX:
\def~{~.}~
Wyniki w:
! TeX capacity exceeded, sorry [input stack size=5000]. ~->~ . ~->~ . ~->~ . ~->~ . ~->~ . ~->~ . ... <*> \def~{~.}~
LaTeX:
\end\end
Wyniki w:
! TeX capacity exceeded, sorry [input stack size=5000]. \end #1->\csname end#1 \endcsname \@checkend {#1}\expandafter \endgroup \if@e... <*> \end\end
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-24 15:00:51
Asembler Z-80 -- W Miejscu Pamięci 0x0000:
rst 00
Jeden bajt -- 0xc7 -- niekończąca się pętla przesuwania bieżącego komputera do stosu i przeskakiwania na adres 0x0000.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 17:00:09
W języku angielskim:
recursion = n. See recursion.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 11:39:32
Kolejny przykład PHP:
<?
require(__FILE__);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-24 21:28:21
A może w BASIC:
10 GOSUB 10
(obawiam się, że nie mam podstawowego tłumacza, więc to zgadywanka).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 12:24:45
Spodobała mi się odpowiedź Cody ' ego, więc oto mój podobny wkład, w C++:
template <int i>
class Overflow {
typedef typename Overflow<i + 1>::type type;
};
typedef Overflow<0>::type Kaboom;
W żaden sposób nie jest to wpis kodu golfowego, ale nadal wszystko dla przepełnienia stosu meta! :- P
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 12:33:25
Oto mój wkład C, ważący 18 znaków:
void o(){o();o();}
To jest lot trudniejszy do zoptymalizowania! :- P
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 11:46:48
Użycie pliku wsadowego okna o nazwie "S. bat":
call s
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 02:48:14
Javascript
Aby przyciąć jeszcze kilka znaków i dać się wykopać z kolejnych sklepów z oprogramowaniem, zacznijmy od:
eval(i='eval(i)');
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-23 20:00:59
Groovy:
main()
$ groovy stack.groovy: {]}
Caught: java.lang.StackOverflowError
at stack.main(stack.groovy)
at stack.run(stack.groovy:1)
...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 16:24:08
Proszę mi powiedzieć, co oznacza skrót" GNU ".
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-22 19:09:50
Person JeffAtwood;
Person JoelSpolsky;
JeffAtwood.TalkTo(JoelSpolsky);
Mamy nadzieję, że nie będzie rekurencji ogonowej!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 02:38:59
C - nie jest najkrótsza, ale jest wolna od rekurencji. Nie jest też przenośna: wywala się na Solarisie, ale niektóre implementacje alloca () mogą zwrócić tutaj błąd (lub wywołać malloc ()). Konieczne jest wywołanie 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;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 15:14:11
Perl w 12 znakach:
$_=sub{&$_};&$_
Bash w 10 znakach (spacja w funkcji jest ważna):
i(){ i;};i
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 12:45:21
Spróbuj umieścić więcej niż 4 paszteciki na jednym hamburgerze. przepełnienie stosu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 16:18:11
Python :
so=lambda:so();so()
Alternatywnie:
def so():so()
so()
I jeśli Python zoptymalizował wywołania ogonowe...:
o=lambda:map(o,o());o()
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-28 01:18:49
Wybieram "najlepszą odpowiedź" po tym poście. Ale najpierw chciałbym pochwalić się bardzo oryginalnym wkładem:
-
/ Align = "left" / Każdy z nich bada nowy i oryginalny sposób powodowania przepełnienia stosu. Pomysł robienia f (x) ⇒ F (f(x)) to ten, który poznam w następnym wpisie, poniżej. :-)
- Cody dał kompilatorowi Nemerle przepełnienie stosu.
- i (trochę niechętnie), GateKiller jest o rzucaniu wyjątku przepełnienia stosu. :- P
Bardzo podoba mi się powyższe, wyzwanie polega na zrobieniu code golfa, i aby być uczciwym wobec respondentów, muszę przyznać "najlepszą odpowiedź" najkrótszemu kodowi, czyli wpisowi Befunge; nie wierzę, że ktoś będzie w stanie to pokonać( chociaż Konrad na pewno próbował), więc gratulacje Patrick!
Widząc dużą liczbę rozwiązań przepełnienia stosu przez rekursję, dziwię się, że nikt (w obecnym piśmie) nie wspomniał o kombinatorze Y (patrz esej Dicka Gabriela, dlaczego Y , dla podkładu). Mam rozwiązanie rekurencyjne, które wykorzystuje kombinator Y, a także podejście aku f(f(x)). :-)
((Y (lambda (f) (lambda (x) (f (f x))))) #f)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 13:17:29
Oto kolejny ciekawy ze Scheme:
((lambda (x) (x x)) (lambda (x) (x x)))
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 19:26:26
Java
Nieco krótsza wersja rozwiązania Java.
class X{public static void main(String[]a){main(a);}}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 14:41:42
xor esp, esp
ret
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 15:20:22
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 13:30:10