La difficulté de partager une pizza avec des amis est qu'il est difficile de s'assurer que tout le monde reçoit la même quantité de pepperoni sur sa tranche. Donc, votre tâche est de décider comment trancher une pizza de manière équitable afin que tout le monde soit heureux.
instructions
Écrivez un programme qui, étant donné une liste des positions des pepperonis sur une pizza circulaire et le nombre de tranches à faire, affiche une liste des angles sur lesquels la pizza doit être coupée afin que chaque tranche ait la même quantité de pepperoni il.
- La pizza n'a qu'une seule garniture: le pepperoni.
- Vos amis ne se soucient pas de la taille de leur tranche, juste qu'ils ne sont pas trompés de pepperoni.
- La pizza est un cercle centré sur l'origine
(0, 0)
et avec un rayon de1
. - Les pepperonis sont des cercles qui sont centrés partout où l'entrée indique qu'ils sont centrés et ont un rayon de
0.1
- Prenez l'entrée comme un entier qui représente le nombre de tranches à faire et une liste de paires ordonnées qui représentent les positions des pepperonis sur un système de coordonnées cartésiennes. (Dans tout format raisonnable)
- La sortie doit être une liste d'angles donnée en radians qui représente les positions des "coupes" de la pizza (dans la plage
0 <= a < 2pi
). (Dans tout format raisonnable) (La précision doit être d'au moins+/- 1e-5
.) - Vous pouvez avoir des morceaux partiels de pepperoni sur une tranche (par exemple. Si une pizza a un pepperoni dessus et qu'elle doit être partagée par 10 personnes, coupez la pizza dix fois, toutes les coupes tranchant à travers le pepperoni. Mais assurez-vous que c'est juste !)
- Une coupe peut (peut-être devoir) couper à travers plusieurs pepperonis.
- Pepperonis peut se chevaucher.
Exemples
Contribution:
8 people, pepperonis: (0.4, 0.2), (-0.3, 0.1), (-0.022, -0.5), (0.3, -0.32)
Sortie valide possible:
slices at:
0, 0.46365, 0.68916, 2.81984, 3.14159, 4.66842, 4.86957, 5.46554
Voici une visualisation de cet exemple (tout le monde obtient un demi-pepperoni):
Plus d'exemples:
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
Notation
Il s'agit de code-golf , donc le moins d'octets gagne.
Réponses:
Mathematica, 221 octets
Non golfé:
Ceci définit une fonction qui prend comme paramètres le nombre de tranches et une liste de paires pour les coordonnées peperoni, comme
Il imprimera les tranches sur la console pendant qu'il traverse la pizza.
Sur la plupart des pizzas, c'est assez lent, car (pour obtenir la précision requise) j'intègre la zone peperoni de 0 à 2π par pas de 1e-5. Pour obtenir un résultat légèrement moins précis dans un laps de temps raisonnable, vous pouvez remplacer le
1.*^-5
à la fin par1.*^-3
.Comment ça fonctionne
L'idée est de balayer les tranches de pizza tout en intégrant sur la zone des morceaux de peperoni couverts. Chaque fois que cette zone atteint la quantité requise de peperoni par personne, nous rapportons l'angle actuel et réinitialisons le compteur de zone.
Pour obtenir la zone de peperoni balayée, nous coupons la ligne avec le peperoni pour utiliser les deux distances depuis l'origine, où la ligne coupe avec le peperoni. Puisqu'une ligne s'étend à l'infini dans les deux directions, nous devons restreindre ces distances à des valeurs non négatives. Cela résout deux problèmes:
Je vais inclure quelques diagrammes plus tard.
la source
[8, {{0.4, 0.2}, {-0.3, 0.1}, {-0.022, -0.5}, {0.3, -0.32}}]
)