3x3 verbundene Komponenten

9

Die Herausforderung

Betrachten Sie das 3x3-King-Raster, wie in der folgenden ASCII-Grafik dargestellt:

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

Sie erhalten als Eingabe eine Liste von Ganzzahlen der Länge 9, die eine Beschriftung der Knoten darstellen. Die Eingabe [0,1,1,2,1,0,5,5,1]repräsentiert beispielsweise die folgende Beschriftung:

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

Ihre Ausgabe ist die Menge von Ganzzahlen in der Eingabe, die verbundene Mengen von Knoten bilden. Genauer gesagt sollte die Ausgabe ngenau dann eine Ganzzahl von der Eingabe enthalten, wenn die Gruppe von Knoten mit Beschriftung nverbunden ist. In diesem Beispiel wäre ein akzeptabler Ausgang [1,2,5], da die beiden 0s nicht verbunden sind. Die niedrigste Byteanzahl gewinnt.

Detaillierte Regeln

  • Sie können eine feste Reihenfolge für die Knoten in Ihrer Eingabeliste auswählen und dies in Ihrer Antwort angeben. In der Reihenfolge EFBDHCAGI würde die obige Kennzeichnung als angegeben [1,0,1,2,5,1,0,5,1].
  • Sie können entweder ein vollständiges Programm oder eine Funktion schreiben. Im letzteren Fall kann die Ausgabe eine Reihe von Ganzzahlen sein, wenn Ihre Sprache diese unterstützt.
  • Die Ausgabeliste kann Duplikate enthalten, ihre Länge darf jedoch 9 nicht überschreiten.
  • Standardlücken sind nicht zulässig.

Testfälle

Diese haben einstellige Zahlen, die am Raster ausgerichtet sind. Passen Sie sie an Ihre gewählte Reihenfolge an.

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
Zgarb
quelle

Antworten:

4

J, 54 Bytes

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

Eine Funktion, die eine Liste in der Reihenfolge erstellt ABCDEFGHI.


Bei einer Adjazenzmatrix A eines Graphen der Ordnung n ist der Graph genau dann verbunden, wenn alle Einträge von ( A + I ) n ungleich Null sind, wobei I die n × n- Identitätsmatrix ist.

Wir beginnen mit der (festen) Adjazenz-plus-Identitätsmatrix des 3 × 3-König-Gitters (in der Reihenfolge ABCDEFGHI), nämlich:

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

. Für jede Beschriftung lwählen wir die Zeilen und Spalten aus, die den Beschriftungsknoten entsprechen l. Dies gibt uns die Adjazenz-plus-Identitätsmatrix des Teilgraphen der lmarkierten Knoten. Wir verwenden diese Matrix dann, um zu testen, ob der Untergraph verbunden ist, wie oben beschrieben.

Wir konstruieren die obige Matrix, indem wir feststellen, dass, wenn wir lassen

    0 0 0
Z = 0 0 0
    0 0 0

und

    1 1 0
O = 1 1 1
    0 1 1

dann kann die Matrix als 3 × 3-Blockmatrix angesehen werden

O O Z
O O O
Z O O

, das hat das gleiche Muster wie O! Owird durch Wiederholen des Musters 1 1 0 1in einem 3 × 3-Block erzeugt.

Ell
quelle
Dies ist eine erstaunliche Lösung! Im Nachhinein sind Adjazenzmatrizen wahrscheinlich der kürzeste Weg, dies zu tun, insbesondere mit einer Sprache wie J.
Zgarb
3

CJam, 56 67 Bytes

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

Bestellung : CIGABFHDE.

Beispieleingabe:

[1 1 5 0 1 0 5 2 1]

Ausgabe:

[1 2 5]

Zunächst werden Zahlen in den Ecken entfernt, die mit den verbundenen Zahlen an den Seiten identisch sind. Dann werden Zahlen auf den Seiten entfernt, die mit den Zahlen auf den nächsten Seiten übereinstimmen. Schließlich werden alle zweimal oder mehrmals vorkommenden Nummern entfernt und die mittlere Nummer hinzugefügt.

jimmy23013
quelle
2

CJam, 90 Bytes

Dies basiert auf einer iterativen Flutfüllung , die hier erklärt wird , und kann viel Golf gespielt werden!

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

Benötigt die Eingabe in der Reihenfolge ABCDEFGHwie:

[0 1 1 2 1 0 5 5 1]

und Ausgabe sind die verbundenen Knoten:

[1 1 2 1 5 5 1]

Kurze Erklärung

  • Zuerst iteriere ich über das Eingabearray für jedes Label.
  • In jeder Iteration führe ich eine Flutfüllung durch, um nicht verbundene Knoten herauszufinden.
  • Wenn die Anzahl der nicht verbundenen Knoten größer als 1 ist, wird diese Bezeichnung getrennt.
    • 1, da ein Label auch nur 1 im Eingabearray vorkommen kann.
  • Dann filtere ich einfach nicht verbundene Etiketten heraus und drucke das Array.

Vollständige Erklärung folgt

Probieren Sie es hier online aus

Optimierer
quelle