Jadi saya pikir kita semua mungkin pernah melihat komik xkcd ini :
:
Ini mungkin terlalu umum atau terlalu sulit, saya tidak yakin. Tetapi tantangannya adalah membuat program dalam bahasa apa pun yang menciptakan jendela yang memiliki setidaknya 2 warna dan menampilkan dalam kata-kata bahasa Inggris berapa persentase layar masing-masing warna.
ex. Solusi paling sederhana adalah latar belakang putih dengan huruf hitam bertuliskan "Persentase gambar ini berwarna hitam: [x]%. Persentase gambar ini berwarna putih: [y]%"
Anda bisa menjadi gila atau sesederhana yang Anda inginkan; teks biasa adalah solusi yang valid tetapi jika Anda membuat gambar menarik seperti di komik xkcd itu lebih baik! Pemenang akan menjadi solusi paling menyenangkan dan kreatif yang mendapat suara terbanyak. Jadi maju dan buat sesuatu yang menyenangkan dan layak untuk xkcd! :)
Jadi apa yang Anda pikirkan? Kedengarannya seperti tantangan yang menyenangkan? :)
Harap sertakan tangkapan layar program Anda yang berjalan dalam jawaban Anda :)
sumber
"/.*/"
(baca: [kode sumber] tidak mengandung baris baru)Jawaban:
Elm
Belum melihat orang menggunakan celah ini: demo
sumber
view source
diletakkan di sana oleh share-elm.com dan bukan merupakan bagian dari dikompilasi JS / HTML.JavaScript dengan HTML
Saya mencoba mereproduksi komik asli lebih tepatnya. Tangkapan layar diambil menggunakan pustaka html2canvas. Angka-angka dihitung berulang kali, sehingga Anda dapat mengubah ukuran jendela atau bahkan menambahkan sesuatu ke halaman secara real time.
Cobalah online: http://copy.sh/xkcd-688.html
Berikut screenshotnya:
sumber
Memproses, 222 karakter
Saya selalu ingin membuat versi komik saya sendiri! Cara paling sederhana (hanya?) Yang bisa saya pikirkan untuk melakukan ini adalah coba-coba - menggambar sesuatu, menghitung, menggambar lagi ...
Program ini menerima persentase yang akurat setelah beberapa detik. Ini tidak terlalu cantik, tetapi interaktif ; Anda dapat mengubah ukuran jendela dan itu akan mulai menghitung ulang.
Menambahkan beberapa baris baru untuk keterbacaan:
Ini hanya menunjukkan persentase piksel putih; Karena antialiasing teks, piksel non-putih belum tentu hitam. Semakin lama berjalan semakin banyak waktu yang dibutuhkan untuk memperbarui sendiri pada ukuran.
Sunting:Jadi, ini adalah tantangan kode; Saya semacam golf saja. Mungkin saya bisa menambahkan semacam grafik nanti, tetapi prinsip umum akan tetap sama. Interaktivitas adalah bagian yang rapi menurut saya.
sumber
background(-1)
bukannyabackground(255)
Tantangan besar. Inilah solusi saya. Saya mencoba untuk sedekat mungkin dengan komik asli, saya bahkan menggunakan font xkcd .
Ini aplikasi WPF, tapi saya biasa
System.Drawing
menggambar bagian karena saya malas.Konsep dasar: Di WPF, windows are
Visuals
, yang artinya dapat dirender. Saya render seluruh Window contoh ke dalam bitmap, hitung hitam dan total hitam atau putih (mengabaikan abu-abu dalam font smoothing dan barang-barang) dan juga menghitung ini untuk setiap 3 gambar (untuk setiap panel). Lalu saya melakukannya lagi pada timer. Mencapai keseimbangan dalam satu atau dua detik.Unduh:
MEGA Selalu periksa file yang Anda unduh untuk virus, dll, dll.
Anda harus menginstal font di atas ke sistem Anda jika Anda ingin melihatnya, jika tidak maka itu adalah WPF default.
XAML:
Kode:
Kode tidak dibersihkan, tetapi seharusnya agak terbaca, maaf.
sumber
C (dengan SDL dan SDL_ttf): Solusi Grayscale
Berikut adalah solusi yang mengambil keuntungan dari bentuk diagram lingkaran untuk menangkap spektrum lengkap warna piksel abu-abu, mencentang di bawah 100 garis.
Seperti dengan solusi saya sebelumnya, jalur ke file font perlu di-hardcode pada sumbernya atau ditambahkan ke perintah build, misalnya:
Output dari program terlihat seperti ini:
Yang satu ini menyenangkan untuk ditonton, karena semua matematika memperlambat redraws ke tempat Anda dapat melihat program nol dalam pada solusi stabil. Perkiraan pertama mati secara liar (karena permukaannya mulai hitam pekat), dan kemudian menyusut ke ukuran akhir setelah sekitar selusin atau lebih iterasi.
Kode berfungsi dengan menghitung jumlah populasi dari setiap warna piksel pada gambar saat ini. Jika jumlah populasi ini tidak cocok dengan yang terakhir, maka ia menggambar ulang gambar. Kode ini berulang di setiap piksel, tetapi mengubah koordinat x, y menjadi koordinat polar, menghitung pertama jari-jari (menggunakan pusat gambar sebagai asal). Jika jari-jarinya berada di dalam area diagram lingkaran, itu akan menghitung theta. Theta dengan mudah diskalakan ke jumlah populasi, yang menentukan warna piksel. Di sisi lain, jika jari-jari tepat di perbatasan pai pie, maka nilai anti-alias dihitung untuk menggambar lingkaran di luar bagan. Koordinat kutub membuat semuanya mudah!
sumber
float
versi fungsi matematika-library, tapi kemudian tidak harusfabs
menjadifabsf
?fabs()
lebih portabel.C (dengan SDL dan SDL_ttf)
Berikut ini adalah implementasi yang sangat sederhana, di sekitar 60 baris kode C:
Untuk mengkompilasi ini, Anda perlu mendefinisikan
FONTPATH
untuk menunjuk ke file .ttf font yang akan digunakan:Pada kebanyakan mesin Linux modern Anda dapat menggunakan
fc-match
utilitas untuk mencari lokasi font, sehingga perintah kompilasi menjadi:(Tentu saja Anda dapat mengganti font yang diminta dengan favorit pribadi Anda.)
Kode secara khusus tidak meminta anti-aliasing, sehingga jendela hanya berisi piksel hitam dan putih.
Akhirnya, saya terinspirasi oleh solusi elegan @ daniero untuk memungkinkan perubahan ukuran jendela. Anda akan melihat bahwa kadang-kadang program berosilasi di antara hitungan, terjebak dalam orbit di sekitar penarik yang tidak pernah bisa dijangkau. Ketika itu terjadi, ubah ukuran jendela sedikit sampai berhenti.
Dan, sesuai permintaan, inilah yang terlihat ketika saya menjalankannya di sistem saya:
Akhirnya, saya merasa bahwa saya harus menunjukkan, kalau-kalau ada orang di sini belum melihatnya, bahwa MAA menerbitkan wawancara dengan Randall Munroe di mana ia membahas pembuatan kartun # 688 secara rinci.
sumber
Gambar adalah 100x100 dan angka-angkanya tepat, dan maksud saya tepat - saya memilih gambar 10.000 piksel sehingga persentasenya dapat dinyatakan dengan dua tempat desimal. Metodenya sedikit matematika, sedikit menebak, dan beberapa angka berderak dengan Python.
Melihat seperti yang saya ketahui sebelumnya bahwa persentase dapat dinyatakan dalam 4 digit, saya menghitung berapa banyak piksel hitam dalam setiap digit 0 hingga 9, dalam Arial setinggi 8 piksel, yang merupakan teks yang ditulis. Saya menulis sebuah fungsi cepat
weight
yang memberi tahu Anda berapa banyak piksel yang diperlukan untuk menulis angka tertentu, dibiarkan kosong dengan nol untuk memiliki 4 digit:px
adalah array pemetaan digit ke jumlah piksel yang diperlukan. Jika B adalah jumlah piksel hitam, dan W adalah jumlah piksel putih, kami milikiB + W = 10000
, dan kami perlu:Dari mana konstanta itu berasal? 423 adalah "awal" jumlah piksel hitam, jumlah piksel hitam dalam teks tanpa angka. 9577 adalah jumlah piksel putih awal. Saya harus menyesuaikan jumlah piksel hitam awal beberapa kali sebelum saya berhasil mendapatkan konstanta sehingga sistem di atas bahkan memiliki solusi. Ini dilakukan dengan menebak dan menyilangkan jari saya.
Sistem di atas sangat tidak linier, jadi jelas Anda bisa melupakan penyelesaiannya secara simbolis, tetapi yang dapat Anda lakukan hanyalah mengulang-ulang setiap nilai B, atur W = 10000 - B, dan periksa persamaan secara eksplisit.
sumber
QBasic
Karena nostalgia.
Dan karena saya tidak benar-benar tahu perpustakaan gambar adalah bahasa modern.
Metode output-count-repeat yang cukup mudah. Hal utama yang "menarik" adalah bahwa program ini secara acak mencoba berbagai ketentuan untuk persentase - saya menemukan bahwa itu tidak selalu menyatu.
Dan hasilnya (diuji pada QB64 ):
sumber
AWK
... dengan netpbm dan pembantu lainnya
File 'x':
Lari:
Gambar ditulis sebagai 'x.pbm', saya mengonversinya menjadi png untuk diunggah:
sumber