กำหนดว่าพิกัดเชิงเหตุผลอยู่ในสามเหลี่ยม Sierpinski ที่ถูกต้องหรือไม่


9

Sierpinski สามเหลี่ยมคือชุดของจุดบนเครื่องบินซึ่งถูกสร้างโดยเริ่มต้นด้วยรูปสามเหลี่ยมเดียวและซ้ำ ๆ แยกสามเหลี่ยมทั้งหมดเป็นสี่สามเหลี่ยมสอดคล้องและลบสามเหลี่ยมศูนย์ สิทธิ Sierpinski สามเหลี่ยมมีมุมที่(0,0), (0,1)และ(1,0)และมีลักษณะเช่นนี้

สามเหลี่ยม Sierpinski

คำจำกัดความที่เทียบเท่าของชุดนี้มีดังนี้:

  • คะแนนในnการทำซ้ำ TH nของกระบวนการที่อธิบายข้างต้นทั้งหมด

  • จุด(x,y)ด้วย0 <= x <= 1และ0 <= y <= 1เช่นว่าสำหรับจำนวนเต็มบวกทั้งหมดnที่nบิต TH ในการขยายตัวของฐาน x และ y 1ไม่ได้ทั้ง

  • ปล่อย T = {(0,0),(1,0),(0,1)}

    อนุญาตfเป็นฟังก์ชันในชุดของจุด 2D ที่กำหนดโดยต่อไปนี้:

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

    จากนั้นทางขวา Sierpinski สามเหลี่ยมเป็นปิดทอพอโลยีของจุดอย่างน้อยคงที่ (โดยชุดบรรจุ) fของ

  • อนุญาตSเป็นสแควร์{(x,y) | 0<=x<=1 and 0<=y<=1}

    อนุญาตg(X) = S ∩ {(x+t)/2 | x∈(X), t∈T}(ซึ่งTตามที่นิยามไว้ข้างต้น)

    จากนั้นทางขวา Sierpinski gสามเหลี่ยมเป็นจุดคงที่ยิ่งใหญ่ที่สุดของ

ท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นที่รับจำนวนเต็ม 4 จำนวนa,b,c,dและให้ค่าจริงถ้า(a/b,c/d)เป็นของสามเหลี่ยม Sierpinski ด้านขวาและให้ค่าเท็จ

เกณฑ์การให้คะแนน

นี่คือรหัสกอล์ฟ รหัสที่สั้นที่สุดเป็นไบต์ชนะ

กรณีทดสอบ

ต่อไปนี้อยู่ในสามเหลี่ยม Sierpinski ที่ถูกต้อง:

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

ต่อไปนี้ไม่ได้อยู่ในสามเหลี่ยม Sierpinski ที่ถูกต้อง:

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

แนวคิดคือเราตรวจสอบว่ามีจุดหนึ่งอยู่ในปะเก็นหรือไม่โดยตรวจสอบว่าส่วนขยายไบนารีของพวกเขาเป็นบิตและ - เป็น 0 เพื่อให้ได้kตัวอักษรตัวแรกของการขยายเราบิตเลื่อนเศษเศษที่kเหลือก่อนหารจำนวน . เราต้องทำให้kใหญ่พอที่จะทำซ้ำ เราทราบว่าการขยายตัวแบบไบนารีn/dมีระยะเวลามากที่สุดdดังนั้นการขยายร่วมกันจึงมีระยะเวลามากที่สุดd*Dดังนั้นก็k=d*Dเพียงพอแล้ว

-1/-3ส่วนที่เหลือคือการตรวจสอบว่าส่วนที่อยู่ในกล่องและฉนวนกับปัจจัยการผลิตที่ได้รับเช่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.