Echtfarbencode


12

True Color (24-Bit) bei Wikipedia wird im zugehörigen Teil als beschrieben

24 Bit verwendet fast immer 8 Bit von R, G und B. Ab 2018 wird die 24-Bit-Farbtiefe von praktisch jedem Computer- und Telefondisplay sowie von den meisten Bildspeicherformaten verwendet. In fast allen Fällen, in denen 32 Bit pro Pixel vorhanden sind, werden 24 für die Farbe verwendet und die restlichen 8 sind der Alphakanal oder nicht verwendet.

2 24 ergibt 16.777.216 Farbabweichungen. Das menschliche Auge kann bis zu zehn Millionen Farben unterscheiden [10], und da der Umfang eines Displays kleiner ist als der Bereich des menschlichen Sehens, sollte dies bedeuten, dass dieser Bereich mit mehr Details abgedeckt wird, als wahrgenommen werden kann. ...

...

Macintosh-Systeme bezeichnen 24-Bit-Farben als "Millionen von Farben". Der Begriff "True Color" wird manchmal verwendet, um die Bezeichnung "Direct Color" in diesem Artikel zu bezeichnen. [13] Es wird auch häufig verwendet, um auf alle Farbtiefen größer oder gleich 24 zu verweisen.

Ein Bild, das alle 16.777.216 Farben enthält

Alle 16.777.216 Farben

Aufgabe

Schreiben Sie ein Programm, das alle 16.777.216 Farbvariationen innerhalb eines Arrays als Zeichenfolgen in der CSS- rgb()Funktion generiert und zurückgibt

5.1. Die RGB-Funktionen: rgb()undrgba()

Die rgb()Funktion definiert eine RGB-Farbe durch direkte Angabe der Kanäle Rot, Grün und Blau. Ihre Syntax lautet:

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

Die ersten drei Argumente geben die Rot-, Grün- und Blaukanäle der Farbe an. 0%stellt den Minimalwert für diesen Farbkanal in der sRGB-Farbskala dar und 100%stellt den Maximalwert dar. A <number>ist äquivalent zu a <percentage>, aber mit einem anderen Bereich: 0stellt wieder den Minimalwert für den Farbkanal dar, aber255stellt das Maximum dar. Diese Werte ergeben sich aus der Tatsache, dass viele Grafikmodule die Farbkanäle intern als ein einzelnes Byte speichern, das Ganzzahlen zwischen 0 und 255 enthalten kann. Bei Implementierungen sollte die Präzision des Kanals berücksichtigt werden, die nach Möglichkeit erstellt oder berechnet wurde. Ist dies nicht möglich, sollte der Kanal mit der höchsten verwendeten Genauigkeit auf den nächsten Wert gerundet werden. Wenn zwei Werte gleich nahe beieinander liegen, wird aufgerundet.

Das letzte Argument, das <alpha-value>, gibt das Alpha der Farbe an. Bei Angabe von a reicht <number>der nützliche Wertebereich von 0 (für eine vollständig transparente Farbe) bis 1(für eine vollständig undurchsichtige Farbe). Wenn als a angegeben, 0%stellt dies eine vollständig transparente Farbe dar, während dies 100%eine vollständig opake Farbe darstellt. Wenn nicht angegeben, ist der Standardwert 100%.

Werte außerhalb dieser Bereiche sind nicht ungültig, sondern werden zum Zeitpunkt des Berechnens auf die hier definierten Bereiche beschränkt.

rgb()Unterstützt aus älteren Gründen auch eine alternative Syntax, bei der alle Argumente durch Kommas getrennt werden:

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

Auch aus älteren Gründen gibt es eine rgba()Funktion mit identischer Grammatik und Verhaltensweise rgb().

oder RGB Hexadezimalschreibweise #RRGGBBFormat

5.2. Die hexadezimalen RGB-Notationen:#RRGGBB

Mit der hexadezimalen CSS- Farbnotation kann eine Farbe angegeben werden, indem die Kanäle als Hexadezimalzahlen angegeben werden, ähnlich wie Farben häufig direkt im Computercode geschrieben werden. Es ist auch kürzer als die gleiche Farbe in rgb()Notation zu schreiben .

