สี่แยกสามเหลี่ยมสองแห่ง


19

ป.ร. ให้ไว้ 4 จุดบน 2D เครื่องบินA, B, C, D, คำนวณพื้นที่ของภูมิภาคจุดตัดของรูปสามเหลี่ยมที่OABและOCDที่เป็นศูนย์กลางของเครื่องบินที่มีการประสานงานO(0, 0)

อัลกอริทึมที่ทำงานในความซับซ้อนของเวลาคงที่ (ในแง่ของการดำเนินการทางคณิตศาสตร์) ได้รับการสนับสนุน แต่ไม่บังคับ

กฎระเบียบ

  • แต่ละจุดจะแสดงเป็นตัวเลขจริงสองค่าซึ่งหมายถึงพิกัด X และ Y
    • อีกทางเลือกหนึ่งหากภาษาการเขียนโปรแกรมของคุณ (หรือบางไลบรารีของภาษาการเขียนโปรแกรมของคุณ) มีPointประเภทในตัวหรือเทียบเท่ามันได้รับอนุญาตให้นำPointวัตถุเป็นอินพุต
  • อินพุตได้รับเป็น 4 คะแนนในรูปแบบรวมถึง แต่ไม่ จำกัด เฉพาะ:
    • รายการพิกัด 8 รายการ
    • รายการ 4 คะแนนแต่ละจุดสามารถแสดงในรูปแบบที่สะดวกใด ๆ
    • สองรายการ 2 คะแนน
    • เป็นต้น
  • คุณไม่สามารถถือว่าการสั่งซื้อโดยเฉพาะอย่างยิ่งของจุด
  • คุณไม่สามารถสันนิษฐานได้ว่าจุดOถูกส่งผ่านเป็นอินพุต กล่าวอีกนัยหนึ่งโปรแกรมจะต้องไม่ใช้และใช้การป้อนข้อมูลภายนอก
  • คุณไม่สามารถสรุปได้ว่าคะแนนทั้งหมดนั้นแตกต่างกันหรือไม่ กล่าวอีกนัยหนึ่งสามเหลี่ยมอาจเสื่อมสภาพ คุณต้องจัดการกับกรณีนั้นด้วย (ดูกรณีทดสอบด้านล่าง)
  • ความแตกต่างแบบสัมบูรณ์หรือสัมพัทธ์ต้องน้อยกว่าสำหรับกรณีทดสอบตัวอย่างด้านล่าง10-3

เกณฑ์การชนะ

นี่คือคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ!

กรณีทดสอบตัวอย่าง

Ax Ay Bx By Cx Cy Dx Dy area

5 1 1 3 -1 0 0 -1 0
5 1 1 3 -1 0 0 0 0
5 1 1 3 0 0 0 0 0
5 1 1 3 3 4 4 -3 4.50418
5 1 1 3 1 2 2 1 1.5
5 1 1 3 -2 5 4 -2 1.74829
5 1 1 3 -2 5 5 4 2.96154
5 1 1 3 3 5 5 4 1.88462
5 1 1 3 3 5 3 1 3.92308
5 1 1 3 3 5 4 -1 5.26619
5 1 1 3 5 1 4 -1 0
5 1 1 3 5 1 1 3 7
1 3 1 3 5 1 1 3 0
1 3 1 3 1 3 1 3 0
4 8 4 -1 -2 6 -2 -3 0

1.2 3.4 -0.3 4.2 5 7.6 -1.1 2.4 2.6210759326188535
3.1 0.6 0.1 7.2 5.2 0.7 0.9 8 9.018496993987977

หากใครต้องการนี่คือผลลัพธ์สำหรับกลุ่มกรณีทดสอบแรกในรูปแบบที่แน่นอน:

0
0
0
46375/10296
3/2
1792/1025
77/26
49/26
51/13
23345/4433
0
7
0
0
0

ภาพภาพประกอบสำหรับกรณีทดสอบ5 1 1 3 3 4 4 -3(พื้นที่ของรูปสี่เหลี่ยมสีเขียวเป็นผลลัพธ์ที่คาดไว้):

[ ภาพ]


หนึ่งในกรณีทดสอบของคุณมี 9 อินพุตมากกว่า 8 1.2 3.4 -0.3 4.2 5 3 7.6 -1.1 2.4 0
Kelly Lowder

1
@KellyLowder แก้ไขแล้ว
user202729

คำตอบ:


16

ภาษา Wolfram (Mathematica) , 55 ไบต์

