Pertimbangkan untuk menggambarkan kurva dua dimensi yang sederhana , terbuka , pada W lebar dengan H grid teks tinggi di mana X
merupakan bagian dari kurva dan .
mewakili ruang kosong dan tidak ada karakter lain yang digunakan.
Setiap ruang grid memiliki 8 ruang grid tetangga, lingkungan Moore -nya . Ruang kotak di luar batas dianggap kosong.
Kotak berisi kurva jika memiliki tepat satu X
ATAU jika memiliki lebih dari satu X
tempat:
- Tepatnya dua
X
s hanya memiliki satu tetanggaX
. Ini adalah titik akhir kurva. - Setiap
X
selain titik akhir tetangga tepat duaX
s. Ini membentuk sebagian besar kurva.
Misalnya, kisi ini di mana W = 9 dan H = 4 berisi kurva:
....X.... .X.X.X.X. X..X..X.X .XX.....X
Demikian juga, kisi-kisi ini (W = 4, H = 3) memiliki kurva:
.... .X.. .... .... .X.X .... X..X ..X. XX.. X.X. ..X. .XX. .X.. .... ....
Namun kisi-kisi ini tidak mengandung kurva:
.... .XX. ...X XX.. .... X.X. .... X..X ..XX XX.. .X.X .X.. .... .XX. .X.. .... ...X X.X.
Kita dapat menemukan panjang kurva dengan menjumlahkan jarak antara semua pasangan tetangga X
s:
Jarak antara dua
X
s yang bertetangga secara orthogonal adalah 1 unit.XX
X X
Jarak antara dua
X
s diagonal yang bersebelahan adalah √2 unit.X. .X
.X X.
Misalnya panjang kurva di kisi
XXX. ...X ..X.
dapat divisualisasikan sebagai
jadi kita bisa melihatnya 1 + 1 + √2 + √2 = 4.828427 ...
Panjang kurva dengan hanya satu X
adalah nol.
Ketika kisi tidak membentuk kurva, panjangnya tidak didefinisikan dengan baik.
Tantangan
Diberi kisi-kisi teks X
s dan .
s, mengeluarkan panjang kurva yang dikandungnya, atau menampilkan sesuatu seperti -1
atau Null
untuk menunjukkan kisi tidak memiliki kurva.
Untuk input Anda dapat menggunakan karakter lain selain X
dan .
jika diinginkan, dan H dan W dapat diambil sebagai input jika diperlukan. Input sebagai daftar bersarang atau matriks diisi dengan 1s dan 0s sebagai ganti string juga baik-baik saja.
Anda dapat menampilkan pelampung untuk panjang kurva atau alternatif dua bilangan bulat A dan B di mana length = A + B*√2
.
Kode terpendek dalam byte menang.
Uji Kasus
XXX.
...X
..X.
2 + 2*√2 = 4.828427...
....X....
.X.X.X.X.
X..X..X.X
.XX.....X
3 + 8*√2 = 14.313708...
....
....
..X.
0 + 0*√2 = 0
.X..
X..X
.XX.
1 + 3*√2 = 5.242640...
....
..X.
.X..
0 + 1*√2 = 1.414213...
....
XX..
....
1 + 0*√2 = 1
.X.X
X.X.
....
0 + 3*√2 = 4.242640...
....
....
....
....
-1
.XX.
X..X
.XX.
-1
...X
..XX
.X..
-1
....
.X.X
...X
-1
X.X.
.X..
X.X.
-1
sumber
[x.x,...,.x.]
bukan kurva yang valid, bukan?Jawaban:
MATL ,
5251 byteInput adalah matriks nol dan satu.
Outputnya
B
, kalau begituA
. Non-kurva memberi negatifA
.Cobalah online! Atau verifikasi semua kasus uji .
Penjelasan
Menghitung panjang kurva menggunakan dua konvolusi 2D 1 : satu dengan topeng Moore, dan yang lainnya dengan topeng yang hanya berisi tetangga diagonal. Hasilnya adalah dua matriks dengan ukuran input yang sama, yang akan dilambangkan sebagai M dan D masing-masing. M memberikan jumlah total tetangga untuk setiap titik, sedangkan D memberikan jumlah tetangga diagonal.
Hasil dalam M dan D harus disaring untuk membuang titik yang bukan milik kurva. Juga, mereka harus dibagi dengan 2, karena "menjadi tetangga" adalah hubungan simetris, sehingga setiap titik dalam kurva dihitung dua kali.
Menentukan apakah kurva valid lebih rumit dari yang saya harapkan. Untuk melakukan ini, kode menguji tiga kondisi:
2
? (Yaitu, apakah benar dua poin dengan satu tetangga?)2
minus2
? (Bersama dengan kondisi 1, ini menguji jika semua nilai non-nol dalam M kecuali dua di antaranya sama2
)Kurva valid jika kondisi 1 dan 2 benar, atau jika kondisi 3 adalah.
1 Konvolusi adalah kunci kesuksesan .
sumber
Python 3 ,
316315311 byteSaya pikir ini mencakup semua kasus; setidaknya test case berfungsi.
Selain itu, pasti masih banyak yang bisa dimainkan, mungkin pada awalnya di mana kasus tepi ditangani.
Cobalah online!
Bagaimana itu bekerja:
d,R,C
adalah 1. daftar daftar dengan 1 sebagai kurva dan 0 sebagai latar belakang, 2. jumlah baris dan kolomd
sehingga kita tidak perlu khawatir tentang tepi array 2dTerima kasih kepada @Helka Homba karena menunjukkan kasing yang hilang. Terima kasih kepada @TuukkaX dan @Trelzevir untuk tips golfnya.
sumber
d=[[1,0,1],[0,1,0],[1,0,1]]
akan gagal di sini (tambah testcase).s=sum
menghemat 4 byte.Mathematica,
153150 byteMengambil array 2D, dengan
0
s untuk.
s dan1
s untukX
s. OutputNull
untuk non-kurva.Mathematica memiliki built-in 45-byte untuk ini, tetapi output beberapa angka untuk non-kurva dan 1 / sqrt (2) untuk input
{{1}}
. Memperbaiki biaya 105 byte ini (bisa golf?).sumber