如何用十六进制编码颜色


15

六边形棋盘格或平面拼贴是三色的-意味着仅使用三种颜色(例如红色,蓝色和绿色),就可以对每个六边形进行着色,而没有任何两个共享颜色边界的六边形。显示这种模式的部分示例

给定局部ASCII六边形拼贴(通过STDIN,从文件中读取等),请更改字符的颜色(通过ANSI代码,图像处理等)以适合此颜色。扭曲是六边形的中间(*下面的,是三种颜色),并且它们之间的线需要混合使用两种相应的十六进制*颜色。如果线在外边界上,则应与对应*

例如,给定的部分六角形平铺

 / \ / \ / \ / \
| * | * | * | * |
 \ / \ / \ / \ /
  | * | * | * |
   \ / \ / \ /

假设我们决定将左上角的十六进制着色*为红色,并将其两个相邻的着色为蓝色和绿色(顺时针旋转)。然后,该|行需要为洋红色,该/行需要为黄色。如果我们继续着色,我们最终将得到如下所示(为清晰起见,将其放大):

六角着色1

或者,输入

     / \
    | * |
   / \ /
  | * |
 / \ /
| * |
 \ /

您可能会这样着色(为清楚起见放大了):

六角着色2

其他一些测试用例(您的代码应能够处理这些用例):

 / \ / \
| * | * |
 \ / \ /
  | * |
 / \ / \
| * | * |
 \ / \ /


 / \
| * |
 \ / \
  | * |
 / \ /
| * |
 \ /



 / \
| * |
 \ /

规则

  • 确保输入具有至少一个六边形,并且任何输入都不会有“孔”。
  • 只要您保持三色规则,就不需要用红色开始着色。
  • 如果部分切片可以是两种颜色,则可以不加任何惩罚地进行着色(例如在第二个示例中)-您不必将部分切片推断为完整的切片。
  • 六边形中心*必须用红色,蓝色或绿色着色,而它们之间的线必须是青色,黄色或品红色。例如,*不允许具有洋红色,并且红色|\/必须位于图形的外部边界上。请参阅下面的颜色
  • 如果您的控制台没有这些确切的颜色,请使用最接近的近似值,并在答案中指定您使用的近似值。
  • 只要字符对齐,开头或结尾的空格(包括结尾的换行符)都是可以接受的。
  • 可以通过空格填充输入部分切片,以形成一个矩形,如果这样可以简化代码。
  • 完整的程序或功能都是可以接受的。如果是函数,则可以返回输出而不是打印输出。
  • 输出可以保存到控制台,也可以保存为图像等。
  • 禁止出现标准漏洞
  • 这是因此所有常用的高尔夫规则都适用,并且最短的代码(以字节为单位)获胜。

颜色和混色:

三种可用的基色是(带有RGB十进制格式的颜色代码):

  • 红色 (255,0,0)
  • 绿色 (0,255,0)
  • 蓝色 (0,0,255)

组合为:

  • 红色和绿色结合成黄色 (255,255,0)
  • 蓝色和绿色相结合,使青色 (0,255,255)
  • 红色和蓝色结合形成洋红色 (255,0,255)

可以加一个带孔的测试用例吗?像第一个(其他)一样,但没有中间*
H.PWiz

如果在输入的行尾或换行符后有多余的空格,是否必须保留它们?
HyperNeutrino

@ H.PWiz永远不会出现这种情况。不用担心。
AdmBorkBork

@HyperNeutrino不,那完全是您的决定。输入/输出空格格式不是此挑战的有趣部分。
AdmBorkBork

好的。谢谢。另外,我们是否必须处理空输入?
HyperNeutrino

Answers:


7

的JavaScript(ES6),219个 203 201字节

f=
s=>s.split`
`.map((b,i,a)=>b.replace(/./g,(c,j)=>`<font color=#${g=(x,y)=>((a[x+i]||``)[b=y+j]==`*`&&15<<b%3*4)|(y<0?8<<9:g(x,y-2)),(g(0,2)|g(-1,1)|g(1,1)).toString(16).slice(1)}>${c}</font>`)).join`
`
<input type=button value="Colourise!" onclick=i.innerHTML=f(i.textContent)>
<pre id=i contenteditable> / \ / \
| * | * |
 \ / \ / \
  | * | * |
 / \ / \ / \
| * |   | * |
 \ / \ / \ / \
  | * | * | * |
 / \ / \ / \ /
| * | * |
 \ / \ /</pre>

说明:每个字符都包裹在一个font标签中以设置其颜色,该颜色是通过检查每个正方形,左和右两个正方形,对角线四个正方形(对角为*s)以及如果将所有颜色组合在一起而得出的*找到了。的*颜色简单地通过取它们的水平坐标模3和适当地偏移一个位掩码选择的。编辑:从切换#RRGGBB#RGB颜色,节省了2个字节。


如果这有所作为,则无需处理内孔。
AdmBorkBork

2
@AdmBorkBork不,我只是在炫耀。
尼尔

“ Co!” -你拼错了。
OldBunny2800 '17

3
@ OldBunny2800用我的语言正确拼写了……
Neil

2
@ OldBunny2800 American不是唯一存在的拼写集。例如,有英国人(英语英语的超集),澳大利亚人(出于某种原因包括新西兰-也许应该称为澳大利亚)和加拿大人(位于美国大部分地区的北部)。
wizzwizz4

4

JavaScript(ES6),210字节(使用HTML + CSS)

类似于我的画布方法 ; 查找*输入字符串中的所有s,并以绝对定位的<pre>元素的形式将六边形写入页面。因为mix-blend-mode设置为lighten,所以当字符重叠时会自动执行颜色添加。

