Código de color verdadero

12

El color verdadero (24 bits) en Wikipedia se describe en la parte pertinente como

24 bits casi siempre usa 8 bits de cada uno de R, G, B. A partir de 2018, la profundidad de color de 24 bits es utilizada por prácticamente todas las computadoras y pantallas de teléfonos y la gran mayoría de los formatos de almacenamiento de imágenes. Casi todos los casos en los que hay 32 bits por píxel significa que se usan 24 para el color, y los 8 restantes son el canal alfa o no se usan.

2 24 da 16,777,216 variaciones de color. El ojo humano puede discriminar hasta diez millones de colores [10] y dado que la gama de una pantalla es más pequeña que el rango de la visión humana, esto significa que debe cubrir ese rango con más detalles de los que se pueden percibir. ...

...

Los sistemas Macintosh se refieren al color de 24 bits como "millones de colores". El término "color verdadero" se usa en ocasiones para referirse a lo que este artículo llama "color directo". [13] También se usa a menudo para referirse a todas las profundidades de color mayores o iguales a 24.

Una imagen que contiene los 16.777.216 colores.

Todos los 16.777.216 colores

Tarea

Escriba un programa que genere y devuelva las 16.777.216 variaciones de color dentro de una matriz como cadenas en la rgb()función CSS

5.1. Las funciones RGB: rgb()yrgba()

La rgb()función define un color RGB especificando los canales rojo, verde y azul directamente. Su sintaxis es:

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

Los primeros tres argumentos especifican los canales rojo, verde y azul del color, respectivamente. 0%representa el valor mínimo para ese canal de color en la gama sRGB y 100%representa el valor máximo. A <number>es equivalente a a <percentage>, pero con un rango diferente: 0nuevamente representa el valor mínimo para el canal de color, pero255representa el maximo. Estos valores provienen del hecho de que muchos motores gráficos almacenan los canales de color internamente como un solo byte, que puede contener enteros entre 0 y 255. Las implementaciones deben respetar la precisión del canal según lo creado o calculado siempre que sea posible. Si esto no es posible, el canal debe redondearse al valor más cercano con la mayor precisión utilizada, redondeando hacia arriba si dos valores están igualmente cerca.

El argumento final, el <alpha-value>, especifica el alfa del color. Si se da como a <number>, el rango útil del valor es 0 (que representa un color totalmente transparente) a 1(que representa un color totalmente opaco). Si se da como a, 0%representa un color totalmente transparente, mientras que 100%representa un color completamente opaco. Si se omite, su valor predeterminado es 100%.

Los valores fuera de estos rangos no son inválidos, pero están sujetos a los rangos definidos aquí en el tiempo de valor calculado.

Por razones heredadas, rgb()también admite una sintaxis alternativa que separa todos sus argumentos con comas:

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

También por razones heredadas, rgba()también existe una función, con una gramática y comportamiento idénticos rgb().

o #RRGGBBformato de notación hexadecimal RGB

5.2. Las notaciones hexadecimales RGB:#RRGGBB

La notación de color hexadecimal CSS permite especificar un color al dar a los canales como números hexadecimales, que es similar a cómo los colores a menudo se escriben directamente en el código de la computadora. También es más corto que escribir el mismo color en rgb()notación.

