Prawdziwy kod koloru

12

Prawdziwy kolor (24 bity) w Wikipedii jest opisany w odpowiedniej części jako

24 bity prawie zawsze wykorzystuje 8 bitów każdego z R, G, B. Od 2018 r. 24-bitowa głębia kolorów jest używana przez praktycznie każdy wyświetlacz komputera i telefonu oraz zdecydowaną większość formatów przechowywania obrazów. Prawie wszystkie przypadki, w których 32 piksele mają piksel, oznaczają, że 24 są użyte dla koloru, a pozostałe 8 to kanał alfa lub nieużywane.

2 24 daje 16 777 216 wariantów kolorystycznych. Ludzkie oko może rozróżnić do dziesięciu milionów kolorów [10], a ponieważ gama wyświetlacza jest mniejsza niż zasięg widzenia ludzkiego, oznacza to, że powinien on obejmować ten zakres bardziej szczegółowo, niż można to dostrzec. ...

...

Systemy Macintosh określają kolory 24-bitowe jako „miliony kolorów”. Termin „prawdziwy kolor” jest czasem używany w znaczeniu tego, co ten artykuł nazywa „kolorem bezpośrednim”. [13] Jest również często stosowany w odniesieniu do wszystkich głębi kolorów większych lub równych 24.

Obraz zawierający wszystkie 16 777 216 kolorów

Wszystkie 16 777 216 kolorów

Zadanie

Napisz program, który generuje i zwraca wszystkie 16 777 216 wariantów kolorów w tablicy jako ciągi znaków w rgb()funkcji CSS

5.1 Funkcje RGB: rgb()irgba()

rgb()Funkcja definiuje koloru RGB określając czerwone, zielone i niebieskie kanały bezpośrednio. Jego składnia to:

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

Pierwsze trzy argumenty określają odpowiednio czerwony, zielony i niebieski kanał koloru. 0%reprezentuje minimalną wartość dla tego kanału kolorów w gamie sRGB i 100%reprezentuje wartość maksymalną. A <number>jest równoważne a <percentage>, ale z innym zakresem: 0ponownie reprezentuje minimalną wartość dla kanału koloru, ale255reprezentuje maksimum. Wartości te wynikają z faktu, że wiele silników graficznych przechowuje kanały kolorów wewnętrznie jako jeden bajt, który może pomieścić liczby całkowite od 0 do 255. Implementacje powinny honorować precyzję kanału, jeśli jest to możliwe lub obliczone. Jeśli nie jest to możliwe, kanał należy zaokrąglić do najbliższej wartości z najwyższą zastosowaną precyzją, zaokrąglając w górę, jeśli dwie wartości są jednakowo bliskie.

Ostatni argument, the <alpha-value>, określa alfa koloru. Jeśli podano jako a <number>, użyteczny zakres wartości to 0 (reprezentujący całkowicie przezroczysty kolor) do 1(reprezentujący całkowicie nieprzezroczysty kolor). Jeśli podany jako a, 0%reprezentuje całkowicie przezroczysty kolor, a 100%reprezentuje całkowicie nieprzezroczysty kolor. Jeśli zostanie pominięty, domyślnie jest to 100%.

Wartości poza tymi zakresami nie są nieprawidłowe, ale są ograniczone do zakresów zdefiniowanych tutaj w czasie wartości obliczonej.

Ze względów starszych rgb()obsługuje także alternatywną składnię, która oddziela wszystkie argumenty przecinkami:

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

Również ze względów starszych rgba()istnieje również funkcja o identycznej gramatyce i zachowaniu rgb().

lub zapis szesnastkowy w #RRGGBBformacie RGB

5.2 Notacje szesnastkowe RGB:#RRGGBB

Notacja koloru szesnastkowego CSS pozwala określić kolor, podając kanały jako liczby szesnastkowe, co jest podobne do tego, jak często kolory zapisywane są bezpośrednio w kodzie komputerowym. Jest także krótszy niż zapisywanie tego samego koloru w rgb()notacji.

