Véritable code couleur

12

La vraie couleur (24 bits) sur Wikipedia est décrite dans la partie pertinente comme

24 bits utilise presque toujours 8 bits de chacun des R, G et B.Depuis 2018, la profondeur de couleur 24 bits est utilisée par pratiquement tous les écrans d'ordinateur et de téléphone et la grande majorité des formats de stockage d'images. Presque tous les cas où il y a 32 bits par pixel signifient que 24 sont utilisés pour la couleur, et les 8 restants sont le canal alpha ou inutilisés.

2 24 donne 16 777 216 variations de couleurs. L'œil humain peut distinguer jusqu'à dix millions de couleurs [10] et comme la gamme d'un écran est plus petite que la plage de vision humaine, cela signifie que cela devrait couvrir cette plage avec plus de détails que ce qui peut être perçu. ...

...

Les systèmes Macintosh désignent les couleurs 24 bits comme des «millions de couleurs». Le terme «True color» est parfois utilisé pour signifier ce que cet article appelle «couleur directe». [13] Il est également souvent utilisé pour désigner toutes les profondeurs de couleur supérieures ou égales à 24.

Une image contenant toutes les 16 777 216 couleurs

Toutes les 16,777,216 couleurs

Tâche

Écrire un programme qui génère et renvoie toutes les 16 777 216 variations de couleurs dans un tableau sous forme de chaînes dans la rgb()fonction CSS

5.1. Les fonctions RVB: rgb()etrgba()

La rgb()fonction définit une couleur RVB en spécifiant directement les canaux rouge, vert et bleu. Sa syntaxe est:

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

Les trois premiers arguments spécifient respectivement les canaux rouge, vert et bleu de la couleur. 0%représente la valeur minimale pour ce canal de couleur dans la gamme sRGB et 100%représente la valeur maximale. A <number>est équivalent à a <percentage>, mais avec une plage différente: 0représente à nouveau la valeur minimale pour le canal de couleur, mais255représente le maximum. Ces valeurs proviennent du fait que de nombreux moteurs graphiques stockent les canaux de couleur en interne comme un seul octet, qui peut contenir des entiers compris entre 0 et 255. Les implémentations doivent respecter la précision du canal tel qu'il est créé ou calculé dans la mesure du possible. Si cela n'est pas possible, le canal doit être arrondi à la valeur la plus proche avec la plus grande précision utilisée, arrondi si deux valeurs sont également proches.

Le dernier argument, le <alpha-value>, spécifie l'alpha de la couleur. Si donné comme un <number>, la plage utile de la valeur est 0 (représentant une couleur entièrement transparente) à 1(représentant une couleur entièrement opaque). Si donné comme un, 0%représente une couleur entièrement transparente, tandis que 100%représente une couleur entièrement opaque. S'il est omis, il est par défaut 100%.

Les valeurs en dehors de ces plages ne sont pas invalides, mais sont fixées aux plages définies ici au moment de la valeur calculée.

Pour des raisons héritées, rgb()prend également en charge une syntaxe alternative qui sépare tous ses arguments par des virgules:

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

Également pour des raisons héritées, une rgba()fonction existe également, avec une grammaire et un comportement identiques à rgb().

ou #RRGGBBformat de notation hexadécimal RVB

5.2. Les notations hexadécimales RVB:#RRGGBB

La notation de couleur hexadécimale CSS permet de spécifier une couleur en donnant aux canaux des nombres hexadécimaux, ce qui est similaire à la façon dont les couleurs sont souvent écrites directement dans le code informatique. C'est aussi plus court que d'écrire la même couleur en rgb()notation.

La syntaxe de a <hex-color>est un <hash-token>jeton dont la valeur se compose de 3, 4, 6 ou 8 chiffres hexadécimaux. En d'autres termes, une couleur hexadécimale est écrite sous la forme d'un caractère de hachage, "#", suivi d'un certain nombre de chiffres 0-9 ou de lettres af (la casse des lettres n'a pas d'importance - #00ff00est identique à #00FF00).

Le nombre de chiffres hexadécimaux donné détermine comment décoder la notation hexadécimale en une couleur RVB:

6 chiffres

La première paire de chiffres, interprétée comme un nombre hexadécimal, spécifie le canal rouge de la couleur, où 00représente la valeur minimale et ff(255 en décimal) représente le maximum. La paire de chiffres suivante, interprétée de la même manière, spécifie le canal vert et la dernière paire spécifie le bleu. Le canal alpha de la couleur est entièrement opaque.

EXEMPLE 2
En d'autres termes, #00ff00représente la même couleur que rgb(0 255 0)(un vert lime).

