3x3 Komponen yang Terhubung

9

Tantangan

Pertimbangkan kisi raja 3x3, seperti yang ditunjukkan dalam grafik ASCII berikut:

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

Anda diberikan sebagai input panjang-9 daftar bilangan bulat yang mewakili pelabelan node. Misalnya, input [0,1,1,2,1,0,5,5,1]mewakili label berikut:

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

Output Anda adalah himpunan bilangan bulat dalam input yang membentuk kumpulan node yang terhubung. Lebih jelasnya, output harus mengandung integer ndari input jika dan hanya jika set node dengan label nterhubung. Dalam contoh ini, output yang dapat diterima adalah [1,2,5], karena keduanya 0tidak terhubung. Hitungan byte terendah menang.

Aturan terperinci

  • Anda dapat memilih pemesanan tetap untuk node dalam daftar input Anda, dan Anda harus menyatakan ini dalam jawaban Anda. Dalam urutan EFBDHCAGI, label di atas akan diberikan sebagai [1,0,1,2,5,1,0,5,1].
  • Anda dapat menulis program lengkap atau fungsi. Dalam kasus terakhir, output dapat berupa satu set bilangan bulat jika bahasa Anda mendukungnya.
  • Daftar output mungkin berisi duplikat, tetapi panjangnya tidak boleh lebih dari 9.
  • Celah standar tidak diijinkan.

Uji kasus

Ini memiliki angka satu digit selaras dengan grid; sesuaikan dengan pesanan yang Anda pilih.

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
sumber

Jawaban:

4

J, 54 byte

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

Fungsi mengambil daftar dalam urutan ABCDEFGHI.


Mengingat matriks adjacency A dari grafik urutan n , grafik terhubung jika dan hanya jika semua entri dari ( A + I ) n adalah nol, di mana saya adalah n × n matriks identitas.

Kita mulai dengan matriks adjacency-plus-identitas (tetap) raja 3 × 3 (dalam urutan ABCDEFGHI), yaitu:

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

. Untuk setiap label l, kami memilih baris dan kolom yang sesuai dengan simpul label l. Ini memberi kita matriks adjacency-plus-identitas dari subgraph dari l-labeled node. Kami kemudian menggunakan matriks ini untuk menguji apakah subgraph terhubung, seperti dijelaskan di atas.

Kami membangun matriks di atas dengan mencatat bahwa jika kita membiarkan

    0 0 0
Z = 0 0 0
    0 0 0

dan

    1 1 0
O = 1 1 1
    0 1 1

, maka matriks dapat dilihat sebagai matriks blok 3 × 3

O O Z
O O O
Z O O

, yang memiliki pola yang sama dengan O! Odiproduksi dengan mengulangi pola 1 1 0 1dalam blok 3 × 3.

Elo
sumber
Ini solusi luar biasa! Jika diperhatikan, matriks kedekatan mungkin merupakan cara terpendek untuk melakukan ini, terutama dengan bahasa seperti J.
Zgarb
3

CJam, 56 67 byte

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

Order: CIGABFHDE.

Input contoh:

[1 1 5 0 1 0 5 2 1]

Keluaran:

[1 2 5]

Pertama-tama menghapus angka di sudut-sudut yang sama dengan angka yang terhubung di samping. Kemudian menghapus angka di sisi yang sama dengan angka di sisi berikutnya. Akhirnya itu menghilangkan semua nomor terjadi dua kali atau lebih dan menambahkan nomor pusat.

jimmy23013
sumber
2

CJam, 90 byte

Ini didasarkan pada isian banjir berulang yang dijelaskan di sini dan dapat banyak bermain golf!

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

Membutuhkan input dalam urutan ABCDEFGHseperti:

[0 1 1 2 1 0 5 5 1]

dan output adalah node yang terhubung:

[1 1 2 1 5 5 1]

Penjelasan singkat

  • Pertama, saya mengulangi array input untuk setiap label.
  • Dalam setiap iterasi, saya melakukan penimbunan banjir untuk mengetahui node yang terputus.
  • Jika jumlah node terputus lebih besar dari 1, maka label itu terputus.
    • 1 karena label hanya dapat memiliki 1 kemunculan di larik input juga.
  • Lalu saya cukup menyaring label yang terputus dan mencetak array.

Penjelasan lengkap untuk diikuti

Cobalah online di sini

Pengoptimal
sumber