Tentukan apakah koordinat rasional berada di segitiga Sierpinski kanan

9

The Sierpinski segitiga adalah satu set poin di pesawat yang dibangun dengan memulai dengan segitiga tunggal dan berulang kali membelah semua segitiga menjadi empat segitiga kongruen dan menghapus segitiga pusat. Segitiga Sierpinski kanan memiliki sudut di (0,0), (0,1)dan (1,0), dan terlihat seperti ini:

Segitiga Sierpinski

Beberapa definisi yang setara dari set ini adalah sebagai berikut:

  • Poin dalam niterasi proses yang dijelaskan di atas, untuk semua n.

  • Poin (x,y)dengan 0 <= x <= 1dan 0 <= y <= 1sedemikian rupa sehingga untuk semua bilangan bulat positif n, nbit th dalam ekspansi biner dari x dan y tidak keduanya 1.

  • Membiarkan T = {(0,0),(1,0),(0,1)}

    Membiarkan fmenjadi fungsi pada set poin 2D yang ditentukan oleh yang berikut ini:

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

    Kemudian segitiga Sierpinski kanan adalah penutupan topologi dari titik yang paling tidak pasti (dengan set kontainment) dari f.

  • Membiarkan Smenjadi persegi{(x,y) | 0<=x<=1 and 0<=y<=1}

    Biarkan g(X) = S ∩ {(x+t)/2 | x∈(X), t∈T}(di mana Tseperti yang didefinisikan di atas)

    Maka segitiga Sierpinski kanan adalah titik tetap terbesar g.

Tantangan

Tulis program atau fungsi yang menerima 4 bilangan bulat, a,b,c,ddan berikan nilai kebenaran jika (a/b,c/d)milik segitiga Sierpinski kanan, dan jika tidak berikan nilai falsey.

Mencetak gol

Ini adalah kode golf. Kode terpendek dalam byte menang.

Uji kasus

Berikut ini adalah dalam segitiga Sierpinski kanan:

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

Berikut ini tidak dalam segitiga Sierpinski kanan:

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
kotak kardus
sumber
Apakah -1 -3 1 1input yang valid?
xnor
Ya, itu adalah input yang valid. Saya telah menambahkan test case untuk membuatnya lebih jelas.
cardboard_box

Jawaban:

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

Cara yang bagus untuk memeriksa keanggotaan gasket dibuat jelek. Jika kami dijamin bahwa inputnya tidak negatif dan di unit square, kami akan memiliki 38:

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

Idenya adalah bahwa kita memeriksa apakah suatu titik terletak di dalam paking dengan memeriksa apakah fraksi biner mereka ekspansi bitwise-DAN ke 0. Untuk mendapatkan kkarakter pertama dari ekspansi, kita menggeser-geser kbit pembilang yang tersisa sebelum pembagi-bilangan bulat oleh penyebut. . Kita harus membuat kukuran yang cukup besar untuk mendapatkan pengulangan. Kami mencatat bahwa ekspansi biner n/dmemiliki periode paling banyak d, jadi ekspansi gabungan memiliki periode paling banyak d*D, jadi k=d*Dcukup.

Sisanya adalah untuk memeriksa apakah fraksi ada di dalam kotak dan melindungi terhadap input yang diberikan seperti -1/-3.

Tidak
sumber