Składnia a <hex-color>to <hash-token>token, którego wartość składa się z 3, 4, 6 lub 8 cyfr szesnastkowych. Innymi słowy, kolor szesnastkowy jest zapisany jako znak skrótu „#”, po którym następuje pewna liczba cyfr 0–9 lub liter af (wielkość liter nie ma znaczenia - #00ff00jest identyczna #00FF00).

Podana liczba cyfr szesnastkowych określa sposób dekodowania zapisu szesnastkowego na kolor RGB:

6 cyfr

Pierwsza para cyfr, interpretowana jako liczba szesnastkowa, określa czerwony kanał koloru, gdzie 00reprezentuje wartość minimalną, a ff(255 w systemie dziesiętnym) reprezentuje maksimum. Następna para cyfr, interpretowana w ten sam sposób, określa zielony kanał, a ostatnia para określa niebieski. Kanał alfa koloru jest całkowicie nieprzejrzysty.

PRZYKŁAD 2
Innymi słowy, #00ff00reprezentuje ten sam kolor co rgb(0 255 0)(limonkowy).

Zobacz szkic edytora CSS Moduł kolorów poziom 4

Przykłady

rgb()Funkcja CSS ( znak spacji można zastąpić przecinkiem, np. 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)']

Notacja szesnastkowa CSS RGB RRGGBB

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

Kryteria wygranej

Najmniej bajtów użytych do napisania programu.

guest271314
źródło
Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
Mego

Odpowiedzi:

8

R , 25 bajtów

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

Wypróbuj online!

J.Doe
źródło
Nie znasz R, ale czy to nie generuje # 000000?
nyanpasu64
2
Nie, generuje # 000000. Zobacz link TIO
J.Doe
@ jimbo1qaz a:b-ctworzy wektor od a-cdo b-cwłącznie (tworzy wektor od ado b, a następnie odejmuje cod każdego wpisu).
Arthur
2
Ach, więc R określa dwukropki z większym priorytetem niż arytmetyka ... W przeciwieństwie do plasterków Pythona.
nyanpasu64
7

Python 2 , 77 40 39 37 bajtów

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

Wypróbuj online!

-1 bajt dzięki Digital Trauma

-2 bajty dzięki dylnan