La sintaxis de a <hex-color>es un <hash-token>token cuyo valor consta de 3, 4, 6 u 8 dígitos hexadecimales. En otras palabras, un color hexadecimal se escribe como un carácter hash, "#", seguido de cierto número de dígitos 0-9 o letras af (el caso de las letras no importa, #00ff00es idéntico a #00FF00).

El número de dígitos hexadecimales determinado determina cómo decodificar la notación hexadecimal en un color RGB:

6 dígitos

El primer par de dígitos, interpretado como un número hexadecimal, especifica el canal rojo del color, donde 00representa el valor mínimo y ff(255 en decimal) representa el máximo. El siguiente par de dígitos, interpretado de la misma manera, especifica el canal verde, y el último par especifica el azul. El canal alfa del color es completamente opaco.

EJEMPLO 2
En otras palabras, #00ff00representa el mismo color que rgb(0 255 0)(un verde lima).

Vea el borrador del editor del módulo de color CSS Nivel 4

Ejemplos

rgb()Función CSS (el carácter de espacio se puede sustituir por el carácter de coma, por ejemplo, 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)']

Notación hexadecimal CSS RGB RRGGBB

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

Criterios ganadores

Menos bytes utilizados para escribir el programa.

invitado271314
fuente
Los comentarios no son para discusión extendida; Esta conversación se ha movido al chat .
Mego

Respuestas:

8

R , 25 bytes

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

Pruébalo en línea!

J.Doe
fuente
¿No está familiarizado con R, pero esto no puede salir # 000000?
nyanpasu64
2
No, sale # 000000. Ver el enlace TIO
J.Doe
@ jimbo1qaz crea a:b-cun vector desde a-chasta b-c, inclusive ( crea un vector desde ahasta b, luego resta cde cada entrada).
Arthur
2
Ahh, entonces R especifica dos puntos con mayor precedencia que la aritmética ... A diferencia de las rebanadas de Python.
nyanpasu64
7

Python 2 , 77 40 39 37 bytes

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

Pruébalo en línea!

-1 byte gracias a Digital Trauma

-2 bytes gracias a dylnan

TFeld
fuente
2
¿Por qué necesitas la lambda? La comprensión de la lista en sí es una respuesta válida, ¿no?
Adirio
2
Intente en 8**8lugar de 1<<24guardar un byte
Digital Trauma
2
¿qué talprint['...
dylnan
1
@Adirio Un valor por sí solo no cuenta como una implementación de un desafío.
Jonathan Frech
2
@Adirio Usted mismo escribió [...] en una terminal de Python, [...] por lo tanto, su envío se escribiría en Python 2 REPL , no en Python 2 .
Jonathan Frech
6

PowerShell , 28 26 bytes

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

Pruébalo en línea!

Bucles desde 1hasta 16mb(16777216). Cada iteración, utilizamos el -foperador ormat que actúa sobre el número actual pre-decrementado --$_contra la cadena "#{0:x6}". Aquí, estamos especificando los xvalores, rellenados con 6dígitos, con un hash #al frente. En TIO, limitado a 60 segundos / 128 KB de salida. Cambia 1a (16mb-5)para ver cómo termina .

AdmBorkBork
fuente
6

JavaScript (ES7), 65 62 61 bytes

Guardado 3 4 bytes gracias a @tsh

Devuelve una matriz de #RRGGBBcadenas.

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

Pruébalo en línea! (salida truncada)

Arnauld
fuente
Uso actual de la solución Python en 8**8lugar de 1<<24. También funcionaría en JS.
tsh
5

Lisp común, 42 bytes

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

Pruébalo en línea!

Renzo
fuente
1
Puede ser el primer formatgolf que he visto. +1 solo sobre esa base.
Silvio Mayolo
4

Japt, 14 bytes

Salidas como #rrggbb.

G²³ÇsG ùT6 i'#

Pruébelo (limitado a los primeros 4096 elementos)


Explicación

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 "#"
Lanudo
fuente
Lenguaje interesante ¿Alguna idea de por qué la letra T se usa para "0"? Obtengo 16 -> G para guardar un byte, pero T -> 0 no logra lo mismo.
Alec
@Alec Porque si reemplazas T con 0, se une con el 6 y se convierte en 06.
geokavel
Ah, te tengo. Entonces, ¿hay una letra por dígito para los casos en los que no desea que se una con el dígito anterior / siguiente?
Alec
@Alec, como dijo geokavel, en este caso particular, me ahorra un byte al tener que usar una coma para delimitar los 2 argumentos que se pasan ù. Otro caso de uso típico es usarlo como un contador cuando necesita incrementar una variable mientras, por ejemplo, mapea sobre una matriz. Y, por supuesto, como es una variable, simplemente puede asignarle un valor, si es necesario. 0es el único número entero de un solo dígito que tiene su propia variable, bueno, técnicamente, 7 como la variable de entrada 6 U-Zpredeterminada 0. Los otros números enteros asignados a las variables en Japt son: -1, 10-16, 32, 64 & 100.
Shaggy
Si desea obtener más información sobre Japt, no dude en enviarme un ping en nuestra sala de chat .
Shaggy
3

05AB1E , 15 14 10 bytes

15Ýh6ãJ'#ì

Pruébalo en línea.

Explicación:

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
fuente
3

Lote, 87 bytes

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

Salidas en formato CSS. La sustitución de la variable ocurre antes de foranalizar la instrucción, por lo que el código real es el siguiente:

@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
fuente
2

C # (.NET Core) , 75 bytes

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

Pruébalo en línea!

Puerto de la versión JAVA 10 con formato de cadena interpolada C #

pocki_c
fuente
2

K (oK) , 19 bytes

Solución:

$(3#256)\'!16777216

Pruébalo en línea! (limitado a los primeros 500 números)

Explicación:

Volcar cadenas rgb. Convierta cada número entre 0 y 16777216 a base 256, luego convierta a cadenas ...

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

MATL , 17 15 bytes

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

Pruébalo en línea!

La versión TIO muestra los primeros 2 ^ 10 solo para no agotar el tiempo de espera. Incluí la iteración final en el pie de página para mostrar que efectivamente termina en #FFFFFF. Se guardó un byte cambiando a en fprintflugar de ensamblar manualmente la cadena. Emite una lista separada por comas.

Explicación

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
fuente
2

APL (Dyalog Unicode) , 47 43 20 bytes

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

Pruébalo en línea!

224-16⍴4⍴

Gracias a @Dzaima y @ngn por los 23 bytes.

Usos ⎕IO←0.

Cómo:

'#',(⎕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é
fuente
1

Ruby , 31 bytes

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

Pruébalo en línea!

GB
fuente
Estoy un poco sorprendido de que %tome una cadena tan larga y una matriz tan larga. Para su información, puede guardar un byte utilizando un salto de línea literal en lugar de \n.
Jordania
1

V , 25 bytes

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

Pruébalo en línea! (reemplazado 16777215por 31)

Explicación

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 #
ბიმო
fuente
1

Lote, 69 + 4 = 73

g.cmd, 69

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

Guarda el valor hexadecimal con forma #RRGGBBen una 'matriz'.

g.cmdes ser llamado usando cmd /V/Q/K g.cmd. De aquí viene el + 4 /V/Q, contando como 4 caracteres adicionales en comparación con solocmd /K g.cmd . Esto configura un entorno que tiene la 'matriz' en la memoria. También tarda una eternidad en ejecutarse, así que use valores muy bajos para intentar o interrumpir la ejecución usandoCtrl+C


Descompostura

Invocación

  • /Vpermite la expansión retrasada, pero es más corta que setlocal EnableDelayedExpansion, por eso necesitamos lacmd llamada en primer lugar
  • /Q omite la salida y es equivalente a @echo off
  • /Kle permite ejecutar una expresión (en este caso g.cmd) y no sale después, por lo que puede verificar la 'matriz' utilizandoset #

g.cmd

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

Este bit utiliza un truco documentado aquí para convertir un número normal a un hexadecimal, luego guarda ese valor en una 'matriz'.


He estado llamando a esa estructura de almacenamiento una 'matriz', pero eso no es realmente correcto ya que las matrices verdaderas no existen en Batch. PERO puedes nombrar variables para que tengan nombres parecidos a matrices, así:

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

o, como en este caso:

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

Todavía puedes acceder a ellos a través de !#%position%!


fuente
No estoy seguro. Pero tal vez /V/Q/Kse pueda reclamar como "argumentos" para el intérprete y contar como "3 + 69 = 72". meta
tsh
No lo sabía y actualizaré mi respuesta en consecuencia. Thx @tsh
0

Groovy , 53 bytes

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

Definición de funciones. c () devuelve una ArrayList (supongo que está bien, incluso a través de la pregunta pide una matriz).

Sin golf, con tipos implícitos:

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

Pruébalo en línea!

archangel.mjj
fuente
0

Java 10, 87 84 bytes

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

-3 bytes gracias a @ archangel.mjj .

Pruébelo en línea (limitado a los primeros 4,096artículos).

Explicación:

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
fuente
Ah, publicaste esto mientras escribía mi publicación, así que tenemos respuestas muy similares. Puede mejorar en tres bytes conr[i]="".format("#%06X",i);
archangel.mjj
@ archangel.mjj Ah, soy un idiota. ¡Gracias! En realidad lo había hecho "".format("#%06X",i)antes desde que lo vi en la respuesta de Python, pero descarté la respuesta porque no pude hacer que funcionara lo suficientemente rápido para TIO. Luego vi a todos simplemente sacando los primeros 4,096elementos en TIO, así que escribí la respuesta nuevamente, olvidando "#%06X"...>. <
Kevin Cruijssen
@KevinCruijssen Nunca supe que podías hacer var ren Java ..
FireCubez
@FireCubez Es nuevo desde Java 10. :) Aquí un consejo relevante para ver qué es y qué no es posible varen Java.
Kevin Cruijssen
0

PHP, 68 62 bytes

Se supone que esto se coloca dentro de un archivo, la matriz se devuelve al final, para ser utilizable.

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

Para tener acceso a la matriz, simplemente dé el resultado de la inclusión (por ejemplo:) $a = include 'xyz.php';a una variable.


Gracias a @manatwork por guardarme 6 bytes y arreglar un error.

Ismael Miguel
fuente
1
¿Estás seguro de que esto generará dígitos hexadecimales con la %1$06dcadena de formato? Y no veo ninguna razón para usar 1$. Se podría reducir la longitud mediante la inclusión de la “#” en la cadena de formato: #%06x. Lo que sería útil al agregar caracteres adicionales para corregir el rango, ya que actualmente cuenta hasta 16777216 = # 1000000.
manatwork
Bueno, sería .... Si no se olvidó de cambiar %da %x. Y se olvidó por completo de mover el #interior de la sprintf()llamada. Me salvaste 6 bytes. Gracias
Ismael Miguel
0

MATL , 11 bytes

'#'5Y26Z^Yc

Pruébalo en línea!(con solo tres dígitos hexadecimales en lugar de seis)

Explicación

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

Lua , 47 45 bytes

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

Pruébalo en línea!

Marcio Medeiros
fuente
1
Podría lanzar su variable sy guardar un byte.
Jonathan Frech
0

T-SQL, 122 117 bytes

Devuelve una tabla de #RRGGBBcadenas de 16.777.216 filas . El salto de línea es solo para legibilidad:

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

Utiliza un CTE recursivo para una tabla numérica de 0 a 2 ^ 24-1, luego usa el FORMATcomando incorporado (disponible en SQL 2012 o posterior) para convertirlo en una cadena hexadecimal de 6 dígitos . Adjunte el #al frente, y hemos terminado.

Edición 1: POWER()función eliminada , el número era más corto: P

BradC
fuente
0

Jalea , 8 bytes

ØHṗ6”#;Ɱ

Pruébalo en línea! (nota: utiliza en 2lugar de 6como 6tiempo de espera en TIO)

Envío de funciones (porque los programas completos de Jelly, por defecto, imprimirán listas de cadenas sin delimitadores entre ellas, lo que dificultará ver los límites). El enlace TIO contiene un contenedor para imprimir una lista de cadenas usando nuevas líneas para separarlas.

Explicación

Ø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
fuente
1
Fuera de interés: ¿por qué hizo que su respuesta fuera un wiki comunitario?
Jonathan Frech
@JonathanFrech: hago esto para todas mis publicaciones porque a) reduce el incentivo para que las personas jueguen con el sistema de reputación (ya que la publicación no da reputación), b) estoy feliz de que mis publicaciones sean editadas y la comunidad El marcador wiki es una forma de indicar eso. El sistema de reputación de Stack Exchange está más o menos roto por completo: en una cuenta anterior, una vez volví a tapar intencionalmente todos los días durante una semana para mostrar lo fácil que era el sistema para jugar. Hoy en día no quiero participar en él, especialmente porque una reputación más alta simplemente hace que el sitio intente persuadirlo para que lo modere.
ais523
Simplemente curioso: ¿en qué pila lograste jugar con el sistema de reputación?
Jonathan Frech
@ JonathanFrech: Este. Era un usuario de 20k, pero eventualmente eliminé mi cuenta porque estaba arruinando mi vida y porque el sistema de reputación me estaba empujando activamente a hacer contenido que empeorara el sitio, en lugar de mejorarlo.
ais523
0

PHP , 43 bytes

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

Pruébalo en línea!

Logern
fuente
1<<24-> 8**8debería trabajar aquí para, créditos a @DigitalTrauma
Adirio
0

Perl 6 , 26 bytes

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

Pruébalo en línea!

Utiliza el mismo formato que todos los demás. Tiempos de espera en TIO.

O, en formato rgb:

31 bytes

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

Pruébalo en línea!

Jo King
fuente
Creo que la salida rgb debería rgb(0, 0, 0)incluir la cadena rgb.
nwellnhof
@nwellnhof Actualizado (aunque terminó más corto para hacer hexadecimal)
Jo King