Najkrótszy program, który generuje błąd StackOverflow [zamknięty]


75

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 mainjava). Powinien korzystać z klas wybranego języka programowania.

I nie powinno to jawnie rzucać błędu.


4
Nie rozumiem „korzystania z klas wybranego języka programowania”
Prince John Wesley,

3
Czy można zdefiniować funkcję, która wywoła taką funkcję wewnętrzną def s{def t=s;t}?
Książę John Wesley,

12
W większości języków klasy stanowią jedynie specjalny rodzaj struktury danych, a nie centrum wszechświata. Wielu nawet nie ma czegoś takiego.
przestał obracać przeciwnie do zegara

1
Zabawne jest to, że języki wymagające eliminacji rekurencji ogona (i implementacje, które go obsługują, gdy języki tego nie wymagają) - które są w bardzo realnym sensie lepsze - są na tym niekorzystne. Odpowiedź TwiNight prowadzi do wersji tego, która istnieje w przepełnieniu stosu od samego początku.
dmckee,

1
Z dokumentu Java: Zgłaszane, gdy nastąpi przepełnienie stosu, ponieważ aplikacja zbyt głęboko się powtarza. docs.oracle.com/javase/6/docs/api/java/lang/…
jsedano

Odpowiedzi:


90

Befunge, 1

Nie wiem Befunge, ale ...

1

z kodu przepełnienia stosu golf


21
Objaśnienie: 1 to literał liczbowy, który jest wypychany na stos po napotkaniu. W Befunge, kontrola przepływu jest zawijana, aż napotka i @zakończy program.
histokrata

6
Nie wiedziałem, że na StackOverflow było to pytanie. Przed opublikowaniem szukałem tylko na tej stronie.
True Soft,

31
Jestem lekko pochlebiony, aby zobaczyć moją odpowiedź tutaj.
Patrick,

4
Działa to również w> <>.
Cruncher,

49

Python (2.7.3), 35 znaków

import sys
sys.setrecursionlimit(1)

Sama operacja się udaje, ale RuntimeError: 'maximum recursion depth exceeded'w konsekwencji zarówno skrypt, jak i interaktywny natychmiast ją wyrzucą .

Zainspirowany odpowiedzią Elssara.


Zastanawiałem się nad tym, by postawić to jako moje rozwiązanie, ale nie byłem pewien, czy błąd można uznać za przepełnienie stosu. Chociaż w gruncie rzeczy tak właśnie jest, prawda?
elssar

2
@elssar: Wydaje mi się, że istnieją dwa sposoby przepełnienia stosu: powiększ używaną część stosu lub zmniejsz nieużywaną część stosu. Jeśli wyobrażasz sobie, że wiadro wypełnia się wodą, możesz je przelać, dodając więcej wody, ale możesz również przelać je, zmniejszając wiadro.

19

Coq

Compute 70000.

70000jest po prostu cukrem syntaktycznym dla S (S ( ... (S O) ...))70000 S. Myślę, że to sprawdzanie typów powoduje przepełnienie stosu.

Oto ostrzeżenie, które jest drukowane przed wykonaniem polecenia:

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
To może pozwolić ci myśleć, że Coq jest niesamowicie głupim językiem ... zabawnym ...
przestał się obracać przeciwnie do zegara

1
@leftaroundabout Właściwie nie. Typ Nat jest cyfrą peano na poziomie typu, która musi działać tak, jakby była listą połączoną.
FUZxxl,

1
@FUZxxl: mój komentarz wcale nie miał na myśli ironii. Zdecyduj sam, czy chcesz włączyć klasyczną logikę do tego zdania, czy wolisz pozostać konstruktywnym ...
przestałem obracać przeciwnie do zegara

2
@leftaroundabout Ups ... przepraszam. Zapomniałem, że parser Markdown zawsze zjada te ładne tagi ironii.
FUZxxl

19

Java - 35

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

Czy OP nie powiedziało żadnych nowych zajęć? Nie widzę public static void maintam. A może po prostu nie rozumiem Java?
Braden Best

4
@ B1KMusic Nie ma nowych klas, jest tylko jedna klasa (S). Kod używa inicjatora statycznego, wyrzuca SO, zanim jvm zorientuje się, że nie ma głównej metody. Działa z java 6.
aditsu

