Labirin diberikan sebagai matriks 0s (dinding) dan 1s (ruang walkable) dalam format apa pun yang nyaman. Setiap sel dianggap terhubung dengan 4 (atau lebih sedikit) tetangga ortogonalnya. Sebuah komponen terhubung adalah satu set sel walkable semua transitif terhubung satu sama lain. Tugas Anda adalah mengidentifikasi cutpoint - sel walkable yang, jika diubah menjadi dinding, akan mengubah jumlah komponen yang terhubung. Keluarkan matriks boolean dengan 1-s hanya di lokasi tersebut. Tujuannya adalah melakukannya dalam byte kode paling sedikit.
Matriks input akan terdiri dari setidaknya 3 baris dan 3 kolom. Setidaknya satu dari sel-selnya akan menjadi dinding dan setidaknya satu akan berjalan. Fungsi atau program Anda harus dapat memproses salah satu contoh di bawah ini dalam waktu kurang dari satu menit di TIO (atau di komputer Anda sendiri, jika bahasa tersebut tidak didukung oleh TIO).
in:
11101001
11011101
00000001
11101111
11110101
00011111
10110001
11111111
out:
01000000
00001001
00000001
00000101
00110000
00010000
00000000
11100000
in:
1111111111111111
1000000000000001
1111111111111101
0000000000000101
1111111111110101
1000000000010101
1011111111010101
1010000001010101
1010111101010101
1010101111010101
1010100000010101
1010111111110101
1010000000000101
1011111111111101
1000000000000001
1111111111111111
out:
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
in:
1011010001111010
1111111011101101
1110010101001011
1111001110010010
1111010000101001
0111101001000101
0011100111110010
1001110011111110
0101000011100011
1110110101001110
0010100111000110
1000110111011010
0100101000100101
0001010101100011
1001010000111101
1000111011000010
out:
0000000000111010
1011110001001000
0000000000000011
0000000100010000
0000010000101000
0000001000000100
0000000011000000
1001100000011110
0000000001000010
0110100001000110
0000100101000010
1000100000000000
0100001000000100
0000000100100001
0000010000111000
0000010000000010
Jawaban:
Stax , 40 byte
Jalankan dan debug kasus uji
Program ini mengambil input sebagai string yang dipisahkan spasi yang berisi baris. Outputnya dalam format yang sama. Inilah representasi ascii yang belum dibongkar.
Operasi mendasar untuk menghitung sebuah pulau bekerja seperti ini.
'1'
dengan a'2'
.'12|21'
dengan'22'
.'1'
dalam string. Jumlah repetisi adalah jumlah pulau..
Program bonus 44 byte - versi ini input dan output menggunakan format grid.
sumber
MATL , 26 byte
Input adalah matriks numerik, menggunakan
;
pemisah baris.Cobalah online! Atau verifikasi semua kasus uji .
Penjelasan
sumber
Perl 5 ,
-p0
10510196939089 byteGunakan
b
bukan1
pada input.Pastikan matriks pada STDIN diakhiri dengan baris baru
Cobalah online!
Gunakan 3 level subtitusi!
Versi 87 byte ini dalam format input dan output lebih mudah untuk diartikan, tetapi tidak bersaing karena menggunakan 3 karakter berbeda dalam output:
Cobalah online!
Sangat mudah untuk menyimpan byte lain (
s
pengubah regex ) di kedua versi dengan menggunakan beberapa karakter (non-alfanumerik) yang berbeda sebagai terminator baris (alih-alih baris baru), tetapi itu membuat input cukup tidak dapat dibaca lagi.Bagaimana itu bekerja
Pertimbangkan substitusi
Ini akan menemukan dua huruf yang berbeda dan bersebelahan secara horizontal atau vertikal dan menggantinya dengan
c
. Dalam labirin yang jalurnya terdiri dari seluruhnya hurufb
tidak akan terjadi karena huruf-hurufnya sama, tetapi segera setelah salah satu huruf diganti dengan yang lain (mis.z
) Surat itu dan tetangga akan diganti olehc
dan aplikasi berulang adalah isi banjir komponen yang terhubung denganc
dari benihz
.Namun dalam hal ini saya tidak ingin banjir penuh. Saya hanya ingin mengisi salah satu lengan tetangga
z
, jadi setelah langkah pertama saya ingin yangz
hilang. Itu sudah bekerja denganc$2c
penggantian, tetapi saya kemudian ingin memulai kembali banjir-mengisi sepanjang lengan lain mulai dari titik yang sama dan saya tidak tahu yang mana daric
s awalnyaz
. Jadi alih-alih saya gunakanb | a
adalahc
,b | c
sedangc
danz | a
sedang{
. Jadi dalam sebuah labirin dengan jalan setapak yang terbuat darib
dan sebuah benihz
pada langkah pertamab
akan digantikan olehc
danz
akan digantikan oleh{
yang bukan huruf dan tidak cocok\w
sehingga tidak akan menyebabkan pengisian lebih lanjut. Thec
namun akan tetap banjir-fill lanjut pergi dan satu tetangga lengan benih akan diisi. Misalnya mulai dariSaya kemudian dapat mengganti semua c dengan beberapa huruf (misalnya
-
) dan mengganti{
denganz
lagi untuk memulai kembali pengisian banjir:dan ulangi proses ini sampai semua tetangga benih telah bertobat. Jika saya sekali lagi ganti
{
denganz
dan isi banjir:Yang
z
tertinggal di akhir karena tidak ada tetangga untuk melakukan transformasi dengan. Itu memperjelas apa yang terjadi dalam fragmen kode berikut:Temukan baris baru pertama. Offset awal sekarang dalam
@-
Regex yang dibahas di atas dengan
@{-}
jumlah kolom (karena plain@-
membingungkan parser perl dan tidak dapat diganti dengan benar)Yang
/\n/
selalu berhasil dan substitusi itu benar selama kita masih bisa mengisi banjir. Jadi bagian setelah&&
dieksekusi jika mengisi banjir satu lengan dilakukan. Jika tidak sisi kiri mengevaluasi ke string kosongNyalakan kembali isian banjir dan kembalikan 1 jika isian banjir sebelumnya melakukan sesuatu. Lain kembali string kosong. Seluruh bagian kode ini terbungkus di dalamnya
Jadi jika ini dieksekusi pada string awal
$_
denganz
posisi seed, potongan kode di dalamnya akan dieksekusi berkali-kali sebagian besar tidak menghasilkan apa-apa kecuali1
setiap kali lengan tetangga dipenuhi banjir. Secara efektif$_
dihancurkan dan diganti oleh sebanyak1
komponen yang terhubungz
. Perhatikan bahwa perulangan perlu dieksekusi hingga jumlah ukuran komponen + jumlah lengan, tetapi itu OK karena akan "jumlah karakter termasuk baris baru * 2 + 1" kali.Labirin akan terputus jika tidak ada
1
(string kosong, titik terisolasi) atau jika ada lebih dari 1 lengan (lebih dari 21
detik). Ini dapat diperiksa menggunakan regex/\B/
(ini memberikan0
bukan1
pada versi perl yang lebih lama. Ini bisa diperdebatkan mana yang salah). Sayangnya jika tidak cocok ini akan memberikan string kosong sebagai gantinya0
. Namuns:|.: code :seg
itu dirancang untuk selalu mengembalikan nomor ganjil sehingga dengan melakukan&
dengan/\B/
ini akan memberi0
atau1
.Yang tersisa adalah berjalan seluruh array input dan pada setiap posisi benih berjalan dengan
z
dan menghitung lengan yang terhubung. Itu mudah dilakukan dengan:Satu-satunya masalah adalah bahwa dalam posisi non-walkable nilai lama dipertahankan. Karena kita memerlukannya
0
di sana, itu berarti array input asli harus memiliki0
posisi yang tidak dapat dilalui dan0
cocok\w
dengan subtitusi asli dan akan memicu banjir. Itu sebabnya saya menggunakan\pL
sebagai gantinya (hanya huruf yang cocok).sumber
Java 8,
503489459455 byte-18 byte terima kasih kepada @ceilingcat .
Penjelasan:
Cobalah online.
sumber
Python 2 , 290 byte
Cobalah online!
-11 byte berkat Rod
-11 byte terima kasih kepada Lynn
sumber
F(m,i,j)
untuk setiap elemen, menghemat 11 bytefor q in((i,j+1),(i,j-1),(i+1,j),(i-1,j)):
->for q in(i,j+1),(i,j-1),(i+1,j),(i-1,j):
- rm outer parensF
kembali secara implisitNone
, Anda dapat menggunakanF(m,i,j)or c
bukan[F(m,i,j)]and c
.and m[i][j]
bisa>0<m[i][j]
, dan[q[:]for q in m]
bisaeval(`m`)
.Bahasa Wolfram (Mathematica) , 118 byte
Cobalah online!
sumber
Javascript 122 byte
Input / output sebagai string multiline.
Untuk setiap sel walkable, letakkan blok dan coba isi 4 sel tetangga. Jika sel saat ini bukan titik potong, maka mulai dari tetangga terbuka akan mengisi semuanya. Selain itu, saya membutuhkan lebih dari satu operasi pengisian untuk menjangkau semua sel tetangga.
Kurang golf
Uji
sumber