Tulis program atau fungsi yang menggunakan string multiline 0
's dan 1
' s. Tidak ada karakter lain dalam string dan string akan selalu persegi panjang (semua garis akan memiliki jumlah karakter yang sama), dengan dimensi sekecil 1 × 1, tetapi jika 0
's dan 1
' dapat diatur secara sewenang-wenang.
Anda dapat mengasumsikan string memiliki baris tambahan opsional, dan jika diinginkan Anda dapat menggunakan dua karakter ASCII yang dapat dicetak untuk menggantikan 0
dan 1
.
Cetak atau kembalikan nilai kebenaran jika semua wilayah jalur yang terhubung baik 0
dari dan 1
di dalam string adalah persegi panjang yang solid , selain itu menghasilkan nilai palsu .
Sebuah jalan wilayah terhubung dari 0
'berarti s bahwa dari salah satu 0
di wilayah tersebut, semua yang lain 0
' s dapat dicapai dengan hanya bergerak ke atas, bawah, kiri dan kanan untuk lainnya 0
's (dan tidak bergerak diagonal, tidak bergerak untuk setiap 1
, dan tidak bergerak di luar batas string). Ide yang sama berlaku untuk 1
jalur yang terhubung wilayah.
Sebuah persegi panjang yang solid dari 0
's berarti seluruh area persegi panjang diisi dengan 0
' s dan tidak ada 1
's. Gagasan yang sama berlaku untuk 1
persegi panjang yang solid.
Kode terpendek dalam byte menang. Tiebreaker adalah jawaban sebelumnya.
(Perhatikan bahwa string tidak membungkus dengan kondisi batas toroidal .)
Contohnya
1) String input ini memiliki 3 jalur yang terhubung wilayah (2 untuk 0
dan 1 untuk 1
). Hanya daerah kanan bawah 00
adalah persegi panjang yang solid, jadi outputnya akan palsu.
0011
0111
0100
2) String input ini memiliki 4 jalur yang terhubung wilayah (2 untuk keduanya 0
dan 1
). Semua dari mereka adalah persegi panjang yang solid sehingga hasilnya akan benar.
0011
0011
1100
3) Input ini memiliki 2 jalur yang terhubung dengan daerah, tetapi hanya satu dari mereka adalah persegi panjang yang solid, sehingga hasilnya akan palsu.
00000000
01111110
00000000
4) Input ini hanya memiliki 1 jalur yang terhubung wilayah dan biasanya merupakan persegi panjang yang solid, sehingga hasilnya benar.
11111111
11111111
11111111
Uji Kasus
Sebuah T
tepat di bawah berarti string input truthy, F
berarti falsy.
0
T
1
T
00
T
01
T
10
T
11
T
0000000
T
1111111
T
011100100100101100110100100100101010100011100101
T
00
11
T
01
10
T
01
11
F
00
01
F
11
11
T
110
100
F
111
000
T
111
101
111
F
101
010
101
T
1101
0010
1101
0010
T
1101
0010
1111
0010
F
0011
0111
0100
F
0011
0011
1100
T
00000000
01111110
00000000
F
11111111
11111111
11111111
T
0000001111
0000001111
T
0000001111
0000011111
F
0000001111
1000001111
F
1000001111
1000001111
T
1110100110101010110100010111011101000101111
1010100100101010100100010101010101100101000
1110100110010010110101010111010101010101011
1010100100101010010101010110010101001101001
1010110110101010110111110101011101000101111
F
Ruby, 76
Dalam kisi-kisi apa pun yang seluruhnya terdiri dari persegi panjang, setiap baris harus identik dengan garis sebelumnya, atau semua bit dibalik dari 0 ke 1 dan sebaliknya.
Ini mudah dibuktikan. Ambil selembar kertas dan gambar garis vertikal dan horizontal yang sewenang-wenang sepanjang jalan di atasnya. Sekarang warna persegi panjang hanya menggunakan 2 warna. Anda akan berakhir dengan kotak-kotak yang terdistorsi, di mana semua warna terbalik di setiap baris.
Ingin menggambar persegi panjang dengan garis yang hanya sebagian melintang? coba hapus segmen dari salah satu baris Anda. Anda sekarang akan membutuhkan lebih dari 2 warna untuk mewarnai desain Anda, karena Anda akan memiliki titik di mana 3 persegi panjang bertemu (2 sudut dan tepi.) Desain seperti itu karena itu tidak relevan dengan pertanyaan ini.
Saya terkejut jawaban sejauh ini belum memperhatikan ini.
Saya pikir algoritma ini harusnya jauh lebih pendek dalam beberapa bahasa lain.
Tidak digabungkan dalam program uji
sumber
s.scan(/^?.*\n/)
akan membantu menghemat byte.Siput , 20 byte
Mencetak area kisi jika tidak ada kotak 2x2 dengan 3 nol dan satu atau 3 dan nol, atau
0
jika ada kotak 2x2 seperti itu.sumber
MATL , 12 byte
Algoritma yang sama dengan jawaban luar biasa @ sp3000 .
Untuk memungkinkan input multiline, MATL membutuhkan array char baris (string) yang akan dibangun secara eksplisit menggunakan karakter
10
untuk baris baru. Jadi input dari empat contoh tersebut adalah (perhatikan bahwa[]
adalah gabungan, sehingga masing-masing adalah deretan baris karakter):dan tiga kasus uji terakhir adalah
Output yang benar adalah array yang hanya berisi yang.
Cobalah online!
Penjelasan
Ini menggunakan fakta bahwa paritas karakter
'0'
dan'1'
sama dengan angka0
dan1
, jadi tidak perlu mengkonversi dari char ke digit yang diwakilinya,sumber
['first line' 10 'second llne']
, di mana10
ASCII untuk baris baru. Apakah itu dapat diterima?'0011 0111 0100'
JavaScript (ES6), 69 byte
Saya percaya bahwa kriteria persegi panjang hubungan jalan setara dengan mengharuskan bahwa diberikan empat poin yang membentuk sudut-sudut persegi panjang sewenang-wenang bahwa ada bilangan genap
1
s. Perhatikan bahwa paritas persegi panjang (0, b), (x, y) sama dengan (0, b), (a, y)^
(a, b), (x, y) jadi saya hanya perlu memeriksa persegi panjang yang sudut kiri atas berada di (0, 0). Juga oleh hukum De Morgan,!.some()
sama seperti.every(!)
yang menyelamatkan saya beberapa byte.Sunting: Saya perhatikan bahwa solusi Jelly memeriksa paritas sudut semua persegi panjang 2 × 2, yang dapat ditunjukkan setara.
sumber
JavaScript (ES6), 79
Algoritma yang sama dari jawaban Jelly dari @ Sp3000 (dan senang tidak harus membuktikannya berhasil). Hanya 8 kali lebih lama
Kurang golf
Suite uji
sumber
Grime v0.1, 31 byte
Mencetak
1
untuk pertandingan dan0
tanpa pertandingan.Cobalah online!Penjelasan
Grime adalah bahasa pencocokan pola 2D saya. Saya memang memodifikasinya hari ini, tetapi hanya untuk mengubah karakter elemen sintaks (
`
bukan,
), jadi itu tidak mempengaruhi skor saya.Saya menggunakan pendekatan yang mirip dengan Sp3000 : input salah jika berisi 2 × N persegi panjang yang satu baris berisi keduanya
0
dan1
, dan baris lainnya tidak.sumber
JavaScript (ES6), 64 byte
Berdasarkan pengamatan @ LevelRiverSt bahwa setiap baris harus sama atau kebalikan dari yang pertama.
sumber