输出HTML颜色


30

16色CGA调色板(也称为HTML色)是早期图形适配器使用的16种颜色的集合。这项挑战的目标是以十六进制格式(RRGGBB)按照十六进制值的升序输出所有16个字符,并以换行符分隔。因此,输出应该完全是这样:

000000
000080
0000FF
008000
008080
00FF00
00FFFF
800000
800080
808000
808080
C0C0C0
FF0000
FF00FF
FFFF00
FFFFFF

允许使用一条尾随的换行符,但不是必需的。

Answers:


13

果冻31 29 27 字节

“×Ɗ¡‘ŒP»Ṫ¦209ṗ€3Fd⁴ịØHs3ṢQY

在线尝试!

怎么运行的

“×Ɗ¡‘在Jelly的SBCS中的引号之间产生字符的代码点,即0x11 = 17 0x91 = 145,和0×00 = 0

ŒP 构造代码点阵列的幂集,得出

[[], [17], [145], [0], [17, 145], [17, 0], [145, 0], [17, 145, 0]]

最后两个条目对应于包含80个组合的组合FF的,因此我们必须丢弃它们。

»Ṫ¦209 包括三个部分:

  • (tail)删除代码点的最后一个数组,即[17,145,0]

  • »209取幂集其余部分中每个整数的最大值,0xD1 = 209,将它们全部替换为209

  • ¦(稀疏)遍历powerset其余部分的元素。如果在[17,145,0]中找到了相应的索引,则元素将全部替换为209。如果没有,则保持不变。

    ¦不是模块化的,因此仅修改了Powerset其余部分中的最后一个数组(索引0)。指数17145太大,没有作用。

结果如下。

[[], [17], [145], [0], [17, 145], [17, 0], [209, 209]]

ṗ€3 计算每个数组(即每个数组的所有三元组元素的数组)的三次笛卡尔乘方。

Fd⁴展平结果并计算每个整数的商和余数除以16

ịØH索引(从1开始)到“0123456789ABCDEF,所以为0x110x910×00,并0xD1被映射到“00” “80” “FF”“C0” (相应的)。

s3ṢQ 将字符对拆分为3个元组,对元组进行排序,然后进行重复数据删除。

最后,Y加入唯一的元组,并以换行分隔。


11

Bash + GNU实用工具,67

  • @manatwork节省了2个字节
  • @zeppelin节省了2个字节
a={00,80,FF}
eval echo $a$a$a|fmt -w9|sed '16iC0C0C0
/F0*8\|80*F/d'
  • 括号扩展 {00,80,FF}{00,80,FF}{00,80,FF}以正确的顺序(不包括C0C0C0)提供了所有需要的组合以及一些附加功能。额外内容是同时包含F8字符的内容。
  • 撑杆膨胀的结果是一条用空格分隔的线。 fmt将每个条目放在自己的行上
  • sed表达式的第一行插入C0C0C0相应的行
  • sed表达式的第二行过滤掉上述的“附加”。

伊迪奥


6

果冻38 31 字节

“mạ9ṣṃwɠƁ,¡ẓw’b4µża1$ị“08CF”s3Y

TryItOnline!

以250为基数的数字(“...’)压缩,
转换为以4为基数(b4),在进行矢量化逻辑运算后以自身的副本
压缩(ż),并以1(a1$)* 压缩,将()
索引为所使用的四个字符(“08CF”),
分成若干块长度3(s3),
并与换行符(Y)连接。

*因此,将每个零数字与另一个零配对,并将任何其他数字与一个配对。随着下面的索引取这个装置'F'变得与另一个配对'F''0''8''C'每对同一个'0'


小修改,以解决这一问题的答案:“0FC8”,因为我们有00FFC0,和80
Sherlock16年

哦,我没注意到!谢谢。
乔纳森·艾伦

3

Python 3中,134 129 125 108 91 90个字节

我认为这里还有很多高尔夫活动。欢迎打高尔夫球!

编辑: -9个字节,非常感谢Mego提供的字符串格式化帮助。首先从-17个字节中找出了一种更好的方式来打印字符串。首先找出一个更好的方法来编写for循环的-17个字节。-1字节感谢xnor的技巧i%3//2*"\n"而不是使用"\n"*(i%3<2)

