Jadi, Anda duduk di meja Anda, bermain golf program untuk menghitung 20 digit pertama pi, dan kemudian datang bos Anda dan melempar apel Anda ke luar jendela. Anda sekarang sedang mengerjakan proyek baru dan komputer ini belum memiliki kemampuan teks apa pun. Tidak ada Tanpa font. Tidak ada.
Sekarang mari kita selesaikan program itu. Hitung dan Tampilkan 20 karakter pertama pi tanpa menggunakan font apa pun yang bukan bagian dari program Anda. Output Anda dapat ditampilkan atau ditulis ke standar sebagai file gambar (jpeg, png, gif, svg (selama Anda tidak menggunakan karakter apa pun), bmp, xpm). Anda dapat menggunakan bahasa apa pun, tetapi Anda tidak dapat menggunakan fungsi font bahasa Anda, tampilan teks atau yang serupa.
bonus kecil (10 karakter) Jika itu akan berfungsi pada Lisa.
Sunting: bagi mereka yang tidak tahu inspirasi saya adalah mac pertama, dan judulnya adalah permainan kata-kata. Sebuah pujian besar untuk @Sukminder yang gif animasi-nya keren. Kontes belum berakhir jika jawaban yang lebih baik datang.
sumber
Jawaban:
Python, 222 karakter
Baris pertama menghitung digit pi menggunakan aproksimasi
pi-3 ~= 277991633/1963319607
. Tiga baris berikutnya menghasilkan 20 karakter pi menggunakan seni ASCII Nemeth Braille.Saya mendorong batas-batas dalam dua arah di sini, baik dalam pengertian "menghitung Pi" dan "dapat dibaca manusia".
sumber
*
ruang dan tanpa font?*
sebagai piksel hitam 1x1 dan `` sebagai piksel putih 1x1.*
tanpa menggunakan font, saya pikir Anda didiskualifikasiPython, 217 byte
Membutuhkan Perpustakaan Pencitraan Python
Hitungan byte mengasumsikan bahwa karakter yang lolos
\177
diganti dengan padanan literalnya (char 127 ).Output akan muncul sebagai berikut (ini akan terbuka di viewer * .bmp default Anda):
Perhatikan bahwa ini dapat dengan mudah diparameterisasi untuk mencetak sejumlah digit yang Anda suka. Berikut ini akan menerima input integer dari stdin, dan menampilkan banyak digit:
Output untuk n = 80 :
Perhitungan Pi
Yup, itu dia. Rumus yang digunakan adalah hasil dari penerapan Transform Euler ke Seri Leibniz , dan kemudian menghitung setiap istilah dari sisa jumlah. Rumus bertemu secara linear; setiap digit membutuhkan log 2 (10) ≈ 3.32 iterasi. Bagi yang tertarik dengan derivasi, lihat Lampiran A.
Tampilan
PIL digunakan untuk pembuatan gambar, karena ini adalah perpustakaan paling nyaman yang saya tahu. Sebuah bitmap kosong 141 × 11 hitam dan putih dibuat, dan kemudian garis-garis putih digambar di atasnya dalam mode tujuh segmen, satu piksel pada satu waktu. Posisi yang diperlukan untuk menggambar setiap segmen disimpan dalam string bitmask, dengan bit yang sesuai dengan posisi berikut:
Bit ajaib
(j%7/5*4-~j%7/4*~j/7+p,j%7*3%14%8+j%14/10+2)
menghasilkan masing-masing piksel dalam urutan berikut (basis-18):Lampiran A
Euler's Transform adalah teknik percepatan konvergensi yang berfungsi untuk semua seri yang menampilkan konvergensi monoton absolut. Seri yang dihasilkan akan konvergen secara linier, biasanya pada laju satu bit per term (perhatikan bahwa jika seri asli sudah super linier, seri yang dihasilkan akan konvergen lebih lambat). The deskripsi murni matematika agak sulit untuk diikuti, jadi saya akan mengambil pendekatan prosedural.
Kami akan mulai dengan Seri Leibniz:
Kemudian pisahkan setiap istilah menjadi dua, menggabungkan istilah tetangga:
Sederhana:
Generalisasi:
Perhatikan bahwa ½ pemimpin tidak memiliki istilah mitra, dan dengan demikian dikeluarkan dari sisa jumlah. Ini adalah istilah pertama dari seri yang diubah. Untuk menemukan istilah berikutnya, kami ulangi prosesnya lagi:
Dan lagi:
Dan lagi:
Dan sekali lagi untuk ukuran yang baik:
Pada titik ini kita memiliki lima istilah pertama, dan istilah keenam sudah jelas. Ini sudah cukup untuk digeneralisasi, jadi kita akan berhenti di sini. Kami akan mulai dengan memperhitungkan pembilang dan penyebut:
Penyebut jelas mengandung dua faktorial dari 2n + 1 , jadi kita akan menambal bahwa dalam:
Semuanya cocok, kecuali untuk dua istilah pertama yang memiliki 2 untuk penghitungan yang tidak terhitung dalam penyebut. Kami dapat memperbaikinya dengan mengalikan seluruh ekspresi dengan 2 :
2 3 = 2 · 4 , jadi:
Pembilang sekarang dapat dengan mudah diidentifikasi sebagai n!.
Perhatikan bahwa faktor yang ditambahkan ke setiap istilah berturut-turut, n / (2n +1) , mendekati ½ saat n menjadi besar, menyiratkan konvergensi linier pada laju satu bit per istilah - ini sebenarnya berdasarkan desain. Hasil yang bagus, tetapi akan lebih baik tanpa faktorial di sana. Apa yang dapat kita lakukan di sini adalah mempertimbangkan setiap istilah yang berurutan dari sisa jumlah, yang akan menghasilkan ekspresi bersarang:
Ini dapat ditulis ulang sebagai relasi berulang:
Di mana n dihitung mundur dari ⌈ log 2 (10) · d ⌉ .. 0 , di mana d adalah jumlah digit yang diperlukan.
Mungkin menarik untuk dicatat bahwa titik stabil dari perulangan ini adalah tepat 2 (atau 4 jika Anda telah menggandakannya, seperti yang saya miliki dalam penerapan di atas), sehingga Anda dapat menyimpan sejumlah iterasi dengan menginisialisasi dengan benar. Padahal, menginisialisasi ke nilai acak yang Anda butuhkan di tempat lain, dan melemparkan beberapa iterasi tambahan di atas umumnya lebih murah byte-bijaksana.
sumber
p
di dalamp/2 * x/p + ...
.. AIUI Python mendukung promosi otomatis ke datatype biginteger-ish, jadi itu seharusnya bukan hal yang presisi, tapi entah bagaimanap
itu penting dan jangan membatalkan seperti yang saya bayangkan mereka untuk ... apa yang saya lewatkan di sini?p
diinisialisasi aneh, sehinggap/2/p
setara - di bawah pembagian integer - ke((p-1)/2)/p
. Ini menghasilkan1/3
,2/5
,3/7
, dll istilah yang berasal di atas.#C - 777 KarakterC - 731 Karakter
Mencetak GIF ke
stdout
.3
.Menjahit bersama GIF dari tajuk yang sudah dikonfigurasi sebelumnya + setiap digit diwakili oleh font buatan rumah (tertanam) berukuran 5x5 piksel.
Perhatikan bahwa GIF menghilang, terkadang, di Chrome setelah satu kali proses.
Pengantar singkat:
Perhitungan PI
Pi dihitung menggunakan versi Dik Winter yang sedikit dimodifikasi dan implementasi Achim Flammenkamp dari Rabinowitz dan algoritma Wagon untuk menghitung angka π.
Generasi GIF
Gambar GIF memiliki
canvas
properti di header. Kita dapat menggunakan ini dalam kombinasi dengan menampilkan beberapa gambar dengan mengaturleft
properti untuk setiap digit yang sesuai - di mana setiap digit adalah gambar (tertanam) dalam dirinya sendiri.Dokumentasi.
Contoh:
Kode diperluas (dengan banyak komentar)
Berantakan, tetapi itu adalah bagian dari minimalisasi :
Mencari untuk menggunakan algoritma yang lebih pendek / lainnya untuk menghitung π.
sumber
JavaScript, 680 karakter
Ini dapat dilihat di browser web; angka-angka tersebut dikeluarkan sebagai jalur SVG.
Itu tidak menghitung pi dengan cara yang menarik, dan JS tidak memiliki tipe angka dengan presisi untuk menampilkan 20 digit.
Untuk menyimpan karakter, saya menghapus data jalur untuk "0", karena tidak muncul dalam urutan.
sumber
Java -
866860857853 karakter, ditambah versi curang dengan 574 karakterMenggunakan rumus Simon Plouffe dari tahun 1996, menghasilkan
x.png
file dengan angka seperti jam digital putih di latar belakang hitam:Ini adalah kode terkompresi:
Itu, dengan mengidentifikasi dan beberapa spasi putih akan menjadi ini:
Menyontek aturan dan mempertimbangkan bahwa perhitungan PI dapat dilakukan sebagai "representasi numerik dari String 3.1415926535897934384", ini dapat dikurangi menjadi 574 karakter:
sumber
Java -
642622 karakterMenyalin dari jawaban saya sebelumnya, menggunakan rumus Simon Plouffe dari tahun 1996. Tetapi menghasilkan ASCII-art sebagai gantinya:
Semua itu, dengan beberapa identifikasi dan spasi, dan sedikit bantuan bagi pembaca untuk memahami arti angka ajaib:
Keluaran:
sumber
C,
253250 karakterKira-kira pi menggunakan algoritma dalam kode @ Sukminder (sedikit meminjam dan refactoring kode mereka sedikit demi sedikit). Keluaran gambar biner PBM , yang kemudian dapat mis dikonversi dengan ImageMagick.
Seperti apa hasilnya dengan renderer PPM berbasis Braille saya:
Memiliki kekhasan yang sama dengan jawaban @ Sukminder karena tidak memiliki pemisah desimal. Selain itu, output tambang adalah vertikal, dan apakah itu dapat dibaca manusia dapat diperdebatkan ...
Edit: diterapkan saran @ ugoren.
sumber
puts
kefor
inisialisasi, menentukanL[5]
dan menghilangkan,0
. Buatd
parameter untukmain
(simpan koma).PHP 380
membutuhkan gd diaktifkan untuk output gambar
perhitungan pi: karena basis php memiliki presisi default 14 dan saya tidak ingin mengkompilasi ulang server dengan ekstensi presisi acak diaktifkan, saya bahkan tidak bisa mendekati PI dengan desimal yang diperlukan, jadi alih-alih menghitung tau / 2 lalu sisa desimal
karena grafik terbuat dari 0 dan 1, saya dapat mencoba menggunakan WBMP sebagai format nanti untuk melihat apakah saya dapat menghapus gd
sumber
3x5 with 1 px between chars
. warnanya merah hanya untuk mengurangi 4 karakter, tetapi mengingat bahwa saya tidak akan menang, saya akan mengubahnya menjadi putih agar mudah dibacaimagecreate
), doa pertama dariimagecolorallocate
set warna latar belakang, dan yang kedua diperlukan untuk mengatur warna tulisan. jadi berakhir lebih lamaPrinter C + LaserWriter 599 - 10 = 589
Pipa output ke LaserWriter Anda! :) Ini seharusnya bekerja pada Lisa (dengan kompiler C).
Ini menghitung
pi
dalam printer dengan menghitung jumlah panjang segmen garis yang mendekati urutan kurva Bezier yang kira-kira setengah lingkaran, dibagi dengan diameter, kali 2.PostScript Ungolfed Level-1 (kompatibel 1985):
Keluaran:
sumber
Java,
157426431934 karakterDikompresi 1934 karakter:
Diperluas 2643 karakter:
Metode pi dikumpulkan dari: /programming/8343977/calculate-pi-on-an-android-phone?rq=1
sumber
throws Exception
dalammain
dan menghapus blok try-catch. Selanjutnya, Anda dapat mengubah namapi
dansqrt
metode danloc
,args
,SCALE
,x0
danx1
variabel untuk 1 pengidentifikasi arang. Dan omong-omong Anda harus menambahkan kelas lengkap, ini termasukclass Foo{
deklarasi dan impor.