울타리 게시물 찾기


11

배경

담장 공장 근처에서 원자 폭탄이 폭발했습니다! 담장은 문명의 생존을 위해 필수적이므로 가능한 많은 구조를해야합니다. 우리는 해당 지역을 조사하기 위해 방사선에 강한 로봇을 보내고 있으며, 인공 비전을 프로그래밍하는 것이 당신의 임무입니다.

입력

입력은 |-#개행으로 구분 된 문자열로 제공되는 두 종류의 울타리 포스트 부분과 잔해를 나타내는 문자의 직사각형 격자입니다 . 울타리 기둥은 폭발로 인해 끔찍하게 훼손되었으며 일부는 더위에 의해 융합되었습니다. 우리는 정의 후보의 fencepost을 시작 및 종료에있는 수평 패턴 중 하나를 수 |및 하나 이상의 가지고 -그들 사이의을 (같은 |-|또는 |---|아니지만 ||), 또는 시작 및 종료에있는 수직 패턴 -과 하나 개 이상의가 |본질적으로 그들 사이들 ( 수평 후보 울타리 포스트는 90도 회전). 실제 fencepost는 다른 후보의 fencepost와 기타 부품을 공유하지 않는 후보의 fencepost입니다.

산출

출력은 입력 그리드에서 실제 펜스 포스트 수입니다.

입력 그리드를 고려하십시오

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

이 그리드에는 5 개의 후보 울타리 포스트가 있지만 그중 2 개만 실제 울타리 포스트입니다 (굵게 표시). 따라서 올바른 출력은 2입니다.

규칙

전체 프로그램이나 함수를 작성할 수 있습니다. 가장 낮은 바이트 수가 이기고 표준 허점이 허용되지 않습니다.

추가 테스트 사례

입력:

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

출력 : 0(0 후보 펜스 포스트)

입력:

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

결과 : 0(5 개의 후보 펜스 포스트)

입력:

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

결과 : 4(8 개의 후보 펜스 포스트)

입력:

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

결과 : 5(7 개의 후보 펜스 포스트)

입력:

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

결과 : 4(9 개의 후보 펜스 포스트)

입력:

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

결과 : 9(30 개의 후보 펜스 포스트)


|--...--|패턴 와일드 카드 의 마침표는 무엇입니까? 가로 펜스에 하이픈이 5 개 이상 있어야합니까? 나는 표기법에 약간 혼란스러워합니다.
BMac

@BMac 줄임표로되어있어 일부 하이픈이 생략되었습니다. 나는 이것이 가장 명확한 표기법이 아니라는 데 동의합니다. 덜 모호한 것을 생각해 봅시다.
Zgarb

함수를 작성한다면, 예를 들어 입력으로 하나의 2D 배열 인수를 취할 수 있습니다. [[-,|,-],[#,#,-],[-,-,|]]?
blutorange

@blutorange 아니오,이 과제에서는 단일 문자열이어야합니다.
Zgarb

답변:


3

루비, 266268 바이트

시작하려면 중복 후보를 제거하기 위해 변수가 객체 (2D 배열의 각 요소에 대한 1 문자 문자열)를 가리키는 사실을 사용합니다.

예 : 당신은 실행하면 a="s";b=a, 모두 ab같은 문자열을 가리 킵니다. 두 개의 다른 String 객체를 만들었으므로 "test"=="test"true를 "test".equal?("test")반환 하지만 false를 반환합니다.

->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)}}}

ideone 에 대한 테스트 사례 .


1
map대신 사용할 수 있습니다each
Cristian Lupascu

@ w0lf 감사합니다. 재밌는 것은, 내가 알았어 야했는데 ...
blutorange
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.