Voir le brouillon de l'éditeur du module de couleur CSS niveau 4

Exemples

rgb()Fonction CSS ( le caractère espace peut être substitué au caractère virgule, par exemple 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)']

Notation hexadécimale CSS RGB RRGGBB

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

Critères gagnants

Moindres octets utilisés pour écrire le programme.

guest271314
la source
Les commentaires ne sont pas pour une discussion approfondie; cette conversation a été déplacée vers le chat .
Mego

Réponses:

8

R , 25 octets

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

Essayez-le en ligne!

J.Doe
la source
Vous ne connaissez pas R, mais cela ne produit-il pas la sortie # 000000?
nyanpasu64
2
Non, il génère # 000000. Voir le lien TIO
J.Doe
@ jimbo1qaz a:b-cfait un vecteur de a-cà b-c, inclus (il fait un vecteur de aà b, puis soustrait cde chaque entrée).
Arthur
2
Ahh, donc R spécifie les deux-points avec une priorité plus stricte que l'arithmétique ... Contrairement aux tranches Python.
nyanpasu64
7

Python 2 , 77 40 39 37 octets

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

Essayez-le en ligne!

-1 octet grâce à Digital Trauma

-2 octets grâce à dylnan

TFeld
la source
2
Pourquoi avez-vous besoin du lambda? La compréhension de la liste elle-même est une réponse valable, n'est-ce pas?
Adirio
2
Essayez 8**8au lieu de 1<<24sauvegarder un octet
Digital Trauma
2
que diriez-vousprint['...
dylnan
1
@Adirio Une valeur seule ne compte pas comme une mise en œuvre d'un défi.
Jonathan Frech
2
@Adirio Vous avez vous-même écrit [...] dans un terminal Python [...] - ainsi votre soumission serait écrite en Python 2 REPL , pas en Python 2 .
Jonathan Frech
6

PowerShell , 28 26 octets

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

Essayez-le en ligne!

Boucles de 1à 16mb(16777216). À chaque itération, nous utilisons l' -fopérateur ormat agissant sur le nombre actuel pré-décrémenté par --$_rapport à la chaîne "#{0:x6}". Ici, nous spécifions les xvaleurs he , complétées en 6chiffres, avec un hachage #devant. Sur TIO, limité à 60 secondes / 128 Ko de sortie. Modifiez le 1pour (16mb-5)voir comment cela se termine .

AdmBorkBork
la source
6

JavaScript (ES7), 65 62 61 octets

Enregistré 3 4 octets grâce à @tsh

Renvoie un tableau de #RRGGBBchaînes.

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

Essayez-le en ligne! (sortie tronquée)

Arnauld
la source
Utilisation actuelle de la solution Python 8**8au lieu de 1<<24. Cela fonctionnerait aussi sur JS.
tsh
5

Lisp commun, 42 octets

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

Essayez-le en ligne!

Renzo
la source
1
Peut-être le premier- formatgolf que j'ai vu. +1 sur cette seule base.
Silvio Mayolo
4

Japt, 14 octets

Sorties comme #rrggbb.

G²³ÇsG ùT6 i'#

Essayez-le (limité aux 4096 premiers éléments)


Explication

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 "#"
Hirsute
la source
Langage intéressant. Une idée de pourquoi la lettre T est utilisée pour "0"? Je reçois 16 -> G pour enregistrer un octet, mais T -> 0 ne fait pas la même chose.
Alec
@Alec Parce que si vous remplacez T par 0, il rejoint le 6 et devient 06.
geokavel
Ah, gotcha. Y a-t-il donc une lettre par chiffre pour les cas où vous ne voulez pas qu'elle se joigne au chiffre précédent / suivant?
Alec
@Alec, comme l'a dit geokavel, dans ce cas particulier, cela me fait économiser un octet en ayant à utiliser une virgule pour délimiter les 2 arguments transmis ù. Un autre cas d'utilisation typique consiste à l'utiliser comme compteur lorsque vous devez incrémenter une variable lors, par exemple, d'un mappage sur un tableau. Et, bien sûr, comme il s'agit d'une variable, vous pouvez simplement lui attribuer une valeur, si nécessaire. 0est le seul entier à un seul chiffre qui a sa propre variable, cependant - eh bien, techniquement, 7 comme la variable d'entrée 6 U-Zpar défaut 0. Les autres entiers affectées aux variables Japt sont: -1, 10-16, 32, 64 & 100.
Shaggy
Si vous souhaitez en savoir plus sur Japt, n'hésitez pas à me cingler dans notre salon de discussion .
Shaggy
3

05AB1E , 15 14 10 octets

15Ýh6ãJ'#ì

Essayez-le en ligne.

Explication:

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
la source
3

Lot, 87 octets

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

Sorties au format CSS. La substitution de variable se produit avant l' foranalyse de l' instruction, de sorte que le code réel est le suivant:

@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
la source
2

K (oK) , 19 octets

Solution:

$(3#256)\'!16777216

Essayez-le en ligne! (limité aux 500 premiers numéros)

Explication:

Vider les chaînes RVB. Convertissez chaque nombre entre 0 et 16777216 en base 256, puis convertissez-le en chaînes ...

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

MATL , 17 15 octets

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

Essayez-le en ligne!

La version TIO affiche uniquement les 2 ^ 10 premiers pour ne pas expirer. J'ai inclus l'itération finale dans le pied de page pour montrer qu'elle se termine bien à #FFFFFF. Enregistré un octet en remplaçant par au fprintflieu d'assembler manuellement la chaîne. Génère une liste séparée par des virgules.

Explication

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
la source
2

APL (Dyalog Unicode) , 47 43 20 octets

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

Essayez-le en ligne!

22416⍴4⍴

Merci à @Dzaima et @ngn pour les 23 octets.

Utilise ⎕IO←0.

Comment:

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

Rubis , 31 octets

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

Essayez-le en ligne!

GB
la source
Je suis un peu étonné de %prendre une chaîne aussi longue et un tableau aussi long. Pour info, vous pouvez enregistrer un octet en utilisant un saut de ligne littéral au lieu de \n.
Jordan
1

V , 25 octets

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

Essayez-le en ligne! (remplacé 16777215par 31)

Explication

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

Lot, 69 + 4 = 73

g.cmd, 69

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

Enregistre la valeur hexadécimale avec formulaire #RRGGBBdans un «tableau».

g.cmddoit être appelé en utilisant cmd /V/Q/K g.cmd. C'est de là que vient le + 4 /V/Q, qui compte pour 4 caractères supplémentaires par rapport à juste cmd /K g.cmd. Cela met en place un environnement qui a le «tableau» en mémoire. L'exécution prend également une éternité, utilisez donc des valeurs très faibles pour essayer ou interrompre l'exécution à l'aide deCtrl+C


Panne

Invocation

  • /Vpermet une expansion retardée, mais est plus courte que setlocal EnableDelayedExpansion, c'est pourquoi nous avons besoin de l' cmdappel en premier lieu
  • /Q omet la sortie et est équivalent à @echo off
  • /Kvous permet d'exécuter une expression (dans ce cas g.cmd) et ne se ferme pas par la suite, vous pouvez donc vérifier le 'tableau' en utilisantset #

g.cmd

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

Ce bit utilise une astuce documentée ici pour convertir un nombre normal en hexadécimal, puis enregistre cette valeur dans un «tableau».


J'ai appelé cette structure de stockage un «tableau», mais ce n'est pas vrai, car les vrais tableaux n'existent pas dans Batch. MAIS vous pouvez nommer des variables pour qu'elles aient des noms de type tableau, comme ceci:

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

ou, comme dans ce cas:

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

Vous pouvez toujours y accéder via !#%position%!


la source
Je ne suis pas sûr. Mais peut /V/Q/K-être peut-être revendiqué comme "arguments" pour l'interprète et compter comme "3 + 69 = 72". meta
tsh
Je ne le savais pas et je mettrai à jour ma réponse en conséquence. Thx @tsh
0

Groovy , 53 octets

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

Définition de fonction. c () renvoie une ArrayList (je suppose que c'est bien, même si la question demande un tableau).

Non golfé, avec des types implicites:

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

Essayez-le en ligne!

archangel.mjj
la source
0

Java 10, 87 84 octets

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

-3 octets grâce à @ archangel.mjj .

Essayez-le en ligne (limité aux premiers 4,096articles).

Explication:

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
la source
Ah, vous avez posté ceci pendant que j'écrivais mon article, nous avons donc des réponses très similaires. Vous pouvez améliorer de trois octets avecr[i]="".format("#%06X",i);
archangel.mjj
@ archangel.mjj Ah, je suis un idiot. Merci! J'avais en fait "".format("#%06X",i)avant depuis que je l'ai vu dans la réponse Python, mais j'ai laissé tomber la réponse parce que je ne pouvais pas le faire fonctionner assez rapidement pour TIO. Ensuite, j'ai vu tout le monde sortir les premiers 4,096éléments sur TIO, alors j'ai écrit à nouveau la réponse, oubliant "#%06X"...>. <
Kevin Cruijssen
@KevinCruijssen Je n'ai jamais su que tu pouvais faire var ren Java ..
FireCubez
@FireCubez C'est nouveau depuis Java 10. :) Voici une astuce pertinente pour voir ce qui est et n'est pas possible avec varJava.
Kevin Cruijssen
0

PHP, 68 62 octets

Celui-ci est censé être placé dans un fichier, le tableau est retourné à la fin, pour être utilisable.

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

Pour avoir accès au tableau, donnez simplement le résultat de l'inclusion (par exemple:) $a = include 'xyz.php';à une variable.


Merci à @manatwork pour m'avoir sauvé 6 octets et corrigé une erreur.

Ismael Miguel
la source
1
Êtes-vous sûr que cela produira jamais des chiffres hexadécimaux avec la %1$06dchaîne de format? Et je ne vois aucune raison d'utiliser 1$. Vous pouvez réduire la longueur en incluant le « # » dans la chaîne de format: #%06x. Ce qui serait utile lors de l'ajout de caractères supplémentaires pour fixer la plage, car il compte actuellement jusqu'à 16777216 = # 1000000.
manatwork
Eh bien, ce serait ... Si je n'avais pas oublié de passer %dà %x. Et j'ai complètement oublié de déplacer l' #intérieur dusprintf() appel. Vous m'avez sauvé 6 octets. Merci
Ismael Miguel
0

MATL , 11 octets

'#'5Y26Z^Yc

Essayez-le en ligne! (avec seulement trois chiffres hexadécimaux au lieu de six)

Explication

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

Lua , 47 45 octets

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

Essayez-le en ligne!

Marcio Medeiros
la source
1
Vous pouvez lancer votre variable set enregistrer un octet.
Jonathan Frech
0

T-SQL, 122 117 octets

Renvoie une table de #RRGGBBchaînes de 16 777 216 lignes . Le saut de ligne est uniquement pour la lisibilité:

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

Utilise un CTE récursif pour une table numérique de 0 à 2 ^ 24-1, puis utilise la FORMATcommande intégrée (disponible dans SQL 2012 ou version ultérieure) pour le transformer en une chaîne hexadécimale à 6 chiffres . Fixez le #à l'avant, et nous avons terminé.

Edit 1: POWER()Fonction supprimée , le nombre était plus court: P

BradC
la source
0

Gelée , 8 octets

ØHṗ6”#;Ɱ

Essayez-le en ligne! (note: utilise 2plutôt que 6comme 6temps mort sur TIO)

Soumission des fonctions (parce que les programmes complets Jelly imprimeront par défaut des listes de chaînes sans aucun délimiteur entre eux, ce qui rendra difficile de voir les limites). Le lien TIO contient un wrapper pour imprimer une liste de chaînes en utilisant des sauts de ligne pour les séparer.

Explication

Ø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
la source
1
Par intérêt - pourquoi avez-vous fait de votre réponse un wiki communautaire?
Jonathan Frech
@JonathanFrech: Je le fais pour tous mes messages car a) cela réduit l'incitation pour les gens à jouer le système de réputation (car le message ne donne pas de réputation), b) je suis heureux d'avoir mes messages édités et la communauté- le marqueur wiki est un moyen d'indiquer cela. Le système de réputation de Stack Exchange est plus ou moins complètement cassé: sur un compte passé, j'ai une fois intentionnellement répété chaque jour pendant une semaine pour montrer à quel point le système était facile à jouer. De nos jours, je ne veux pratiquement pas y participer, d'autant plus qu'une réputation plus élevée fait simplement que le site essaie de vous persuader de le modérer.
ais523
Juste curieux - sur quelle pile avez-vous réussi à jouer le système de réputation?
Jonathan Frech
@JonathanFrech: Celui-ci. J'étais un utilisateur de 20k, mais j'ai finalement supprimé mon compte parce que cela gâchait ma vie, et parce que le système de réputation me poussait activement à créer du contenu qui rendait le site pire, plutôt que meilleur.
ais523
0

PHP , 43 octets

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

Essayez-le en ligne!

Logern
la source
1<<24-> 8**8devrait fonctionner ici pour, crédits à @DigitalTrauma
Adirio
0

Perl 6 , 26 octets

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

Essayez-le en ligne!

Utilise le même format que tout le monde. Temps mort sur TIO.

Ou, au format RVB:

31 octets

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

Essayez-le en ligne!

Jo King
la source
Je pense que la sortie RVB devrait rgb(0, 0, 0)inclure la chaîne rgb.
nwellnhof
@nwellnhof Mis à jour (bien qu'il ait fini par être plus court pour faire de l'hexadécimal)
Jo King