Die Syntax von a <hex-color>ist ein <hash-token>Token, dessen Wert aus 3, 4, 6 oder 8 hexadezimalen Ziffern besteht. Mit anderen Worten, eine hexadezimale Farbe wird als Hash-Zeichen "#" geschrieben, gefolgt von einer Anzahl von Ziffern 0-9 oder Buchstaben af ​​(der Fall der Buchstaben spielt keine Rolle - #00ff00ist identisch mit #00FF00).

Die Anzahl der angegebenen Hexadezimalstellen bestimmt, wie die Hexadezimalnotation in eine RGB-Farbe decodiert wird:

6 Stellen

Das erste Ziffernpaar, das als Hexadezimalzahl interpretiert wird, gibt den roten Kanal der Farbe an, wobei 00der minimale Wert und ff(255 in Dezimalzahl) der maximale Wert angegeben werden . Das nächste Ziffernpaar, das auf die gleiche Weise interpretiert wird, gibt den grünen Kanal an, und das letzte Ziffernpaar gibt den blauen Kanal an. Der Alpha-Kanal der Farbe ist vollständig undurchsichtig.

BEISPIEL 2
Mit anderen Worten, #00ff00stellt die gleiche Farbe dar wie rgb(0 255 0)(ein Limonengrün).

Siehe Redaktionsentwurf des CSS-Farbmoduls Level 4

Beispiele

CSS- rgb()Funktion ( Leerzeichen können zB durch Komma ersetzt werden 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 hexadezimale Notation RRGGBB

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

Gewinnkriterien

Wenigste zum Schreiben des Programms verwendete Bytes.


Kommentare sind nicht für längere Diskussionen gedacht. Diese Unterhaltung wurde in den Chat verschoben .
Mego

Antworten:


8

R , 25 Bytes

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

Probieren Sie es online!


Nicht vertraut mit R, aber schlägt die Ausgabe von # 000000 fehl?
Jimbo1qaz

2
Nein, es wird # 000000 ausgegeben. Siehe den TIO-Link
J.Doe

@ jimbo1qaz erstellt a:b-ceinen Vektor von a-cbis b-ceinschließlich (erstellt einen Vektor von abis bund subtrahiert dann cvon jedem Eintrag).
Arthur

2
Ahh, also spezifiziert R Doppelpunkte mit einer höheren Priorität als Arithmetik ... Im Gegensatz zu Python-Slices.
jimbo1qaz

7

Python 2 , 77 40 39 37 Bytes

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

Probieren Sie es online!

-1 Byte dank digitalem Trauma

-2 Bytes dank Dylnan


2
Warum brauchst du den Lambda? Das Listenverständnis selbst ist eine gültige Antwort, nicht wahr?
Adirio

2
Versuchen Sie 8**8stattdessen 1<<24, ein Byte zu speichern
Digitales Trauma

2
wie wäre esprint['...
dylnan

1
@Adirio Ein Wert allein zählt nicht als Implementierung einer Herausforderung.
Jonathan Frech

2
@Adirio Du hast selbst [...] in ein Python-Terminal geschrieben - [...] so würde dein Beitrag in Python 2 REPL geschrieben , nicht in Python 2 .
Jonathan Frech

6

PowerShell , 28 26 Bytes

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

Probieren Sie es online!

Schleifen von 1bis 16mb(16777216). Bei jeder Iteration verwenden wir den -format-Operator, der auf die aktuelle Zahl einwirkt, die vorab --$_gegen die Zeichenfolge dekrementiert wurde "#{0:x6}". Hier geben wir die xWerte an, die auf 6Ziffern aufgefüllt sind und vor denen ein Hash steht #. Bei TIO ist die Ausgabe auf 60 Sekunden / 128 KB begrenzt. Ändern Sie die, 1um (16mb-5)zu sehen, wie es endet .


6

JavaScript (ES7), 65 62 61 Bytes

Gespeichert 3 4 Bytes dank @tsh

Gibt ein Array von #RRGGBBZeichenfolgen zurück.

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

Probieren Sie es online! (abgeschnittene Ausgabe)


Aktuelle Python-Lösung verwenden 8**8statt 1<<24. Es würde auch auf JS funktionieren.
Dienstag,


4

Japt, 14 Bytes

Ausgänge als #rrggbb.

G²³ÇsG ùT6 i'#

Probieren Sie es aus (Beschränkt auf die ersten 4096 Elemente)


Erläuterung

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

Interessante Sprache. Irgendeine Idee, warum der Buchstabe T für "0" verwendet wird? Ich bekomme 16 -> G, um ein Byte zu speichern, aber T -> 0 erreicht nicht dasselbe.
Alec

@ Alec Denn wenn Sie T durch 0 ersetzen, wird es mit der 6 verbunden und wird 06.
Geokavel

Ah, gotcha. Gibt es also einen Buchstaben pro Ziffer für Fälle, in denen Sie nicht möchten, dass er mit der vorherigen / nächsten Ziffer verbunden wird?
Alec

@Alec, wie Geokavel in diesem speziellen Fall sagte, erspart es mir ein Byte, wenn ich ein Komma verwenden muss, um die 2 Argumente abzugrenzen, an die übergeben wird ù. Ein weiterer typischer Anwendungsfall ist die Verwendung als Zähler, wenn Sie eine Variable inkrementieren müssen, während Sie beispielsweise ein Array zuordnen. Und da es sich natürlich um eine Variable handelt, können Sie ihr bei Bedarf auch einfach einen Wert zuweisen. 0ist die einzige einstellige Ganzzahl, die eine eigene Variable hat - technisch gesehen ist 7 die U-ZStandardeingabevariable für 0. Die anderen Integer - Variablen in Japt zugeordnet sind: -1, 10-16, 32, 64 & 100.
Shaggy

Wenn Sie mehr über Japt erfahren möchten, können Sie mich gerne in unserem Chatroom anrufen .
Shaggy


3

05AB1E , 15 14 10 Bytes

15Ýh6ãJ'#ì

Probieren Sie es online aus.

Erläuterung:

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

Batch, 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)

Ausgaben im CSS-Format. Die Variablensubstitution findet statt, bevor die forAnweisung analysiert wird, sodass der tatsächliche Code wie folgt lautet:

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

Lösung:

$(3#256)\'!16777216

Probieren Sie es online! (limitiert auf die ersten 500 Nummern)

Erläuterung:

Rgb-Strings rauswerfen. Konvertieren Sie jede Zahl zwischen 0 und 16777216 in Basis 256 und konvertieren Sie sie dann in Zeichenfolgen ...

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

2

MATL , 17 15 Bytes

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

Probieren Sie es online!

Die TIO-Version zeigt die ersten 2 ^ 10 nur an, um keine Zeitüberschreitung zu verursachen. Ich habe die letzte Iteration in die Fußzeile eingefügt, um zu zeigen, dass sie tatsächlich um endet #FFFFFF. Ein Byte wurde gespeichert, indem auf geändert wurde, fprintfanstatt die Zeichenfolge manuell zusammenzusetzen. Gibt eine durch Kommas getrennte Liste aus.

Erläuterung

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 Bytes

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

Probieren Sie es online!

224-16⍴4⍴ den Code im Code austauschen und sehen, dass er jeden Code mit bis zu 4 Ziffern ausgibt.

Danke an @Dzaima und @ngn für die 23 Bytes.

Verwendet ⎕IO←0 .

Wie:

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

Ruby , 31 Bytes

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

Probieren Sie es online!


Ich bin ein bisschen erstaunt, %dass eine Saite so lang und ein Array so lang ist. Zu Ihrer Information, Sie können ein Byte speichern, indem Sie einen wörtlichen Zeilenumbruch anstelle von verwenden \n.
Jordanien

1

V , 25 Bytes

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

Probieren Sie es online! (ersetzt 16777215durch 31)

Erläuterung

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

Charge, 69 + 4 = 73

g.cmd, 69

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

Speichert den Hexadezimalwert mit Formular #RRGGBBin ein 'Array'.

g.cmdsoll mit angerufen werden cmd /V/Q/K g.cmd. Dies ist, wo die + 4 herkommt, /V/Qund zählt als 4 zusätzliche Zeichen im Vergleich zu nur cmd /K g.cmd. Dadurch wird eine Umgebung eingerichtet, in der sich das Array im Speicher befindet. Die Ausführung dauert ebenfalls ewig. Verwenden Sie daher sehr niedrige Werte, um die Ausführung mit zu versuchen oder abzubrechenCtrl+C


Nervenzusammenbruch

Aufruf

  • /Vermöglicht eine verzögerte Erweiterung, ist aber kürzer als setlocal EnableDelayedExpansion, weshalb wir den cmdAnruf an erster Stelle benötigen
  • /Q Lässt die Ausgabe aus und entspricht @echo off
  • /Klässt Sie einen Ausdruck ausführen (in diesem Fall g.cmd) und wird danach nicht beendet, so dass Sie das 'Array' mit überprüfen könnenset #

g.cmd

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

Dieses Bit verwendet einen hier dokumentierten Trick , um eine normale Zahl in eine hexadezimale Zahl umzuwandeln, und speichert diesen Wert dann in einem 'Array'.


Ich habe diese Speicherstruktur als 'Array' bezeichnet, aber das stimmt nicht, da es in Batch keine echten Arrays gibt. ABER Sie können Variablen so benennen, dass sie arrayähnliche Namen haben:

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

oder, wie in diesem Fall:

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

Sie können weiterhin über darauf zugreifen !#%position%!


Ich bin mir nicht sicher. Aber vielleicht /V/Q/Kkann man als "Argumente" für den Interpreter gelten und als "3 + 69 = 72" zählen. meta
tsh

Ich wusste das nicht und werde meine Antwort entsprechend aktualisieren. Danke @tsh

0

Groovy , 53 Bytes

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

Funktionsdefinition. c () gibt eine ArrayList zurück (ich nehme an, das ist in Ordnung, auch wenn die Frage nach einem Array fragt).

Ungolfed mit impliziten Typen:

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

Probieren Sie es online!


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

Probieren Sie es online aus (beschränkt auf die ersten 4,096Artikel).

Erläuterung:

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, du hast das gepostet, als ich meinen Beitrag geschrieben habe, also haben wir sehr ähnliche Antworten. Sie können sich mitr[i]="".format("#%06X",i);
archangel.mjj

@ archangel.mjj Ah, ich bin ein Idiot. Vielen Dank! Ich hatte es tatsächlich schon einmal, "".format("#%06X",i)seit ich es in der Python-Antwort gesehen habe, aber ich habe die Antwort fallen lassen, weil ich es nicht schnell genug für TIO zum Laufen bringen konnte. Dann habe ich gesehen, dass alle nur die ersten 4,096Artikel auf TIO ausgegeben haben, also habe ich die Antwort noch einmal geschrieben und dabei vergessen, dass "#%06X"...>. <
Kevin Cruijssen

@ KevinCruijssen Ich wusste nie, dass Sie var rin Java tun können ..
FireCubez


0

PHP, 68 62 Bytes

Dies soll in einer Datei platziert werden, das Array wird am Ende zurückgegeben, um verwendbar zu sein.

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

Um Zugriff auf das Array zu erhalten, geben Sie einfach das Ergebnis des Includes an (zB: $a = include 'xyz.php'; einer Variablen.


Vielen Dank an @manatwork , dass du mir 6 Bytes gespart und einen Fehler behoben hast.


1
Sind Sie sicher, dass dies jemals hexadezimale Ziffern mit der Formatzeichenfolge ausgeben wird %1$06d? Und ich sehe keinen Grund für die Verwendung 1$. Sie konnten die Länge , indem das Zeichen „#“ im Format - String reduzieren: #%06x. Was sich als nützlich erweisen würde, wenn zusätzliche Zeichen hinzugefügt würden, um den Bereich zu korrigieren, da derzeit bis zu 16777216 = # 1000000 gezählt wird.
Manatwork

Nun, es würde .... Wenn ich habe vergessen, nicht ändern %dzu %x. Und völlig vergessen, das #Innere des sprintf()Anrufs zu bewegen . Du hast mir 6 Bytes gerettet. Vielen Dank
Ismael Miguel

0

MATL , 11 Bytes

'#'5Y26Z^Yc

Probieren Sie es online!(mit nur drei Hex-Ziffern statt sechs)

Erläuterung

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

Gibt eine #RRGGBBZeichenfolgentabelle mit 16.777.216 Zeilen zurück . Der Zeilenumbruch dient nur der Lesbarkeit:

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

Verwendet einen rekursiven CTE für eine Zahlentabelle von 0 bis 2 ^ 24-1 und wandelt ihn dann mit dem integrierten FORMATBefehl (verfügbar in SQL 2012 oder höher) in eine 6-stellige Hex-Zeichenfolge um . Befestigen Sie die #an der Vorderseite, und wir sind fertig.

Edit 1: POWER()Funktion entfernt, die Nummer war kürzer: P



0

Gelee , 8 Bytes

ØHṗ6”#;Ɱ

Probieren Sie es online! (Anmerkung: verwendet 2eher als6 als6 TIO Timeout)

Funktionsübermittlung (da Jelly-Vollprogramme standardmäßig Listen von Zeichenfolgen ohne Trennzeichen zwischen ihnen drucken, wodurch es schwierig wird, die Grenzen zu erkennen). Der TIO-Link enthält einen Wrapper zum Drucken einer Liste von Zeichenfolgen, wobei Zeilenumbrüche als Trennzeichen verwendet werden.

Erläuterung

Ø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
Aus Interesse - warum hast du deine Antwort zu einem Community-Wiki gemacht?
Jonathan Frech

@JonathanFrech: Ich mache das für alle meine Posts, weil a) es den Anreiz für Leute verringert, das Reputationssystem zu spielen (da der Post keinen Ruf gibt), b) ich bin froh, dass meine Posts bearbeitet und die Community- wiki marker ist eine Möglichkeit, dies anzuzeigen. Das Reputationssystem von Stack Exchange ist mehr oder weniger völlig kaputt: Ich habe in der Vergangenheit einmal absichtlich eine Woche lang jeden Tag eine neue Kappe aufgesetzt, um zu zeigen, wie einfach das System zu spielen war. Heutzutage möchte ich so ziemlich keinen Anteil daran haben, zumal eine höhere Reputation die Website nur dazu bringt, Sie davon zu überzeugen, sie zu moderieren.
ais523

Nur neugierig - auf welchem ​​Stack hast du das Reputationssystem gespielt?
Jonathan Frech

@ JonathanFrech: Dieser. Ich war ein 20-köpfiger Nutzer, löschte aber schließlich mein Konto, weil es mein Leben durcheinander brachte und weil das Reputationssystem mich aktiv dazu drängte, Inhalte zu erstellen, die die Website schlechter machten als besser.
ais523



Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.