Temukan Fenceposts

11

Latar Belakang

Sebuah bom atom meledak di dekat pabrik fencepost! Karena tiang pagar sangat penting untuk kelangsungan hidup peradaban kita, kita harus menyelamatkan sebanyak mungkin. Kami mengirim robot tahan radiasi untuk mencari di daerah itu, dan tugas Anda adalah memprogram penglihatan buatan mereka.

Memasukkan

Input Anda adalah kisi-kisi persegi karakter |-#, mewakili dua jenis bagian fencepost dan puing-puing, diberikan sebagai string yang dibatasi garis baru. Fenceposts telah dilumpuhkan oleh ledakan, dan beberapa bahkan telah menyatu bersama oleh panas. Kami mendefinisikan kandidat fencepost menjadi pola horizontal yang dimulai dan berakhir |dan memiliki satu atau lebih -s di antara mereka (suka |-|atau |---|tidak ||), atau pola vertikal yang dimulai dan berakhir -dan memiliki satu atau lebih |s di antara mereka (pada dasarnya kandidat horizontal fencepost diputar 90 derajat). Sebuah fencepost sebenarnya adalah fencepost calon yang tidak berbagi komponen dengan fencepost kandidat lain.

Keluaran

Output Anda adalah jumlah posting aktual di kisi input.

Contoh

Pertimbangkan kisi masukan

|#|-|#|##
#||--|||#
###|#|--#
###-||--|
-#-|#-|#-
#---#-#-|
#-#-|#--|

Ada 5 kandidat fencepost di kisi ini, tetapi hanya 2 dari mereka fencepost yang sebenarnya (ditunjukkan dalam huruf tebal). Dengan demikian output yang benar adalah 2.

Aturan

Anda dapat menulis program lengkap atau fungsi. Hitungan byte terendah menang, dan celah standar tidak diizinkan.

Kasus uji tambahan

Memasukkan:

##--
||##
-#|-
|#|#

Keluaran: 0(0 kandidat fencepost)

Memasukkan:

-##|-##--
#|#-|#||-
--|-#|#||
##||||-##
||#|--|-|
-#|-#--|#
|####|#-#

Output: 0(5 kandidat fenceposts)

Memasukkan:

#|--|---|-|#
####|##--||-
-|-##||#|---
-#|#-|-#-|||
#|-##--###|-
---#-||-#-##
#|---|###|-#
-|---#-#|#|#
|#--|####-|-

Output: 4(8 kandidat fenceposts)

Memasukkan:

-|-||---##|#
---|######-#
####-##|#--|
|||##|#-||||
####-#-||-#|
---#--|#-#--
-|#-####-##-
#||-|-|-###|
|-##||-||-#-

Output: 5(7 kandidat fenceposts)

Memasukkan:

|#-|#|#-###|#-#
----#####|#----
|#--#-##-#|##-|
|#-|#-|--##||--
||#-#---##|||##
#|#-|||-#-#--||
--#|-||#|--|#|#
-#-|###||-#--#|
-#||-|#-##||##|
|--|-|||-##|-#|

Output: 4(9 kandidat fenceposts)

Memasukkan:

||-|-|-##-#-#-|#--#-
-##|-#|-#-##-|#|--|-
||#---###||-|#|##|-#
#||-#-#-|---|#||#|##
-#-###-##-|-#-|-#||#
##-#--#||-----||-|##
-|--#-#-#|---#-#|#-#
###|-|#-#|-|###|#-|#
#||#-#|--|-||#------
||##|-||#-|--#|#-#-#
|#-|-#-|-|--##-#|||#
-|#--#||##---##|-##-
#|-|-|-||-||#-#-|##-
|-#|##|-|#|#|--||#--

Output: 9(30 kandidat fenceposts)

Zgarb
sumber
Jadi, apakah periode dalam |--...--|wildcard pola? Apakah itu berarti pagar horizontal harus memiliki setidaknya 5 tanda hubung? Saya agak bingung dengan notasinya.
BMac
@BMac Mereka seharusnya menjadi elipsis, yang berarti bahwa beberapa tanda hubung dihilangkan. Saya setuju bahwa itu bukan notasi yang paling jelas. Biarkan saya memikirkan sesuatu yang kurang ambigu.
Zgarb
Jika kita menulis suatu fungsi, mungkin diperlukan satu argumen 2D-array sebagai input, mis. [[-,|,-],[#,#,-],[-,-,|]]?
blutorange
@blutorange Tidak, dalam tantangan ini harus berupa string tunggal.
Zgarb

Jawaban:

3

Ruby, 266 268 byte

Untuk memulai ini. Memanfaatkan fakta bahwa variabel menunjuk ke objek (string 1-char untuk setiap elemen array 2D) untuk menghilangkan kandidat yang tumpang tindih.

Misalnya. jika Anda mengeksekusi a="s";b=a, keduanya adan barahkan ke string yang sama. "test"=="test"mengembalikan true, tetapi "test".equal?("test")mengembalikan false, karena kami telah membuat dua objek String yang berbeda.

->d{c=->d,f,v,u{i=0
r=[]
d.map{|y|j=0
e=[]
y.map{|x|f[j]||=[]
f[j][i]=x
x==v ?e[1]?r<<e+[x]&&e=[x]:e[0]?e=[x]:e<<x :x==u&&e[0]?e<<x :e=[]
j+=1}
i+=1}
r}
y=c[d.split.map(&:chars),f=[],?|,?-]+c[f,[],?-,?|]
y.count{|x|y.all?{|q|x.equal?(q)||!(q+x).uniq!(&:object_id)}}}

Uji kasus pada ideone .

blutorange
sumber
1
Anda dapat menggunakan mapsebagai gantinyaeach
Cristian Lupascu
@ w0lf terima kasih, diterapkan. lucunya, aku seharusnya tahu bahwa ...
blutorange