แบ่งปันพิซซ่าอย่างเป็นธรรม


13

ความยากลำบากในการแบ่งปันพิซซ่ากับเพื่อน ๆ เป็นเรื่องยากที่จะตรวจสอบให้แน่ใจว่าทุกคนได้รับเป็ปเปอโรนีในปริมาณที่เท่ากัน ดังนั้นงานของคุณคือการตัดสินใจว่าจะหั่นพิซซ่าอย่างเป็นธรรมเพื่อให้ทุกคนมีความสุข

คำสั่ง

เขียนโปรแกรมที่ให้รายชื่อตำแหน่งของเป็ปโปนิสบนพิซซ่าวงกลมและจำนวนชิ้นที่จะทำออกรายการของมุมที่ควรตัดพิซซ่าเพื่อให้แต่ละชิ้นมีเป็ปเปอร์โรนีจำนวนเท่ากัน มัน.

  • พิซซ่ามีเพียงหน้าเดียว: เป็ปเปอร์โรนี
  • เพื่อนของคุณไม่สนใจขนาดของชิ้นส่วนของพวกเขาเพียง แต่พวกเขาจะไม่ถูกหลอกจากเป็ปเปอร์โรนี
  • พิซซ่าเป็นวงกลมมีศูนย์กลางอยู่ที่จุดเริ่มต้น(0, 0)และมีรัศมีของ1
  • เป็ปเปอร์นิสเป็นวงกลมที่มีศูนย์กลางอยู่ที่ใดก็ตามที่อินพุตบอกว่าพวกเขาอยู่กึ่งกลางและมีรัศมี0.1
  • นำเข้าเป็นจำนวนเต็มที่แสดงจำนวนชิ้นที่จะทำและรายการของคู่สั่งที่แสดงถึงตำแหน่งของพริกไทยในระบบพิกัดคาร์ทีเซียน (ในรูปแบบที่เหมาะสม)
  • ผลลัพธ์ควรเป็นรายการของมุมที่ระบุในเรเดียนซึ่งแสดงถึงตำแหน่งของ "การตัด" กับพิซซ่า (ในช่วง0 <= a < 2pi ) (ในรูปแบบที่เหมาะสม) (ความแม่นยำควรเป็นอย่างน้อย+/- 1e-5)
  • คุณสามารถมีเป็ปเปอร์โรนีบางส่วนบนชิ้น (เช่นถ้าพิซซ่ามีเป็ปเปอร์โรนี่หนึ่งชิ้นและต้องแบ่งให้คน 10 คนตัดพิซซ่าสิบครั้งตัดทั้งหมดหั่นผ่านเป็ปเปอร์โรนี !)
  • สามารถตัด (อาจต้อง) ชิ้นผ่านพริกไทยหลาย
  • Pepperonis อาจทับซ้อนกัน

ตัวอย่าง

การป้อนข้อมูล:

8 people, pepperonis: (0.4, 0.2), (-0.3, 0.1), (-0.022, -0.5), (0.3, -0.32)

เอาต์พุตที่ใช้ได้:

slices at:
0, 0.46365, 0.68916, 2.81984, 3.14159, 4.66842, 4.86957, 5.46554

นี่คือภาพประกอบของตัวอย่างนี้ (ทุกคนได้รับเป็ปเปอร์โรนี่ครึ่งหนึ่ง):

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

ตัวอย่างเพิ่มเติม:

Input: 9 people, 1 pepperoni at: (0.03, 0.01)
Output: 0, 0.4065, 0.8222, 1.29988, 1.94749, 3.03869, 4.42503, 5.28428, 5.83985

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

Input: 5, (0.4, 0.3), (0.45, 0.43), (-0.5, -0.04)
Output: 0, 0.64751, 0.73928, 0.84206, 3.18997

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

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

นี่คือดังนั้นจำนวนไบต์น้อยที่สุดจึงจะชนะ


การส่งผลงานที่ถูกต้องจะต้องมีความแม่นยำเท่าใด?
Rainbolt

@Rainbolt ฉันจะบอกว่า 4 หรือ 5 ตำแหน่งทศนิยมควรจะเพียงพอ คุณแนะนำอะไร? ฉันควรเพิ่มเข้าไปในคำถาม
kukac67

ฉันไม่แน่ใจว่าปัญหาทุกอย่างสามารถแก้ไขได้ เกิดอะไรขึ้นถ้ามี 7 ชิ้นและ 3 เป็ปเปอโรนีเว้นระยะเท่ากัน?
นาธานเมอร์ริลล์

