Codice colore vero


12

Il vero colore (24 bit) su Wikipedia è descritto nella parte pertinente come

24 bit utilizza quasi sempre 8 bit di ciascuno di R, G, B. A partire dal 2018 la profondità di colore a 24 bit viene utilizzata praticamente da tutti i display di computer e telefoni e dalla stragrande maggioranza dei formati di archiviazione delle immagini. Quasi tutti i casi in cui sono presenti 32 bit per pixel indicano che 24 sono utilizzati per il colore e gli altri 8 sono il canale alfa o non utilizzati.

2 24 offre 16.777.216 variazioni di colore. L'occhio umano può discriminare fino a dieci milioni di colori [10] e poiché la gamma di un display è più piccola della gamma della visione umana, ciò significa che questo dovrebbe coprire quella gamma con più dettagli di quanto si possa percepire. ...

...

I sistemi Macintosh si riferiscono al colore a 24 bit come "milioni di colori". Il termine "True color" viene talvolta utilizzato per indicare ciò che questo articolo chiama "Direct color". [13] Inoltre è spesso usato per riferirsi a tutte le profondità di colore maggiori o uguali a 24.

Un'immagine contenente tutti i 16.777.216 colori

Tutti i 16.777.216 colori

Compito

Scrivi un programma che genera e restituisce tutte le 16.777.216 variazioni di colore all'interno di un array come stringhe nella rgb()funzione CSS

5.1. Le funzioni RGB: rgb()ergba()

La rgb()funzione definisce un colore RGB specificando direttamente i canali rosso, verde e blu. La sua sintassi è:

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

I primi tre argomenti specificano rispettivamente i canali rosso, verde e blu del colore. 0%rappresenta il valore minimo per quel canale di colore nella gamma sRGB e 100%rappresenta il valore massimo. A <number>equivale a <percentage>, ma con un intervallo diverso: 0rappresenta nuovamente il valore minimo per il canale di colore, ma255rappresenta il massimo. Questi valori derivano dal fatto che molti motori grafici memorizzano i canali di colore internamente come un singolo byte, che può contenere numeri interi compresi tra 0 e 255. Le implementazioni dovrebbero rispettare la precisione del canale come creata o calcolata ove possibile. Se ciò non è possibile, il canale deve essere arrotondato al valore più vicino con la massima precisione utilizzata, arrotondando per eccesso se due valori sono ugualmente vicini.

L'argomento finale, il <alpha-value>, specifica l'alfa del colore. Se indicato come a <number>, l'intervallo utile del valore è 0 (che rappresenta un colore completamente trasparente) a 1(che rappresenta un colore completamente opaco). Se indicato come a, 0%rappresenta un colore completamente trasparente, mentre 100%rappresenta un colore completamente opaco. Se omesso, il valore predefinito è 100%.

I valori al di fuori di questi intervalli non sono validi, ma vengono bloccati agli intervalli qui definiti al momento del valore calcolato.

Per motivi legacy, rgb()supporta anche una sintassi alternativa che separa tutti i suoi argomenti con virgole:

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

Anche per motivi legacy, rgba()esiste anche una funzione, con grammatica e comportamento identici a rgb().

o #RRGGBBformato di notazione esadecimale RGB

5.2. Notazioni esadecimali RGB:#RRGGBB

La notazione del colore esadecimale CSS consente di specificare un colore fornendo i canali come numeri esadecimali, il che è simile al modo in cui i colori vengono spesso scritti direttamente nel codice del computer. È anche più breve della scrittura dello stesso colore in rgb()notazione.

