Jak zapewne wiecie, istnieje matematyczna frajda, że po dodaniu wszystkich liczb naturalnych otrzymamy ... -1/12 (patrz Wikipedia tutaj) .
Oczywiście jest to bardzo dziwny wynik i nie można go uzyskać, dodając tylko jedną liczbę, a następnie inną, ale niektóre specjalne sztuczki matematyczne.
Twoim zadaniem jest jednak napisanie programu, który wygląda tak , jakby próbował dodać wszystkie liczby naturalne, ale po uruchomieniu program zwraca -1/12.
W pseudokodzie może to wyglądać tak:
result = 0;
counter = 1;
while(true) {
result += counter;
counter ++;
}
println(result);
Możesz to zrobić w dowolny sposób - możesz wykorzystać przepełnienie bufora, grać z wyrzuconymi błędami, podczas gdy jakaś zmienna staje się zbyt duża lub po prostu ukryć kluczowe elementy w kodzie w sprytny sposób. Jedynymi warunkami jest to, że kod powinien na początku wyglądać, jakby próbował dodać wszystkie liczby naturalne, a po uruchomieniu zwraca -1/12 (w dowolnym formacie, może być dziesiętny, binarny, tekstowy, ascii).
Kod może oczywiście zawierać znacznie więcej niż pokazano powyżej, ale powinien być wystarczająco jasny, aby oszukać czytelnika.
To konkurs popularności - głosuj na najmądrzejszy pomysł!
źródło
Odpowiedzi:
do
Powinien działać na platformach gdzie zarówno
sizeof(float)
isizeof(int)
są 4 i następujący standard zmiennoprzecinkowej IEEE (chyba).Wersja 1:
Wynik:
-0.083
Wyjaśnienie:
Specjalne podziękowania dla @Geobits za pomysł zakończenia pętli poprzez porównanie sumy zamiast licznika.
Edycja: wersja 2
Wynik:
-0.083333
Wyjaśnienie:
źródło
79776
jest137A0
, co jest((int) "\rz") << 4
. Nie jestem jednak pewien, jak to jest przydatnewhile(!(abs<delta))
zamiastwhile(abs>delta)
upuścić czek NaN.Pyton
Wynik:
Więc jaka jest sztuczka?
źródło
Matematyka
(Uwaga: wklejenie tego do notatnika Mathematica prawdopodobnie ujawni, co się dzieje).
źródło
68+{0,37,46,37,31,36,40,33,48}
, ponieważPlus
ma tenListable
atrybut. Osobiście uważam to za bardziej idiomatyczne.do
Ładnie formatuje odpowiedź jako
-1/12
nie0.8333
.Jak to działa?
źródło
Brainfuck
Kod ocenia tylko 1 + 2 + 3 + ...
źródło
1 + 2 + 3 + ...
co oznacza, że 256 musiałoby być trójkątne,i == 256
jak również twierdzisz, ale 256 nie jest liczbą trójkątną. Ponadto, gdzie wyprowadza twój kod-1/12
?1/12
zamiast-1/12
(Szczęśliwy dzisiaj? +.
- -.
+ +.
+ Proszę głosować za mną.
) Te cztery.
służą do generowania.256
.i
stają się zerowe, gdy się do nich dostać256
(to miałem na myśli przez przepełnienie). W tym momencie pętla zewnętrzna kończy się, a następujące po niej linie (które wydają się komentarzem) są wykonywane, stąd wyjście-1/12
.Po prostu dodanie trochę lepszego zaciemnienia wyjścia z pętli do odpowiedzi asa.
Wskazówka, że nie ma przelewu ...
źródło
average=sum/i;
SIGFPE zostaje złapany przezhandler
drukowanie -1/12.unsigned int sum=3182065200L; printf("%.3f\n",*(float*) &sum);
to martwa gratka, że coś się tam dzieje, a fakt, że jest w module obsługi SIGFPE, sprawia, że jest to zbyt oczywiste dla moich gustów.Perl 6
Oblicza sumę za pomocą funkcji zeta. Użyłbym
[+] 1..*
(suma wszystkich liczb od 1 do nieskończoności), z wyjątkiem tego, że działa w nieskończonym czasie.źródło
Jawa
Dodaje to wszystkie liczby od 0 do wartości maksymalnej, pomnożone przez 12, a także dodaje 1 na końcu. Wynik to 0, dlatego suma liczb musi wynosić (0 - 1) / 12.
Wyjaśnienie:
źródło
Rubin
Próbny
Okej, przypuszczalna semantyka i składnia wyjściowa tutaj nie mają większego sensu, ale może nie jest to oczywiste na pierwszy rzut oka.
Zauważ też, że jest to w rzeczywistości niezależne od platformy Ruby i wersji. Zależy to od niektórych innych stałych zdefiniowanych zgodnie z oczekiwaniami.
źródło
do
Aby poradzić sobie z (prawie) nieskończoną sumą w rozsądnym czasie, skompiluj z następującymi opcjami dla niektórych optymalizacji kompilatora (wymagane):
Przykładowe dane wyjściowe:
źródło
??/
sztuczka z trigrafią już dawno przestała być sprytna. :(Jawa
Teoretycznie to zostanie wydrukowane
true
. Myślę jednak, że mój komputer rozpadnie się w pył, zanim skończy działać.źródło
-1/12
jest to zero. Zakładam więc, że jest to rodzaj przepełnienia, które powoduje zakończenie pętli i przypadkowesum
przepełnienie do zera?long
. Wszechświat prawdopodobnie już wtedy nie będzie istniał, ale to tylko teoretyczne, prawda? I tak, wszystkie dolne 32 bitysum
będą wynosić zero - dlatego ważne jest,sum
aby być anint
, a nielong
. Oczywiście, jak powiedział @ace, Java używa dzielenia liczb całkowitych do oceny-1/12
, więc jest zero.Jawa
Jak to działa:
Chciałbym móc zamieścić to jako spoiler, ale nie mogę wymyślić, jak to zrobić. Oto reszta kodu, który jest podstępnie ukryty.
źródło
Brak rozwiązań Haskell, nie do przyjęcia!
Możemy wykorzystać nieskończone listy Haskella, aby uzyskać dokładną odpowiedź!
Haskell:
Rozwiązanie jest dość proste, jeśli weźmiesz pod uwagę strzałki ....
Więc jaka jest sztuczka?
źródło
do
Zgodnie ze standardem C można to bardzo dobrze wydrukować,
Answer = -1/12
ponieważ wystąpi przepełnienie liczby całkowitej, które jest niezdefiniowanym zachowaniem. Znalezienie kompilatora, który to zrobi, pozostawia czytelnikowi ćwiczenie.źródło
printf
Matematyka
źródło
Python 3.x
Trochę nowy tutaj. Jakieś wskazówki?
źródło
JavaScript (ECMAScript 6)
Jak to działa:
1:
2:
3:
4:
źródło
C ++
Jeśli dwa
#define
s zostaną usunięte, kod nadal będzie prawidłowym kodem C ++ i faktycznie spróbuje (ale oczywiście nie powiedzie się) obliczyć sumę wszystkich liczb całkowitych.Jak to działa:
Biorąc pod uwagę pseudokod plakatu, nie mogłem się powstrzymać przed dodaniem tego. Wykorzystuje ten sam podstawowy i kolejny mały pomysł, ale nie sądzę, że jest tak elegancki.
Jak to działa:
I dlaczego nie powinieneś próbować go uruchomić:
źródło