この線はその正方形を通りますか?


19

以下に示すように、最初の象限(正のx軸、正のy軸、および原点を含む)を1x1グリッドに分割し、各グリッドに左下隅の座標でラベルを付けます。

各グリッドには境界と頂点が含まれていることに注意してください。数学記号を使用すると、(m、n)というラベルの付いたグリッドは正方形を表し{(x,y) | m ≤ x ≤ m+1, n ≤ y ≤ n+1}ます。


形で直線所定のax+by+c=0整数としab、およびc、と表されるグリッド(m,n)線は、グリッド、すなわち所与のグリッド内の任意の点がライン上にあるかどうかを通過するかどうかを出力。


a  b  c m n output
1  1  0 0 0 true
1  1  0 1 1 false
1  1  0 0 2 false
1  1 -3 0 1 true
1  1 -3 0 0 false
2 -1  0 1 1 true
2 -1  0 1 0 false
2 -1  0 0 2 true
2 -1  0 0 1 true
2 -1  0 1 2 true
2  0 -1 0 0 true
2  0 -1 0 1 true
2  0 -1 0 2 true
2  0 -1 1 0 false
2  0 -1 1 1 false
0  2 -1 0 0 true
0  2 -1 1 0 true
0  2 -1 2 0 true
0  2 -1 0 1 false
0  2 -1 1 1 false
1  0 -1 0 0 true
1  0 -1 0 1 true
1  0 -1 0 2 true
1  0 -1 1 0 true
1  0 -1 1 1 true

コメントでさらにテストケースを提案してください。


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


1
もちろん、aとbの両方が0でないと仮定できるはずです。cがゼロの場合、無限の行が存在し、cがゼロ以外の場合、行がまったく存在しない可能性があるためです。
エリックアウトゴルファー

入力を2つ以上の配列、たとえば[a, b, c](線)と[m, n](正方形)として取得できますか?
エリックアウトゴルファー

@EriktheOutgolferメタではないことに驚いています。
リーキー修道女


回答:


5

Python 3、84 66バイト

最初のゴルフ、最初の失敗(多分)。

直接入力の代わりに関数を使用して18バイトを削減したRodに感謝します。

def f(a,b,c,m,n):f=-(a*m+c)/b;g=f-a/b;print(min(f,g)<=n<=max(f,g))

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

説明:

基本的に、mとm + 1のライン関数の値を計算します。nが値の間にある場合、リストはある時点でそれを通過する必要があります。言語に複数の整数を入力するためのより簡単な方法があれば、はるかに良いでしょう。



2
PPCGへようこそ!
betseg

1
これは、n + 1およびm + 1に対してチェックする必要はありませんか?
ニール

3
ゼロによる除算bです0
オリビエグレゴワール

また、Leaky Nunが強調したいくつかのテストケースに合格しません。
オリビエグレゴワール

5

ゼリー、10バイト

