Справжній код кольору


12

Справжній колір (24-бітний) у Вікіпедії описується у відповідній частині як

24 біти майже завжди використовують 8 біт кожного з R, G, B. Станом на 2018 рік, 24-розрядна глибина кольору використовується практично на кожному дисплеї комп'ютера та телефону та переважна більшість форматів зберігання зображень. Майже всі випадки, коли є 32 біти на піксель, означають, що 24 використовуються для кольору, а решта 8 - альфа-канал або невикористаний.

2 24 дає 16 777 216 варіацій кольорів. Людське око може розрізнити до десяти мільйонів кольорів [10], і оскільки гамма дисплея менша, ніж діапазон зору людини, це означає, що це повинно охоплювати цей діапазон більш детально, ніж можна сприймати. ...

...

Системи Macintosh позначають 24-бітний колір як "мільйони кольорів". Термін "Справжній колір" колись використовується для позначення того, що ця стаття називає "Прямий колір". [13] Він також часто використовується для позначення всіх глибин кольору, більших або рівних 24.

Зображення, що містить усі 16 777 216 кольорів

Усі 16 777 216 кольорів

Завдання

Напишіть програму , яка генерує і повертає всі 16,777,216 колірні варіації в межах масиву в вигляді рядка в CSS rgb()функції

5.1. Функції RGB: rgb()іrgba()

rgb()Функція визначає колір RGB, вказавши червоний, зелені і сині канали безпосередньо. Його синтаксис:

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

Перші три аргументи задають відповідно червоний, зелений та синій канали кольору. 0%представляє мінімальне значення для цього кольорового каналу в гамі sRGB і 100%представляє максимальне значення. A <number>еквівалентний a <percentage>, але з іншим діапазоном: 0знову представляє мінімальне значення для кольорового каналу, але255представляє максимум. Ці значення випливають з того, що багато графічних двигунів зберігають кольорові канали внутрішньо як єдиний байт, який може вміщувати цілі числа від 0 до 255. Реалізація повинна вшановувати точність каналу як авторську або обчислену, де це можливо. Якщо це неможливо, канал слід округлювати до найближчого значення з найвищою точністю, що використовується, округлюючи, якщо два значення однаково близькі.

Заключний аргумент, the <alpha-value>, вказує альфа кольору. Якщо дано як a <number>, корисний діапазон значення становить 0 (представляє повністю прозорий колір) до 1(представляє повністю непрозорий колір). Якщо подано у вигляді a, 0%являє собою повністю прозорий колір, тоді як 100%являє собою повністю непрозорий колір. Якщо пропущено, це значення за замовчуванням 100%.

Значення за межами цих діапазонів недійсні, але затискаються до діапазонів, визначених тут у час обчисленого значення.

З застарілих причин rgb()також підтримується альтернативний синтаксис, який розділяє всі його аргументи комами:

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

Також із застарілих міркувань rgba()також існує функція, що відповідає ідентичній граматиці та поведінці rgb().

або шістнадцятковий #RRGGBBформат позначень RGB

5.2. Шістнадцяткові позначення RGB:#RRGGBB

Шістнадцяткова позначення кольорів CSS дозволяє задавати колір, надаючи каналам як шістнадцяткові числа, що схоже на те, як кольори часто записуються безпосередньо в комп'ютерний код. Це також коротше, ніж написання одного кольору в rgb()нотації.