1
@NathanMerrill จากนั้นทุกคนจะได้รับเปปเปอโรนี 3/7 :) (ขนาดของสไลซ์ไม่สำคัญ)
kukac67

1
การพยายามสวมหมวกพิซซ่าล้มเหลว ขอให้ง่ายขึ้นในครั้งต่อไป ;)
Ilmari Karonen

คำตอบ:


7

Mathematica ขนาด 221 ไบต์

f=(A=Pi.01Length@#2/#;l=m/.Solve[Norm[{a,b}-m{Cos@t,Sin@t}]==.1,m];k=(l/.{a->#,b->#2})&@@@#2;d=1.*^-5;For[Print[h=B=0];n=1,n<#,h+=d,(B+=If[Im@#<0,0,d(Max[#2,0]^2-Max[#,0]^2)/2])&@@@(k/.{t->h});If[B>A,n+=1;Print@h;B-=A]])&

Ungolfed:

f = (
   A = Pi .01 Length@#2/#;
   l = m /. Solve[Norm[{a, b} - m {Cos@t, Sin@t}] == .1, m];
   k = (l /. {a -> #, b -> #2}) & @@@ #2;
   d = 1.*^-5;
   For[Print[h = B = 0]; n = 1, n < #, h += d,
    (
      B += If[Im@# < 0, 0, d (Max[#2, 0]^2 - Max[#, 0]^2)/2]
    ) & @@@ (k /. {t -> h});
    If[B > A, n += 1; Print@h; B -= A]
   ]
) &

สิ่งนี้จะกำหนดฟังก์ชั่นซึ่งรับพารามิเตอร์เป็นจำนวนชิ้นและรายการคู่สำหรับพิกัด peperoni เช่น

f[8, {{0.4, 0.2}, {-0.3, 0.1}, {-0.022, -0.5}, {0.3, -0.32}}]

มันจะพิมพ์ส่วนต่าง ๆ ไปที่คอนโซลในขณะที่มันเข้าไปในพิซซ่า

ในพิซซ่าส่วนใหญ่มันค่อนข้างช้าเพราะ (เพื่อให้ได้ความแม่นยำที่ต้องการ) ฉันกำลังรวมพื้นที่ peperoni ตั้งแต่ 0 ถึง2πในขั้นตอนที่ 1e-5 เพื่อให้ได้ผลเล็กน้อยแม่นยำน้อยลงในจำนวนที่เหมาะสมของเวลาที่คุณสามารถเปลี่ยนด้านท้ายที่จะ1.*^-51.*^-3

มันทำงานอย่างไร

แนวคิดก็คือการกวาดพิซซ่าออกไปในขณะที่รวมเอาชิ้นส่วนของเปปเปอร์โร่ที่ครอบคลุม เมื่อใดก็ตามที่พื้นที่นั้นพบจำนวน peperoni ต่อคนเราจะรายงานมุมปัจจุบันและรีเซ็ตตัวนับพื้นที่

เพื่อให้ได้พื้นที่ peperoni กวาดออกเราจะตัดเส้นกับ peperoni เพื่อให้ใช้สองระยะทางจากจุดกำเนิดที่เส้นตัดกับ peperoni เนื่องจากเส้นขยายไปถึงอินฟินิตี้ทั้งสองทิศทางเราจำเป็นต้องยึดระยะทางเหล่านี้เป็นค่าที่ไม่เป็นลบ วิธีนี้ช่วยแก้ปัญหาสองข้อ:

  • นับการแยกกับแต่ละ peperoni สองครั้งหนึ่งครั้งเป็นบวกและลบครั้งเดียว (ซึ่งจริง ๆ แล้วจะส่งผลให้พื้นที่โดยรวมของ 0)
  • การนับเวดจ์เฉพาะชิ้น peperoni ซึ่งรวมอยู่ในแหล่งกำเนิด

ฉันจะรวมไดอะแกรมในภายหลัง


อ๋อ นี่คือแผนการโจมตีของฉัน อย่างน้อยฉันก็สามารถทำตัวอย่างได้ง่ายขึ้นในตอนนี้! : D
kukac67

ฉันสังเกตเห็นว่าบางครั้งการใช้งานของคุณจะส่งมุมพิเศษหนึ่งมุมซึ่งจะสร้างชิ้นส่วนเพิ่มเติมโดยไม่มีเป็ปเปอร์โรนีอยู่ (ตัวอย่างเช่นมีการป้อนข้อมูล: [8, {{0.4, 0.2}, {-0.3, 0.1}, {-0.022, -0.5}, {0.3, -0.32}}])
kukac67

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