1
Rozumiem blok statyczny. Ale jaki jest następny blok?
Nicolas Barbulesco

1
@NicolasBarbulesco To jest blok inicjalizujący, jest wykonywany podczas tworzenia nowej instancji.
aditsu

1
@LigiigiCortese Myślę, że działa tylko z java 6 lub starszą
aditsu

19

Javascript 24 znaki

Odpowiedź zależna od przeglądarki (musi mieć dostęp apply):

eval.apply(0,Array(999999))
  • eval była najkrótszą globalną nazwą funkcji, jaką udało mi się znaleźć (ktoś zna taką, która jest krótsza?)
  • applypozwala 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:

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

Uwaga - Z powodu jednowątkowego charakteru javascript nieskończone pętle ostatecznie blokują interfejs użytkownika i nigdy nie zgłaszają wyjątku.

while(1);
for(;;);

Żaden z nich się nie kwalifikuje.

Aktualizacja - goli trzy postacie:

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

MDN twierdzi, że evaljest najkrótszy.
Peter Taylor

5
eval.apply(0,Array(1e6))oszczędza 3 znaki, możesz nawet iść bez 9e9żadnych kosztów
ThinkChaos

1
applyjest 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 2 apply, ponieważ Arrayklasa nie istnieje w Netscape 2.
Konrad Borowski

1
nowy najkrótszy w ES6:eval(...Array(9e9))
Patrick Roberts

1
Prawdopodobnie niestandardowe, wrzuca Chrome z konsoli. dir.apply(0,Array(1e7));
Paul J

17

Python 2.7 (12 znaków)

exec('{'*99)

powoduje «s_push: przepełnienie stosu parsera»


4
RozumiemSyntaxError: unexpected EOF while parsing
Martin Thoma

1
Z exec('{'*101)dostajęMemoryError
Martin Thoma

4
W Python2 execznajduje się instrukcja, więc możesz po prostu użyć exec'{'*999(99 nie wydaje się wystarczająca)
gnibbler

Potrzebujesz co najmniej 100, aby wywołać błąd MemoryError. I ten ≠ przepełnienie stosu
noɥʇʎԀʎzɐɹƆ

13

Mathematica, 4 znaki

x=2x

$ RecursionLimit :: reclim: Przekroczono głębokość rekurencji 1024. >>


1
„Nie możesz zdefiniować funkcji, która się nazywa”
Tomas

13
To nie jest funkcja, to zmienna (chyba, że ​​wcale nie wygląda tak).
AMK

Wziąłeś mój pomysł.
PyRulez

12

Clojure, 12 znaków

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

Uruchamianie w replie:

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