for i in range(48):print(end="F0C8F000"[0x10114abf7f75c147d745d55//4**i%4::4]+i%3//2*"\n")

开球

z = 0
a = [0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 2, 2, 2, 3, 3, 3, 1, 3, 3, 3, 1, 3, 1, 1, 3, 0, 0, 1, 1, 0, 1, 3, 3, 1, 1, 3, 1, 0, 1, 1, 3, 1, 1, 1, 1, 1]
for i in range(len(a)):
    z = (z + a[i]) * 4
z //= 4                   # we multiplied by 4 one too many times
for i in range(48):
    m = z // 4**j % 4
    s = "F0C8F000"[c::4]
    if i % 3 == 2:
        s += "\n"
    print(s, end="")

尝试这样 -您必须将参数包装在括号(或方括号)中,并使用splat *
Mego

i%3//2*"\n"保存一个字节。
xnor

这也适用于py 3
Miguel

@Miguel不,这是我没有清理的编辑。它不使用Python 2.工作
Sherlock9

2

的JavaScript(ES6),109个 107字节

由于尼尔,节省了2个字节

这比仅在反引号中返回原始字符串短7 9字节。

_=>[...'1121173113106393'].map(v=>[4,2,0].map(x=>'08CF'[x=n>>x&3]+'000F'[x],n+=+v||21).join``,n=-1).join`
`

测试


1
有趣的.replace(/./g)是,它的长度与相同.map().join,但.map(x=>'08CF'[x=n>>x&3]+'000F'[x],n+=+v||21)节省了两个字节。
尼尔

2

PowerShell,113106字节

'777
7780
77FF
7807
78080
7FF7
7FFFF
8077
80780
80807
808080
C0C0C0
FF77
FF7FF
FFFF7
FFFFFF'-replace7,'00'

是的,除了打印文字字符串外,我没有发现任何其他东西...感谢@ Martin Smith使用简单的替换操作将7个字节缩减(我完全忽略了)。因此,与简单地对其进行硬编码相比,我们至少短了7个字节。好极了!

但这很无聊!

所以与其 ...

PowerShell v4,128字节

[consolecolor[]](0,7+9..15)+-split'Lime Maroon Navy Olive Purple Silver Teal'|%{-join"$([windows.media.colors]::$_)"[3..8]}|sort

[system.consolecolor]命名空间定义控制台的颜色(原生)提供的PowerShell控制台。如果我们通过这样的整数数组引用它们,则默认值为名称(例如,BlackWhite或类似物)。我们将其与已经-split空格,因此现在我们有了颜色名称的字符串数组。

我们遍历这些值|%{...},每次迭代都提取相应的[system.windows.media.colors]值。这些对象的默认字符串化是#AARRGGBB格式为十六进制值的颜色,因此我们通过使用脚本块将调用封装在字符串中来利用它"$(...)"。但是,由于我们不希望使用alpha值或哈希值,因此我们使用[3..8]了字符串的后端,并且需要将-join生成的char-array返回字符串。然后,简单Sort-Object地将它们以正确的顺序放置。


1
共有21个实例,00.Replace(7,'00')<21个字符。
马丁·史密斯

我不知道如何使用PowerShell,但是替换80和FF也可能值得。
nedla2004年

@ nedla2004执行-replacefor 880是相同的字节数(保存12个零,即-replace8,80长度)。这样做是为了FF是因为周围的需要引号的两个字节长"FF"-replace2,"FF"声明。
AdmBorkBork

好的,我想知道您是否可以以某种方式组合替换项。
nedla2004年


1

MATL,39个字节

'80FFC000'2e'3na:1Fswv1=`uIn'F4:ZaZ)6e!

在线尝试!

'80FFC000'         % Push this string
2e                 % Reshape with 2 rows. So 1st column contains '80', 2nd 'FF' etc
'3na:1Fswv1=`uIn'  % Push this string
F4:Za              % Convert from base 95 to alphabet [1 2 3 4]
Z)                 % Use as column indices into the first string
6e!                % Reshape with 6 rows and transpose.
                   % Implicitly display

1

05AB1E,57个字节

