Aby upamiętnić publiczne uruchomienie Stack Overflow, jaki jest najkrótszy kod powodujący przepełnienie stosu? Mile widziane w każdym języku.
ETA: Żeby wyjaśnić to pytanie, ponieważ jestem sporadycznym użytkownikiem Schematu: rekurencja wywołania ogonowego jest tak naprawdę iteracją, a każde rozwiązanie, które można stosunkowo trywialnie przekształcić w rozwiązanie iteracyjne przez przyzwoity kompilator, nie być policzonym. :-P
ETA2: Wybrałem teraz „najlepszą odpowiedź”; zobacz ten post dla uzasadnienia. Dziękujemy wszystkim, którzy wnieśli swój wkład! :-)
źródło
"
ładuje 79 kopii liczby 32 co dwa razy, a nie 2 kopie liczby 1.Przeczytaj ten wiersz i zrób to, co w nim jest, dwa razy .
źródło
Możesz również spróbować tego w C # .net
źródło
Nemerle :
To powoduje awarię kompilatora z wyjątkiem StackOverflowException:
źródło
Mój obecny najlepszy (w zestawie x86) to:
co daje 3 bajty kodu wynikowego (
50 EB FD
). W przypadku kodu 16-bitowego jest to również możliwe:co również daje 3 bajty (
E8 FD FF
).źródło
PIC18
Odpowiedź PIC18 udzielona przez TK skutkuje następującymi instrukcjami (binarnymi):
Jednak samo CALL wykona przepełnienie stosu:
Mniejszy, szybszy PIC18
Ale RCALL (wywołanie względne) jest jeszcze mniejsze (nie pamięć globalna, więc nie ma potrzeby dodatkowych 2 bajtów):
Zatem najmniejsza w PIC18 to pojedyncza instrukcja, 16 bitów (dwa bajty). Zajmie to 2 cykle instrukcji na pętlę. Przy 4 cyklach zegara na cykl instrukcji masz 8 cykli zegara. PIC18 ma 31-poziomowy stos, więc po 32. pętli przepełni stos w 256 cyklach zegara. Przy 64 MHz przepełnienie stosu zajmie 4 mikro sekundy i 2 bajty .
PIC16F5x (jeszcze mniejszy i szybszy)
Jednak seria PIC16F5x wykorzystuje instrukcje 12-bitowe:
Ponownie, dwa cykle instrukcji na pętlę, 4 zegary na instrukcję, czyli 8 cykli zegara na pętlę.
Jednak PIC16F5x ma stos dwupoziomowy, więc w trzeciej pętli przepełniłby się w 24 instrukcjach. Przy 20 MHz przepełnienie zajmie 1,2 mikrosekundy i 1,5 bajta .
Intel 4004
Intel 4004 posiada 8-bitowe instrukcje wywołanie podprogramu:
Dla ciekawskich, co odpowiada ascii „P”. Z 3-poziomowym stosem, który zajmuje 24 cykle zegara, łącznie 32,4 mikrosekundy i jeden bajt . (Chyba że podkręcisz swój 4004 - daj spokój, wiesz, że chcesz.)
Co jest tak małe jak odpowiedź befunge, ale znacznie, dużo szybsze niż kod befunge działający w obecnych interpreterach.
źródło
DO#:
źródło
Hoot overflow!
źródło
Każde zadanie wymaga odpowiedniego narzędzia. Poznaj język SO Overflow , zoptymalizowany do tworzenia przepełnień stosu:
źródło
TeX:
Prowadzi do:
Lateks:
Prowadzi do:
źródło
~
jest aktywny, może być używany zamiast\a
. I całkowicie przypadkowo odkryłem kod LaTeX. :)Asembler Z-80 - w lokalizacji pamięci 0x0000:
jeden bajt - 0xC7 - niekończąca się pętla wpychania bieżącego komputera na stos i przeskakiwania do adresu 0x0000.
źródło
Po angielsku:
źródło
Kolejny przykład PHP:
źródło
A co z następującymi w języku BASIC:
(Obawiam się, że nie mam tłumacza języka BASIC, więc to przypuszczenie).
źródło
GOSUB
nieGOTO
. SkoroRETURN
pochodzi z tego miejsca, z którego został wywołany, na pewno używa stosu?Uwielbiałem mnóstwo odpowiedzi Cody'ego, więc oto mój podobny wkład w C ++:
W żadnym wypadku nie jest to kod do gry w golfa, ale nadal nic dla przepełnienia meta stosu! :-P
źródło
Oto mój wkład w C, ważący 18 znaków:
Jest to o wiele trudniejsze do optymalizacji połączeń końcowych! :-P
źródło
Korzystanie z pliku wsadowego okna o nazwie „s.bat”:
źródło
Javascript
Aby przyciąć kilka dodatkowych znaków i wyrzucić nas z większej liczby sklepów z oprogramowaniem, przejdźmy do:
źródło
Groovy:
$ groovy stack.groovy:
źródło
Powiedz mi proszę, co oznacza skrót „ GNU ”.
źródło
Mamy nadzieję na brak rekurencji ogona!
źródło
C - To nie jest najkrótsze, ale wolne od rekurencji. Nie jest również przenośny: ulega awarii w systemie Solaris, ale niektóre implementacje przydzielania () mogą zwracać tutaj błąd (lub wywoływać malloc ()). Wywołanie printf () jest konieczne.
źródło
perl w 12 znakach:
bash 10 znakami (ważna jest spacja w funkcji):
źródło
spróbuj umieścić więcej niż 4 paszteciki na jednym burgerze. przepełnienie stosu.
źródło
Python :
Alternatywnie:
A jeśli zoptymalizowane pod Pythonem wywołania tail ...:
źródło
Po tym poście wybieram „najlepszą odpowiedź”. Ale najpierw chciałbym podziękować za bardzo oryginalny wkład:
Mimo że uwielbiam powyższe, wyzwanie polega na robieniu kodu golfa i aby być uczciwym wobec respondentów, muszę przyznać „najlepszą odpowiedź” najkrótszemu kodowi, czyli wpisowi Befunge; Nie wierzę, że ktokolwiek będzie w stanie to pokonać (chociaż Konrad z pewnością próbował), więc gratuluję Patrickowi!
Widząc dużą liczbę rozwiązań polegających na przepełnieniu stosu przez rekursję, jestem zaskoczony, że nikt (w chwili obecnej) nie przywołał kombinatora Y (zajrzyj do eseju Dicka Gabriela The Why of Y ). Mam rozwiązanie rekurencyjne, które wykorzystuje kombinator Y, a także podejście aku f (f (x)). :-)
źródło
Oto kolejny interesujący ze Scheme:
źródło
Jawa
Nieco krótsza wersja rozwiązania Java.
źródło
źródło
3 bajty:
Aktualizacja
Według (starej?) Dokumentacji Intela (?) Jest to również 3 bajty:
źródło