Код истинного цвета


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 цветовых вариаций в массиве в виде строк в rgb()функции CSS.

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. Реализации должны соблюдать точность канала как созданную или вычисленную, где это возможно. Если это невозможно, канал должен быть округлен до ближайшего значения с максимально возможной точностью, округлен в большую сторону, если два значения одинаково близки.

Последний аргумент - <alpha-value>указывает альфа цвета. Если задано как <number>, полезный диапазон значения 0 (представляющий полностью прозрачный цвет) - 1(представляющий полностью непрозрачный цвет). Если задано как, 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']

Критерии победы

Наименее байты используются для написания программы.


Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат .
Mego

Ответы:


8

R , 25 байт

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

Попробуйте онлайн!


Не знаком с R, но разве это не выдает # 000000?
nyanpasu64

2
Нет, выводится # 000000. См. Ссылку
TIO

@ jimbo1qaz a:b-cделает вектор из a-cto b-cвключительно (делает вектор из ato 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['...
Дилнан

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

Интересный язык. Есть идеи, почему буква Т используется для «0»? Я получаю 16 -> G, чтобы сохранить байт, но T -> 0 не выполняет то же самое.
Алек

@Alec Потому что, если вы замените T на 0, он соединится с 6 и станет 06.
geokavel

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

@ Алек, как сказал 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 (ок) , 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

г. см, 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


Сломать

Invokation

  • /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!
)

Этот бит использует описанный здесь прием для преобразования нормального числа в шестнадцатеричное, а затем сохраняет это значение в массив.


Я назвал эту структуру хранения «Массивом», но на самом деле это неверно, поскольку настоящие массивы не существуют в пакетном режиме. НО вы можете называть переменные так, чтобы они имели имена, похожие на массивы, например:

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». Мета
Tsh

Я не знал этого и буду обновлять свой ответ соответственно. Спасибо @tsh

0

Groovy , 53 байта

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

Определение функции. c () возвращает ArrayList (я полагаю, что это нормально, даже несмотря на вопрос, запрашивающий массив).

Ungolfed, с неявными типами:

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"...>. <
Кевин Круйссен,

@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.
manatwork

Ну, было бы .... Если бы я не забыл изменить %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 байт

Возвращает таблицу #RRGGBBстрок из 16 777 216 строк. Разрыв строки предназначен только для удобства чтения:

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”#;Ɱ

Попробуйте онлайн! (примечание: использует, 2а не 6как 6время ожидания на TIO)

Передача функций (поскольку полные программы 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: Я делаю это для всех своих постов, потому что: а) это снижает стимул для людей играть в систему репутации (поскольку пост не дает репутации), б) я рад, что мои посты отредактированы, а сообщество - маркер вики это способ указать на это. Система репутации 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 (хотя в итоге он стал короче шестнадцатеричным)
Джо Кинг,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.