Napisz program, który zgłasza błąd StackOverflow lub równoważny w używanym języku. Na przykład w Javie program powinien rzucać java.lang.StackOverflowError
.
Nie wolno definiować funkcji, która wywołuje samą siebie lub nową klasę (z wyjątkiem tej zawierającej main
java). Powinien korzystać z klas wybranego języka programowania.
I nie powinno to jawnie rzucać błędu.
def s{def t=s;t}
?Odpowiedzi:
Befunge, 1
Nie wiem Befunge, ale ...
z kodu przepełnienia stosu golf
źródło
@
zakończy program.Python (2.7.3), 35 znaków
Sama operacja się udaje, ale
RuntimeError: 'maximum recursion depth exceeded'
w konsekwencji zarówno skrypt, jak i interaktywny natychmiast ją wyrzucą .Zainspirowany odpowiedzią Elssara.
źródło
Coq
70000
jest po prostu cukrem syntaktycznym dlaS (S ( ... (S O) ...))
70000S
. Myślę, że to sprawdzanie typów powoduje przepełnienie stosu.Oto ostrzeżenie, które jest drukowane przed wykonaniem polecenia:
źródło
Java - 35
źródło
public static void main
tam. A może po prostu nie rozumiem Java?Javascript 24 znaki
Odpowiedź zależna od przeglądarki (musi mieć dostęp
apply
):eval
była najkrótszą globalną nazwą funkcji, jaką udało mi się znaleźć (ktoś zna taką, która jest krótsza?)apply
pozwala nam przekonwertować tablicę na parametry funkcji, przy czym pierwszym parametrem jest kontekst funkcji (this
)Array(999999)
utworzy tablicę o podanej długości. Nie jestem pewien, jaka jest maksymalna liczba argumentów, ale jest mniejsza niż ta i więcej niż99999
IE9:
Chrome 24:
FireFox 18
Uwaga - Z powodu jednowątkowego charakteru javascript nieskończone pętle ostatecznie blokują interfejs użytkownika i nigdy nie zgłaszają wyjątku.
Żaden z nich się nie kwalifikuje.
Aktualizacja - goli trzy postacie:
źródło
eval
jest najkrótszy.eval.apply(0,Array(1e6))
oszczędza 3 znaki, możesz nawet iść bez9e9
żadnych kosztówapply
jest standardową funkcją ECMAScript. Nie ma nic zależnego od przeglądarki. Chyba że mówisz o naprawdę starych przeglądarkach, ale i tak nie działałoby to w hipotetycznym Netscape 2apply
, ponieważArray
klasa nie istnieje w Netscape 2.eval(...Array(9e9))
dir.apply(0,Array(1e7));
Python 2.7 (12 znaków)
powoduje «s_push: przepełnienie stosu parsera»
źródło
SyntaxError: unexpected EOF while parsing
exec('{'*101)
dostajęMemoryError
exec
znajduje się instrukcja, więc możesz po prostu użyćexec'{'*999
(99 nie wydaje się wystarczająca)Mathematica, 4 znaki
źródło
Clojure, 12 znaków
Uruchamianie w replie:
źródło
(\x.xx)(\x.xx)
, ale nie znam wystarczająco dobrze clojure, aby stwierdzić na pewno, czy tak się dzieje. Nie rozumiem również, dlaczego powyższe wyrażenie spowodowałoby przepełnienie stosu, więc może robisz jakieś sztuczki z kombinatorem Y? Ta odpowiedź mnie interesuje i wyjaśnienie byłoby miłe.Java - 113 znaków
Myślę, że pozostaje to w zgodzie z zasadą „bez samozwańczych metod”. Nie robi tego wprost, a nawet przechodzi przez konstrukcję języka Java.
Wersja skrócona:
źródło
""+this
naprawdę jest""+this.toString()
, więc metoda nazywa się sama.StringBuilder
tam obiekt.toString
będzie prawdopodobnie wywoływany z tego miejsca.toString()
metoda kończy siępublic java.lang.String toString() { return this.toString(); }
C, 19 bajtów
źródło
main.c:1:16: error: size of array 'i' is negative
mi to na gcc 4.8.1.main(){int i[~0U];}
Działa wersja bez znaku .sizeof(i)
to 16 GB. Czy użycie sufiksuul
lubull
robi różnicę? Niektóre systemy przepełniają pamięć i powodują awarię tylko wtedy, gdy pamięć jest zapisana.GolfScript (8 znaków)
Wynik:
Zasadniczo tworzy to mocno zagnieżdżoną strukturę danych, a następnie przepełnia stos przy próbie przekształcenia go w ciąg.
źródło
[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ [[[[[[[[[[[[[""]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] ]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] ]]]]]]]]]]]]]]]]] (and so on, output too long for comments)
333
i się zepsuje .333
była najmniejszą wartością, która się dla mnie złamała, ale jeśli masz inną wersję Ruby (lub może tę samą wersję na innym systemie operacyjnym, o ile wiem), może obsłużyć inną liczbę ramek stosu przed przepełnieniem.6.?
nadal działa bez dodawania znaków.Zestaw x86, składnia NASM, 7 bajtów
„Pëý” to 50 EB FD w systemie szesnastkowym i
w zestawie x86.
źródło
Ruby, 12 lat
Daje
Prawdopodobnie zależy od systemu, ale możesz dodać rzędy wielkości, podbijając ostatnią cyfrę w górę (niezalecane).
Edytuj dla wyjaśnienia: Podobnie jak w niektórych innych przykładach, tworzy ciąg
[][][]
... powtórzony 9000 razy, a następnie ocenia go: skrajna prawa[]
jest analizowana jako wywołanie funkcji do reszty i tak dalej. Jeśli faktycznie dojdzie do początku, wyrzuci błąd ArgumentError, ponieważ[]
jest to obiekt z[]
metodą wymagającą jednego argumentu, ale moja maszyna zgłasza błąd nieco zanim stos przekroczy dziewięć tysięcy.źródło
ruby
1.9.2 wyrzuca „ArgumentError: zła liczba argumentów (0 dla 1..2)”.ruby
1.8.7. Tam opublikowany kod działa zgodnie z opisem.def f;f;end;f
Rebol (11 znaków)
Wydajność:
Chociaż Rebol ma funkcje, zamknięcia i obiekty ... to nie definiuje żadnego z nich. Definiuje strukturę danych, która w paradygmacie kod jako dane może być traktowana jako kod za pomocą DO.
Z REPL możemy zbadać pytanie „co to jest S” :
Nigdy nie zamienia tego w funkcję, wywołuje ewaluator w bieżącym środowisku struktury.
źródło
C, 35 znaków
źródło
alloca(1)
jest w zasadzie przetłumaczony na,sub $1, %esp
więc stos nie zostanie zmieniony.Common Lisp, 7 znaków
źródło
#1=(#1#)
terminala(print #1=(#1#))
, ale twoje rozwiązanie jest o wiele lepsze.Python - 11 znaków
źródło
Kalkulator Casio, 11 naciśnięć klawiszy
W tym „języku” trudno jest policzyć bajty / tokeny - podałem wymaganą liczbę naciśnięć klawiszy, z wyłączeniem Shift, Alpha (drugi klawisz Shift) i
=
na końcu - z pewnością mieści się w 1 bajcie na naciśnięcie klawisza.Testowany na modelu fx-85GT PLUS , który jest standardowym kalkulatorem naukowym bez grafów, „nieprogramowalnym”. Inne modele będą działać.
Po prostu ułóż 11 korzeni kostki:
3√ 3√ 3√ 3√
3√ 3√ 3√ 3√
3√ 3√ 3√
Nie podaje nawet błędu składniowego dotyczącego brakującej liczby pod pierwiastkiem kwadratowym.
To nie wydaje się działać z pierwiastkami kwadratowymi.
Alternatywnie powtórz cos(31 razy.
Wynik
Uważam, że kwalifikuje się to jako przepełnienie stosu. Stos wydaje się niewielki ...
źródło
(((((((((((((((((((((((((
FORTH, 13 bajtów
przepełnia stos wartości
źródło
: X X ; X
(9) musi zostać przepełniony stos zwrotny:
...;
definicję słowa. Dodaje to co najmniej 6 znaków i co najmniej 2 dodatkowe, aby można było to wykonać jako program. Możesz być w stanie zrobić to krótsze, ale oto przykład:: F BEGIN 1 AGAIN ; F
. Sugeruję to, ponieważ pytanie brzmi: „Napisz program”. W każdym razie, dałem ci głos na Forth, niezależnie od liczby znaków! :-)Postscriptum, 7
Na przykład.
źródło
Haskell (GHC, bez optymalizacji), 25
suma jest leniwa w sumie. Spiętrza to mnóstwo grudek, a następnie próbuje je ocenić na końcu, co powoduje przepełnienie stosu.
źródło
LaTeX: 8 znaków
To jest ten sam kod użyty w tej odpowiedzi . Zasadniczo,
\end
makro powiększa się wielokrotnie, powodując przepełnienie komina:TeX capacity exceeded, sorry [input stack size=5000]
. Bardziej szczegółowe wyjaśnienie można znaleźć tutaj .źródło
PHP 5.4, 33 znaki
Powoduje to przepełnienie stosu, gdy zagnieżdżone obiekty stdClass są automatycznie niszczone:
źródło
Q / k (16 znaków)
Nie jestem pewien, czy jest to zgodne z duchem wyzwania, ale nie sądzę, że łamie to zasady:
źródło
Kilka w tym samym stylu:
Python, 30
JavaScript, 38
Lua, 44
źródło
x=lambda y:y(y);x(x)
jest krótszy (20 znaków). Ta funkcja nie jest rekurencyjna. x wywołuje dowolną funkcję przekazaną mu jako argument.->x{x[x]}[->y{y[y]}]
#@#&[#@#&]
C #:
106865846322832 : Getters mogą SO twoją maszynę łatwo w C #:
źródło
public int a {get{return a;}}
int a { get { return a; } }
INTERCAL, 12 bajtów
Wyjaśnienie:
NEXT
jest wersją wywołania podprogramu INTERCAL (lub przynajmniej najbliższą dostępną funkcją). Pcha aktualną pozycję naNEXT
stos i przeskakuje do podanej etykiety.Jeśli jednak
NEXT
długość stosu przekracza 80, otrzymujesz mniej więcej wersję INTERCAL przepełnienia stosu:Wypróbuj na Ideone. .
źródło
Mornington Crescent,
139133źródło
Zestaw X86 (AT&T), 33 znaki
Zauważ, że chociaż używam etykiety
main
jako celu skoku, nie jest to funkcja rekurencyjna.źródło
dd 0fdeb60
10 znaków!Python (17):
źródło
KeyError: 'unknown symbol table entry'