フェンスポストを見つける


11

バックグラウンド

フェンスポスト工場の近くで原子爆弾が爆発しました!フェンスポストは私たちの文明の存続に不可欠であるため、できるだけ多くを救出する必要があります。放射線耐性のあるロボットを派遣して地域を探索していますが、彼らの人工視覚をプログラムするのはあなたの仕事です。

入力

入力は、|-#改行区切りの文字列として指定された2種類のフェンスポストパーツと瓦bleを表す、文字の長方形のグリッドです。フェンスの支柱は爆発によって恐ろしく損なわれ、一部は熱によって融合しました。候補のフェンスポストを、開始と終了で|1つ以上-のsがある(|-|または|---|そうでない||)水平パターン、または開始と終了で-1つ以上|のs がある垂直パターン(基本的に)のいずれかに定義します90度回転した水平候補フェンスポスト)。実際fencepostは別の候補fencepostとその部分のいずれかを共有しない候補fencepostあります。

出力

出力は、入力グリッド内の実際のフェンスポストの数です。

入力グリッドを検討する

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

このグリッドには5つの候補フェンスポストがありますが、実際のフェンスポストは2つだけです(太字で表示)。したがって、正しい出力は2です。

ルール

完全なプログラムまたは関数のいずれかを作成できます。最小のバイトカウントが優先され、標準の抜け穴は許可されません。

追加のテストケース

入力:

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

出力:0(0候補フ​​ェンスポスト)

入力:

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

出力:0(5つの候補フェンスポスト)

入力:

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

出力:4(8つの候補フェンスポスト)

入力:

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

出力:5(7つの候補フェンスポスト)

入力:

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

出力:4(9つの候補フェンスポスト)

入力:

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

出力:9(30の候補フェンスポスト)


|--...--|パターンのピリオドはワイルドカードですか?つまり、水平フェンスには少なくとも5つのハイフンが必要ですか?表記法に少し混乱しています。
BMac

@BMacこれらは省略記号であると想定されます。つまり、一部のハイフンが省略されます。それが最も明確な表記法ではないことに同意します。曖昧さの少ないものを考えてみましょう。
ズガルブ

関数を書く場合、入力として2D配列引数を1つ取りますか。[[-,|,-],[#,#,-],[-,-,|]]
ブルトレンジ

@blutorangeいいえ、このチャレンジでは、単一の文字列である必要があります。
ズガルブ

回答:


3

ルビー、266 268バイト

これを開始するには。変数がオブジェクト(2D配列の各要素の1文字の文字列)を指しているという事実を利用して、重複する候補を排除します。

例えば。を実行すると a="s";b=a、両方が同じ文字列ab指します。"test"=="test"trueを返しますが、"test".equal?("test")2つの異なるStringオブジェクトを作成したため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)}}}

イデオンのテストケース。


1
map代わりに使用できますeach
Cristian Lupascu

@ w0lfありがとう、適用。面白いことに...私がいることを知っているべきである
blutorange
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.