5文字のASCIIマップ


9

注:この投稿では、「文字」と「色」という用語は本質的に同じ意味です

この画像:

地図の例

として表すことができます

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

(アスキー文字への色のマッピング)

4つの色の定理は、「隣接する領域に平面を分離してマップと呼ばれる図を生成する場合、隣接する2つの領域が同じ色にならないように、マップの領域に色を付けるために必要な色は4つだけです。2つコーナーではない共通の境界を共有する領域は隣接と呼ばれます。コーナーは3つ以上の領域で共有されるポイントです。」-ウィキペディア(リンク)

これは、エッジを共有する2つの部分が色を共有しないように、4色を使用してマップに色を付けることが可能であることを意味します。

4色のみを使用してマップに色を付けるアルゴリズムは複雑であるため、この課題では、プログラムは5色以下を使用してマップに色を付けるだけで済みます。

色を変更した以前のマップは次のようになります。

5つのカラーマップの例

これは次のように表すことができます

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

または同等に

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

チャレンジ:

ASCII文字(各文字が異なる色を表す)で構成される「マップ」が与えられた場合、マップを「色変更」(異なるASCII文字を使用してマップを表す)して、5色以下しか使用しないようにします。

例:

入力:

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

可能な出力:

11111111111122222222223333333311
44444111222255555551111111112444
22222224441111444444444411111111
55555555222222255555553355511111
22222211111111111122222222222222

明確化:

  • 入力マップは常に6文字以上を使用します
  • 出力には5つの異なる文字を使用できます
  • 出力では5文字未満を使用できます
  • 入力は、適切な形式(配列の配列、または文字列の配列を含む)で取得できます。
  • これはコードゴルフなので、最も短い答えが優先されます。

サンドボックスリンク


2
少なくともあなたの例では、隣接していない領域は同じ色である必要があるように見えるので、「マップ」は実際には平面グラフではないことがわかります。つまり、6色以上の色を必要とするグラフを簡単に作成できます。121この問題を回避するには、マップが3つの別個の領域として扱われるべきですか、それとも例が示唆しているのでしょうか、それとも2つとして扱う必要がありますか。
— MildlyMilquetoast 2017年

2
この例にはエラーはありません。それは、例がどちらの方法でも機能するということだけです-間違いではなく、あいまいです。同じ文字でラベル付けされた異なる領域が、ルール内の同じ領域か複数の領域かを指定すると役立ちます。
— MildlyMilquetoast 2017年

1
おかしなことに、私は今、4色の定理の証明についてエッセイを書いています。5色の定理の証明はそれほど複雑ではありません
— MildlyMilquetoast

回答:


5

パイソン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接続されているすべての文字とその隣接文字のセットを、明確な色で着色できる領域に返します。



@ovsありがとう:-)
— TFeld 2017年


@FelipeNardiBatistaありがとう:)
— TFeld 2017年

if~-(n!={c}or(i,j)in m):-2バイトの場合
— フェリペナルディバティスタ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.