Kode warna yang benar

12

Warna asli (24-bit) di Wikipedia dijelaskan sebagai bagian yang terkait

24 bit hampir selalu menggunakan 8 bit dari masing-masing R, G, B. Pada 2018, kedalaman warna 24-bit digunakan oleh hampir setiap komputer dan tampilan telepon dan sebagian besar format penyimpanan gambar. Hampir semua kasus di mana ada 32 bit per piksel berarti 24 digunakan untuk warna, dan 8 sisanya adalah saluran alfa atau tidak digunakan.

2 24 menghasilkan 16.777.216 variasi warna. Mata manusia dapat membedakan hingga sepuluh juta warna [10] dan karena gamut layar lebih kecil dari kisaran penglihatan manusia, ini berarti ini harus mencakup kisaran itu dengan lebih detail daripada yang dapat dirasakan. ...

...

Sistem Macintosh menyebut warna 24-bit sebagai "jutaan warna". Istilah "True color" kadang-kadang digunakan untuk arti apa yang disebut artikel ini "warna langsung". [13] Ia juga sering digunakan untuk merujuk pada semua kedalaman warna yang lebih besar atau sama dengan 24.

Gambar yang mengandung 16.777.216 warna

Semua 16.777.216 warna

Tugas

Tulis sebuah program yang menghasilkan dan mengembalikan semua 16.777.216 variasi warna dalam sebuah array sebagai string dalam rgb()fungsi CSS

5.1. Fungsi RGB: rgb()danrgba()

The rgb()Fungsi mendefinisikan warna RGB dengan menentukan saluran merah, hijau, dan biru secara langsung. Sintaksnya adalah:

rgb() = rgb( <percentage>{3} [ / <alpha-value> ]? ) |
        rgb( <number>{3} [ / <alpha-value> ]? )
<alpha-value> = <number> | <percentage>

Tiga argumen pertama menentukan saluran merah, hijau, dan biru warna, masing-masing. 0%mewakili nilai minimum untuk saluran warna dalam gamut sRGB, dan 100%mewakili nilai maksimum. A <number>sama dengan a <percentage>, tetapi dengan rentang yang berbeda: 0sekali lagi mewakili nilai minimum untuk saluran warna, tetapi255mewakili maksimum. Nilai-nilai ini berasal dari fakta bahwa banyak mesin grafis menyimpan saluran warna secara internal sebagai satu byte, yang dapat menyimpan bilangan bulat antara 0 dan 255. Implementasi harus menghormati ketepatan saluran sebagaimana ditulis atau dihitung sedapat mungkin. Jika ini tidak memungkinkan, saluran harus dibulatkan ke nilai terdekat pada presisi tertinggi yang digunakan, mengumpulkan jika dua nilai sama-sama dekat.

Argumen terakhir, the <alpha-value>, menentukan alfa warna. Jika diberikan sebagai a <number>, kisaran nilai yang berguna adalah 0 (mewakili warna yang sepenuhnya transparan) hingga 1(mewakili warna yang sepenuhnya buram). Jika diberikan sebagai, 0%mewakili warna sepenuhnya transparan, sementara 100%mewakili warna sepenuhnya buram. Jika dihilangkan, defaultnya adalah 100%.

Nilai di luar rentang ini tidak valid, tetapi dijepit ke rentang yang ditentukan di sini pada waktu nilai-dihitung.

Untuk alasan sebelumnya, rgb()juga mendukung sintaks alternatif yang memisahkan semua argumennya dengan koma:

rgb() = rgb( <percentage>#{3} , <alpha-value>? ) |
        rgb( <number>#{3} , <alpha-value>? )

Juga karena alasan warisan, suatu rgba()fungsi juga ada, dengan tata bahasa dan perilaku yang identik dengannya rgb().

atau #RRGGBBformat notasi heksadesimal RGB

5.2. Notasi heksadesimal RGB:#RRGGBB

Notasi warna heks CSS memungkinkan warna ditentukan dengan memberikan saluran sebagai angka heksadesimal, yang mirip dengan bagaimana warna sering ditulis langsung dalam kode komputer. Ini juga lebih pendek daripada menulis warna yang sama dalam rgb()notasi.

Sintaks dari a <hex-color>adalah <hash-token>token yang nilainya terdiri dari 3, 4, 6, atau 8 digit heksadesimal. Dengan kata lain, warna heksa ditulis sebagai karakter hash, "#", diikuti oleh beberapa angka 0-9 atau huruf af (huruf huruf tidak masalah - #00ff00identik dengan #00FF00).

Jumlah digit hex yang diberikan menentukan cara mendekode notasi hex menjadi warna RGB:

6 digit

Pasangan digit pertama, ditafsirkan sebagai angka heksadesimal, menentukan saluran merah warna, di mana 00merupakan nilai minimum dan ff(255 dalam desimal) mewakili maksimum. Pasangan digit berikutnya, ditafsirkan dengan cara yang sama, menentukan saluran hijau, dan pasangan terakhir menentukan biru. Saluran alfa warna sepenuhnya buram.

CONTOH 2
Dengan kata lain, #00ff00mewakili warna yang sama dengan rgb(0 255 0)(hijau limau).

Lihat Draf Editor Modul Warna CSS Level 4

Contohnya

rgb()Fungsi CSS ( karakter spasi dapat diganti dengan karakter koma, misalnya, rgb(0 255 0))

// `rgb()` `<percentage>` as strings in resulting array
['rgb(0%,0%,0%)', ...,'rgb(0%,255%,0)', ...'rgb(255,255,255)']

// `rgb()` `<number>` as strings in resulting array
['rgb(0,0,0)', ...,'rgb(0,255,0)', ...'rgb(255,255,255)']

CSS RGB notasi heksadesimal RRGGBB

// RGB hexadecimal notation as strings in resulting array
['#000000', ...,'#00ff00', ...'#ffffff']

Kriteria menang

Bit terkecil digunakan untuk menulis program.

guest271314
sumber
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Mego

Jawaban:

8

R , 25 byte

sprintf("#%06X",1:2^24-1)

Cobalah online!

J.Apakah
sumber
Tidak terbiasa dengan R, tetapi apakah ini gagal menghasilkan # 000000?
nyanpasu64
2
Tidak, ini menghasilkan # 000000. Lihat tautan TIO
J.Doe
@ jimbo1qaz a:b-cmembuat vektor dari a-cmenjadi b-c, inklusif (itu membuat vektor dari ake b, lalu kurangi cdari setiap entri).
Arthur
2
Ahh, jadi R menentukan titik dua dengan prioritas lebih tinggi daripada aritmatika ... Tidak seperti irisan Python.
nyanpasu64
7

Python 2 , 77 40 39 37 byte

print['#%06X'%c for c in range(8**8)]

Cobalah online!

-1 byte berkat Digital Trauma

-2 byte terima kasih kepada dylnan

TFeld
sumber
2
Mengapa Anda membutuhkan lambda? Pemahaman daftar itu sendiri adalah jawaban yang valid, bukan?
Adirio
2
Coba 8**8alih-alih 1<<24menyimpan byte
Digital Trauma
2
bagaimana denganprint['...
dylnan
1
@Adirio Nilai saja tidak dihitung sebagai implementasi tantangan.
Jonathan Frech
2
@Adirio Anda sendiri menulis [...] di terminal Python [...] - jadi kiriman Anda akan ditulis dalam Python 2 REPL , bukan Python 2 .
Jonathan Frech
6

PowerShell , 28 26 byte

1..16mb|%{"#{0:x6}"-f--$_}

Cobalah online!

Loop dari 1ke 16mb(16777216). Setiap iterasi, kami menggunakan -foperator ormat yang bekerja pada nomor saat ini yang telah ditentukan sebelumnya --$_terhadap string "#{0:x6}". Di sini, kami menentukan xnilai dia , diisi 6digit, dengan hash #di depan. Pada TIO, output dibatasi hingga 60 detik / 128KiB. Ubah 1to (16mb-5)untuk melihat bagaimana itu berakhir .

AdmBorkBork
sumber
6

JavaScript (ES7), 65 62 61 byte

Disimpan 3 4 byte berkat @tsh

Mengembalikan array #RRGGBBstring.

_=>[...Array(n=8**8)].map(_=>'#'+(n++).toString(16).slice(1))

Cobalah online! (keluaran terpotong)

Arnauld
sumber
Gunakan solusi Python saat ini 8**8sebagai gantinya 1<<24. Ini akan bekerja pada JS juga.
tsh
5

Gangguan Umum, 42 byte

(dotimes(i 16777216)(format t"#~6,'0x "i))

Cobalah online!

Renzo
sumber
1
Mungkin format-golf pertama yang kulihat. Memberi +1 hanya berdasarkan itu saja.
Silvio Mayolo
4

Japt, 14 byte

Output sebagai #rrggbb.

G²³ÇsG ùT6 i'#

Cobalah (Terbatas pada 4096 elemen pertama)


Penjelasan

G                  :16
 ²                 :Squared
  ³                :Cubed
   Ç               :Map the range [0,result)
    sG             :  Convert to base-16 string
       ù           :  Left pad
        T          :   With 0
         6         :   To length 6
           i'#     :  Prepend "#"
Shaggy
sumber
Bahasa yang menarik. Adakah yang tahu mengapa huruf T digunakan untuk "0"? Saya mendapatkan 16 -> G untuk menyimpan byte, tetapi T -> 0 tidak mencapai hal yang sama.
Alec
@Alec Karena jika Anda mengganti T dengan 0, ia bergabung dengan 6 dan menjadi 06.
geokavel
Ah, mengerti. Jadi, apakah ada satu huruf per digit untuk kasus di mana Anda tidak ingin bergabung dengan digit sebelumnya / berikutnya?
Alec
@Alec, seperti yang dikatakan geokavel, dalam kasus khusus ini, saya menghemat satu byte karena harus menggunakan koma untuk membatasi 2 argumen yang diteruskan ù. Kasus penggunaan tipikal lainnya adalah menggunakannya sebagai penghitung saat Anda perlu menambahkan variabel, misalnya, memetakan di atas larik. Dan, tentu saja, karena merupakan variabel, Anda dapat dengan mudah memberikan nilai padanya, jika diperlukan. 0adalah satu-satunya bilangan bulat tunggal yang memiliki variabel sendiri, meskipun - well, secara teknis, 7 sebagai variabel input 6 U-Zdefault 0. Bilangan bulat lainnya ditugaskan untuk variabel dalam Japt adalah: -1, 10-16, 32, 64 & 100.
Shaggy
Jika Anda ingin mempelajari lebih lanjut tentang Japt, silakan ping saya di ruang obrolan kami .
Shaggy
3

05AB1E , 15 14 10 byte

15Ýh6ãJ'#ì

Cobalah online.

Penjelasan:

15Ý           # Create a list in the range [0, 15]
   h          # Convert each to a hexadecimal value
    6ã        # Create each possible sextuple combination of the list
      J       # Join them together to a single string
       '#ì    # And prepend a "#" before each of them
Kevin Cruijssen
sumber
3

Batch, 87 byte

@set s= in (0,1,255)do @
@for /l %%r%s%for /l %%g%s%for /l %%b%s%echo rgb(%%r,%%g,%%b)

Output dalam format CSS. Substitusi variabel terjadi sebelum forpernyataan diuraikan sehingga kode aktualnya adalah sebagai berikut:

@for /l %%r in (0,1,255)do @for /l %%g in (0,1,255)do @for /l %%b in (0,1,255)do @echo rgb(%%r,%%g,%%b)
Neil
sumber
2

C # (.NET Core) , 75 byte

()=>{int i=1<<24;var a=new string[i];for(;i-->0;)a[i]=$"#{i:X6}";return a;}

Cobalah online!

Port versi JAVA 10 dengan format string interpolasi C #

pocki_c
sumber
2

K (oK) , 19 byte

Larutan:

$(3#256)\'!16777216

Cobalah online! (terbatas pada 500 nomor pertama)

Penjelasan:

Buang string rgb. Ubah setiap angka antara 0 dan 16777216 menjadi basis 256, lalu konversikan ke string ...

$(3#256)\'!16777216 / the solution
          !16777216 / range 0..16777215
 (     )\'          / split each both
  3#256             / 256 256 256
$                   / string
streetster
sumber
2

MATL , 17 15 byte

10W:q'#%06X,'YD

Cobalah online!

Versi TIO menampilkan 2 ^ 10 pertama hanya sebagai tidak kehabisan waktu. Saya memasukkan iterasi terakhir di footer untuk menunjukkan bahwa itu memang berakhir #FFFFFF. Disimpan satu byte dengan mengubah fprintfdaripada merakit string secara manual. Menampilkan daftar yang dipisahkan koma.

Penjelasan

24W:q            % Range from 0 to 2^24-1
     '#%06X,'    % fprintf format spec (# followed by hexadecimal, zero-padded, fixed-width, followed by newline)
             YD  % Call fprintf. Internally loops over range.
Sanchises
sumber
2

APL (Dyalog Unicode) , 47 43 20 byte

'#',(⎕D,⎕A)[↑,⍳616]

Cobalah online!

22416⍴4⍴

Berkat @Dimaima dan @ngn untuk 23 byte.

Penggunaan ⎕IO←0.

Bagaimana:

'#',(⎕D,⎕A)[↑,⍳616]  Main function
               616   Generate every possible 6 digit hex number in a matrix format
              ,        Ravel the matrix (from a 16x16x16x16x16x16 matrix to a 16^6x2 list)
                      Mix; (turns the list into a 16^6x2 matrix)
    (⎕D,⎕A)[       ]  Use that matrix to index the vector of the digits 0-9 concatenated with the alphabet.
'#',                   Then prepend a '#' to each.
J. Sallé
sumber
1

Ruby , 31 byte

$><<("#%06x\n"*d=2**24)%[*0..d]

Cobalah online!

GB
sumber
Saya agak kagum %mengambil string yang panjang dan array yang panjang. FYI Anda dapat menyimpan byte dengan menggunakan hentian garis literal \n.
Jordan
1

V , 25 byte

8É00lrx16777215ñÄ<C-a>ñ0<C-v>Gls#

Cobalah online! (diganti 16777215oleh 31)

Penjelasan

8É0                                " insert 8 zeroes
   0l                              " move cursor to the second character
     rx                            " replace by x
       16777215ñ      ñ            " 16777215 times do ..
                Ä                  " .. duplicate line
                 <C-a>             " .. increment (leading 0x makes sure it uses hexadecimals)
                       0<C-v>      " move cursor to beginning of line and start selection
                             Gl    " select the column with 0x
                               s#  " replace by #
ბიმო
sumber
1

Batch, 69 + 4 = 73

g.cmd, 69

for /L %%A in (0,1,16777215)do cmd/kexit %%A&set #%%A=#!=exitcode:~2!

Menyimpan nilai heksadesimal dengan formulir #RRGGBBke dalam 'Array'.

g.cmddisebut menggunakan cmd /V/Q/K g.cmd. Di sinilah +4 berasal /V/Q,, dihitung sebagai 4 karakter tambahan dibandingkan dengan hanya cmd /K g.cmd. Ini mengatur lingkungan yang memiliki 'Array' di memori. Ini juga membutuhkan waktu selamanya untuk dijalankan, jadi gunakan nilai yang sangat rendah untuk mencoba atau menghentikan eksekusi menggunakanCtrl+C


Kerusakan

Invokasi

  • /Vmemungkinkan ekspansi tertunda, tetapi lebih pendek dari setlocal EnableDelayedExpansion, itulah sebabnya kami membutuhkan cmdpanggilan di tempat pertama
  • /Q menghilangkan output dan setara dengan @echo off
  • /Kmemungkinkan Anda menjalankan ekspresi (Dalam hal ini g.cmd) dan tidak keluar setelahnya, sehingga Anda dapat memeriksa 'Array' dengan menggunakanset #

g.cmd

for /L %%A IN (0,1,16777215) DO (
    cmd /k exit %%A
    set #%%A=#!=exitcode:~2!
)

Bit ini menggunakan trik yang didokumentasikan di sini untuk mengubah angka normal menjadi heksadesimal, kemudian menyimpan nilai itu menjadi 'Array'.


Saya telah memanggil bahwa struktur penyimpanan 'Array' tetapi itu sebenarnya tidak benar karena Array yang benar tidak ada di Batch. TETAPI Anda bisa memberi nama variabel sehingga memiliki nama seperti array, seperti:

set elem[1]=First element
set elem[2]=Second one

atau, seperti dalam kasus ini:

set #1=First element
set #2=Second one

Anda masih dapat mengaksesnya melalui !#%position%!


sumber
Saya tidak yakin. Tetapi mungkin /V/Q/Kdapat diklaim sebagai "argumen" untuk juru bahasa dan dihitung sebagai "3 + 69 = 72". meta
tsh
Saya tidak tahu itu dan akan memperbarui jawaban saya sesuai dengan itu. Thx @tsh
0

Groovy , 53 byte

c={a=[];(1<<24).times{a.add "".format("#%06x",it)};a}

Definisi fungsi. c () mengembalikan ArrayList (saya berasumsi itu bagus, bahkan melalui pertanyaan meminta array).

Tidak disatukan, dengan tipe implisit:

ArrayList<String> c = {
    ArrayList<String> a = []
    (1 << 24).times { 
        a.add("".format("#%06x", it)) // add the hex-formatted number to the list.
    }
    return a
}

Cobalah online!

archangel.mjj
sumber
0

Java 10, 87 84 byte

v->{int i=1<<24;var r=new String[i];for(;i-->0;)r[i]="".format("#%06X",i);return r;}

-3 byte terima kasih kepada @ archangel.mjj .

Cobalah online (terbatas pada 4,096item pertama ).

Penjelasan:

v->{                       // Method with empty unused parameter & String-array return-type
  int i=1<<24;             //  Integer `i`, starting at 16,777,216
  var r=new String[i];     //  Result String-array of that size
  for(;i-->0;)             //  Loop `i` in the range (16777216, 0]
    r[i]=                  //   Set the `i`'th item in the array to:
      "".format("#%06X",i);//   `i` converted to a hexadecimal value (of size 6)
  return r;}               //  Return the result-array
Kevin Cruijssen
sumber
Ah, Anda memposting ini ketika saya sedang menulis posting saya, jadi kami memiliki jawaban yang sangat mirip. Anda dapat meningkatkan tiga byte denganr[i]="".format("#%06X",i);
archangel.mjj
@ archangel.mjj Ah, saya idiot. Terima kasih! Saya benar-benar memiliki "".format("#%06X",i)sebelumnya sejak saya melihatnya dalam jawaban Python, tetapi saya menjatuhkan jawabannya karena saya tidak bisa membuatnya bekerja cukup cepat untuk TIO. Lalu saya melihat semua orang mengeluarkan 4,096item pertama di TIO, jadi saya menulis jawabannya lagi, melupakan "#%06X"...>. <
Kevin Cruijssen
@KevinCruijssen Saya tidak pernah tahu Anda bisa melakukannya var rdi Jawa ..
FireCubez
0

PHP, 68 62 byte

Ini seharusnya ditempatkan di dalam file, array dikembalikan pada akhirnya, agar dapat digunakan.

<?foreach(range(0,1<<24)as$i)$a[]=sprintf('#%06x',$i);return$a;

Untuk memiliki akses ke array, cukup berikan hasil dari include (misalnya:) $a = include 'xyz.php';ke variabel.


Terima kasih kepada @manatwork karena telah menyelamatkan saya 6 byte dan memperbaiki kesalahan.

Ismael Miguel
sumber
1
Apakah Anda yakin ini akan menghasilkan digit hex dengan %1$06dstring format? Dan saya tidak melihat alasan untuk menggunakan 1$. Anda bisa mengurangi panjang dengan memasukkan “#” dalam format string: #%06x. Yang akan berguna ketika menambahkan karakter tambahan untuk memperbaiki rentang, karena saat ini dihitung hingga 16777216 = # 1000000.
manatwork
Nah, itu akan .... Jika saya tidak lupa untuk mengubah %dke %x. Dan benar-benar lupa tentang memindahkan bagian #dalam sprintf()panggilan. Anda menyelamatkan saya 6 byte. Terima kasih
Ismael Miguel
0

MATL , 11 byte

'#'5Y26Z^Yc

Cobalah online! (dengan hanya tiga digit hex bukan enam)

Penjelasan

'#'   % Push this character
5Y2   % Push '01234567890ABCDEF'
6     % Push 6
Z^    % Cartesian power. Gives a (16^6)×6 char matrix
Yc    % String concatenation. '#' is implicitly replicated
      % Implicitly display
Luis Mendo
sumber
0

Bash + jot, 22

jot -w\#%06X $[8**8] 0

Cobalah online!

Trauma Digital
sumber
0

Lua , 47 45 byte

for i=1,8^8 do s='#%06X'print(s:format(i))end

Cobalah online!

Marcio Medeiros
sumber
1
Anda bisa melempar variabel Anda sdan menyimpan satu byte.
Jonathan Frech
0

T-SQL, 122 117 byte

Mengembalikan tabel #RRGGBBstring 16.777.216-baris . Istirahat baris hanya untuk keterbacaan:

WITH t AS(SELECT 0n UNION ALL SELECT n+1FROM t WHERE n<16777215)
SELECT'#'+FORMAT(n,'X6')FROM t option(maxrecursion 0)

Menggunakan CTE rekursif untuk tabel angka dari 0 hingga 2 ^ 24-1, kemudian menggunakan FORMATperintah bawaan (tersedia dalam SQL 2012 atau lebih baru) untuk mengubahnya menjadi string hex 6-digit . Pasang #ke depan, dan kita selesai.

Sunting 1: POWER()Fungsi dihapus , angkanya lebih pendek: P

BradC
sumber
0

Jelly , 8 byte

ØHṗ6”#;Ɱ

Cobalah online! (catatan: penggunaan 2daripada 6sebagai 6kali keluar pada TIO)

Pengiriman fungsi (karena program Jelly penuh akan, secara default, mencetak daftar string tanpa pembatas di antara mereka, sehingga sulit untuk melihat batas-batas). TIO link berisi pembungkus untuk mencetak daftar string menggunakan baris baru untuk memisahkannya.

Penjelasan

ØHṗ6”#;Ɱ
ØH         All hex digits (“0123456789ABCDEF”)
  ṗ6       Find all strings of 6 of them (order relevant, repeats allowed)
    ”#;    Prepend “#”
       Ɱ     to each of the resulting strings
ais523
sumber
1
Karena ketertarikan - mengapa Anda membuat jawaban Anda sebagai wiki komunitas?
Jonathan Frech
@JonathanFrech: Saya melakukan ini untuk semua posting saya karena a) mengurangi insentif bagi orang untuk memainkan sistem reputasi (karena posting tidak memberikan reputasi), b) Saya senang posting saya diedit dan komunitas- penanda wiki adalah cara untuk menunjukkan hal itu. Sistem reputasi Stack Exchange kurang lebih benar-benar rusak: pada akun masa lalu, saya pernah sengaja menutup ulang setiap hari selama seminggu untuk menunjukkan betapa mudahnya sistem itu untuk dimainkan. Saat ini saya sangat ingin tidak ada bagian di dalamnya, terutama karena reputasi yang lebih tinggi hanya membuat situs mencoba membujuk Anda untuk memoderasi itu.
ais523
Hanya ingin tahu - tumpukan apa yang Anda capai untuk memainkan sistem reputasi?
Jonathan Frech
@ JonathanFrech: Yang ini. Saya adalah pengguna 20k, tetapi akhirnya menghapus akun saya karena itu semacam mengacaukan hidup saya, dan karena sistem reputasi secara aktif mendorong saya untuk membuat konten yang membuat situs lebih buruk, bukan yang lebih baik.
ais523
0

PHP , 43 byte

<?php for(;$i<1<<24;printf("#%06X ",$i++));

Cobalah online!

Logern
sumber
1<<24-> 8**8harus bekerja di sini untuk, kredit ke @ Digitalitalia
Adirio
0

Perl 6 , 26 byte

{map *.fmt("#%06X"),^8**8}

Cobalah online!

Menggunakan format yang sama dengan orang lain. Waktu habis di TIO.

Atau, dalam format rgb:

31 byte

{map {"rgb($_)"},[X] ^256 xx 3}

Cobalah online!

Jo King
sumber
Saya pikir output rgb harus rgb(0, 0, 0)termasuk string rgb.
nwellnhof
@nwellnhof Diperbarui (meskipun akhirnya lebih pendek untuk melakukan heksadesimal)
Jo King