五字符ASCII映射


9

注意:在本文中,术语“字符”和“颜色”本质上是同一件事

这个图片:

示例图

可以表示为

....'''333
.eeee'''3e
..dddd33ee
%%%dd####e

(将颜色映射为ASCII字符)

四种颜色定理指出:“在将平面分成相邻区域的任何情况下,生成一个称为图的图形,对地图区域进行着色所需的颜色不超过四种,因此,两个相邻区域的颜色都不相同。两个如果这些区域共享不是角的公共边界,则这些区域称为相邻区域,其中角是三个或更多区域共享的点。” -维基百科(链接

这意味着应该可以使用四种颜色为地图着色,以使没有两个共享边的部分共享一种颜色。

仅使用四种颜色为地图着色的算法很复杂,因此在此挑战中,您的程序仅需要使用五种或更少的颜色为地图着色。

重新着色的先前地图可能看起来像这样:

示例五色图

可以表示为

....'''333
.eeee'''3e
..dddd33ee
333dd....e

或同等

@@@@$$$!!!
@^^^^$$$!^
@@<<<<!!^^
!!!<<@@@@^

挑战:

给定一个由ascii字符组成的“地图”(每个字符代表不同的颜色),请对该地图“重新着色”(使用不同的ascii字符代表地图),使其仅使用五种或更少的颜色。

例:

输入:

%%%%%%%%%%%%##########$$$$$$$$%%
*****%%%####!!!!!!!%%%%%%%%%#^^^
(((((((***>>>>??????????%%%%%%%%
&&&&&&&&$$$$$$$^^^^^^^))@@@%%%%%
^^^^^^%%%%%%%%%%%%##############

可能的输出:

11111111111122222222223333333311
44444111222255555551111111112444
22222224441111444444444411111111
55555555222222255555553355511111
22222211111111111122222222222222

说明:

  • 输入映射将始终使用六个或更多字符
  • 您可以在输出中使用任何五个不同的字符
  • 您可以在输出中使用少于五个不同的字符
  • 您可以采用任何合理的格式输入(包括数组数组或字符串数​​组)
  • 这是代码高尔夫球,因此最短的答案为准。

沙盒链接


2
至少在您的示例中,我看到“地图”实际上并不是平面图,因为非连续区域似乎必须具有相同的颜色。这意味着您可以轻松创建需要6种或更多种颜色才能上色的图形。121即使示例中另有说明,我们是否应将地图视为3个单独的区域来避免此问题,还是应将其视为2个,并假定不会给出需要超过5种颜色的地图?
MildlyMilquetoast

2
示例中没有错误,只是示例可以以任何一种方式工作-它没有错,只是模棱两可。这将有助于指定规则中标有相同字符的不同区域是相同还是多个区域。
MildlyMilquetoast

1
有趣的是,我正在就四色定理的证明写一篇论文。我必须说,五色定理的证明要简单得多
-MildlyMilquetoast

Answers:


5

Python 2中375 361 359 357 355 353个 350 347字节

e=enumerate
C=set('12345')
def f(s):
 s=[map(ord,l)for l in s]
 for i,v in e(s):
	for j,w in e(v):
	 if{w}-C:
		F,N=g([],s,i,j,w)
		for y,x in F:s[y][x]=min(C-N)
 return s
def g(m,s,i,j,c):
 n={s[i][j]}
 if(n^{c}or(i,j)in m)<1:
	m+=(i,j),
	for x,y in(0,1),(0,-1),(1,0),(-1,0):
	 if len(s)>i+x>-1<j+y<len(s[0]):m,N=g(m,s,i+x,j+y,c);n|=N
 return m,n

在线尝试!

将输入作为字符串列表,并返回列表列表

f接受地图输入并g为其着色,返回所有连接的字符及其邻居的集合,该区域可以使用不同的颜色进行着色。



@ovs谢谢:-)
TF


@FelipeNardiBatista谢谢:)
TF

if~-(n!={c}or(i,j)in m):为-2个字节
Felipe Nardi Batista
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.