0&@@Area@BooleanRegion[And,Simplex[{0{,}}~Join~#]&/@#]&

ลองออนไลน์!

โกนคำตอบเล็กน้อยไปสองสามไบต์

%@{{{5, 1}, {1, 3}}, {{3, 4}, {4, -3}}} yields 46375/10296 or 4.504176379

การแทนที่Areaด้วยDiscretizeRegionจะแสดงจุดตัด

ป้อนคำอธิบายรูปภาพที่นี่

โดยวิธีการนี้จะทำงานร่วมกับ simplexes ใด ๆ ไม่เพียง แต่รูปสามเหลี่ยม

-1 ไบต์ขอบคุณ JungHwan Min

ข้อเสนอแนะของ @ user202729 เพิ่ม 4 ไบต์ แต่ทำให้ได้ผลลัพธ์เป็น 0 สำหรับรูปสามเหลี่ยมที่แย่ลง


1
รูปหลายเหลี่ยมสามารถใช้แทน Simplex ได้เช่นกัน
Kelly Lowder

1
อีกหนึ่งไบต์: {{0,0}}ถึง{0{,}}(ใช้งานได้เนื่องจากนิพจน์ประเมินเป็น{Times[0, {Null, Null}]})
JungHwan Min

ล้มเหลวสำหรับกรณีทดสอบนี้ซึ่งแสดงอยู่ในตัวอย่างกรณีทดสอบ
user202729

ทราบอยู่แล้วว่านี่ไม่สามารถใช้งานได้กับ TIO ไม่แน่ใจว่าสิ่งที่พวกเขามีภายใต้ประทุน
Kelly Lowder

1
ฉันเห็นว่ามันใช้ไม่ได้กับการตัดกันของสองบรรทัด ฉันไม่ดีสำหรับการข้ามกรณีทดสอบ ในทางเทคนิคแล้วสิ่งเหล่านี้ไม่ใช่รูปสามเหลี่ยม ฉันคิดว่าถ้าเราจะได้รับทางเทคนิคนั้นบางทีคุณควรเปลี่ยนชื่อของโพสต์เช่นเดียวกับประโยคแรก เราอาจมีการพูดคุยที่ลึกลับเกี่ยวกับว่าพื้นที่นั้นถูกกำหนดไว้สำหรับวัตถุหนึ่งมิติหรือไม่ แต่ฉันไม่ต้องการ
Kelly Lowder

5

Python 2 + PIL, 341 318 313 284 270 ไบต์

ขอขอบคุณเป็นพิเศษกับเดนนิสที่เพิ่ม PIL ลงใน TIO
-23 ไบต์ทันทีขอบคุณ Mr. Xcoder

import PIL.Image as I,PIL.ImageDraw as D
l=[i*1000for i in[0,0]+input()+[0,0]]
z=zip(*[[i-min(t)for i in t]for t in l[::2],l[1::2]])
print sum(map(int.__mul__,*map(lambda i,c:D.Draw(i).polygon(c,1)or i.getdata(),map(I.new,'11',[[max(l)-min(l)]*2]*2),[z[:3],z[3:]])))/1e6

ลองออนไลน์! หรือลองกรณีทดสอบทั้งหมด

ในการคำนวณความแตกต่างนี้จะวาดรูปสามเหลี่ยมอย่างแท้จริงและตรวจสอบจำนวนพิกเซลที่วาดในทั้งสองภาพ
วิธีนี้แทรกข้อผิดพลาดในการปัดเศษซึ่งถูกทำให้อ่อนลงโดยการเพิ่มขนาดรูปภาพ

คำอธิบาย

#the image/triangles are enlarged to increase the precision
#a pair of zeros are inserted in the start and at the end, this way "l" will have all 6 points to draw the triangles 
l=[i*1000for i in[0,0]+input()+[0,0]]
#split the input in x and y, where x=l[::2] and y=l[1::2]
#get the smallest number on each list, that will be "0" if there is no negative number, to be used as offset.
#this will be used to overcome the fact that PIL won't draw on negative coords
#zip "x" and "y" lists, to create a list containing the points
z=zip(*[[i-min(t)for i in t]for t in x,y])
#create 2 (B&W) blank images
#where the size is the difference between the smallest and the largest coord.
map(I.new,'11',[[max(l)-min(l)]*2]*2)
#draw both triangles and return the pixel list of each image
map(lambda i,c:D.Draw(i).polygon(c,1)or i.getdata(),<result of previous line>,[z[:3],z[3:]])
#count the amount of overlapping pixels by summing the color of each pixel, if the pixel is "1" in both images, then the triangles are overlapping, then the amount of pixels is divided by the initial enlarging factor squared (1e6)
print sum(map(int.__mul__,*<result of previous line>))/1e6
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.