Seperti yang Anda ketahui ada fakta menyenangkan matematis bahwa jika Anda menambahkan semua bilangan asli, Anda akan mendapatkan ... -1/12 (lihat Wikipedia di sini) .
Tentu saja ini hasil yang sangat aneh dan tidak dapat diperoleh dengan hanya menambahkan satu angka diikuti oleh yang lain, tetapi beberapa trik matematika khusus.
Namun tugas Anda adalah menulis sebuah program, yang terlihat seperti mencoba untuk menambahkan semua bilangan asli, tetapi ketika Anda menjalankannya - ia mengembalikan -1/12.
Dalam pseudocode mungkin terlihat seperti ini:
result = 0;
counter = 1;
while(true) {
result += counter;
counter ++;
}
println(result);
Anda dapat melakukan ini dengan cara apa pun yang Anda suka - Anda dapat mengeksploitasi beberapa buffer overflow, bermain dengan kesalahan yang dilemparkan sementara beberapa variabel menjadi terlalu besar atau hanya menyembunyikan hal penting di sepanjang kode dengan cara yang cerdas. Satu-satunya syarat adalah bahwa kode tersebut harus pada awalnya terlihat seolah-olah ia mencoba untuk menambahkan semua bilangan asli dan ketika menjalankannya mengembalikan -1/12 (dalam format apa pun, itu mungkin desimal, biner, teks, ascii art apa pun).
Tentu saja kode dapat berisi lebih banyak, daripada yang ditunjukkan di atas, tetapi harus cukup jelas, untuk menipu pembaca.
Ini adalah kontes popularitas - pilih ide yang paling cerdas!
sumber
Jawaban:
C
Harus bekerja pada platform di mana keduanya
sizeof(float)
dansizeof(int)
4 dan mengikuti standar IEEE floating point (saya kira).Versi 1:
Keluaran:
-0.083
Penjelasan:
Terima kasih khusus kepada @Geobits untuk gagasan mengakhiri loop dengan membandingkan jumlah dan bukan penghitung.
Sunting: Versi 2
Keluaran:
-0.083333
Penjelasan:
sumber
79776
adalah137A0
, yang mana((int) "\rz") << 4
. Tidak yakin seberapa bermanfaat itu,while(!(abs<delta))
bukanwhile(abs>delta)
untuk menjatuhkan cek NaN.Python
Hasil:
Jadi apa masalahnya?
sumber
Mathematica
(Catatan: menempelkan ini ke notebook Mathematica kemungkinan akan mengungkapkan apa yang terjadi.)
sumber
68+{0,37,46,37,31,36,40,33,48}
, karenaPlus
memilikiListable
atribut. Secara pribadi, saya menemukan ini lebih idiomatis.C
Dengan baik format jawabannya sebagai
-1/12
, bukan0.8333
.Bagaimana itu bekerja?
sumber
Brainfuck
Kode hanya mengevaluasi 1 + 2 + 3 + ...
sumber
1 + 2 + 3 + ...
yang berarti 256 harus berbentuk segitigai == 256
seperti yang Anda klaim juga, tetapi 256 bukan angka segitiga. Juga, di mana output kode Anda-1/12
?1/12
bukan-1/12
(Selamat hari ini? +.
- -.
+ +.
+ Silakan pilih saya.
) Keempat.
ini untuk keluaran.256
.i
menjadi nol ketika sampai256
(itulah yang saya maksud dengan melimpah). Setelah titik ini, loop luar berakhir, dan baris berikut (yang tampak seperti komentar) dieksekusi, maka output dari-1/12
.Hanya menambahkan sedikit kebingungan yang lebih baik dari meninggalkan loop ke jawaban ace.
Tips tidak ada luapan ...
sumber
average=sum/i;
memberikan SIGFPE, tertangkap olehhandler
, mencetak -1/12.unsigned int sum=3182065200L; printf("%.3f\n",*(float*) &sum);
adalah hadiah mati bahwa ada sesuatu yang terjadi di sana, dan melihat bahwa ada di handler untuk SIGFPE membuat ini terlalu jelas untuk seleraku.Perl 6
Ini menghitung jumlah menggunakan fungsi zeta. Saya akan menggunakan
[+] 1..*
(jumlah semua angka antara 1 dan tak terbatas), kecuali yang berjalan dalam waktu yang tak terbatas.sumber
Jawa
Ini menambahkan semua angka dari 0 hingga nilai maksimum, dikalikan 12, dan juga menambahkan 1 di akhir. Hasilnya adalah 0, oleh karena itu jumlah angka harus (0 - 1) / 12.
Penjelasan:
sumber
Rubi
Demo
Oke, semantik output dan sintaksis yang seharusnya di sini tidak masuk akal, tapi mungkin itu tidak terlihat secara sepintas.
Perhatikan juga bahwa ini sebenarnya tidak tergantung pada Platform dan Versi Ruby. Itu tergantung pada beberapa konstanta lain yang didefinisikan seperti yang diharapkan.
sumber
C
Dalam rangka menangani (hampir) jumlah tak terbatas dalam jumlah waktu yang wajar, kompilasi dengan opsi berikut untuk beberapa optimisasi kompiler (diperlukan):
Output sampel:
sumber
??/
Trik trigraph telah lama berhenti menjadi pintar. :(Jawa
Secara teori, ini akan dicetak
true
. Namun, saya pikir komputer saya akan hancur menjadi debu sebelum selesai menjalankannya.sumber
-1/12
sebenarnya nol. Jadi saya menganggap itu adalah semacam perilaku overflow yang menyebabkan loop berakhir dan kebetulansum
meluap ke nol?long
. Alam semesta mungkin tidak akan ada lagi saat itu, tetapi ini hanya teoretis, bukan? Dan ya, 32 bit terbawah darisum
semuanya akan menjadi nol - itulah mengapa penting untuksum
menjadiint
, bukan along
. Tentu saja, seperti yang dikatakan @ace, Java menggunakan divisi integer untuk mengevaluasi-1/12
, jadi nol.Jawa
Bagaimana itu bekerja:
Seandainya saya bisa memposting ini sebagai spoiler tapi saya tidak tahu caranya. Inilah sisa kode yang tersembunyi secara tersembunyi.
sumber
Tidak ada solusi Haskell, tidak dapat diterima!
Kita dapat menggunakan daftar Haskell yang tak terbatas untuk mendapatkan jawaban yang tepat!
Haskell:
Solusi cukup lurus ke depan ketika Anda memperhitungkan panah ....
Jadi apa masalahnya?
sumber
C
Menurut standar C, ini bisa sangat baik dicetak
Answer = -1/12
karena akan ada limpahan bilangan bulat yang ditandatangani yang merupakan perilaku tidak terdefinisi. Menemukan kompiler yang akan melakukan ini dibiarkan sebagai latihan untuk pembaca.sumber
printf
Mathematica
sumber
Python 3.x
Agak baru di sini. Ada tips?
sumber
JavaScript (ECMAScript 6)
Bagaimana itu bekerja:
1:
2:
3:
4:
sumber
C ++
Jika kedua
#define
s dihapus kode masih akan menjadi kode C ++ yang valid dan benar-benar mencoba (tapi tentu saja gagal) untuk menghitung jumlah semua bilangan bulat.Bagaimana itu bekerja:
Mengingat pseudocode poster saya tidak bisa menolak untuk menambahkan ini. Ini menggunakan dasar dan ide kecil yang sama tapi saya tidak berpikir itu elegan.
Bagaimana itu bekerja:
Dan mengapa Anda tidak harus mencoba menjalankannya:
sumber