Tulis program yang mencetak warna RGB dari piksel yang diberikan pada layar.
Program harus membaca baris dari stdin dalam format x,y
, di mana x dan y adalah bilangan bulat yang tidak ditandatangani. Pixel (0,0) adalah piksel kiri atas pada layar.
Program kemudian harus menampilkan garis ke stdout dalam format RRR,GGG,BBB
, yang mewakili warna piksel pada ( x
, y
).
RRR
,, GGG
dan BBB
harus angka titik-mengambang antara 0 dan 1, ATAU bilangan bulat dalam rentang [0, 255]. Angka nol di depan tidak penting, misalnya: keduanya 074
dan 74
dapat diterima.
Perilaku tidak terdefinisi
Tidak apa-apa bagi program untuk menunjukkan perilaku tidak terdefinisi (crash, memberikan output yang salah, dll) dalam kondisi berikut:
- Pengguna memasukkan string, integer bertanda, float, atau tipe data tidak valid lainnya
- Input pengguna tidak dalam format
x,y
- Pixel yang ditentukan di luar layar
Catatan:
- Program tidak dapat memodifikasi piksel pada koordinat yang diberikan.
- Jika Anda memiliki banyak monitor, tidak masalah monitor mana yang pikselnya aktif, selama monitor yang sama digunakan setiap kali program dijalankan.
Jawaban dengan byte paling sedikit menang.
RRR
,,GGG
danBBB
menjadi titik mengambang antara 0 dan 1? Biasanya mereka bilangan bulat dalam kisaran[0,255]
. Saya sarankan untuk mengizinkan keduanya.RRR
,GGG
danBBB
di spec, tapiR
,G
,B
0, 0, 0
, mengalahkan tujuan tantangan.Jawaban:
Java 10 (fungsi lambda),
10575 byteSebuah fungsi mengambil dua parameter integer dan mengembalikan sebuah String
RRR,GGG,BBB
, di mana warnanya adalah integer dalam range[0, 255]
.-30 byte terima kasih kepada @LukeStevens dengan menggunakan keluaran
java.awt.Color
defaulttoString()
dan memodifikasinya sehingga hanya digit dan koma yang tersisa.Penjelasan:
CATATAN:
toString()
Implementasi default darijava.awt.Color
selalu sama di versi JVM sejauh yang saya tahu, tetapi berpotensi berubah di masa depan. Saya mengujinya di Java 8 dan Java 10 dan kembali"java.awt.Color[r=#,g=#,b=#]"
.Tapi, karena tantangannya menyatakan:
x,y
dari STDINR,G,B
menjadi STDOUTR
,G
,B
seperti mengambang poin dalam kisaran[0.0, 1.0]
Kode menjadi BANYAK lebih bertele-tele:
Java 10 (program penuh), 266 byte
Penjelasan:
sumber
x->y->(new java.awt.Robot().getPixelColor(x,y)+"").replaceAll("[^\\d,]","")
dengan 75 bytetoString()
darijava.awt.Color
. Terima kasih!toString()
cara juga ... ;-) Kecuali saya harus mengunduh IDE untuk melakukan semua itu: Saya hanya menggunakan TIO sekarang :(Color::toString
implementasi-diskresioner. Jadi mungkin lebih baik untuk menentukan JVM mana yang digunakan untuk pengujian (ini berfungsi seperti halnya dengan OpenJDK dan Oracle JDK)." "
dengan","
untuk mematuhiRRR,GGG,BBB
format ketat (bukanRRR GGG BBB
).6502 kode mesin (C64),
280260 byteSaya berharap ini akan dimungkinkan dalam byte yang jauh lebih sedikit, tapi sayangnya ... well, karena saya menyelesaikannya, mempostingnya sekarang. Setidaknya, format restriktif membantu dengan satu hal: Sesuatu yang mirip dengan
stdin
(input dari perangkat saat ini) hanya ada pada C64 dalam mode teks, karena OS hanya mendukung mode ini - jadi tidak perlu mempertimbangkan mode lain dari chip grafis .Catatan pada output nilai warna: chip grafis C64 tidak menggunakan warna RGB tetapi secara langsung menghasilkan sinyal video dengan warna YUV, dengan palet 16 warna tetap. Saya menggunakan nilai bulat dari konversi colodore ke RGB dengan pengaturan monitor "default" di sini.
-20 byte : rutin keluaran yang lebih baik, menyandikan keluaran 3 karakter per saluran warna dalam satu byte.
Mengenai komentar: Secara teori dimungkinkan untuk menggunakan mode karakter bahkan multicolor dari VIC dengan OS C64, tetapi membutuhkan font khusus yang benar-benar dapat dibaca dengan hanya 4 piksel horizontal dengan lebar dua kali lipat. Bukan sepenuhnya mustahil, tetapi sangat tidak mungkin. Demikian juga, mode warna yang diperluas (atau mode latar yang diperluas, yang sama) dapat digunakan dengan OS C64, tetapi mengharuskan untuk mengkonfigurasi ulang chip grafis secara langsung. Saya memilih untuk mengabaikan semua kemungkinan ini dalam arti kode golf di sini: Ini bukan lingkungan standar yang Anda temukan di Commodore 64 dengan menjalankan OS persediaan. Apa yang mungkin dengan OS persediaan beralih di antara dua font bawaan (shift + komodor key), program tidak memperhitungkan itu.
Demo online
Penggunaan:
SYS49152
untuk memulai.Berkomentar pembongkaran :
sumber
cc65
.. sangat mungkin :) tetapi setidaknya, kode yang dikompilasi akan lebih besar :)TI-BASIC (TI-83/84 +), 22 byte
Karena layarnya hitam dan putih, kita hanya perlu menguji apakah piksel yang ditentukan hidup atau mati dan memetakannya ke RGB hitam atau putih. Juga, piksel hanya dapat diakses melalui baris dan kolom dalam urutan itu, jadi itu sebabnya koordinatnya terbalik.
sumber
bash, 103/86 byte
Dengan interpretasi yang ketat dari spec (input dari STDIN dan output pada STDOUT keduanya dipisahkan koma):
Dengan format input yang lebih longgar (input yang dipisahkan plus sebagai argumen baris perintah, output yang dipisahkan spasi:
Tergantung pada imagemagick, awk, dan coreutils.
sumber
Perakitan TI-Nspire - 112 byte
Program ini menghasilkan bilangan bulat dalam kisaran 0-31 untuk R dan B dan 0-63 untuk G, karena perangkat ini menggunakan framebuffer RGB565. Ini menggunakan serial untuk input dan output.
Sumber:
sumber
Bash di Linux dengan xserver, 30 byte
Menggunakan ide yang disajikan dalam komentar saya pada pertanyaan, solusi ini harus mematikan output display sepenuhnya, dan kemudian menggemakan bahwa layar memang hitam.
Saya juga berpikir untuk menggunakan
xbacklight =0
, tetapi itu tidak mengubah warna piksel.sumber
Pustaka Python 2 + PIL,
9691 byteMenerapkan spesifikasi secara harfiah seperti yang diminta. Hanya Windows - tidak bekerja di Linux, dan menghasilkan output tambahan (nilai alfa) pada Mac.
sumber
from PIL import ImageGrab as i
→from PIL import*
,i.grab
→ImageGrab.grab
.__import__('...')
cara kerjanya.Mathematica, 69 Bytes
Hanya fungsinya 34 byte.
CurrentScreenImage[]~PixelValue~#&
Mengambil input dalam bentuk {x, y}.
Gambar adalah penggabungan gambar pada semua monitor. Jika Anda menginginkan layar tertentu, gunakan indeks integer - mis
CurrentScreenImage[1]
Program lengkap persis seperti yang ditentukan adalah 69 Bytes
CurrentScreenImage[]~PixelValue~ToExpression["{"<>InputString[]<>"}"]
sumber
AutoHotKey, 113 byte
Gunakan kotak dialog alih-alih stdin / stdout.
sumber
Bash + coreutils + scrot + netpbm, 90 byte
Versi I / O longgar
Mengambil
x
dany
sebagai argumen baris perintah yang terpisah.Cetakan
r
,g
,b
sebagai int 0-255 pada baris yang berbedaBash + coreutils + scrot + netpbm + bc + sed, 172 byte
Versi I / O yang ketat
Masukan pada stdin sebagai
x,y
Output pada stdout as
r.rr,g.gg,b.bb
(no newline).sumber
TI-BASIC (TI-83/84 +), 15 byte
Mengambil satu integer dari
Ans
dan satu dari prompt.rand(3)
membuat daftar 3 angka acak bukan nol, sehingga produk adalah nol jika pikselnya gelap.sumber