Xác định xem tọa độ hợp lý có nằm trong tam giác Sierpinki không


9

Các Sierpinski tam giác là một tập hợp các điểm trên mặt phẳng đó được xây dựng bằng cách bắt đầu với một hình tam giác đơn và nhiều lần chia tách tất cả các tam giác thành bốn hình tam giác đồng dạng và loại bỏ các trung tâm tam giác. Tam giác Sierpinki bên phải có các góc tại (0,0), (0,1)(1,0), và trông như thế này:

Tam giác Sierpinki

Một số định nghĩa tương đương của bộ này như sau:

  • Điểm trong nlần lặp lại của quá trình được mô tả ở trên, cho tất cả n.

  • Các điểm (x,y)0 <= x <= 10 <= y <= 1sao cho tất cả các số nguyên dương n, nbit thứ trong khai triển nhị phân của x và y không phải là cả hai 1.

  • Để cho T = {(0,0),(1,0),(0,1)}

    Hãy flà một hàm trên các tập hợp các điểm 2D được xác định bởi các mục sau:

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

    Sau đó, tam giác Sierpinki bên phải là đóng cửa tôpô của điểm cố định ít nhất (bằng cách đặt ngăn chặn) của f.

  • Hãy Slà hình vuông{(x,y) | 0<=x<=1 and 0<=y<=1}

    Hãy để g(X) = S ∩ {(x+t)/2 | x∈(X), t∈T}(nơi Tđược xác định ở trên)

    Thì tam giác Sierpinki phải là điểm cố định lớn nhất g.

Thử thách

Viết chương trình hoặc hàm chấp nhận 4 số nguyên a,b,c,dvà đưa ra giá trị trung thực nếu (a/b,c/d)thuộc về tam giác Sierpinki phải, và mặt khác sẽ cho giá trị falsey.

Chấm điểm

Đây là một mã golf. Mã ngắn nhất trong byte thắng.

Các trường hợp thử nghiệm

Sau đây là trong tam giác Sierpinki bên phải:

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

Sau đây không nằm trong tam giác Sierpinki bên phải:

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 1một đầu vào hợp lệ?
xnor 17/05/2015

Vâng, đó là một đầu vào hợp lệ. Tôi đã thêm các trường hợp thử nghiệm để làm rõ điều này.
cardboard_box

Câu trả lời:


5

Con trăn 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

Một cách tốt đẹp để kiểm tra thành viên gasket làm xấu xí. Nếu chúng tôi được đảm bảo rằng các đầu vào không âm và trong ô vuông đơn vị, chúng tôi sẽ có 38:

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

Ý tưởng là chúng ta kiểm tra xem một điểm có nằm trong miếng đệm hay không bằng cách kiểm tra xem phần nhị phân của chúng có mở rộng từng bit hay không thành 0. Để lấy kký tự đầu tiên của khai triển, chúng ta dịch chuyển kbit bit còn lại trước khi chia số nguyên cho mẫu số . Chúng ta cần làm cho kđủ lớn để bắt lặp lại. Chúng tôi lưu ý rằng việc mở rộng nhị phân n/dcó thời gian nhiều nhất d, vì vậy các mở rộng chung có thời gian nhiều nhất d*D, vì vậy k=d*Dđủ.

Phần còn lại là kiểm tra xem phân số có trong hộp không và cách nhiệt với các đầu vào như thế nào -1/-3.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.