Peta Lima Karakter ASCII

9

Catatan: Dalam posting ini, istilah 'karakter' dan 'warna' pada dasarnya berarti hal yang sama

Gambar ini:

contoh peta

dapat direpresentasikan sebagai

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

(memetakan warna ke karakter ascii)

Teorema empat warna menyatakan bahwa "diberikan setiap pemisahan pesawat ke daerah yang berdekatan, menghasilkan gambar yang disebut peta, tidak lebih dari empat warna yang diperlukan untuk mewarnai wilayah peta sehingga tidak ada dua daerah yang berdekatan memiliki warna yang sama. Dua daerah disebut berdekatan jika mereka memiliki batas bersama yang bukan sudut, di mana sudut adalah titik yang dibagi oleh tiga atau lebih daerah. " - Wikipedia ( tautan )

Ini berarti bahwa harus dimungkinkan untuk mewarnai peta menggunakan empat warna sehingga tidak ada dua bagian yang berbagi sisi yang berbagi warna.

Algoritma untuk mewarnai peta menggunakan hanya empat warna rumit sehingga dalam tantangan ini program Anda hanya perlu mewarnai peta menggunakan lima warna atau kurang.

Peta sebelumnya yang di-recolored bisa seperti ini:

contoh peta lima warna

yang dapat direpresentasikan sebagai

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

atau setara

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

Tantangan:

Diberi "peta" yang terbuat dari karakter ascii (di mana setiap karakter mewakili warna yang berbeda), "mengubah warna" peta (mewakili peta menggunakan karakter ascii yang berbeda) sehingga hanya menggunakan lima atau kurang warna.

Contoh:

Memasukkan:

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

Output yang mungkin:

11111111111122222222223333333311
44444111222255555551111111112444
22222224441111444444444411111111
55555555222222255555553355511111
22222211111111111122222222222222

Klarifikasi:

  • Peta input akan selalu menggunakan enam karakter atau lebih
  • Anda dapat menggunakan lima karakter berbeda dalam output
  • Anda dapat menggunakan kurang dari lima karakter yang berbeda dalam output
  • Anda dapat mengambil input dalam format wajar apa pun (termasuk array array, atau array string)
  • Ini adalah kode-golf sehingga jawaban terpendek menang.

Tautan kotak pasir

jkd
sumber
2
Saya melihat, setidaknya dalam contoh Anda, bahwa "peta" sebenarnya bukan grafik planar, mengingat bahwa daerah yang tidak bersebelahan tampaknya harus memiliki warna yang sama. Ini artinya Anda dapat dengan mudah membuat grafik yang membutuhkan 6 warna atau lebih untuk diwarnai. Haruskah kita memperlakukan peta 121sebagai 3 wilayah terpisah untuk menghindari masalah ini, meskipun contohnya menyiratkan sebaliknya, atau haruskah kita memperlakukannya sebagai 2, dan menganggap bahwa tidak ada peta yang akan diberikan yang membutuhkan lebih dari 5 warna?
MildlyMilquetoast
2
Tidak ada kesalahan dalam contoh, hanya saja contohnya bisa bekerja dengan baik - itu tidak salah, hanya ambigu. Ini akan membantu untuk menentukan apakah wilayah berbeda berlabel dengan karakter yang sama adalah wilayah yang sama atau beberapa dalam aturan.
MildlyMilquetoast
1
Lucunya, saya sedang menulis esai tentang bukti teorema empat warna sekarang. Saya harus mengatakan, bukti untuk teorema lima warna jauh lebih mudah
MildlyMilquetoast

Jawaban:

5

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

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

Cobalah online!

Mengambil input sebagai daftar string, dan mengembalikan daftar daftar

fmengambil input peta dan mewarnainya, gmengembalikan semua karakter yang terhubung dan mengatur tetangganya, ke area tersebut dapat diwarnai dengan warna yang berbeda.

TFeld
sumber
361 byte
ovs
@ovs Terima kasih :-)
TFeld
359 byte
Felipe Nardi Batista
@FelipeNardiBatista Terima kasih :)
TFeld
if~-(n!={c}or(i,j)in m):untuk -2 byte
Felipe Nardi Batista