本色代码


12

维基百科上的真彩色(24位)在相关部分中描述为

24位几乎总是使用R,G,B中的每个8位。截至2018年,几乎每台计算机和电话显示器以及绝大多数图像存储格式都使用24位色深。几乎所有情况下每个像素有32位意味着使用24种颜色,其余8种是alpha通道或未使用。

2 24给出16,777,216种颜色变化。人眼最多可以辨别一千万种颜色[10],并且由于显示器的色域小于人眼的范围,因此这意味着该范围应覆盖比所能感知的更多的细节。...

...

Macintosh系统将24位颜色称为“数百万种颜色”。术语“真彩色”有时用来表示本文所说的“直接彩色”。[13]通常也用于指所有大于或等于24的颜色深度。

包含所有16,777,216色的图像

全部16,777,216色

任务

编写一个程序,该程序在CSS rgb()函数中生成并返回数组中所有16,777,216个颜色变化作为字符串

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>指定颜色的Alpha。如果指定为a <number>,则该值的有用范围是0 (表示完全透明的颜色)至1(表示完全不透明的颜色)。如果指定为,则0%表示完全透明的颜色,而100%表示完全不透明的颜色。如果省略,则默认为100%

超出这些范围的值不是无效的,但是在计算值时将被限制为此处定义的范围。

出于遗留原因,rgb()它还支持另一种语法,该语法用逗号分隔所有参数:

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

同样由于遗留原因,rgba()也存在一个函数,其语法和行为与相同rgb()

或RGB十六进制表示法#RRGGBB格式

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)代表最大值。以相同方式解释的下一对数字指定绿色通道,最后一对数字指定蓝色。颜色的Alpha通道是完全不透明的。

实施例2
换句话说,#00ff00表示与rgb(0 255 0)(柠檬绿)相同的颜色。

请参阅CSS Color Module Level 4的编辑草稿

例子

CSS rgb()函数(可用空格代替逗号,例如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,

Answers:


8

R,25个字节

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

在线尝试!


不熟悉R,但这是否无法输出#000000?
nyanpasu64

2
不,它输出#000000。参见TIO链接
J.Doe

@ jimbo1qaz a:b-ca-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字节归功于Digital Trauma

-2字节感谢dylnan


2
为什么需要lambda?列表理解本身是一个有效的答案,不是吗?
Adirio

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--$_}

在线尝试!

从循环116mb(16777216)。每次迭代时,我们都使用-format运算符,该运算符对--$_针对string 递减的当前数字起作用"#{0:x6}"。在这里,我们指定他的x值,将其填充到6数字,并#在前面加一个哈希。在TIO上,限制为60秒/ 128KiB的输出。更改1(16mb-5),看它是如何结束


6

JavaScript(ES7),65 62 61字节

@tsh 节省了3个 4字节

返回#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

啊,知道了 因此,如果您不希望它与前一个/下一个数字结合在一起,那么每个数字是否存在一个字母?
亚历克

正如geokavel所说,@Alec在这种特殊情况下,由于必须使用逗号来分隔要传递给的2个参数,因此节省了我一个字节ù。另一个典型的用例是在需要递增变量(例如在数组上进行映射)时将其用作计数器。而且,当然,由于它是一个变量,如果需要,您也可以简单地为其分配一个值。0是唯一具有自己的变量的一位整数,但是-从技术上讲,7作为6输入变量的U-Z默认值默认为0。在Japt中分配给变量的其他整数是:-1, 10-16, 32, 64 & 100
毛茸茸的

如果您想了解有关Japt的更多信息,请随时在我们的聊天室 ping我。
毛茸茸的


3

05AB1E15 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(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

MATL17 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

红宝石,31个字节

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

在线尝试!


我有点惊讶,%需要那么长的字符串和那么长的数组。仅供参考,您可以使用文字换行符代替来保存一个字节\n
乔丹

1

V,25个字节

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

在线尝试!(替换1677721531

说明

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与just相比,它算作4个额外的字符cmd /K g.cmd。这将建立一个在内存中具有“阵列”的环境。它也永远需要运行,因此请使用非常低的值尝试使用Ctrl+C


分解

开票

  • /V启用延迟扩展,但比短setlocal EnableDelayedExpansion,这就是为什么我们首先需要cmd致电的原因
  • /Q 省略输出,等效于 @echo off
  • /K使您可以执行表达式(在这种情况下为g.cmd),并且此后不会退出,因此您可以使用来检查“数组”set #

厘米

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”。meta
tsh

我不知道,将相应地更新我的答案。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"...>。<
Kevin Cruijssen

@KevinCruijssen我从不知道你可以var r用Java 做。
FireCubez


0

PHP,68 62字节

应该将其放置在文件内,最后返回数组,以使其可用。

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

要访问该数组,只需将include(例如:)的结果提供给$a = include 'xyz.php';变量。


感谢@manatwork为我节省了6个字节并修复了问题。


1
您确定这会输出带有%1$06d格式字符串的十六进制数字吗?而且我认为没有理由使用1$。您可以通过在格式字符串中包含“#”来减少长度#%06x。当添加额外的字符来固定范围时,这会派上用场,因为当前的计数高达16777216 =#1000000。
manatwork 18/09/24

好吧,这会....如果我不忘记更改%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)

对从0到2 ^ 24-1的数字表使用递归CTE,然后使用内置FORMAT命令(在SQL 2012或更高版本中可用)将其转换为6位十六进制字符串。将附加#到前面,我们就完成了。

编辑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
出于兴趣-为什么将答案作为社区Wiki?
乔纳森·弗雷希

@JonathanFrech:我对我的所有帖子都这样做,因为a)它减少了人们使用声誉系统的动机(因为该帖子没有给予声誉),b)我很高兴编辑自己的帖子,并且社区- Wiki标记是一种表明这一点的方法。Stack Exchange的信誉系统或多或少都被完全破坏了:根据过去的经验,我曾经有意每天在一周内每天设置上限,以显示该系统的游戏难度。如今,我几乎不想参与其中,尤其是因为较高的声誉只是使该网站试图说服您进行管理。
ais523

只是好奇-您在信誉系统上获得了哪些筹码?
乔纳森·弗雷希

@JonathanFrech:这个。我当时是2万名用户,但最终删除了我的帐户,因为那会破坏我的生活,并且由于信誉系统积极地促使我制作使网站变得更糟而不是更好的内容。
ais523



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.