3x3接続コンポーネント


9

チャレンジ

次のASCIIグラフィックに示すように、3x3キンググリッドについて考えてみます。

A--B--C
|\/|\/|
|/\|/\|
D--E--F
|\/|\/|
|/\|/\|
G--H--I

入力として、ノードのラベルを表す整数の長さ9のリストが与えられます。たとえば、入力[0,1,1,2,1,0,5,5,1]は次のラベルを表します。

0--1--1
|\/|\/|
|/\|/\|
2--1--0
|\/|\/|
|/\|/\|
5--5--1

出力は、接続されたノードのセットを形成する入力内の整数のセットです。より明示的にはn、ラベル付きのノードのセットnが接続されている場合にのみ、出力に入力からの整数が含まれる必要があります。この例では[1,2,5]、2つ0のが接続されていないため、許容可能な出力はになります。最も低いバイト数が優先されます。

詳細なルール

  • 入力リスト内のノードの固定順序を選択でき、これを回答で述べる必要があります。EFBDHCAGIの順序では、上記のラベルはとして与えられ[1,0,1,2,5,1,0,5,1]ます。
  • 完全なプログラムまたは関数を記述できます。後者の場合、言語がサポートしている場合、出力は整数のセットになる可能性があります。
  • 出力リストには重複が含まれる場合がありますが、その長さは9を超えてはなりません。
  • 標準の抜け穴は許可されていません。

テストケース

これらには、グリッドに合わせて1桁の数字があります。それらを選択した順序に調整します。

011
210 => 1 2 5
551

010
202 => 0 2
221

110
123 => 0 2 3
221

111
111 => 1
111

111
141 => 1 4
111

回答:


4

J、54バイト

#~3 :'0<*/,+/ .*/^:8~y#|:y#,/,"1/({0&,:)3 3$#:13'"1@e.

順番にリストを取る関数ABCDEFGHI


次数nのグラフの隣接行列Aが与えられると、(A + Inのすべてのエントリが非ゼロである場合にのみグラフが結合されます。ここで、In × n単位行列です。

3×3のキンググリッドの(固定された)隣接プラスアイデンティティマトリックスから始めます(次の順序ABCDEFGHI):

1 1 0 1 1 0 0 0 0
1 1 1 1 1 1 0 0 0
0 1 1 0 1 1 0 0 0
1 1 0 1 1 0 1 1 0
1 1 1 1 1 1 1 1 1
0 1 1 0 1 1 0 1 1
0 0 0 1 1 0 1 1 0
0 0 0 1 1 1 1 1 1
0 0 0 0 1 1 0 1 1

。各ラベルについて、ラベルlのノードに対応する行と列を選択しますl。これにより、でlラベル付けされたノードのサブグラフの隣接とID行列が得られます。次に、この行列を使用して、上記のようにサブグラフが接続されているかどうかをテストします。

上記の行列を作成します。

    0 0 0
Z = 0 0 0
    0 0 0

そして

    1 1 0
O = 1 1 1
    0 1 1

の場合、マトリックスは3×3ブロックマトリックスと見なすことができます。

O O Z
O O O
Z O O

と同じパターンOです。 3×3のブロックでOパターン1 1 0 1を繰り返すことによって生成されます。


これは素晴らしいソリューションです!後知恵では、隣接行列は、特にJ.ような言語で、おそらくこれを行うための最短の方法です
Zgarb

3

CJam、56 67バイト

q~4/~\@{a1$2<-\(+}%)_)-{_(+{\(a@-\}}A?%+:+[$_(d+1$)c\+@]zLf|2f>:+|`

注文:CIGABFHDE

入力例:

[1 1 5 0 1 0 5 2 1]

出力:

[1 2 5]

まず、側面の接続された数字と同じである角の数字を削除します。次に、次の辺の数字と同じ辺の数字を削除します。最後に、2回以上発生したすべての番号を削除し、中央の番号を追加します。


2

CJam、90バイト

これは、ここで説明されている反復的な塗りつぶしに基づいており、多くのゴルフをすることができます!

q~:Q{:IQ3/S*Sca5*+:T;G,G*{:AT=1$={[WXZ5 4_~_)_)]Af+Tf=AT='#a+&,g{TA'#t:T;}*}*}%;aT\/,3<},p

次のABCDEFGHような順序で入力が必要です:

[0 1 1 2 1 0 5 5 1]

出力は接続されたノードです:

[1 1 2 1 5 5 1]

簡単な説明

  • 最初に、各ラベルの入力配列を反復処理します。
  • 各反復で、フラッドフィルを実行して、切断されたノードを特定します。
  • 切断されたノードの数が1より大きい場合、そのラベルは切断されています。
    • 1は、入力配列でもラベルが1つしかないためです。
  • 次に、切断されたラベルをフィルターで取り除き、配列を出力します。

従うべき完全な説明

ここでオンラインでお試しください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.