s=>s.split`
`.map((r,y)=>[...r].map((c,x)=>c=='*'&&document.write(`<pre style=position:fixed;mix-blend-mode:lighten;line-height:1;left:${x}ch;top:${y}em;color:${['red','lime','blue'][x%3]}> / \\
| * |
 \\ /`)))


3

Python 2,279字节

e=enumerate
x=input()
c=[[i,j]for i,t in e(x)for j,_ in e(t)if"*"==x[i][j]]
C=[[j%3*([i,j]in c)for j,_ in e(o)]for i,o in e(x)]
for J,K in c:
	for i in-1,0,1:q=2-(i&1);_=C[i+J];_[K+q]=_[K-q]=_[K-q]|C[J][K]
for i,o in e(x):print"".join("[%dm"%(30+C[i][j])+x[i][j]for j,_ in e(o))

在线尝试!

感谢user202729打高尔夫球和固定!
由于Xcoder先生,-27个
字节感谢Jonathan Frech,-24个字节



2-abs(i)就是2-(i&1)在这种背景下,336个字节。
Xcoder先生17年

@ Mr.Xcoder太好了,谢谢!
HyperNeutrino

我认为\033可以是\33(节省一个字节)或实际\x1b字符(节省三个字节)。
乔纳森·弗雷希

1
@ OldBunny2800我认为长度是一样的。您将两个=和一个交换;为两个,和一个=
wizzwizz4

2

Python 2中346个 331字节

e=enumerate
C='0132645'
def f(s):
 c={(i,j):[1+(i/2%2+j/4)%3*2]for i,l in e(s)for j,x in e(l)if'*'==x}
 for i,l in e(s):
  r=''
  for j,x in e(l):a=c.get((i,j),c.get((i-(x<'|'),j+[-1,1][x>'/']+(x>'z')),[]))+c.get((i+(x<'|'),j+[1,-1][x>'/']-(x>'z')),[])if' '<x else[0];r+='\033[3'+C[[sum(a)/len(a),6][set(a)=={5,1}]]+'m'+x
  print r

在线尝试!


1

HTML(画布)+ JavaScript(ES6),13 + 251 = 264字节

*在输入字符串中找到所有s,并在画布上的相应位置绘制一个ASCII六边形。因为globalCompositeOperation='lighter',当字符重叠时会自动执行颜色添加。

的HTML

<canvas id=c>

的JavaScript

s=>{c.width=c.height=s.length
with(c.getContext`2d`)font='1px monospace',globalCompositeOperation='lighter',s.split`
`.map((r,y)=>[...r].map((c,x)=>c=='*'&&[` / \\`,`| * |`,` \\ /`].map((t,i)=>fillText(t,x,y+i),fillStyle=['red','lime','blue'][x%3])))}

scale()片段中已添加了乘法器和附加命令,以提高可见性。

在此处输入图片说明


另请参阅基于CSS的方法


我不认为这符合要求的输出:https : //i.stack.imgur.com/Pp3J0.png。正斜杠和反斜杠应该是它们所包围的六边形颜色的加法组合,而不是分开。
Patrick Roberts

@PatrickRoberts Hmm,看来是字体宽度不一致的问题(我的计算机上位置正确)。我将在今天晚些时候对此进行调查。
darrylyeo

哦,我没有意识到有一个正确的平台。如果您使用屏幕截图更新答案,我将恢复投票。答案仅需要在至少一种实现上进行,而不必跨平台。
Patrick Roberts

1

MATLAB / Octave,223字节

a=input('')';s=size(a);p=zeros([s 3]);[i,j]=ind2sub(s,find(a=='*'));
for f=1:nnz(i)
p((-2:2)+i(f),(-1:1)+j(f),mod(f+~mod(j(f)/2,2),3)+1)=1;end
for f=1:nnz(a)
[i,j]=ind2sub(s,f);text(i/s(1),1-j/s(2),a(i,j),'Co',p(i,j,:));end

稍微整洁的代码格式:

a=input('')';                  %Grab input as 2D array
s=size(a);                     %Get input size
p=zeros([s 3]);                %Make empty colour matrix of matching size with RGB
[i,j]=ind2sub(s,find(a=='*')); %Find all *'s
for f=1:nnz(i)                 %For each *
    %Fill a 5x3 box centred at the * on the colour channel for this box
    %Overlapping regions between boxes will result in the correct mix.
    p((-2:2)+i(f),(-1:1)+j(f),mod(f+~mod(j(f)/2,2),3)+1)=1;
end
%Display as text on a figure
for f=1:nnz(a)
    [i,j]=ind2sub(s,f);
    text(i/s(1),1-j/s(2),a(i,j),'Co',p(i,j,:))
end

输入被视为2D数组,例如在提示输入时输入以下内容:

[' / \ / \ / \ / \ ';'| * | * | * | * |';' \ / \ / \ / \ / ';'  | * | * | * |  ';'   \ / \ / \ /   ']

据我所知,MATLAB无法将颜色输出到控制台(我不喜欢脏Java hack除外)。这样,输出改为打印到图形上。

着色是通过查找*输入中所有数字的位置来实现的,然后在RGB颜色数组(p)中,以1的5x3框(在MATLAB颜色表示中为255)为中心*。该框沿每行写有与mod-3索引对应的颜色,偶数行的颜色索引偏移了一个偏移量。

这将生成一个颜色矩阵,其中任何重叠的框都将产生所需的混合色。上面的示例产生以下颜色矩阵。

颜色矩阵示例

白色和黑色区域无关紧要,因为在那些位置打印了空格,这意味着我们实际上看不到错误的颜色。

创建颜色矩阵后,我们将使用text命令在图形上显示每个字符,并将文本的颜色设置为颜色矩阵中的相应条目。上面的示例将显示:

样本输出

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.