Mapa ASCII de cinco caracteres

9

Nota: en esta publicación, los términos 'carácter' y 'color' significan esencialmente lo mismo

Esta imagen:

mapa de ejemplo

puede ser representado como

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

(asignación de colores a caracteres ascii)

El teorema de los cuatro colores establece que "dada cualquier separación de un plano en regiones contiguas, produciendo una figura llamada mapa, no se requieren más de cuatro colores para colorear las regiones del mapa, de modo que no haya dos regiones adyacentes que tengan el mismo color. Dos las regiones se llaman adyacentes si comparten un límite común que no es una esquina, donde las esquinas son los puntos compartidos por tres o más regiones ". - Wikipedia ( enlace )

Esto significa que debería ser posible colorear un mapa usando cuatro colores para que no haya dos partes que compartan un borde compartiendo un color.

El algoritmo para colorear un mapa usando solo cuatro colores es complicado, por lo que en este desafío su programa solo necesita colorear el mapa usando cinco o menos colores.

El mapa anterior recolorado podría verse así:

ejemplo mapa de cinco colores

que podría representarse como

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

o equivalente

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

Desafío:

Dado un "mapa" hecho de caracteres ascii (donde cada carácter representa un color diferente), "vuelve a colorear" el mapa (representa el mapa usando diferentes caracteres ascii) para que solo use cinco o menos colores.

Ejemplo:

Entrada:

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

Salida posible:

11111111111122222222223333333311
44444111222255555551111111112444
22222224441111444444444411111111
55555555222222255555553355511111
22222211111111111122222222222222

Aclaraciones:

  • El mapa de entrada siempre utilizará seis o más caracteres.
  • Puede usar cinco caracteres diferentes en la salida
  • Puede usar menos de cinco caracteres diferentes en la salida
  • Puede tomar la entrada en cualquier formato razonable (incluida una matriz de matrices o una serie de cadenas)
  • Este es el código de golf por lo que gana la respuesta más corta.

Enlace de caja de arena

jkd
fuente
2
Veo, al menos en su ejemplo, que los "mapas" no son realmente gráficos planos, dado que las regiones no contiguas parecen tener el mismo color. Esto significa que podría crear fácilmente un gráfico que necesitara 6 o más colores para colorear. ¿Deberíamos tratar el mapa 121como 3 regiones separadas para evitar este problema, aunque el ejemplo implica lo contrario, o deberíamos tratarlo como 2, y asumir que no se proporcionará ningún mapa que necesite más de 5 colores?
MildlyMilquetoast
2
No hay un error en el ejemplo, es solo que el ejemplo podría funcionar de cualquier manera, no está mal, solo es ambiguo. Sería útil especificar si las diferentes regiones etiquetadas con el mismo carácter son las mismas o múltiples regiones en las reglas.
MildlyMilquetoast
1
Curiosamente, estoy escribiendo un ensayo sobre la prueba del teorema de los cuatro colores en este momento. Tengo que decir que la prueba del teorema de los cinco colores es mucho menos complicada
MildlyMilquetoast el

Respuestas:

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

Pruébalo en línea!

Toma la entrada como una lista de cadenas y devuelve una lista de listas

ftoma la entrada del mapa y la colorea, gdevuelve todos los caracteres conectados y el conjunto de sus vecinos, al área se puede colorear con un color distinto.

TFeld
fuente
361 bytes
ovs
@ovs Gracias :-)
TFeld
359 bytes
Felipe Nardi Batista
@FelipeNardiBatista Gracias :)
TFeld
if~-(n!={c}or(i,j)in m):por -2 bytes
Felipe Nardi Batista