Die Schwierigkeit, Pizza mit Freunden zu teilen, besteht darin, dass es schwierig ist, sicherzustellen, dass jeder die gleiche Menge Peperoni auf seinem Stück bekommt. Ihre Aufgabe ist es also, zu entscheiden, wie Sie eine Pizza fair in Scheiben schneiden, damit alle glücklich sind.
Richtungen
Schreiben Sie ein Programm, das anhand einer Liste der Positionen von Pepperonis auf einer runden Pizza und der Anzahl der zu schneidenden Scheiben eine Liste der Winkel ausgibt, unter denen die Pizza geschnitten werden sollte, sodass auf jeder Scheibe die gleiche Menge von Pepperonis liegt es.
- Die Pizza hat nur einen Belag: Peperoni.
- Ihre Freunde kümmern sich nicht um die Größe ihrer Scheibe, nur dass sie nicht um irgendwelche Peperoni betrogen werden.
- Die Pizza ist ein auf den Ursprung zentrierter Kreis
(0, 0)
mit einem Radius von1
. - Die Pepperonis sind Kreise, die dort zentriert sind, wo die Eingabe angibt, dass sie zentriert sind und einen Radius von haben
0.1
- Nehmen Sie die Eingabe als Ganzzahl , die die Anzahl der zu erstellenden Schnitte und eine Liste der geordneten Paare darstellt , die die Positionen der Pepperonis auf einem kartesischen Koordinatensystem darstellen. (In jedem vernünftigen Format)
- Die Ausgabe sollte eine Liste von Winkeln im Bogenmaß sein , die die Positionen der "Schnitte" zur Pizza (im Bereich
0 <= a < 2pi
) darstellen. (In jedem vernünftigen Format) (Präzision sollte mindestens sein+/- 1e-5
.) - Sie können teilweise Stücke einer Peperoni auf einer Scheibe haben (z. B. wenn eine Pizza eine Peperoni hat und diese von 10 Personen geteilt werden muss, schneiden Sie die Pizza zehnmal durch, wobei alle Schnitte durch die Peperoni schneiden. Aber stellen Sie sicher, dass sie fair sind !)
- Eine geschnittene Dose kann (muss) mehrere Pepperonis in Scheiben schneiden.
- Pepperonis kann sich überlappen.
Beispiele
Eingang:
8 people, pepperonis: (0.4, 0.2), (-0.3, 0.1), (-0.022, -0.5), (0.3, -0.32)
Mögliche gültige Ausgabe:
slices at:
0, 0.46365, 0.68916, 2.81984, 3.14159, 4.66842, 4.86957, 5.46554
Hier ist eine Visualisierung dieses Beispiels (jeder bekommt eine halbe Peperoni):
Mehr Beispiele:
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
Wertung
Das ist Code-Golf , also gewinnt die geringste Anzahl von Bytes.
Antworten:
Mathematica, 221 Bytes
Ungolfed:
Dies definiert eine Funktion, die als Parameter die Anzahl der Schnitte und eine Liste von Paaren für die Peperoni-Koordinaten verwendet, wie z
Die Slices werden auf der Konsole gedruckt, während sie die Pizza durchlaufen.
Bei den meisten Pizzas ist dies ziemlich langsam, da ich (um die erforderliche Präzision zu erreichen) den Pepperoni-Bereich von 0 bis 2π in Schritten von 1e-5 integriere. Um in angemessener Zeit ein etwas ungenaueres Ergebnis zu erhalten, können Sie das
1.*^-5
am Ende auf ändern1.*^-3
.Wie es funktioniert
Die Idee ist, die Pizzastücke auszuräumen und dabei über die Fläche der bedeckten Peperoni-Stücke zu integrieren. Immer wenn dieser Bereich die erforderliche Menge an Peperoni pro Person erreicht, melden wir den aktuellen Winkel und setzen den Bereichszähler zurück.
Um die überstrichene Peperoni-Fläche zu erhalten, schneiden wir die Linie mit der Peperoni und geben die beiden Abstände vom Ursprung an, in denen sich die Linie mit der Peperoni schneidet. Da eine Linie in beiden Richtungen unendlich verläuft, müssen diese Abstände auf nicht negative Werte geklemmt werden. Dies löst zwei Probleme:
Ich werde später einige Diagramme hinzufügen.
quelle
[8, {{0.4, 0.2}, {-0.3, 0.1}, {-0.022, -0.5}, {0.3, -0.32}}]
)