有理座標が正しいシェルピンスキー三角形にあるかどうかを判別


9

シェルピンスキーの三角形は、単一の三角形で始まる繰り返し4つの合同な三角形にすべての三角形を分割し、中央の三角形を除去することによって構築される平面上の点の集合です。右のシェルピンスキー三角形には(0,0)(0,1)(1,0)に角があり、次のようになります。

シェルピンスキーの三角形

このセットの同等の定義は次のとおりです。

  • nすべてのについて、上記のプロセスのth番目の反復のポイントn

  • (x,y)0 <= x <= 1し、0 <= y <= 1すべての正の整数のようにnnxのバイナリ膨張番目のビットとYの両方ではありません1

  • しましょう T = {(0,0),(1,0),(0,1)}

    f次のように定義された2Dポイントのセットの関数とします。

    f(X) = {(0,0)} ∪ {(x+t)/2 | x∈X, t∈T}

    右シェルピンスキーの三角形は、トポロジカルクロージャ最小不動点の(セット封じ込めによって)f

  • S正方形にしよう{(x,y) | 0<=x<=1 and 0<=y<=1}

    Let g(X) = S ∩ {(x+t)/2 | x∈(X), t∈T}T上記は上で定義したとおり)

    次に、右のシェルピンスキー三角形がの最大の不動点ですg

チャレンジ

4つの整数を受け入れa,b,c,d、正しいシェル(a/b,c/d)ピンスキー三角形に属している場合は真の値を与え、そうでない場合は偽の値を与えるプログラムまたは関数を記述します。

得点

これはコードゴルフです。バイト単位の最短コードが優先されます。

テストケース

以下は、シェルピンスキー三角形の右側にあります。

0 1 0 1
0 1 12345 123456
27 100 73 100
1 7 2 7
8 9 2 21
8 15 20 63
-1 -7 2 7

以下は、シェルピンスキー三角形の右側にありません:

1 1 1 1
-1 100 1 3
1 3 1 3
1 23 1 7
4 63 3 66
58 217 4351 7577
-1 -7 3 7

ある-1 -3 1 1有効な入力?
xnor

はい、それは有効な入力です。これを明確にするために、テストケースを追加しました。
cardboard_box

回答:


5

Python 2、68

lambda n,d,N,D:1>=n/d>=0<=N/D<=1and(n<<abs(D*d))/d&(N<<abs(D*d))/D<1

醜いガスケットのメンバーシップをチェックするための素晴らしい方法。入力が負ではなく、単位平方であることが保証されている場合、38になります。

lambda n,d,N,D:(n<<D*d)/d&(N<<D*d)/D<1

アイデアは、2進法の展開がビット単位のANDで0になっているかどうかをチェックすることにより、ポイントがガスケット内にあるかどうかをチェックするというものです。展開の最初のk文字を取得するには、分母kによる整数除算の前に分子ビットをビットシフトします。kリピートをキャッチするには、十分に大きくする必要があります。バイナリ展開にn/dはせいぜい周期があるdので、ジョイント展開にはせいぜい周期があるd*Dのでk=d*D十分であることに注意します。

残りは、フラクションがボックス内にあるかどうかを確認し、などの入力に対して絶縁することです-1/-3

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