四角がいくつありますか?


12

なる非空の2Dアレイを所与01、4隅全てである正方形の数を見つけます1。正方形は「直立」である必要はありません。すべての行が同じ長さであることが保証されています。

合理的な入出力方法が許可されています。

テストケース:

0001000
1000000
0000000
0000100
0100000

これはを返します1

10101
00000
10100
00000
10001

これはを返します2

1111
1111
1111
1111

これはを返します20

これはです。バイト単位の最短回答が優先されます。標準の抜け穴が適用されます。


意図を理解している場合の別の解釈:1正方形上の4 秒。それぞれ1が、その2つの隣人から周囲に沿って等距離にあるように。
-feersum

@feersum後者の条件はすべての正方形に当てはまりますよね?
-Wojowu

回答:


18

JavaScript(ES6)、127 124 119バイト

nderscoreのおかげで3バイト節約

m=>(F=(x,y)=>m.map((r,Y)=>r.map((i,X)=>i?1/y?n+=x<X&y<=Y&(g=(a,b)=>(m[b+X-x]||0)[a-Y+y])(x,y)&g(X,Y):F(X,Y):0)))(n=0)|n

どうやって?

この関数は、入力行列mのセル(x、y)(X、Y)のすべてのペアを次のように繰り返します。

  • m [x、y] = m [X、Y] = 1
  • x <X
  • y≤Y

一致する各ペアは、正方形の潜在的なエッジの座標を表します。不等式は、各エッジが1回だけテストされることを保証します。

ベクトル[dx、dy] = [X-x、Y-y]を時計回りに90°回転して、[x-dy、y + dx]および[X-dy、Y + dx]にあるセルをテストします。両方に1が含まれている場合、有効な正方形が見つかりました。

平方

テストケース


-2バイト:g=(a,b)=>(m[b+X-x]||0)[a-Y+y]-1バイト:|n代わりに使用&&n
-nderscore

6

MATL、20バイト

&fJ*+4XN!"@&-|un3=vs

入力は行列です。

オンラインでお試しください!

使い方

これにより、入力グリッド内の非ゼロエントリのすべての座標が検索され、それらが複素数として表されます。そのため、行と列のインデックスはそれぞれ実部と虚部に対応します。

次に、コードは、一度に4つずつ取得したこれらの数値のすべての組み合わせ(順序は関係ありません)の配列を生成します。各組み合わせは正方形の候補を表します。各組み合わせに対して、ペアワイズ絶対差の4×4マトリックス(つまり、複素平面内の距離)が計算されます。これは、主対角線に沿ってゼロを持つ対称行列です。現在の組み合わせが正方形を形成するのは、マトリックスに正確に3つの異なる値が含まれている場合のみです(これらは正方形の辺、正方形の対角線、およびゼロです)。

ここに画像の説明を入力してください

一方、たとえば、非正方形の長方形は4つの異なる値(2つの辺、1つの対角線の値、およびゼロ)を生成します。

ここに画像の説明を入力してください

また、一般的な四辺形は最大7つの値(4つの辺、2つの対角線、およびゼロ)を持つことができます。

ここに画像の説明を入力してください

&f      % Input (implicit). Push vectors of row and column indices of nonzero entries
J*      % Multiply by imaginary unit
+       % Add the two vectors. Gives a vector of complex coordinates
4XN     % Matrix of combinations of these complex numbers, taken 4 at a time. Each
        % row is a combination
!       % Transpose
"       % For each column
  @     %   Push current column: candidate set of four points
  &-    %   All pair-wise differences
  |     %   Absolute value
  u     %   Unique entries
  n3=   %   Does the number of elements equal 3? Gives true (1) or false (0)
  vs    %   Concatenate vertically with previous accumulated result, and sum
        % End (implicit). Display (implicit)

どのように機能しますか?
リーキー修道女

@LeakyNun説明が追加されました
ルイスメンドー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.