Tantangan
Diberi gambar langit, Anda harus menampilkan tutupan awan dalam okta. Gambar yang disediakan akan menjadi file gambar (jenisnya terserah Anda) dan hasilnya harus STDOUT.
Oktas
Dalam meteorologi, okta adalah unit pengukuran yang digunakan untuk menggambarkan jumlah tutupan awan di lokasi tertentu seperti stasiun cuaca. Kondisi langit diperkirakan dalam hal berapa banyak per delapan langit ditutupi awan, mulai dari 0 oktas (langit sepenuhnya cerah) hingga 8 oktas (sepenuhnya mendung).
Langit akan selalu menjadi gambar dari sekitar tengah hari (jadi, langit biru, bukan langit merah / malam).
Warna cloud akan selalu menjadi warna yang mengikuti pola berikut:
#ABCDEF
Di mana AB >= C0
, CD >= C0
dan EF >= C0
.
Atau, dalam RGB:
(A, B, C)
Di mana A >= 192
, B >= 192
dan C >= 192
.
Berikut adalah persentase cakupan yang terkait dengan okta:
0% - 0 oktas
12.5% - 1 okta
25% - 2 oktas
37.5% - 3 oktas
50% - 4 oktas
62.5% - 5 oktas
75% - 6 oktas
87.5% - 7 oktas
100% - 8 oktas
Persentase adalah persentase dari gambar yang cloud.
Jika Anda persentase cloud dari gambar Anda bukan kelipatan 12,5, Anda harus membulatkan ke terdekat.
Keluaran
Outputnya harus berupa angka okta (Anda tidak harus mengatakan unit).
Contohnya
1 okta (18.030743615677714% cloud)
0 okta (cloud 0,0%)
3 okta (cloud 42.66319444444445%)
1 okta (12.000401814778645% cloud)
Kode python digunakan untuk menghitung angka
Kemenangan
Kode terpendek dalam byte menang.
sumber
Jawaban:
Python 2 ,
11411098 byte-4 bytes berkat TheLethalCoder
-12 bytes berkat Ruud
Cobalah online!
sumber
191
sebagai gantinya?x&y&z&192>191
, tetapi versi yang diperbarui sama singkatnya.import PIL.Image as P
denganfrom PIL.Image import*
dan menyimpan 1 byte saat bergantii=P.open
kei=open
? Saya tidak tahu apakah itu akan menyebabkan masalah karena terbuka sudah merupakan fungsi yang ditentukan, tetapi saya tidak dapat menguji karena saya tidak memiliki kemampuan untuk menginstal modul.MATL ,
1817 byteContoh dijalankan dengan empat gambar yang disediakan (maaf tentang kualitas pratinjau; klik untuk resolusi penuh):
Atau hapus empat karakter terakhir untuk melihat hasilnya tanpa pembulatan:
Penjelasan
sumber
Java (OpenJDK 8) , 204 byte
Cobalah online! Saya selalu lupa bahwa TIO mengeluarkan STDERR ke tab debug .. Mungkin ini bisa seperti highlight merah jika ada kesalahan?
sumber
x
atauy
. Anda menetapkany=0
dua kali, sehingga Anda dapat menghapus tugas pertama. KelasColor
harus sepenuhnya memenuhi syarat (java.awt.Color
) atau Anda harus memasukkan impor dalam jumlah byte Anda. Dan kode Anda gagal untuk test case ke-4 (menghasilkan 0 bukannya 1).&&
to&
dan,y=0
ke,y
: Cobalah online.C #,
150146 byteDisimpan 4 byte berkat @Ian H.
Versi Lengkap / Terformat:
sumber
for(h=0 h<b.Height;++t)
Saya pikir Anda melewatkan titik koma di sana/0.125
dengan*8
di akhir untuk menghemat beberapa byte.C #, 313 byte
Jelas lebih lama dari jawaban saya yang lain tetapi yang ini menggunakan
LockBits
danunsafe
kode untuk secara langsung mengakses gambar dalam memori; karena itu sangat cepat. Saya mungkin bisa menghapus panggilanUnlockBits
tetapi itu lebih benar ada di sana.Versi Lengkap / Terformat:
sumber
PowerShell , 200 byte
Mendapat input
$args[0]
sebagai path file gambar penuh, membangunNew
Bitmap
objek menjadi$a
. Ini hanya nama objek internal; ini mendukung JPG, PNG, dll.Kami kemudian loop ganda melalui
.height
dan kemudian.width
gambar, menyentuh masing-masingpixel
. Kami mencabutR,G,B
nilai-nilai dan kemudian memilih orang-orang yang-g
reaterthanore
qual untuk192
dan pastikan bahwacount
ini3
(yaitu, semua dari mereka adalah putih-ish). Hasil Boolean itu ditambahkan ke akumulator kami$i
.Kami kemudian membagi untuk mendapatkan persentase, kalikan dengan
8
untuk mendapatkan jumlah okta, dan kemudian[int]
untuk mendapatkan hanya output integer. (Perhatikan bahwa ini melakukan Pembulatan Banker - jika itu tidak diizinkan, akan ada beberapa byte lagi untuk mengubah metode pembulatan.)sumber
dc, 74 byte
Input diambil sebagai file P3 ppm, dengan semua spasi putih sebagai baris baru. Output adalah ke STDOUT.
Cobalah online!
sumber
JavaScript,
8377 byte-6 bytes by ETHproductions
Input
Gambar # 1
Gambar # 2
Gambar # 3
Gambar # 4
Demo
Tampilkan cuplikan kode
sumber
a=>(b,c,d)
) alih-alih melakukana=>{b;c;return d}
ataua=>eval("b;c;d")
. Ini berfungsi kecuali jika Anda memiliki semacam loop, dalam hal ini Anda mungkin akan lebih baik menggunakaneval
metode ini.C (POSIX), 103 byte
Mengasumsikan input sebagai file BMP di stdin.
sumber
Kode Mesin x86, 34 byte
Byte kode ini mendefinisikan fungsi yang mengambil input bitmap dan mengembalikan nilai integer yang mengindikasikan oktas-nya. Seperti dalam C , array (seperti bitmap) direpresentasikan sebagai pointer ke elemen pertama dan ukuran / panjang. Dengan demikian, fungsi ini mengambil dua parameter: jumlah piksel dalam bitmap (baris × kolom) dan pointer ke bitmap itu sendiri.
Kode ini menggunakan konvensi panggilan berbasis register kustom, di mana pointer bitmap dilewatkan dalam
ESI
register dan ukuran bitmap dilewatkan dalamECX
register. Hasilnya (oktas), seperti biasa, dikembalikanEAX
.Seperti yang sudah dinyatakan di atas, input diambil sebagai bitmap. Secara khusus, format 32-bpp digunakan, dalam format little-endian, tetapi kanal alfa (byte orde tertinggi) diabaikan. Ini menyederhanakan banyak hal, memungkinkan kita untuk hanya mengulangi setiap piksel dan memeriksa nilai warna RGB 32-bitnya. Optimalisasi cerdas juga digunakan di sini. Alih-alih mengisolasi setiap komponen warna dan memeriksa apakah itu adalah> = 192, kami hanya menutupi seluruh nilai 32-bit dengan 0xC0C0C0 dan menguji apakah hasilnya adalah> = 0xC0C0C0. Ini akan mengevaluasi true untuk semua warna "cloud", dan false untuk semua warna "sky" (non-cloud). Yah, saya pikir itu pintar! :-) Ini tentu saja menghemat banyak byte.
Oleh karena itu, untuk menguji kode ini, Anda harus mengubah gambar input menjadi bitmap 32-bpp. Anda tidak dapat menggunakan Windows Paint untuk ini, karena mendukung maksimum 24 bit per piksel. Namun, ada sejumlah solusi perangkat lunak lain yang dapat melakukannya, seperti Adobe Photoshop. Saya menggunakan alat gratis ini , yang mengubah PNG menjadi 32-bpp BMP di Windows, artinya Anda hanya perlu mengonversi dari JPEG ke PNG (yang dapat dilakukan Paint).
Asumsi lain yang saya anggap sangat masuk akal:
DF
) diasumsikan jelas sehingga kita akan beralih dengan benar melalui bitmap menggunakanLODSD
instruksi. Ini adalah asumsi yang sama yang dibuat oleh kebanyakan konvensi pemanggilan x86, sehingga tampak adil. Jika Anda tidak menyukainya, tambahkan 1 byte ke hitungan untukCLD
instruksi.Mnemonik perakitan tidak dikumpulkan:
Tentunya Anda belum berhasil sampai sejauh ini dan masih bertanya-tanya bagaimana kodenya bekerja? :-)
Yah, ini sangat sederhana. Kami hanya mengulangi bitmap satu nilai 32-bit pada satu waktu, memeriksa untuk melihat apakah nilai RGB pixel "keruh" atau "tidak keruh". Jika mendung, kami menambah penghitung pra-nol kami. Pada akhirnya, kami menghitung: piksel berawan ⁄ total piksel × 8
(yang setara dengan: piksel berawan ⁄ total piksel ÷ 0,125).
Saya tidak dapat menyertakan tautan TIO untuk ini karena kebutuhan untuk memasukkan gambar. Namun, saya dapat memberi Anda harness yang saya gunakan untuk menguji ini pada Windows:
Berhati-hatilah dengan ini! Seperti yang didefinisikan di atas,
ComputeOktas
menggunakan konvensi pemanggilan kustom, yang tidak akan dihormati oleh kompiler C. Anda perlu menambahkan kode di bagian atas prosedur bahasa rakitan untuk memuat nilai dari tumpukan ke register yang diharapkan, misalnya :sumber
JavaScript (ES6), 218 byte
Mengambil
Image
objek sebagai input, yang dapat dibuat dari suatu<image>
elemen.Uji di sini di CodePen!
Alternatif
Jika input dapat diambil sebagai nilai rata-rata RGBA, dengan dimensi: 82 byte
Format input ini sangat mirip dengan apa yang disarankan jawaban ini pada meta .
sumber
Mathematica 89 byte
Berikut ini binarize gambar dan menentukan sebagian kecil awan, yaitu piksel putih. Kemudian menentukan berapa kali .125 cocok dengan hasilnya. Ini mengembalikan lantai dari nilai itu.
sumber