TFeld
źródło
2
Dlaczego potrzebujesz lambda? Samo rozumienie listy jest prawidłową odpowiedzią, prawda?
Adirio
2
Spróbuj 8**8zamiast 1<<24zapisać bajt
Cyfrowa trauma
2
co print['...
powiesz na
1
@Adirio Sama wartość nie jest liczona jako realizacja wyzwania.
Jonathan Frech,
2
@Adirio Ty sam napisałeś [...] w terminalu Python [...] - dlatego twoje zgłoszenie zostanie napisane w Pythonie 2 REPL , a nie w Pythonie 2 .
Jonathan Frech,
6

PowerShell , 28 26 bajtów

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

Wypróbuj online!

Pętle od 1do 16mb(16777216). W każdej iteracji używamy -foperatora ormat działającego na bieżącą liczbę wstępnie zmniejszoną --$_względem łańcucha "#{0:x6}". Podajemy tutaj xwartości, uzupełnione 6cyframi, z hashem #z przodu. W przypadku TIO, ograniczenie do 60 sekund / 128KiB mocy wyjściowej. Zmień na, 1aby (16mb-5)zobaczyć, jak to się kończy .

AdmBorkBork
źródło
6

JavaScript (ES7), 65 62 61 bajtów

Zaoszczędź 3 4 bajty dzięki @tsh

Zwraca tablicę #RRGGBBciągów.

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

Wypróbuj online! (obcięte wyjście)

Arnauld
źródło
Obecne rozwiązanie Python 8**8zamiast 1<<24. Działa to również na JS.
tsh
5

Common Lisp, 42 bajty

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

Wypróbuj online!

Renzo
źródło
1
Może być pierwszym formatgolfem, jaki widziałem. Tylko +1 na tej podstawie.
Silvio Mayolo,
4

Japt, 14 bajtów

Wyjścia jak #rrggbb.

G²³ÇsG ùT6 i'#

Wypróbuj (Ograniczony do pierwszych 4096 elementów)


Wyjaśnienie

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 "#"
Kudłaty
źródło
Ciekawy język Wiesz, dlaczego litera T jest używana jako „0”? Dostaję 16 -> G, aby zapisać bajt, ale T -> 0 nie osiąga tego samego.
Alec
@Alec Ponieważ jeśli zamienisz T na 0, łączy się z 6 i staje się 06.
geokavel
Ach, gotcha. Czy jest więc jedna litera na cyfrę w przypadkach, w których nie chcesz, aby łączyła się z poprzednią / następną cyfrą?
Alec
@Alec, jak powiedział geokavel, w tym szczególnym przypadku oszczędza mi bajtu w konieczności używania przecinka, aby rozgraniczać 2 argumenty, które są przekazywane ù. Innym typowym przypadkiem użycia jest użycie go jako licznika, gdy trzeba zwiększyć wartość zmiennej, na przykład odwzorowując tablicę. I oczywiście, ponieważ jest to zmienna, możesz po prostu przypisać jej również wartość, jeśli to konieczne. 0jest jedyną jednocyfrową liczbą całkowitą, która ma własną zmienną - technicznie 7 jako U-Zdomyślna zmienna wejściowa 6 0. Inne całkowite przypisane do zmiennych w Japt to: -1, 10-16, 32, 64 & 100.
Shaggy
Jeśli chcesz dowiedzieć się więcej o Japt, możesz pingować mnie w naszym czacie .
Shaggy
3

05AB1E , 15 14 10 bajtów

15Ýh6ãJ'#ì

Wypróbuj online.

Wyjaśnienie:

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
źródło
3

Partia, 87 bajtów

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

Dane wyjściowe w formacie CSS. Podstawienie zmiennej następuje przed foranalizą instrukcji, więc rzeczywisty kod wygląda następująco:

@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
źródło
2

K (oK) , 19 bajtów

Rozwiązanie:

$(3#256)\'!16777216

Wypróbuj online! (ograniczone do pierwszych 500 numerów)

Wyjaśnienie:

Zrzuć ciągi rgb. Konwertuj każdą liczbę z zakresu od 0 do 16777216 na bazę 256, a następnie konwertuj na ciągi ...

$(3#256)\'!16777216 / the solution
          !16777216 / range 0..16777215
 (     )\'          / split each both
  3#256             / 256 256 256
$                   / string
streetster
źródło
2

MATL , 17 15 bajtów

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

Wypróbuj online!

Wersja TIO wyświetla tylko pierwsze 2 ^ 10, aby nie przekroczyć limitu czasu. W stopce umieściłem ostatnią iterację, aby pokazać, że rzeczywiście kończy się o godz #FFFFFF. Zapisano jeden bajt, zmieniając na fprintfzamiast ręcznie zestawiać ciąg. Zwraca listę rozdzielaną przecinkami.

Wyjaśnienie

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
źródło
2

APL (Dyalog Unicode) , 47 43 20 bajtów

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

Wypróbuj online!

22416⍴4⍴

Dzięki @Dzaima i @ngn za 23 bajty.

Zastosowania ⎕IO←0.

W jaki sposób:

'#',(⎕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é
źródło
1

Rubinowy , 31 bajtów

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

Wypróbuj online!

GB
źródło
Jestem trochę zaskoczony, %że ciąg jest tak długi, a tablica tak długa. Dla twojej informacji możesz zapisać bajt, używając dosłownego podziału linii zamiast \n.
Jordan
1

V , 25 bajtów

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

Wypróbuj online! (zastąpiony 16777215przez 31)

Wyjaśnienie

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 #
ბიმო
źródło
1

Partia, 69 + 4 = 73

g.cmd, 69

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

Zapisuje wartość szesnastkową z formą #RRGGBBw „Tablicy”.

g.cmdnależy wywoływać za pomocą cmd /V/Q/K g.cmd. Stąd pochodzi + 4 /V/Q, licząc jako 4 dodatkowe postacie w porównaniu do sprawiedliwego cmd /K g.cmd. Spowoduje to skonfigurowanie środowiska, które ma pamięć „Array”. Uruchamianie trwa również wieczność, więc używaj bardzo niskich wartości, aby spróbować lub przerwać wykonywanieCtrl+C


Awaria

Inwokacja

  • /Vumożliwia opóźnioną ekspansję, ale jest krótsza niż setlocal EnableDelayedExpansion, dlatego właśnie potrzebujemy cmdpołączenia
  • /Q pomija dane wyjściowe i jest równoważne z @echo off
  • /Kpozwala wykonać wyrażenie (w tym przypadku g.cmd) i nie kończy się później, dzięki czemu można sprawdzić tablicę za pomocąset #

g. cmd

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

W tym bicie wykorzystuje się sztuczkę udokumentowaną tutaj, aby przekonwertować liczbę normalną na szesnastkową, a następnie zapisuje tę wartość w „tablicy”.


Nazwałem tę strukturę przechowywania „Array”, ale tak naprawdę nie jest to właściwe, ponieważ w Batch nie istnieją prawdziwe tablice. ALE możesz nazwać zmienne, aby miały nazwy podobne do tablic, na przykład:

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

lub, jak w tym przypadku:

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

Nadal możesz uzyskać do nich dostęp za pośrednictwem !#%position%!


źródło
Nie jestem pewny. Ale może /V/Q/Kbyć twierdzony jako „argumenty” tłumacza i liczony jako „3 + 69 = 72”. meta
tsh
Nie wiedziałem o tym i odpowiednio zaktualizuję swoją odpowiedź. Dzięki @tsh
0

Groovy , 53 bajty

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

Definicja funkcji c () zwraca ArrayList (zakładam, że jest w porządku, nawet jeśli pytanie pyta o tablicę).

Niegolfowane, z typami niejawnymi:

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

Wypróbuj online!

archangel.mjj
źródło
0

Java 10, 87 84 bajtów

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

-3 bajty dzięki @ archangel.mjj .

Wypróbuj online (ograniczone do pierwszych 4,096elementów).

Wyjaśnienie:

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
źródło
Ach, opublikowałeś to, kiedy pisałem mój post, więc mamy bardzo podobne odpowiedzi. Możesz poprawić o trzy bajty za pomocąr[i]="".format("#%06X",i);
archangel.mjj
@ archangel.mjj Ach, jestem idiotą. Dzięki! Właściwie to miałem "".format("#%06X",i)wcześniej, odkąd zobaczyłem to w odpowiedzi na Python, ale upuściłem odpowiedź, ponieważ nie mogłem jej uruchomić wystarczająco szybko dla TIO. Potem zobaczyłem, że wszyscy po prostu wypisują pierwsze 4,096pozycje na TIO, więc napisałem odpowiedź, zapominając o "#%06X"...>. <
Kevin Cruijssen
@KevinCruijssen Nigdy nie wiedziałem, że możesz zrobić var rw Javie ..
FireCubez
0

PHP, 68 62 bajtów

Powinno to zostać umieszczone w pliku, tablica jest zwracana na końcu, aby była użyteczna.

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

Aby uzyskać dostęp do tablicy, po prostu podaj wynik $a = include 'xyz.php';zmiennej (np .:) zmiennej.


Dzięki @manatwork za uratowanie mi 6 bajtów i naprawienie goof.

Ismael Miguel
źródło
1
Czy jesteś pewien, że kiedykolwiek wyświetli to cyfry szesnastkowe z %1$06dciągiem formatu? I nie widzę powodu, aby używać 1$. Można zmniejszyć długość o tym „#” w ciągu formatu: #%06x. Przydałoby się to przy dodawaniu dodatkowych znaków w celu ustalenia zakresu, ponieważ obecnie liczy do 16777216 = # 1000000.
manatwork
Cóż, to będzie .... Gdybym nie zapomniał zmienić %dsię %x. I zupełnie zapomniałem o przeniesieniu #wnętrza sprintf()rozmowy. Zapisałeś mi 6 bajtów. Dziękuję
Ismael Miguel
0

MATL , 11 bajtów

'#'5Y26Z^Yc

Wypróbuj online! (z trzema cyframi szesnastkowymi zamiast sześciu)

Wyjaśnienie

'#'   % 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
źródło
0

Lua , 47 45 bajtów

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

Wypróbuj online!

Marcio Medeiros
źródło
1
Możesz podrzucić swoją zmienną si zapisać bajt.
Jonathan Frech,
0

T-SQL, 122 117 bajtów

Zwraca tablicę #RRGGBBciągów 16 777 216 wierszy . Podział wiersza służy wyłącznie do odczytu:

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

Używa rekurencyjnego CTE dla tabeli liczb od 0 do 2 ^ 24-1, a następnie używa wbudowanego FORMATpolecenia (dostępnego w SQL 2012 lub nowszym), aby przekształcić go w 6-cyfrowy ciąg szesnastkowy . Dołącz z #przodu i gotowe.

Edycja 1: Usunięto POWER()funkcję, numer był krótszy: P

BradC
źródło
0

Galaretka , 8 bajtów

ØHṗ6”#;Ɱ

Wypróbuj online! (uwaga: używa TIO 2zamiast 6jako 6limit czasu)

Przesyłanie funkcji (ponieważ pełne programy Jelly domyślnie będą drukować listy ciągów bez separatorów między nimi, co utrudnia dostrzeżenie granic). Łącze TIO zawiera opakowanie do drukowania listy ciągów znaków za pomocą znaku nowej linii w celu ich rozdzielenia.

Wyjaśnienie

Ø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
źródło
1
Zainteresowanie - dlaczego uczyniłeś swoją odpowiedź wiki społeczności?
Jonathan Frech,
@JathanathanFrech: Robię to dla wszystkich moich postów, ponieważ a) zmniejsza motywację do gry w system reputacji (ponieważ post nie daje reputacji), b) cieszę się, że moje posty są edytowane, a społeczność- marker wiki to sposób na wskazanie tego. System reputacji Stack Exchange jest mniej lub bardziej całkowicie zepsuty: na poprzednim koncie raz celowo codziennie przeskakiwałem codziennie przez tydzień, aby pokazać, jak łatwa była gra. W dzisiejszych czasach prawie nie chcę brać w tym udziału, zwłaszcza że wyższa reputacja po prostu zmusza stronę do przekonania cię do moderacji.
ais523,
Ciekawe - na jakim stosie udało ci się zagrać w system reputacji?
Jonathan Frech,
@JathanathanFrech: Ten. Byłem użytkownikiem 20 tys., Ale ostatecznie usunąłem swoje konto, ponieważ w pewnym sensie zepsuło mi to życie i ponieważ system reputacji aktywnie popychał mnie do tworzenia treści, które pogorszyły stronę, a nie lepiej.
ais523,
0

PHP , 43 bajty

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

Wypróbuj online!

Logern
źródło
1<<24-> 8**8powinno tu działać, podziękowania dla @DigitalTrauma
Adirio,
0

Perl 6 , 26 bajtów

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

Wypróbuj online!

Używa tego samego formatu, co wszyscy inni. Przekroczono limit czasu na TIO.

Lub w formacie rgb:

31 bajtów

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

Wypróbuj online!

Jo King
źródło
Myślę, że wyjście rgb powinno zawierać rgb(0, 0, 0)ciąg rgb.
nwellnhof,
@nwellnhof Zaktualizowano (choć skończyło się na szesnastce)
Jo King