Синтаксис a <hex-color>- це <hash-token>маркер, значення якого складається з 3, 4, 6 або 8 шістнадцяткових цифр. Іншими словами, шістнадцятковий колір пишеться як хеш-символ "#", а потім деяка кількість цифр 0-9 або літери af (справа букв не має значення - #00ff00тотожна #00FF00).

Кількість заданих шістнадцяткових цифр визначає, як розшифрувати шістнадцяткову нотацію в колір RGB:

6 цифр

Перша пара цифр, інтерпретована як шістнадцяткове число, вказує червоний канал кольору, де 00зображено мінімальне значення і ff(255 у десятковій) представляє максимум. Наступна пара цифр, інтерпретована таким же чином, вказує зелений канал, а остання пара - синій. Альфа-канал кольору повністю непрозорий.

ПРИКЛАД 2
Іншими словами, #00ff00являє собою той же колір, що і rgb(0 255 0)(липовий зелений).

Дивіться проект редактора кольорового модуля CSS рівень 4

Приклади

rgb()Функція CSS ( пробільний символ може бути замінений символом кома, наприклад, 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 RRGGBB

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

Критерії виграшу

Найменше байтів, які використовуються для написання програми.


Коментарі не для розширеного обговорення; ця розмова була переміщена до чату .
Мего

Відповіді:


8

R , 25 байт

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

Спробуйте в Інтернеті!


Не знайомий з R, але це не вдається вивести номер 000000?
nyanpasu64

2
Ні, він виводить # 000000. Дивіться посилання TIO
J.Doe,

@ Jimbo1qaz a:b-cробить вектор з a-cдо b-cвключно (це вектор від aдо b, а потім віднімає cз кожного запису).
Артур

2
Так, R визначає колони з більш чітким пріоритетом, ніж арифметичні ... На відміну від фрагментів Python.
nyanpasu64

7

Python 2 , 77 40 39 37 байт

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

Спробуйте в Інтернеті!

-1 байт завдяки цифровій травмі

-2 байти завдяки ділнан


2
Навіщо вам потрібна лямбда? Само розуміння списку є вагомою відповіддю, чи не так?
Адіріо

2
Спробуйте 8**8замість того, 1<<24щоб зберегти байт
Digital Trauma

2
як щодоprint['...
dylnan

1
@Adirio Само значення не вважається реалізацією виклику.
Джонатан Фрех

2
@Adirio Ви самі писали [...] в термінал Python [...] - таким чином ваше подання буде записане в Python 2 REPL , а не в Python 2 .
Джонатан Фрех

6

PowerShell , 28 26 байт

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

Спробуйте в Інтернеті!

Петлі від 1до 16mb(16777216). При кожній ітерації ми використовуємо -fоператор ormat, що діє на поточне число, попередньо зменшене --$_проти рядка "#{0:x6}". Тут ми вказуємо, що він має xзначення, підкреслені 6цифрами, з хешем #спереду. У TIO обмежено 60 секунд / 128 Кбіт виходу. Змініть 1на, (16mb-5)щоб побачити, як воно закінчується .


6

JavaScript (ES7), 65 62 61 байт

Збережено 3 4 байти завдяки @tsh

Повертає масив #RRGGBBрядків.

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

Спробуйте в Інтернеті! (усічений вихід)


Використовується поточне рішення Python 8**8замість 1<<24. Це також буде працювати на JS.
tsh


4

Japt, 14 байт

Виходи як #rrggbb.

G²³ÇsG ùT6 i'#

Спробуйте (обмежено першими 4096 елементами)


Пояснення

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

Цікава мова. Будь-яка ідея, чому літера "T" використовується для "0"? Я отримую 16 -> G, щоб зберегти байт, але T -> 0 не виконує те саме.
Алек

@Alec Тому що якщо замінити T на 0, він з'єднується з 6 і стає 06.
geokavel

Ах, готча. Так є одна літера на цифру для випадків, коли ви не хочете, щоб вона поєднувалася з попередньою / наступною цифрою?
Алек

@Alec, як сказав geokavel, у цьому конкретному випадку він економить мені байт у тому, щоб використовувати кому для розмежування двох переданих аргументів ù. Ще один типовий випадок використання - це використовувати його як лічильник, коли вам потрібно збільшити змінну, наприклад, зіставляючи масив. І, звичайно, оскільки це змінна, ви можете просто присвоїти їй значення, якщо потрібно. 0це єдине одноцифрове ціле число, яке має власну змінну, але, технічно, 7 як 6 вхідної змінної U-Zза замовчуванням 0. Решта цілі числа , присвоєні змінним в Japt є: -1, 10-16, 32, 64 & 100.
Кудлатий

Якщо ви хочете дізнатись більше про Japt, не соромтеся пінг мені в нашій чаті .
Кудлатий



3

Пакет, 87 байт

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

Виводи у форматі CSS. Підстановка змінної відбувається до forрозбору оператора, тому фактичний код такий:

@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 байт

Рішення:

$(3#256)\'!16777216

Спробуйте в Інтернеті! (обмежено першими 500 номерами)

Пояснення:

Вивантажте рядок rgb. Перетворіть кожне число від 0 до 16777216 до базового 256, а потім перетворіть у рядки ...

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

2

MATL , 17 15 байт

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

Спробуйте в Інтернеті!

Версія TIO відображає перші 2 ^ 10 лише як не вичерпані. Я включив остаточну ітерацію в колонтитул, щоб показати, що він дійсно закінчується на #FFFFFF. Збережено один байт, змінивши на, fprintfа не вручну збираючи рядок. Виводить список, розділений комами.

Пояснення

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 байт

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

Спробуйте в Інтернеті!

22416⍴4⍴

Завдяки @Dzaima та @ngn за 23 байти.

Використання ⎕IO←0.

Як:

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

V , 25 байт

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

Спробуйте в Інтернеті! (замінено 16777215на 31)

Пояснення

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

Пакетна, 69 + 4 = 73

g.cmd, 69

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

Зберігає шістнадцяткове значення з формою #RRGGBBу "масив".

g.cmdназиватися використанням cmd /V/Q/K g.cmd. Звідси походить + 4 /V/Q, рахуючи як 4 додаткових символи порівняно з просто cmd /K g.cmd. Це створює середовище, яке має "масив" в пам'яті. Це також потрібно вічно запустити, тому використовуйте дуже низькі значення, щоб спробувати перервати виконанняCtrl+C


Зламатися

Виклик

  • /Vдозволяє затримати розширення, але коротше setlocal EnableDelayedExpansion, тому нам потрібен cmdв першу чергу виклик
  • /Q опускає вихід і еквівалентний @echo off
  • /Kдозволяє виконувати вираз (У даному випадку g.cmd) і не виходити після цього, тому ви можете перевірити "масив", використовуючиset #

g.cmd

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

Цей біт використовує фокус, задокументований тут, для перетворення нормального числа в шістнадцятковий, а потім зберігає це значення у "масив".


Я називав цю структуру зберігання "масивом", але це насправді не так, оскільки справжні масиви не існують у Batch. АЛЕ Ви можете назвати змінні таким чином, щоб вони мали такі імена масивів, як:

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

або, як у цьому випадку:

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

Ви все одно можете отримати доступ до них через !#%position%!


Я не впевнений. Але, можливо, /V/Q/Kїх можна стверджувати як «аргументи» для перекладача і вважати «3 + 69 = 72». мета
тш

Я цього не знав, і відповіді оновлю відповідно. Thx @tsh

0

Groovy , 53 байти

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

Визначення функції. c () повертає ArrayList (я припускаю, що це добре, навіть через запитання запитує масив).

Безгольовий з неявними типами:

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

Спробуйте в Інтернеті!


0

Java 10, 87 84 байт

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

-3 байти завдяки @ archangel.mjj .

Спробуйте в Інтернеті (обмежено першими 4,096пунктами).

Пояснення:

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

Ах, ти це розмістив, поки я писав свій пост, тому у нас дуже схожі відповіді. Можна покращитись на три байти за допомогоюr[i]="".format("#%06X",i);
archangel.mjj

@ archangel.mjj Ах, я ідіот. Дякую! Я насправді мав "".format("#%06X",i)раніше, оскільки бачив це у відповіді Python, але я кинув відповідь, оскільки не міг змусити її працювати досить швидко для TIO. Потім я побачив , що все просто виводить перші 4,096пункти TIO, так що я знову написав відповідь, забувши про "#%06X".> ... <
Кевін Cruijssen

@KevinCruijssen Я ніколи не знав, що ти можеш робити var rна Java ..
FireCubez


0

PHP, 68 62 байт

Це повинно бути розміщено всередині файлу, масив повертається в кінцевому підсумку, щоб бути корисним.

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

Щоб мати доступ до масиву, просто надайте результат включення (наприклад $a = include 'xyz.php';:) змінної.


Завдяки @manatwork за те, що врятувало мені 6 байт та виправляє помилку.


1
Ви впевнені, що це коли-небудь виводить шістнадцяткові цифри із %1$06dрядком формату? І я не бачу причин для використання 1$. Ви могли б зменшити довжину, включивши «#» в рядку формату: #%06x. Що стане в нагоді при додаванні додаткових символів для виправлення діапазону, оскільки наразі нараховується до 16777216 = # 1000000.
манатура

Ну, було б .... Якби я не забув змінити %dдо %x. І зовсім забув про переміщення #всередині sprintf()дзвінка. Ти врятував мені 6 байт. Дякую
Ісмаель Мігель

0

MATL , 11 байт

'#'5Y26Z^Yc

Спробуйте в Інтернеті! (із трьома шістнадцятковими цифрами замість шести)

Пояснення

'#'   % 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 байт

Повертає 16 777 216 рядків #RRGGBBрядків рядків. Розрив рядка призначений лише для читання:

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

Використовує рекурсивний CTE для таблиці чисел від 0 до 2 ^ 24-1, потім використовує вбудовану FORMATкоманду (доступну в SQL 2012 або новіших версіях), щоб перетворити її в шестизначну шістнадцяткову рядок . Прикріпіть на #передню частину, і ми закінчили.

Правка 1: Вилучена POWER()функція, число було коротше: P



0

Желе , 8 байт

ØHṗ6”#;Ɱ

Спробуйте в Інтернеті! (Примітка: використовується TIO, 2а не 6як 6час)

Подання функцій (адже повні програми Jelly за замовчуванням друкують списки рядків без роздільників між ними, утрудняючи видимість меж). Посилання TIO містить обгортку для друку списку рядків, використовуючи нові рядки для їх розділення.

Пояснення

Ø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
Не цікаво - чому ви зробили свою відповідь вікі спільноти?
Джонатан Фрех

@JonathanFrech: Я роблю це для всіх своїх постів, тому що: а) це зменшує стимули для людей грати в систему репутації (оскільки повідомлення не дає репутації); б) я радий редагувати свої публікації та wiki маркер - це спосіб вказати це. Система репутації Stack Exchange більш-менш повністю зруйнована: за минулий рахунок я один раз навмисно повторював щоденний тиждень протягом тижня, щоб показати, наскільки легко в цій системі грати. Сьогодні я дуже хочу, щоб у цьому не брали участі, тим більше, що вища репутація просто змушує сайт спробувати переконати його помітити.
ais523

Просто цікаво - на якому стеку ви досягли гри в репутаційну систему?
Джонатан Фрех

@JonathanFrech: Цей. Я був користувачем 20 тис., Але врешті-решт видалив мій обліковий запис, тому що це ніби зіпсувало моє життя і тому, що система репутації активно підштовхувала мене до створення контенту, який зробив сайт гіршим, а не кращим.
ais523



0

Perl 6 , 26 байт

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

Спробуйте в Інтернеті!

Використовується той самий формат, що і всі інші. Тайм-аут вийшов на TIO.

Або у форматі rgb:

31 байт

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

Спробуйте в Інтернеті!


Я думаю, що вихід RGB повинен rgb(0, 0, 0)включати рядок rgb.
nwellnhof

@nwellnhof Оновлено (хоча в кінці кінця це зробити шістнадцятковий)
Jo King
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.