Anda diberi nilai warna RGB. Tugas Anda sederhana: untuk menghitung rona, dalam definisi paling sederhana.
Katakanlah saluran dengan nilai tertinggi, menengah dan terendah adalah X, Y, Z (yang berwarna merah, hijau atau biru) dan nilainya adalah x, y, z. Rona warna ini adalah (h (X) -h (Y)) * (1 + (xy) / (xz)) / 2 + h (Y), di mana:
h(red) = 0 (or 360 if one of X or Y is blue)
h(green) = 120
h(blue) = 240
Input terdiri dari 3 bilangan bulat dari 0 hingga 255 yang tidak semuanya sama, dalam urutan yang konsisten. Outputnya bisa berupa float, atau bilangan bulat dibulatkan ke atas atau ke bawah, yang tidak harus konsisten. Jika bagian integer dari output adalah 0 atau 360, Anda dapat mencetak salah satunya.
Anda tidak dapat memanggil builtin untuk konversi ruang warna, termasuk konversi tersirat seperti saat memanipulasi gambar.
Ini adalah kode-golf. Kode terpendek menang.
Contohnya
Input: 0 182 255
Output: 197 (or 198)
Input: 127 247 103
Output: 110
Input: 0 0 1
Output: 240
Input: 255 165 245
Output: 307 (or 306)
Edit
Anda tidak harus mengikuti rumus yang tepat, tetapi hanya harus memberikan hasil yang sama dengan rumus di atas. Saya juga ingin melihat beberapa jawaban menggunakan rumus itu sendiri.
Jawaban:
Pyth, 27 byte
Demonstrasi. Uji harness.
Fomula diambil dari Wikipedia .
Intinya, langkah-langkahnya adalah:
.<QJxQKeSQ
: Roate nilai terbesar ke depan daftar.-Ft
: Ambil perbedaan dari dua nilai lainnya.-KhSQ
: Kurangi nilai minimum dari nilai maksimum.c
: Bagi 2 dengan 3.+ ... yJ
Tambahkan dua kali indeks dari nilai maksimum dalam daftar (0 jika R, 2 jika G, 4 jika B).% ... 6
: Mod 6, untuk memperbaiki masalah dengan negatif.*60
: Kalikan dengan 60 untuk mengkonversi ke derajat, dan cetak.sumber
C #,
188210206197191 byteTerima kasih kepada Sok karena telah menghemat 4 byte dan untuk SLuck49 karena telah menghemat 15!
sumber
z
satu kali dalam perhitungan output, dan Anda tidak menggunakannya dalam perhitungan sebelumnya, Anda menghapus variabel dan mengubah outputreturn(int)((c-d)*(1+(x-y)/(double)(x-a[0]))/2+d);
, menghemat Anda 4 byte.c
dand
tugas ke dalam pengembalian seperti inic=x==g?1:(x==b?2:(y==b?3:0)),d=y==g?1:(y==b?2:(x==b?3:0))
dan kemudianreturn(int)((c-d)*120*(1+(x-y)/(double)(x-a[0]))/2+d*120);
menyimpan 4 byte.double
? Jika Anda melakukannya, Anda dapat menggunakan ini sebagai gantinya(x-a[0])*1D
untuk menyimpan 5 byte lainnya.*1D
perkalian itu adalah trik yang bagus!System.Array
untuk 6 byte lainnya.Pyth,
41555351 byteMasukan diharapkan dalam bentuk
r,g,b
. Berikut penjelasannya:Disimpan 4 byte, terima kasih kepada @Jakube dan @isaacg
sumber
m*120d
->*L120
, simpaneeJ
keK
inline untuk menyimpan byte lain.L
operator menghasilkan kisaran pada int secara otomatis, setiap hari sepertinya hari shcool: o) Terima kasih!Javascript (ES6),
1451151081009790 bytePengembalian mengapung. Tetapkan ke fungsi yang akan digunakan.
Menyimpan 30 byte dengan mengurutkan semuanya ke dalam urutan operator ternary tunggal dan menunggu hingga akhir normal ke 0-360.
Berkat edc65, Vasu Adari, dan produk ETH untuk menghemat lebih banyak byte.
JSFiddle dengan tes. Coba di Firefox.
Jika menghapus deklarasi fungsi
h=
tidak sah, tambahkan 2 byte.sumber
return
. Saya percaya menghapus deklarasi fungsi (h=
) juga legal, sehingga totalnya turun menjadi 100.%6)*60
dan mitranya di sisi lain. Selain itu, menggunakan brute force pada penambahan (alih-alih menambahkan 6 di akhir) sebenarnya akan menghemat satu byte pada pengaturan Anda saat ini.(((x==r?(g-b)/m:x==g?2+(b-r)/m:4+(r-g)/m)+6)%6)*60
akan menjadi(x==r?6+(g-b)/m:x==g?8+(b-r)/m:10+(r-g)/m)%6*60
.(r,g,b)=>([m,_,M]=[r,g,b].sort((a,b)=>a-b),C=M-m,(M-r?M-g?r-g+4*C:b-r+2*C:g-b+6*C)/C%6*60)
Oktaf,
656050 byteSunting: Disimpan 10 byte berkat pawel.boczarski
Solusi perkiraan ...
Uji coba
Oktaf, 107 byte
Solusi orisinal (tepat) saya ...
Kode:
Dijelaskan:
Fungsi ini mengambil vektor yang berisi nilai R, G, B sebagai input
c
dan mengurutkan input dalam urutan menaikb
berisi nilai yang diurutkan [z, y, x]i
berisi bidang RGB yang terkait dengan setiap nilai dalam bVektor
h
diisi dengan nilai-nilai60*[6, 2, 4]
=[360, 120, 240]
(tetapi lebih pendek 3 byte)i(1) == 3
warna Biru ( ), dalam hal ini nilai rona pertama menjadi nol(i)
untuk mengatur ulangh
ke[h(Z), h(Y), h(X)]
urutanDari sana hanya transkripsi formula yang lurus. Anda bisa mencobanya di sini .
sumber
@(c)mod(atan2d(.866*c*[0;1;-1],c*[2;-1;-1]/2),360)
sepuluh byte lebih pendek dari definisi denganfunction
kata kunci.r=
fungsi anonim sebelum menyebutnya, kan?(@(c)mod(atan2d(.866*c*[0;1;-1],c*[2;-1;-1]/2),360))([127 247 103])
:, atau berpendapat bahwa Anda dapat menggunakanans
variabel segera setelah fungsi anonim ditentukan, sehingga penugasan tidak perlu untuk menyelesaikan definisi fungsi. Dalam satu tantangan ( codegolf.stackexchange.com/questions/54945 ) menangani fungsi perpustakaan Matlab yang ada diposting sebagai solusi lengkap.ans
dalam sampel. Terima kasih lagi!Pyth, 55
Saya tahu jawaban Sok mengalahkan saya, tetapi karena saya menyelesaikan jawaban saya tepat setelah dia diposting, saya pikir saya masih akan memposting. Ini adalah pertama kalinya saya menggunakan Pyth jadi saya yakin saya membuat beberapa kesalahan yang jelas.
Input diharapkan
r, g, b
. Anda bisa mencobanya di sini .sumber
255,165,245
.PowerShell,
232226222161 BytesLihat riwayat revisi untuk versi sebelumnya
Hoo boy, mari kita lihat apakah saya bisa berjalan melalui ini. Karena
\n
dihitung sama dengan;
saya meninggalkan garis istirahat untuk kejelasan.Baris pertama mengambil input sebanyak tiga
$args
dan menyimpannya$r, $g, $b
. Kami benar-benar hanya akan menggunakan$b
nanti, tetapi kami membutuhkan ketiganya agar|sort
bekerja dengan tepat. Ini membuat$z, $y, $x
argumen input input terkecil hingga terbesar.Pengaturan dua baris berikutnya
$c
dan$d
dengan menggunakan beberapa panggilan indeks-ke-an-array untuk mengatur angka-angka dengan tepat. Bekerja dari luar, kalau$x
ada-eq
ual ke$g
(yaitu, hijau adalah yang terbesar), kami menetapkan$c=1
... lain, jika$x
adalah-n
ote
qual ke$b
(yaitu, biru itu bukan yang terbesar)$c
adalah baik0
atau3
tergantung jika biru adalah yang terbesar kedua ... yang lain$c=2
,. Set logika serupa$d
.Kami kemudian menghitung dan mencetak output dengan yang berikut, yang hanya merupakan algoritma dari tantangan golf sedikit.
sumber
$z
saat menghitung$c
atau$d
, dan Anda hanya menggunakannya sekali dalam perhitungan output, jadi bisakah Anda menyingkirkan$z
seluruhnya dan menggantinya dengan$a[0]
?Rubi,
1179694 byteKode:
()
dan menggunakan variabel r, g, b.Contoh:
sumber
SWI-Prolog, 133 byte
Contoh:
a([255,165,245],Hue).
keluaranHue = 306.666666666666 .
Ini menggunakan rumus berikut:
Max = max(R,G,B)
,Min = min(R,G,B)
.Max = R
,U = 0
. Lain jikaMax = G
,U = 2
. LainU = 4
.Max = R
,I = G
danJ = B
. Jika tidakMax = G
,I = B
danJ = R
. LainI = R
danJ = G
.Z = U + (I - J)/(Max - Min)
Hue
apakahZ
atauZ + 360
jikaZ < 0
.sumber
Perl 5,
138132119 byteKode:
Komentar:
Tentunya Perl tidak dapat memenangkan tantangan seperti itu dengan semua golf Pyth'oresque. Tetapi saya bertanya-tanya apakah ini mungkin dilakukan hanya dengan 1 langkah perhitungan. Berkat modulus yang bekerja dengan baik. :)
Uji:
sumber
C ++ 276 byte
sumber
H
fungsi sendirian dalam jawabannya, seperti pada kode-golf fungsi mandiri adalah jawaban yang sah, setara dengan program penuh, vide meta diskusi: meta.codegolf.stackexchange.com/questions/2419/… . Ini akan membuat jawaban Anda lebih kompetitif (hemat 100 byte untuk casing Anda). Anda masih didorong untuk meninggalkan versi "penuh" program di bawah solusi untuk menyederhanakan pengujian.127 247 103
menghasilkan nilai yang tidak valid,-120
bukan110
.R, 125 byte
Sangat mirip dengan solusi Oktaf pengocok. Output titik mengambang.
Kode:
Contoh:
sumber
Python, 154 byte
Menerima daftar nilai. Tidak yakin apakah ini dapat diuraikan lebih lanjut. Ini dia ungolfed:
sumber
JavaScript 108
Metode alternatif.
JavaScript 194
Menggunakan metode contoh.
sumber