Pięcioznakowa mapa ASCII

9

Uwaga: w tym poście terminy „znak” i „kolor” oznaczają w zasadzie to samo

Ten obraz:

przykładowa mapa

może być reprezentowany jako

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

(mapowanie kolorów na znaki ascii)

Twierdzenie o czterech kolorach stwierdza, że ​​„biorąc pod uwagę jakikolwiek podział płaszczyzny na sąsiadujące regiony, tworząc figurę zwaną mapą, do pokolorowania regionów mapy nie są wymagane więcej niż cztery kolory, tak że żadne dwa sąsiednie regiony nie będą miały tego samego koloru. regiony są nazywane przylegającymi, jeśli mają wspólną granicę, która nie jest rogiem, a narożniki to punkty wspólne dla trzech lub więcej regionów. ” - Wikipedia ( link )

Oznacza to, że powinna istnieć możliwość pokolorowania mapy za pomocą czterech kolorów, tak aby żadna z dwóch części o wspólnej krawędzi nie miała tego samego koloru.

Algorytm pokolorowania mapy przy użyciu tylko czterech kolorów jest skomplikowany, więc w tym wyzwaniu Twój program musi pokolorować mapę za pomocą pięciu lub mniej kolorów.

Poprzednia zmieniona mapa może wyglądać następująco:

przykład pięciokolorowa mapa

który może być reprezentowany jako

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

lub równoważnie

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

Wyzwanie:

Biorąc pod uwagę „mapę” wykonaną ze znaków ascii (gdzie każdy znak reprezentuje inny kolor), „ponownie pokoloruj” mapę (reprezentuje mapę za pomocą różnych znaków ascii), tak aby używała tylko pięciu lub mniej kolorów.

Przykład:

Wejście:

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

Możliwe wyjście:

11111111111122222222223333333311
44444111222255555551111111112444
22222224441111444444444411111111
55555555222222255555553355511111
22222211111111111122222222222222

Wyjaśnienia:

  • Mapa wejściowa zawsze będzie zawierała sześć lub więcej znaków
  • W danych wyjściowych możesz użyć dowolnych pięciu różnych znaków
  • W danych wyjściowych można użyć mniej niż różnych pięciu znaków
  • Możesz wziąć dane wejściowe w dowolnym rozsądnym formacie (w tym tablicę tablic lub tablicę ciągów)
  • To jest golf golfowy, więc wygrywa najkrótsza odpowiedź.

Link do piaskownicy

jkd
źródło
2
Widzę, przynajmniej w twoim przykładzie, że „mapy” nie są w rzeczywistości wykresami płaskimi, biorąc pod uwagę, że niesąsiadujące regiony wydają się mieć ten sam kolor. Oznacza to, że możesz łatwo utworzyć wykres, który wymagałby 6 lub więcej kolorów do pokolorowania. Czy powinniśmy traktować mapę 121jako 3 oddzielne regiony, aby uniknąć tego problemu, chociaż przykład sugeruje inaczej, czy też powinniśmy traktować ją jako 2 i zakładać, że nie zostanie podana mapa, która wymaga więcej niż 5 kolorów?
MildlyMilquetoast
2
W przykładzie nie ma błędu, po prostu przykład może działać w obie strony - nie jest zły, tylko dwuznaczny. Pomoże to określić, czy różne regiony oznaczone tym samym znakiem są tymi samymi, czy wieloma regionami w regułach.
MildlyMilquetoast
1
Co zabawne, piszę teraz esej na temat dowodu twierdzenia o czterech kolorach. Muszę powiedzieć, że dowód na twierdzenie o pięciu kolorach jest o wiele mniej skomplikowany
MildlyMilquetoast,

Odpowiedzi:

5

Python 2 , 375 361 359 357 355 353 350 347 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe jako listę ciągów znaków i zwraca listę list

fpobiera dane wejściowe z mapy i gpokolorowuje je, zwraca wszystkie połączone postacie i zestaw sąsiadów, aby obszar mógł być pokolorowany innym kolorem.

TFeld
źródło
@ovs Thanks :-)
TFeld
359 bajtów
Felipe Nardi Batista
@FelipeNardiBatista Thanks :)
TFeld
if~-(n!={c}or(i,j)in m):za -2 bajty
Felipe Nardi Batista