Mapa ASCII de cinco caracteres

9

Nota: Nesta postagem, os termos 'caractere' e 'cor' significam essencialmente a mesma coisa

Esta imagem:

mapa de exemplo

pode ser representado como

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

(mapeando cores para caracteres ascii)

O teorema das quatro cores afirma que "dada qualquer separação de um plano em regiões contíguas, produzindo uma figura chamada mapa, não são necessárias mais de quatro cores para colorir as regiões do mapa, de modo que duas regiões adjacentes não tenham a mesma cor. Dois as regiões são chamadas adjacentes se compartilharem um limite comum que não seja um canto, onde os cantos são os pontos compartilhados por três ou mais regiões ". - Wikipedia ( link )

Isso significa que deve ser possível colorir um mapa usando quatro cores, de modo que duas partes que compartilham uma borda compartilhem uma cor.

O algoritmo para colorir um mapa usando apenas quatro cores é complicado, portanto, nesse desafio, seu programa precisa apenas colorir o mapa usando cinco ou menos cores.

O mapa anterior recolorido pode ficar assim:

exemplo mapa de cinco cores

que poderia ser representado como

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

ou equivalente

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

Desafio:

Dado um "mapa" feito de caracteres ASCII (onde cada caractere representa uma cor diferente), "recolorir" o mapa (representa o mapa usando caracteres ASCII diferentes) para que ele use apenas cinco ou menos cores.

Exemplo:

Entrada:

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

Saída possível:

11111111111122222222223333333311
44444111222255555551111111112444
22222224441111444444444411111111
55555555222222255555553355511111
22222211111111111122222222222222

Esclarecimentos:

  • O mapa de entrada sempre usará seis ou mais caracteres
  • Você pode usar quaisquer cinco caracteres diferentes na saída
  • Você pode usar menos de cinco caracteres diferentes na saída
  • Você pode receber a entrada em qualquer formato razoável (incluindo uma matriz de matrizes ou uma sequência de strings)
  • Isso é código-golfe, então a resposta mais curta vence.

Link sandbox

jkd
fonte
2
Vejo, pelo menos no seu exemplo, que os "mapas" não são realmente gráficos planares, dado que regiões não contíguas parecem ter a mesma cor. Isso significa que você pode criar facilmente um gráfico que precise de 6 ou mais cores para colorir. Devemos tratar o mapa 121como três regiões separadas para evitar esse problema, mesmo que o exemplo implique de outra forma, ou devemos tratá-lo como 2 e assumir que nenhum mapa será fornecido com mais de 5 cores?
MildlyMilquetoast
2
Não há um erro no exemplo, apenas o exemplo pode funcionar de qualquer maneira - não é errado, é apenas ambíguo. Ajudaria a especificar se diferentes regiões rotuladas com o mesmo caractere são iguais ou múltiplas regiões nas regras.
MildlyMilquetoast
11
Curiosamente, estou escrevendo um ensaio sobre a prova do teorema das quatro cores agora. Eu tenho que dizer, a prova para o teorema de cinco cores é muito menos complicado
MildlyMilquetoast

Respostas:

5

Python 2 , 375 361 359 357 355 353 350 347 bytes

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

Experimente online!

Recebe entrada como uma lista de strings e retorna uma lista de listas

fpega a entrada do mapa e a colore, gretorna todos os caracteres conectados e o conjunto de seus vizinhos para a área que pode ser colorida com uma cor distinta.

TFeld
fonte
361 bytes
ovs 31/10
@ovs Thanks :-)
TFeld
359 bytes
Felipe Nardi Batista
@FelipeNardiBatista Thanks :) #
TFeld 31/10
if~-(n!={c}or(i,j)in m):para -2 bytes
Felipe Nardi Batista