Chia sẻ pizza công bằng


13

Khó khăn trong việc chia sẻ pizza với bạn bè là khó có thể đảm bảo rằng tất cả mọi người đều nhận được cùng một lượng pepperoni trên lát của họ. Vì vậy, nhiệm vụ của bạn là quyết định làm thế nào để cắt một chiếc bánh pizza để mọi người đều vui vẻ.

Hướng

Viết một chương trình, đưa ra một danh sách các vị trí của pepperonis trên một chiếc bánh pizza hình tròn và số lát cắt được tạo ra, đưa ra một danh sách các góc mà chiếc bánh pizza nên được cắt sao cho mỗi lát có cùng một lượng pepperoni nó

  • Bánh pizza chỉ có một topping: pepperoni.
  • Bạn bè của bạn không quan tâm đến kích thước của lát cắt của họ, chỉ là họ không bị lừa bởi bất kỳ pepperoni nào.
  • Bánh pizza là một vòng tròn tập trung vào nguồn gốc (0, 0)và với bán kính là1 .
  • Pepperonis là các vòng tròn được căn giữa ở bất cứ nơi nào đầu vào nói rằng chúng nằm ở giữa và có bán kính là0.1
  • Lấy đầu vào dưới dạng một số nguyên biểu thị số lát cắt được tạo và danh sách các cặp theo thứ tự đại diện cho các vị trí của pepperonis trên hệ tọa độ cartesian. (Trong bất kỳ định dạng hợp lý)
  • Đầu ra phải là một danh sách các góc được cho bằng radian đại diện cho các vị trí của "vết cắt" đối với pizza (trong phạm vi0 <= a < 2pi ). (Trong bất kỳ định dạng hợp lý nào) (Độ chính xác phải đạt tối thiểu +/- 1e-5.)
  • Bạn có thể có một phần của pepperoni trên một lát (ví dụ: Nếu một chiếc bánh pizza có một pepperoni trên đó và nó cần được chia cho 10 người, hãy cắt pizza mười lần, tất cả các lát cắt qua pepperoni. Nhưng hãy chắc chắn rằng nó công bằng !)
  • Một vết cắt có thể (có thể phải) cắt qua nhiều pepperonis.
  • Pepperonis có thể chồng lên nhau.

Ví dụ

Đầu vào:

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

Đầu ra hợp lệ có thể:

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

Dưới đây là một hình dung của ví dụ này (mọi người đều nhận được một nửa pepperoni):

nhập mô tả hình ảnh ở đây

Ví dụ khác:

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

nhập mô tả hình ảnh ở đây

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

nhập mô tả hình ảnh ở đây

Chấm điểm

Đây là , vì vậy số byte ít nhất sẽ thắng.


Để chính xác những gì đệ trình phải tuân thủ để được coi là hợp lệ?
Rainbolt

@Rainbolt Tôi sẽ nói rằng 4 hoặc 5 chữ số thập phân là đủ. Bạn có đề nghị gì? Tôi nên thêm nó vào câu hỏi.
kukac67

Tôi không chắc chắn rằng mọi vấn đề đều có thể giải quyết được. Điều gì nếu có 7 lát và 3 pepperoni cách đều nhau?
Nathan Merrill

1
@NathanMerrill Sau đó, mọi người sẽ nhận được 3/7 một pepperoni. :) (Kích thước của các lát không quan trọng.)
kukac67 19/12/14

1
Pizza mũ thất bại. Hỏi một lần tiếp theo dễ dàng hơn. ;)
Ilmari Karonen

Câu trả lời:


7

Toán học, 221 byte

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]])&

Ung dung:

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]
   ]
) &

Điều này xác định một hàm lấy tham số số lát và danh sách các cặp cho tọa độ peperoni, như

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

Nó sẽ in các lát lên bàn điều khiển khi nó đi ngang qua pizza.

Trên hầu hết các loại pizza, điều này khá chậm, bởi vì (để đạt được độ chính xác cần thiết) tôi đang tích hợp vùng peperoni từ 0 đến 2π theo các bước của 1e-5. Để có được kết quả ít chính xác hơn trong một khoảng thời gian hợp lý, bạn có thể thay đổi 1.*^-5ở cuối 1.*^-3.

Làm thế nào nó hoạt động

Ý tưởng là quét các lát bánh pizza trong khi tích hợp trên khu vực của các miếng peperoni được bao phủ. Bất cứ khi nào khu vực đó đạt được lượng peperoni cần thiết cho mỗi người, chúng tôi sẽ báo cáo góc hiện tại và đặt lại bộ đếm khu vực.

Để có được diện tích peperoni bị quét ra, chúng ta giao cắt đường với peperoni để sử dụng hai khoảng cách từ điểm gốc, nơi đường giao nhau với peperoni. Vì một đường kéo dài đến vô tận theo cả hai hướng, chúng ta cần kẹp các khoảng cách này với các giá trị không âm. Điều này giải quyết hai vấn đề:

  • Đếm các giao điểm với mỗi peperoni hai lần, một lần dương và một lần âm (sẽ thực sự mang lại tổng diện tích bằng 0).
  • Chỉ đếm những miếng nêm của những miếng peperoni trong đó có nguồn gốc.

Tôi sẽ bao gồm một số sơ đồ sau.


Vâng. Đây là kế hoạch tấn công của tôi. Ít nhất tôi có thể dễ dàng làm ví dụ hơn bây giờ! : D
kukac67

Tôi nhận thấy rằng việc thực hiện của bạn đôi khi tạo ra một góc bổ sung sẽ tạo ra một lát cắt bổ sung mà không có pepperoni trên đó. (ví dụ với đầu vào [8, {{0.4, 0.2}, {-0.3, 0.1}, {-0.022, -0.5}, {0.3, -0.32}}]:)
kukac67

@ kukac67 cố định.
Martin Ender
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.