Przypomina mi to wyrażenie rachunku lambda (\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.
Zwei,

12

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.

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

Wersja skrócona:

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

9
Tak ""+thisnaprawdę jest ""+this.toString(), więc metoda nazywa się sama.
True Soft,

1
@TrueSoft Dość pewna, że ​​Java wrzuca StringBuildertam obiekt. toStringbędzie prawdopodobnie wywoływany z tego miejsca.
Cruncher

1
Zanim kompilator i optymalizator są gotowe, toString()metoda kończy siępublic java.lang.String toString() { return this.toString(); }
Jonathan Callen

12

C, 19 bajtów

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

4
@Thomas Tak, jest to przepełnienie stosu na dowolnym komputerze, na którym zmienne lokalne są przydzielane na stosie. Ponieważ język C nie ma pojęcia wskazania przepełnienia stosu (to wszystko jest niezdefiniowane zachowanie; jeden z nich objawia się jako segfault), spełnia to pierwotne wymaganie.
Jens

OK, przepraszam, zaakceptowano.
Tomas

3
daje main.c:1:16: error: size of array 'i' is negativemi to na gcc 4.8.1. main(){int i[~0U];}Działa wersja bez znaku .
Csq

Nie działa dla mnie po ręcznym skonfigurowaniu stosu 4 GB.
FUZxxl,

@FUZxxl Ciekawe; czy masz ints 32-bit? Jeśli tak, sizeof(i)to 16 GB. Czy użycie sufiksu ullub ullrobi różnicę? Niektóre systemy przepełniają pamięć i powodują awarię tylko wtedy, gdy pamięć jest zapisana.
Jens

10

GolfScript (8 znaków)

{]}333*`

Wynik:

$ 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

Zasadniczo tworzy to mocno zagnieżdżoną strukturę danych, a następnie przepełnia stos przy próbie przekształcenia go w ciąg.


Dla mnie nie generuje to błędu, ale wyniki[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ [[[[[[[[[[[[[""]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] ]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] ]]]]]]]]]]]]]]]]] (and so on, output too long for comments)
ProgramFOX

@ProgramFOX, będzie pewna wartość, którą możesz zastąpić 333i się zepsuje . 333był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.
Peter Taylor

1
Przerywa się na 3192 na moim komputerze, więc 6.?nadal działa bez dodawania znaków.
Dennis

10

Zestaw x86, składnia NASM, 7 bajtów

db"Pëý"

„Pëý” to 50 EB FD w systemie szesnastkowym i

_loop:
push eax
jmp _loop

w zestawie x86.


8

Ruby, 12 lat

eval"[]"*9e3

Daje

SystemStackError: stack level too deep

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.


hmm ... rozbił się IRB: P
Klamka

Która wersja ruby1.9.2 wyrzuca „ArgumentError: zła liczba argumentów (0 dla 1..2)”.
manatwork

Znaleziono stary ruby1.8.7. Tam opublikowany kod działa zgodnie z opisem.
manatwork

Dziwne, działa na moich 1.8.7, 1.9.2 i 1.9.3.
histocrat

Ja bym powiedziałdef f;f;end;f
emblemat

8

Rebol (11 znaków)

do s:[do s]

Wydajność:

>> 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...

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” :

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

>> type? s
== block!

>> length? s
== 2

>> type? first s
== word!

>> type? second s
== word!

Nigdy nie zamienia tego w funkcję, wywołuje ewaluator w bieżącym środowisku struktury.


1
+1 ... Nie zauważyłem, że moja odpowiedź definiuje funkcję i to było niezgodne z regułami, ale zredagowałem moją odpowiedź, aby użyć DO ... i zauważyłem, że już przesłałeś tę odpowiedź. Właśnie usunąłem mój, ale odkąd napisałem, dlaczego to nie definiuje obiektu / funkcji / zamknięcia, pomyślałem, że zamieściłem twoje wyjaśnienie. Myślę też, że do do do do jest zabawne i warte włączenia. :-) Mam nadzieję, że w porządku!
Dr. Rebmu

7

C, 35 znaków

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

Po co przechowywać cokolwiek w wyznaczonym miejscu?
Peter Taylor

1
W takim przypadku nie można rozwiązać tego problemu w C.
FUZxxl,

3
@dmckee, Nie wszystkie błędy segmentacji są przepełnieniem stosu, ale powiedziałbym, że tak, ponieważ jest to wynikiem przekroczenia pojemności stosu.
ugoren

1
@dmckee, alloca przydziela ze stosu.
ugoren

1
@PeterTaylor: Prawdopodobnie zależy to od implementacji, ale w moim przypadku alloca(1)jest w zasadzie przetłumaczony na, sub $1, %espwięc stos nie zostanie zmieniony.
Job

7

Common Lisp, 7 znaków

#1='#1#

Piękne ... Planowałem użyć #1=(#1#)terminala (print #1=(#1#)), ale twoje rozwiązanie jest o wiele lepsze.
Protist

W rzeczywistości to nie przepełnia się w czasie odczytu, tylko przy próbie wydrukowania. Oprócz różnicy między 1 postacią twoja nie jest lepsza.
Protist

Masz rację, właśnie to wyedytowałem. Nie jestem pewien, czy istnieje sposób, aby spowodować przepełnienie w czasie odczytu.
Erik Haliewicz

Właściwie #. # 1 = '# 1 # powoduje przepełnienie czasu odczytu :-)
Erik Haliewicz

7

Python - 11 znaków

exec'('*999

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

Bardzo sprytne rozwiązanie.
mbomb007

7

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

Stack ERROR

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

Uważam, że kwalifikuje się to jako przepełnienie stosu. Stos wydaje się niewielki ...


Zawsze myślałem, że nazywa się to błędem stosu, ponieważ „zgromadziłeś” zbyt wiele korzeni: P
FlipTack

Mój kalkulator Canon podaje błąd stosu z niemal dowolnym operatorem (z wyłączeniem co najmniej +, -, * i /), jeśli jest powtarzany 25 lub więcej razy. Na przykład powoduje to błąd stosu (bez błędu składniowego):(((((((((((((((((((((((((
Steadybox

7

FORTH, 13 bajtów

BEGIN 1 AGAIN

przepełnia stos wartości


: X X ; X(9) musi zostać przepełniony stos zwrotny
AMK

nie zadziała (X nie jest zdefiniowany podczas definiowania połączenia i jest to samodzielne odwołanie / rekurencja
maniak ratchet

@ ratchetfreak, te słowa kontrolne mogą być używane tylko w stanie kompilacji, więc muszą być zawinięte w :... ;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! :-)
Darren Stone

6

Postscriptum, 7

{1}loop

Na przykład.

$ 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

LaTeX: 8 znaków

\end\end

To jest ten sam kod użyty w tej odpowiedzi . Zasadniczo, \endmakro 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 .


5

PHP 5.4, 33 znaki

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

Powoduje to przepełnienie stosu, gdy zagnieżdżone obiekty stdClass są automatycznie niszczone:

$ 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 za drugi występ PHP na CodeGolf!
Bojangles,

5

Q / k (16 znaków)

Nie jestem pewien, czy jest to zgodne z duchem wyzwania, ale nie sądzę, że łamie to zasady:

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

Szkoda, że ​​C # wymaga tyle pisania, że ​​zainspirowałeś moją odpowiedź!
Andrew Gray,

5

Kilka w tym samym stylu:

Python, 30

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

JavaScript, 38

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

Lua, 44

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

W Pythonie 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.
AMK

Ruby 2.0 -->x{x[x]}[->y{y[y]}]
John Dvorak

Mathematica#@#&[#@#&]
alephalpha

Używasz tylko rekurencji, więc dlaczego tego nie zrobić, na przykład w JS: (funkcja x () {x ()}) ()?
xem

@xem Wymagania mówią, że nie ma rekurencji, dlatego.
Danny

5

C #: 106 86 58 46 32 28

32 : Getters mogą SO twoją maszynę łatwo w C #:

public int a{get{return a;}}

1
Seter nie jest potrzebnypublic int a {get{return a;}}
Mike Koder

3
Narusza to zasadę „Nie wolno definiować funkcji, która sama się nazywa”. Wprawdzie jest ukryty za cukrem składniowym, ale wciąż nie ma sensu wyzwania.
Peter Taylor

Dodanie setera nieco omija regułę, ponieważ teraz masz dwie funkcje, które się do siebie wywołują. Zastanawiam się jednak: czy nadal narusza to intencje PO stojące za tym wyzwaniem?
Andrew Gray,

1
Rozumiem, jak rozumiem, aby znaleźć nadmiernie zagnieżdżoną rekurencję w interpretera lub standardowym interfejsie API języka. To może nie być zbyt łatwe w C #.
Peter Taylor

1
Dlaczego „ciąg publiczny”? „int” działa równie dobrze:int a { get { return a; } }
NPSF3000,

5

INTERCAL, 12 bajtów

(1)DO(1)NEXT

Wyjaśnienie:

NEXTjest wersją wywołania podprogramu INTERCAL (lub przynajmniej najbliższą dostępną funkcją). Pcha aktualną pozycję na NEXTstos i przeskakuje do podanej etykiety.

Jeśli jednak NEXTdługość stosu przekracza 80, otrzymujesz mniej więcej wersję INTERCAL przepełnienia stosu:

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

Wypróbuj na Ideone. .


6
„ZNIKNĄŁ W CZARNEJ LAGOONIE” Co to jest, ArnoldC?
Addison Crump

5

Mornington Crescent, 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

Zestaw X86 (AT&T), 33 znaki

Zauważ, że chociaż używam etykiety mainjako celu skoku, nie jest to funkcja rekurencyjna.

.globl main
main:push $0;jmp main

Fajny pomysł: jest to rodzaj rekurencji bez rekurencji!
Andrea Corbellini,

używając a86: dd 0fdeb6010 znaków!
Skizz,

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.