•P{Ætg7«r¨ëÅ,…}ù¢Ý%Vt®£8ãøÚ$0óDÛY²Zþ…ð7ê‘Ó{òìàYëØU¥•hR6ô»

在线尝试!

我们需要输出的基本上是(反转和拆分):

FFFFFF00FFFFFF00FF0000FF0C0C0C080808000808080008000008FFFF0000FF00080800000800FF0000080000000000

其中,十进制为:

39402003857025890357721060524755992261661062099432941475272448103296644696683709026793043150430945208910007869898752

在Base-214中是:

P{Ætg7«r¨ëÅ,…}ù¢Ý%Vt®£8ãøÚ$0óDÛY²Zþ…ð7ê‘Ó{òìàYëØU¥

这是我能想到的最简单的解决方案,因为我无法击败丹尼斯。花了一个小时的尝试,没有什么比他的想法更好。



0

批处理,137字节

@for %%c in (000000 000080 0000FF 008000 008080 00FF00 00FFFF 800000 800080 808000 808080 C0C0C0 FF0000 FF00FF FFFF00 FFFFFF)do @echo %%c

是的,那很无聊。先前的148字节尝试:

@if "%2"=="" (call %0 000000 80&call %0 C0C0C0 FF)|sort&exit/b
@echo %1
@for %%c in (0000%2 00%200 00%2%2 %20000 %200%2 %2%200 %2%2%2)do @echo %%c

不幸的是,您无法通过管道传输a forcall:命令的输出,因此我必须递归调用自己。



0

Befunge,83 69字节

<v"UVTYZQPefij?EDA@"
v>>9\:4/:\4/>4%:3g,0`
<^_@#:,+55$_^#!-9:,g3
F08C

在线尝试!

颜色编码在您在第一行中看到的字符串中,每个颜色分量两位,并设置了一个附加的高位,以强制每个值进入ASCII范围(63除外,否则将超出127的范围) )。

然后按以下方式处理堆栈上的颜色列表:

9\          9 is pushed behind the current colour to serve as a marker.
:4/:\4/     The colour is repeatedly divided by 4, splitting it into 3 component parts.

>           The inner loop deals with each of the 3 components. 
 4%         Modulo 4 masks out the 2 bits of the colour component that we care about.
 :3g,       That is used as an index into the table on line 4 to get the character to output.
 0`3g,      For component values greater than 0 the second char is a '0', otherwise an 'F'. 
 :9-!       Check if the next component is our end marker.
^           If not, repeat the inner loop.

55+,        Output a newline.
:_          Repeat the outer loop until there are no more colours on the stack. 

0

C#,195个字节

void n(){string a="000000\r\n000080\r\n0000FF\r\n008000\r\n008080\r\m00FF00\r\n00FFFF\r\n800000\r\n800080\r\n808000\r\n808080\r\nC0C0C0\r\nFF0000\r\nFF00FF\r\nFFFF00\r\nFFFFFF";Console.Write(a);}

令人遗憾的是,尽管有了令人难以置信的令人费解的缠结(我编写它时获得了无穷的乐趣),C#却远远超过了更有趣的部分,C#,270字节

void n(){string a,b,c,d;a="00";b="80";c="C0";d="FF";for(int i=0;i<16;i++){Console.WriteLine((i<7?a:i<11?b:i>11?d:c)+(i<3?a:i<5?b:i<7?d:i<9?a:i<11?b:i==11?c:i<14?a:d)+(i==0||i==3||i==5|i==7||i==9||i==12||i==14?a:i==1||i==4||i==8||i==10?b:i==2||i==6||i==13||i==15?d:c));}}

您可以直接在函数中返回字符串-无需将其存储在变量中然后打印。另外,a)您可以使用lambda,b)我敢肯定有一种解决方案,它可以简单地转储字符串。
Mego

@Mego,这是我在高尔夫上的第一篇C#帖子,不确定我如何诚实地执行lambda函数!
Alfie Goodacre

我建议浏览此列表以查找需要改进的地方。
Mego

@Alfie Goodacre:仅返回值的C#lambda :(()=>@"string_here"这强制转换为Action<string>)。我还建议使用逐字字符串(@),这样您就可以将新行直接放在字符串中,而不必对其进行转义。
牛奶

0

C(gcc),99字节

f(i){for(i=48;i--;)printf("%.2s%s","FFC08000"+("#&/28MNQRSV]^_ab"[i/3]-35>>i%3*2&3)*2,"\n\0"+i%3);}

在线尝试!

尝试创建一个数字列表并在排序时输出它们之后,我将其与朴素的解决方案进行了比较:

f(){puts("000000\n000080\n0000FF\n008000\n008080\n00FF00\n00FFFF\n800000\n800080\n808000\n808080\nC0C0C0\nFF0000\nFF00FF\nFFFF00\nFFFFFF");}

与我尝试200并进行更改相比,它的时钟为140字节。

解决方案是将其视为与其他任何文本一样的文本,尽管使用小字母。每种颜色都可以看作是字母{0xff,0xc0,0x80,00}中2位索引的三元组。颜色->三元组->数字->字符(偏移量为+35,使它们全部可打印并避免任何转义)的过程可以说明如下:

000000  333     63  b
000080  332     62  a
0000FF  330     60  _
008000  323     59  ^
008080  322     58  ]
00FF00  303     51  V
00FFFF  300     48  S
800000  233     47  R
800080  232     46  Q
808000  223     43  N
808080  222     42  M
C0C0C0  111     21  8
FF0000  033     15  2
FF00FF  030     12  /
FFFF00  003     3   &
FFFFFF  000     0   #

然后,只需遍历结果字符串并切出字母字符串的相应部分即可。

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.