ż‘{Œpæ.ṠE¬

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

バックグラウンド

私の他の答えのように、これは直線が平面を2つの半平面に分割するという事実に依存しています。長方形は、これらの半平面の1つに含まれるか(線と交差しない)、両方の半平面と交差します(したがって、それらを分離する線)。

使い方

ż‘{Œpæ.ṠE¬  Main link. Left argument: [m, n]. Right argument: [a, b, c]

 ‘{         Increment left; yield [m+1, n+1].
ż           Zipwith; yield [[m, m+1], [n, n+1]].
   Œp       Cartesian product; yield [[m, n], [m, n+1], [m+1, n], [m+1, n+1]].
     æ.     Take the dot products with [a, b, c], mapping each [x, y] to ax+by+c.
       Ṡ    Take the signs.
        E   Test the signs for equality.
         ¬  Logical NOT.

4

Python 2、59バイト

lambda a,b,c,m,n:min(0,a,b,a+b)<=-a*m-b*n-c<=max(0,a,b,a+b)

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

ポイントがラインのどちら側にあるかは、の記号でわかりa*x+b*y+cます。4つの頂点すべて(m,n),(m,n+1),(m+1,n),(m+1,n+1)が厳密に線の同じ側にない限り、線は正方形を通過します(接触を数えます)。これらの値を抽出して、a*m+b*n+c4つすべてに現れる定数を抽出することができます。

a*m+b*n+c
a*m+b*n+c+a
a*m+b*n+c+b
a*m+b*n+c+a+b

したがって、これらの4つの値がすべて正またはすべて負でない限り、線は正方形を通過します。そのため、最小値を<=0最大値に設定すれば十分です>=0

min(a*m+b*n+c,a*m+b*n+c+a,a*m+b*n+c+b,a*m+b*n+c+a+b)<=0<=max(a*m+b*n+c,a*m+b*n+c+a,a*m+b*n+c+b,a*m+b*n+c+a+b)

a*m+b*n+c各部分から共通部分を引くと、コードが得られます。

もう少し長いアプローチは、符号セット(+、0、-)の長さが少なくとも2であるかどうかを確認することです。

Python 2、62バイト

lambda a,b,c,m,n:len({cmp(a*m+b*n+c,-d)for d in(0,a,b,a+b)})>1

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



3

バッチ、66バイト

@cmd/cset/a"q=%1*%4+%2*%5+%3,((-(q+%1)*(q+%2)&-q*(q+%1+%2))>>31)+1

説明:セルの四隅で方程式がとる値を考慮します。線がセルと交差しない場合、4つの値はすべて同じ符号を持ちますが、セルと交差する場合、少なくとも1つの値はゼロまたは反対の符号になります。比較は、対角のペアを乗算することで単純化され、両方の値が正の場合、線はセルと交差しません。いくつかのビットトゥイドリングは、乗算を全体的な結果に変換します。


1

Mathematica、50バイト

-4<Tr@Sign[Tuples@{{#,#+1},{#2,#2+1}}.{##4}+#3]<4&

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

テイク m, n, c, a, bの順に入力として。

説明:Tuples@{{#,#+1},{#2,#2+1}}正方形の4つの角の座標のリストを作成し、次に.{##4}(と意味する{#4, #5})ドット積を取り、各角で+#3計算ax + by + cを追加しx,yます。ラインがポイントを通過する場合、これはゼロです。線が原点から遠い場合、負です。そして、線が原点に近い場合、正です-したがって、Sign、これら4つの値のsます。4つの値がすべて1であるか、4つすべてが-1である場合にのみ、線は正方形の外側を通過するため、合計が厳密に-4から4の間であることを確認します。

(この回答は、この質問に対する私の回答に漠然とインスパイアされています。)



1

Python、54バイト

lambda a,b,c,m,n:abs(2*(a*m+b*n+c)+a+b)<=abs(a)+abs(b)

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

(テストスクリプトのxnorに感謝します。)

使い方

行は、次の場合にのみm + 1/2 + xn + 1/2 + yを通過します

⋅(M + 1/2 + X)+ B ⋅(N + 1/2 + Y)+ C = 0
⇔2⋅(AM + BN + C)+ A + B =-2⋅ AX - 2⋅ BY

これは一部で可能です| バツ |、| y | ≤1/2の場合にのみ|2⋅(⋅のM + BN + C)+ A + B | ≤| | + | b |。


1

Java(OpenJDK 8)、71バイト

(a,b,c,x,y)->(0<a?0:a)+(0<b?0:b)<=(x=-a*x-b*y-c)&x<=(0>a?0:a)+(0>b?0:b)

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

xnorのPythonソリューションのポート。

組み込みのJavaの形状/線の交差点を使用した元のソリューション(108バイト)

(a,b,c,x,y)->b==0?x<=-c/a&-c/a<=x+1:new java.awt.Rectangle(x,y,1,1).intersectsLine(x,c=(c+a*x)/-b,x+1,c-a/b)

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

クレジット

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