La sintassi di a <hex-color>è un <hash-token>token il cui valore è composto da 3, 4, 6 o 8 cifre esadecimali. In altre parole, un colore esadecimale è scritto come un carattere hash, "#", seguito da un numero di cifre 0-9 o lettere af (il caso delle lettere non ha importanza - #00ff00è identico a #00FF00).

Il numero di cifre esadecimali fornite determina come decodificare la notazione esadecimale in un colore RGB:

6 cifre

La prima coppia di cifre, interpretata come un numero esadecimale, specifica il canale rosso del colore, dove 00rappresenta il valore minimo e ff(255 in decimale) rappresenta il massimo. La prossima coppia di cifre, interpretata nello stesso modo, specifica il canale verde e l'ultima coppia specifica il blu. Il canale alfa del colore è completamente opaco.

ESEMPIO 2
In altre parole, #00ff00rappresenta lo stesso colore di rgb(0 255 0)(un verde lime).

Vedi Redazione del modulo CSS Color Editor Livello 4

Esempi

rgb()Funzione CSS (il carattere spazio può essere sostituito da un carattere virgola, ad es. 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)']

Notazione esadecimale CSS RGB RRGGBB

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

Criteri vincenti

Minimi byte utilizzati per scrivere il programma.


I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat .
Mego,

Risposte:


8

R , 25 byte

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

Provalo online!


Non hai familiarità con R, ma questo non riesce a produrre # 000000?
nyanpasu64,

2
No, genera # 000000. Vedi il link TIO
J.Doe,

@ jimbo1qaz a:b-ccrea un vettore da a-ca b-c, incluso (crea un vettore da aa b, quindi sottrae cda ciascuna voce).
Arthur,

2
Ahh, quindi R specifica i due punti con precedenza più stretta dell'aritmetica ... A differenza delle sezioni Python.
nyanpasu64,

7

Python 2 , 77 40 39 37 byte

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

Provalo online!

-1 byte grazie a Digital Trauma

-2 byte grazie a Dylnan


2
Perché hai bisogno della lambda? La stessa comprensione dell'elenco è una risposta valida, no?
Adirio,

2
Prova 8**8invece di 1<<24salvare un byte
Digital Trauma

2
che ne diciprint['...
dylnan,

1
@Adirio Un valore da solo non conta come implementazione di una sfida.
Jonathan Frech,

2
@Adirio Tu stesso hai scritto [...] in un terminale Python [...] - quindi il tuo invio sarebbe scritto in REPL di Python 2 , non in Python 2 .
Jonathan Frech,

6

PowerShell , 28 26 byte

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

Provalo online!

Loop da 1a 16mb(16777216). Ogni iterazione, usiamo l' -foperatore ormat che agisce sul numero corrente pre-decrementato --$_rispetto alla stringa "#{0:x6}". Qui, stiamo specificando i suoi xvalori, imbottiti in 6cifre, con un hash #davanti. Su TIO, limitato a 60 secondi / 128 KiB di output. Cambia 1in (16mb-5)per vedere come finisce .


6

JavaScript (ES7), 65 62 61 byte

Salvati 3 4 byte grazie a @tsh

Restituisce una matrice di #RRGGBBstringhe.

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

Provalo online! (uscita troncata)


Utilizzare la soluzione Python corrente 8**8anziché 1<<24. Funzionerebbe anche su JS.
TSH


4

Japt, 14 byte

Uscite come #rrggbb.

G²³ÇsG ùT6 i'#

Provalo (limitato ai primi 4096 elementi)


Spiegazione

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 "#"

Lingua interessante. Qualche idea sul perché la lettera T sia usata per "0"? Ottengo 16 -> G per salvare un byte, ma T -> 0 non ottiene lo stesso risultato.
Alec,

@Alec Perché se sostituisci T con 0, si unisce a 6 e diventa 06.
geokavel

Ah, capito. Quindi c'è una lettera per cifra per i casi in cui non vuoi che si unisca alla cifra precedente / successiva?
Alec,

@Alec, come diceva geokavel, in questo caso particolare, mi fa risparmiare un byte nel dover usare una virgola per delimitare i 2 argomenti che vengono passati ù. Un altro caso d'uso tipico è quello di usarlo come contatore quando è necessario incrementare una variabile mentre, ad esempio, si esegue il mapping su un array. E, naturalmente, poiché è una variabile, puoi semplicemente assegnare un valore anche ad essa, se necessario. 0è l'unico numero intero a una sola cifra che ha la propria variabile, anche se, tecnicamente, 7 come U-Zpredefinito è la variabile di input 6 0. Gli altri numeri interi assegnati alle variabili in Japt sono: -1, 10-16, 32, 64 & 100.
Shaggy,

Se vuoi saperne di più su Japt, sentiti libero di chiamarmi nella nostra chat .
Shaggy,


3

05AB1E , 15 14 10 byte

15Ýh6ãJ'#ì

Provalo online.

Spiegazione:

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

3

Lotto, 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 in formato CSS. La sostituzione della variabile avviene prima fordell'analisi dell'istruzione, quindi il codice effettivo è il seguente:

@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)



2

K (oK) , 19 byte

Soluzione:

$(3#256)\'!16777216

Provalo online! (limitato ai primi 500 numeri)

Spiegazione:

Scarica le stringhe rgb. Converti ogni numero tra 0 e 16777216 in base 256, quindi converti in stringhe ...

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

2

MATL , 17 15 byte

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

Provalo online!

La versione TIO visualizza solo i primi 2 ^ 10 per non scadere. Ho incluso l'iterazione finale nel piè di pagina per dimostrare che effettivamente termina a #FFFFFF. Salvato un byte cambiando in fprintfinvece di assemblare manualmente la stringa. Emette un elenco separato da virgole.

Spiegazione

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.

2

APL (Dyalog Unicode) , 47 43 20 byte

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

Provalo online!

22416⍴4⍴

Grazie a @Dzaima e @ngn per i 23 byte.

Usi ⎕IO←0.

Come:

'#',(⎕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.

1

Rubino , 31 byte

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

Provalo online!


Sono un po 'stupito che %richiede una stringa così lunga e una matrice così lunga. Cordiali saluti, è possibile salvare un byte utilizzando un'interruzione di riga letterale anziché \n.
Giordania,

1

V , 25 byte

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

Provalo online! (sostituito 16777215da 31)

Spiegazione

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 #

1

Lotto, 69 + 4 = 73

g.cmd, 69

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

Salva il valore esadecimale con la forma #RRGGBBin un "array".

g.cmddeve essere chiamato usando cmd /V/Q/K g.cmd. Questo è da dove proviene il + 4 /V/Q, contando come 4 caratteri aggiuntivi rispetto al solo cmd /K g.cmd. Questo crea un ambiente che ha "Array" in memoria. Ci vuole anche un'eternità per funzionare, quindi usa valori molto bassi per provare a interrompere l'esecuzione usandoCtrl+C


Abbattersi

Invokation

  • /Vconsente un'espansione ritardata, ma è più breve di setlocal EnableDelayedExpansion, motivo per cui abbiamo bisogno della cmdchiamata in primo luogo
  • /Q omette l'output ed è equivalente a @echo off
  • /Kti consente di eseguire un'espressione (in questo caso g.cmd) e non esce successivamente, quindi puoi controllare la 'matrice' usandoset #

g.cmd

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

Questo bit usa un trucco documentato qui per convertire un numero normale in esadecimale, quindi salva quel valore in un "array".


Ho chiamato quella struttura di memorizzazione un "array", ma in realtà non è corretto in quanto non esistono array reali in Batch. MA puoi nominare le variabili in modo che abbiano nomi simili a array, in questo modo:

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

o, come in questo caso:

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

Puoi ancora accedervi tramite !#%position%!


Non ne sono sicuro. Ma forse /V/Q/Kpuò essere rivendicato come "argomento" per l'interprete e contare come "3 + 69 = 72". meta
tsh,

Non lo sapevo e aggiornerò la mia risposta di conseguenza. Thx @tsh

0

Groovy , 53 byte

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

Definizione della funzione c () restituisce un ArrayList (suppongo che vada bene, anche attraverso la domanda richiede un array).

Non golfato, con tipi impliciti:

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

Provalo online!


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 grazie a @ archangel.mjj .

Provalo online (limitato ai primi 4,096articoli).

Spiegazione:

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

Ah, hai postato questo mentre stavo scrivendo il mio post, quindi abbiamo risposte molto simili. È possibile migliorare di tre byte conr[i]="".format("#%06X",i);
archangel.mjj

@ archangel.mjj Ah, sono un idiota. Grazie! In realtà l'avevo già fatto da "".format("#%06X",i)quando l'ho visto nella risposta di Python, ma ho lasciato cadere la risposta perché non riuscivo a farlo funzionare abbastanza velocemente per TIO. Poi ho visto tutti appena in uscita i primi 4,096articoli su TIO, quindi ho scritto di nuovo la risposta, dimenticandomi di "#%06X"...>. <
Kevin Cruijssen

@KevinCruijssen Non ho mai saputo che si potesse fare var rin Java ..
FireCubez


0

PHP, 68 62 byte

Questo dovrebbe essere inserito in un file, l'array viene restituito alla fine, per essere utilizzabile.

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

Per accedere all'array, è sufficiente fornire il risultato dell'inclusione (ad es . $a = include 'xyz.php';:) a una variabile.


Grazie a @manatwork per avermi salvato 6 byte e risolto un problema.


1
Sei sicuro che questo produrrà mai cifre esadecimali con la %1$06dstringa di formato? E non vedo alcun motivo per l'utilizzo 1$. Si potrebbe ridurre la lunghezza includendo il “#” nella stringa di formato: #%06x. Il che sarebbe utile quando si aggiungono caratteri extra per correggere l'intervallo, poiché attualmente conta fino a 16777216 = # 1000000.
arte

Bene, sarebbe ... Se non dimenticassi di passare %da %x. E ho completamente dimenticato di spostare l' #interno della sprintf()chiamata. Mi hai salvato 6 byte. Grazie
Ismael Miguel,

0

MATL , 11 byte

'#'5Y26Z^Yc

Provalo online! (con solo tre cifre esadecimali anziché sei)

Spiegazione

'#'   % 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




0

T-SQL, 122 117 byte

Restituisce una tabella di #RRGGBBstringhe 16.777.216 righe . L'interruzione di riga è solo per leggibilità:

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

Utilizza un CTE ricorsivo per una tabella numerica da 0 a 2 ^ 24-1, quindi utilizza il FORMATcomando incorporato (disponibile in SQL 2012 o versioni successive) per trasformarlo in una stringa esadecimale a 6 cifre . Attaccare il #davanti e il gioco è fatto.

Modifica 1: POWER()funzione rimossa , il numero era più breve: P



0

Gelatina , 8 byte

ØHṗ6”#;Ɱ

Provalo online! (nota: utilizza 2anziché 6come 6timeout su TIO)

Invio di funzioni (poiché i programmi completi Jelly stampano, per impostazione predefinita, elenchi di stringhe senza delimitatori tra loro, rendendo difficile la visualizzazione dei limiti). Il collegamento TIO contiene un wrapper per stampare un elenco di stringhe utilizzando le nuove righe per separarle.

Spiegazione

Ø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

1
Per interesse - perché hai reso la tua risposta un wiki della community?
Jonathan Frech,

@JonathanFrech: lo faccio per tutti i miei post perché a) riduce l'incentivo per le persone a giocare nel sistema di reputazione (poiché il post non dà reputazione), b) sono felice di avere i miei post modificati e la community- wiki marker è un modo per indicarlo. Il sistema di reputazione di Stack Exchange è più o meno completamente rotto: su un account passato, una volta ho ripetuto intenzionalmente ogni giorno per una settimana per mostrare quanto fosse facile il gioco del sistema. Al giorno d'oggi praticamente non voglio farne parte, soprattutto perché una reputazione più elevata fa semplicemente provare a convincere il sito a moderarlo.
ais523,

Solo curioso: su quale stack hai raggiunto per giocare al sistema di reputazione?
Jonathan Frech,

@JonathanFrech: questo. Ero un utente di 20k, ma alla fine ho cancellato il mio account perché era un po 'incasinato la mia vita e perché il sistema di reputazione mi stava attivamente spingendo a rendere i contenuti che peggioravano il sito, al contrario di meglio.
ais523,



0

Perl 6 , 26 byte

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

Provalo online!

Utilizza lo stesso formato di tutti gli altri. Timeout su TIO.

Oppure, in formato rgb:

31 byte

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

Provalo online!


Penso che l'output di rgb dovrebbe rgb(0, 0, 0)includere la stringa rgb.
nwellnhof,

@nwellnhof Aggiornato (anche se è risultato più breve per fare esadecimali)
Jo King,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.