다섯 문자 ASCII 맵


9

참고 :이 게시물에서 '문자'와 '색상'이라는 용어는 본질적으로 동일한 것을 의미합니다.

이 사진:

예제 맵

로 표현 될 수있다

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

(색을 ASCII 문자로 매핑)

네 가지 색 정리는 "평면이 인접한 영역으로 분리되어 맵이라고하는 그림을 만들었으므로, 맵 영역을 색칠하는 데 4 개의 색상 만 필요하므로 인접한 두 영역이 같은 색을 가지지 않아야합니다." 모서리가 아닌 공통 경계를 공유하는 경우 인접 영역이라고합니다. 여기서 모서리는 3 개 이상의 영역이 공유하는 지점입니다. " -위키 백과 ( 링크 )

즉, 가장자리를 공유하는 두 부분이 색상을 공유하지 않도록 4 가지 색상을 사용하여지도에 색상을 지정할 수 있어야합니다.

4 가지 색상 만 사용하여지도에 색상을 지정하는 알고리즘은 복잡하므로이 과제에서는 5 가지 이하의 색상을 사용하여지도에 색상을 지정하면됩니다.

이전에 다시 칠한지도는 다음과 같습니다.

예를 들어 5 색지도

로 표현 될 수있는

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

또는 동등하게

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

도전:

ASCII 문자로 구성된 "맵"(각 문자가 다른 색을 나타냄)으로 지정된 경우, 5 가지 이하의 색만 사용하도록 맵을 "다시 칠하십시오"(다른 ASCII 문자를 사용하여 맵을 나타냄)

예:

입력:

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

가능한 출력 :

11111111111122222222223333333311
44444111222255555551111111112444
22222224441111444444444411111111
55555555222222255555553355511111
22222211111111111122222222222222

설명 :

  • 입력 맵은 항상 6 자 이상을 사용합니다
  • 출력에 5 개의 다른 문자를 사용할 수 있습니다
  • 출력에서 다른 5 자 미만을 사용할 수 있습니다
  • 합리적인 형식으로 배열을 입력 할 수 있습니다 (배열 배열 또는 문자열 배열 포함)
  • 이것은 코드 골프이므로 가장 짧은 대답이 이깁니다.

샌드 박스 링크


2
적어도 귀하의 예에서, "지도"는 실제로는 평면 그래프가 아닙니다. 비 연속 영역은 동일한 색상이어야합니다. 즉, 6 색 이상의 색상이 필요한 그래프를 쉽게 만들 수 있습니다. 121예제에서 달리 암시하더라도,이 문제를 피하기 위해 맵 을 3 개의 개별 영역으로 취급해야합니까 , 아니면 2로 취급해야하고 5 색 이상을 필요로하는 맵이 제공되지 않는다고 가정합니까?
MildlyMilquetoast

2
예제에는 오류가 없습니다. 예제가 잘못되었거나 모호한 방식으로 작동 할 수 있다는 것입니다. 동일한 문자로 레이블이 지정된 다른 영역이 규칙에서 동일한 영역인지 여러 영역인지 지정하는 것이 도움이됩니다.
MildlyMilquetoast

1
재미있게도, 나는 지금 네 가지 색 정리의 증거에 대한 에세이를 쓰고 있습니다. 내가 말을해야, 다섯 개 가지 색 정리에 대한 증명은 훨씬 덜 복잡하다
MildlyMilquetoast

답변:


5

파이썬 (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 Thanks :-)
TFeld


@FelipeNardiBatista 감사합니다 :)
TFeld

if~-(n!={c}or(i,j)in m):-2 바이트의 경우
Felipe Nardi Batista
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.