Latar Belakang
Sebuah polyomino disebut L-cembung , apakah itu mungkin untuk wisata dari setiap tile untuk setiap genteng lain dengan jalur L-berbentuk, yaitu jalan yang masuk dalam arah mata angin dan perubahan arah paling banyak sekali. Misalnya, polyomino dari 1
s pada gambar
0 0 1 1 1 0
1 1 1 1 0 0
1 1 0 0 0 0
bukan L-cembung, karena kedua jalur berbentuk L dari kiri bawah 1
ke kanan atas 1
mengandung 0
:
0>0>1>1>1 0
^ ^
1 1 1 1 0 0
^ ^
1>1>0>0>0 0
Namun, poliomino 1
s pada gambar ini adalah L-cembung:
0 1 1 1 0 0
1 1 1 1 1 1
0 1 1 0 0 0
Memasukkan
Input Anda adalah array 2D bit dalam format asli bahasa Anda, atau sebagai string yang dibatasi baris baru jika bahasa kami tidak memiliki array. Dijamin mengandung setidaknya satu 1
.
Keluaran
Output Anda akan menjadi nilai kebenaran jika himpunan 1
s adalah polomino L-cembung, dan nilai palsu jika tidak. Output ini harus konsisten: Anda harus menampilkan nilai kebenaran yang sama untuk semua input L-cembung, dan nilai falsy yang sama untuk yang lain. Perhatikan bahwa himpunan terputus 1
s (yang bukan polyomino) menghasilkan output palsu.
Aturan dan Penilaian
Anda dapat menulis program lengkap atau fungsi. Hitungan byte terendah menang, dan celah standar tidak diizinkan.
Uji Kasus
Kasing uji ini harus berfungsi juga jika Anda memutar atau merefleksikan array, atau menambahkan baris 0
ke batas mana pun.
False instances
01
10
111
101
111
1101
1111
1110
1100
1000
0011
01100
11110
01110
00110
011000
011110
001111
True instances
1
01
11
010
111
010
001
011
111
11100
11110
01100
01000
011000
011000
111100
111111
001000
Jawaban:
Siput ,
4524Tepat setelah memposting solusi awal saya, saya menyadari ada cara yang jauh lebih baik. Program asli berjalan di sekitar alun-alun yang dibentuk oleh jalur antara dua
1
s, menguji keberadaan 0 di setiap pasangan sisi. Itu juga harus memiliki kasus khusus untuk jalur garis lurus. Versi baru dimulai dengan teleportasi dari satu1
ke yang lain, dan menguji tidak adanya jalur lurus atau berbentuk L dari1
belakang ke awal.sumber
Matlab, 182 byte
Ide: Ulangi untuk setiap
1
dalam matriks polyomino:1
tetapi sisanya nol.1
dalam matriks baru ini (ulangi sampai tidak ada yang berubah lagi)1
sebagai tetangga di arah x jika ada1
sebagai tetangga di polinomio1
dalam matriks baru ini (ulangi sampai tidak ada yang berubah lagi)1
sebagai tetangga di arah x jika ada1
sebagai tetangga di polinomioSekarang
1
dalam matriks baru harus mencakup semua1
dalam polynomio-matrix yang dapat dijangkau dari titik awal yang diberikan dengan terlebih dahulu pergi dalam arah x dan kemudian di arah y. Sekarang kita dapat mengulangi proses yang sama tetapi dengan terlebih dahulu masuk ke arah y dan kemudian di arah x. Sekarang setiap1
matriks polyomino harus dicapai sekaligus atau kedua kali. Jika tidak, maka kami telah menemukan posisi dalam matriks polynomio yang tidak dapat dijangkau dari setiap posisi lain dengan sebuahL
-path.Golf:
Dengan komentar:
Skrip uji kasus:
sumber
Javascript ES6, 290 byte
Ok, mungkin itu tidak akan memenangkan penghargaan untuk singkatnya, tapi itu memang menggunakan pendekatan baru. Lihat versi yang tidak diklik untuk cara kerjanya.
Bukti untuk metode ini dapat ditemukan di: Seluler Automata dan Sistem Kompleks Diskrit .
Tidak Disatukan:
sumber
Mathematica,
129127 bytePenjelasan:
Pertama, jika ada
0
antara dua1
s pada baris atau kolom yang sama, arraynya bukan L-cembung, karena kita tidak dapat menghubungkan keduanya1
.Setelah mengecualikan kasing ini, setiap dua
1
s pada baris atau kolom yang sama dapat dihubungkan dengan jalur lurus. Kita dapat menghasilkan grafik, yang simpulnya adalah posisi1
s dalam array, dan ujungnya adalah pasangan1
s pada baris atau kolom yang sama. Maka array adalah L-cembung jika dan hanya jika diameter grafik kurang dari 3.sumber
JavaScript (ES6) 174
Melihat kisi-kisi sel kosong atau terisi, untuk setiap pasangan sel terisi, saya memeriksa jalur horizontal ke kolom sel lainnya (bisa ada 1 jika sel-sel berada di baris yang sama, atau 2) dan jalur vertikal ke baris sel lain (mungkin ada 1 atau 2 juga). Jika saya menemukan sel kosong di kedua jalur vertikal atau kedua jalur horizontal, maka tidak mungkin ada jalur berbentuk L di antara sel.
(Saya mengalami kesulitan mencoba untuk memasang penjelasan ini - saya harap sudah jelas)
Tes menjalankan cuplikan di bawah ini di peramban apa pun yang mendukung EcmaScript 6
sumber