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

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']

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

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

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

Ответы:

8

R , 25 байт

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

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

j.doe
источник
Не знаком с 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 байта благодаря Дилнану

TFeld
источник
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)увидеть, чем это заканчивается .

AdmBorkBork
источник
6

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

Сохранено 3 4 байта благодаря @tsh

Возвращает массив #RRGGBBстрок.

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

Попробуйте онлайн! (усеченный вывод)

Arnauld
источник
Текущее использование Python-решения 8**8вместо 1<<24. Это будет работать на JS тоже.
TSH
5

Common Lisp, 42 байта

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

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

Renzo
источник
1
Может быть, первый- formatгольф, которого я видел. +1 только на этой основе.
Сильвио Майоло
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

05AB1E , 15 14 10 байт

15Ýh6ãJ'#ì

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

Объяснение:

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

Пакет, 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
streetster
источник
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.
Sanchises
источник
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

Рубин , 31 байт

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

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

гигабайт
источник
Я немного удивлен, что получаю %длинную строку и длинный массив. К вашему сведению, вы можете сохранить байт, используя вместо него буквальный разрыв строки \n.
Джордан,
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
}

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

archangel.mjj
источник
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
@FireCubez Это новое, начиная с Java 10. :) Вот соответствующий совет, чтобы увидеть, что можно, а что нельзя varв Java.
Кевин Круйссен
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

Луа , 47 45 байт

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

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

Марсио Медейрос
источник
1
Вы можете бросить свою переменную sи сохранить байт.
Джонатан Фрех,
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

BradC
источник
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
ais523
источник
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 (хотя в итоге он стал короче шестнадцатеричным)
Джо Кинг,