Карта из пяти символов 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

Ответы:

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возвращает все связанные символы и набор их соседей, область может быть окрашена в отдельный цвет.

TFeld
источник
361 байт
овс
@ovs Спасибо :-)
TFeld
359 байтов
Фелипе Нарди Батиста,
@FelipeNardiBatista Спасибо :)
TFeld
if~-(n!={c}or(i,j)in m):за -2 байта
Фелипе Нарди Батиста,