Ce défi consiste à trouver le plus petit disque contenant des points donnés. Ceci est rendu quelque peu plus délicat, cependant, par le fait que dans ce défi, les coordonnées et le rayon du disque doivent tous deux être des entiers.
Votre entrée sera une liste de points avec des coordonnées entières x
et y
. Vous pouvez prendre cela comme une liste de tuples, une liste de listes ou toute autre manière de représenter une collection de paires. x
et y
seront tous deux (éventuellement négatifs) des entiers. Chaque point est garanti unique et il y aura au moins un point.
Votre sortie sera un disque sous la forme de trois numéros, X
, Y
, et R
. X
,, Y
et R
sont tous des entiers, X
et Y
représentent le centre du disque et R
son rayon. La distance entre chaque point donné et le centre doit être inférieure ou égale à R
, et il ne doit pas exister un tel disque avec un plus petit R
qui remplisse également cette condition.
Il est possible qu'il y ait plusieurs solutions possibles pour une entrée donnée, votre code doit en sortir au moins une dans ce cas.
Vous pouvez utiliser n'importe quel type de géométrie intégré dans votre langage s'il en existe, et l'entrée / sortie peut se faire via des objets point / disque intégrés au lieu de simples nombres.
Cas de test
Input (Possible) Output(s)
(x,y) (X,Y,R)
-------------------------
(0,0) (0,0,0)
-------------------------
(0,1) (0,0,1)
(1,0) (1,1,1)
-------------------------
(1,4) (4,4,3)
(3,2)
(4,1)
(4,5)
(5,2)
(7,4)
-------------------------
(-1,0) (0,0,2)
(2,0) (1,0,2)
-------------------------
(-1,0) (1,0,2)
(2,1) (0,1,2)
-------------------------
(0,0) (1,0,1)
(1,1) (0,1,1)
Le moins d'octets gagne.
Réponses:
Gelée ,
252422212018 octetsMerci à @EriktheOutgolfer de m'avoir informé de la
)
sauvegarde de 1 octet.Merci à @Dennis d'avoir économisé 2 octets.
Essayez-le en ligne!
Explication
la source
€
?Brachylog v2, 19 octets
Essayez-le en ligne!
Ce programme était facile à écrire - Brachylog est presque parfait pour ce genre de problème - mais difficile à jouer au golf. Cela ne me surprendrait pas si un octet était enregistré quelque part ici, car peu de choses que j'ai faites semblaient avoir un effet (et il contient des instructions de carte imbriquées, normalement un signe que vous devriez utiliser member / findall, mais je ne peux pas voir un moyen de le faire).
Ceci est une soumission de fonction. L'entrée est de l'argument gauche à la fonction dans le format
[[x,y],[x,y],…]
, sortie de l'argument droit dans le formulaire[r,[[x,y]]]
. (Si vous voulez essayer des nombres négatifs dans l'entrée, notez que Brachylog utilise_
pour le signe moins, non-
. C'est déroutant car la fonction → le wrapper de programme complet fourni avec Brachylog, demandé à l'aide de l'argument de ligne de commandeZ
, présentera des nombres négatifs dans la sortie avec un signe moins régulier.)Explication
Ceci est intéressant dans la mesure où nous demandons à Brachylog de trouver une valeur de certaines propriétés (dans ce cas, le rayon d'un disque centré au point
A
qui correspond à tous les points d'entrée), mais nous n'y plaçons pratiquement aucune exigence (tout ce dont nous avons besoin est que le rayon est un nombre). Cependant, Brachylog calculera en interne le rayon en question de manière symbolique plutôt que d'essayer d'utiliser des nombres concrets, donc lorsque la finale≜
est atteinte, il accomplit deux choses à la fois: tout d'abord, il garantit que seuls des entiers sont utilisés pour les coordonnées deA
et pour le rayon (forçant le rayon carré à être un nombre carré, et expliquant l'utilisation de≤ᵛ
pour trouver un "maximum ou plus"); deuxièmement, il trouve le plus petit rayon viable possible (car le rayon vient en premier dans la sortie).Une chose qui n'est pas du tout spécifiée dans le programme est que tous les points sont mesurés par rapport au même centre d'un disque; comme écrit, il n'y a aucune contrainte que nous n'utilisons pas un centre différent pour chaque point. Cependant, l'ordre de départage (qui dans ce cas est défini par le troisième
ᵐ
, et qui en tant que contrainte de structure sera évalué avant la contrainte de valeur impliquée par≜
) veutA
être aussi court que possible (c'est-à-dire un seul élément, nous utilisons donc le même centre à chaque fois; il essaie d'abord une longueur nulleA
mais cela ne fonctionne évidemment pas, il essaie donc une liste singleton ensuite). En conséquence, nous finissons par obtenir une contrainte utile (que nous n'avons qu'un seul disque) "gratuitement".Cette solution arrive à généraliser à n'importe quel nombre de dimensions , sans aucune modification du code source; il n'y a pas d'hypothèse ici que les choses sont bidimensionnelles. Donc, si vous avez besoin de la plus petite sphère entière, vous pouvez aussi l'avoir.
la source
Perl 6 , 81 octets
Essayez-le en ligne!
Prend une liste de points sous forme de listes à 2 éléments
((X1, Y1), (X2, Y2), ...)
. Renvoie une liste(R, (X, Y))
. Utilise la même approche que la réponse Jelly de Pietu1998:La
minmax
méthode est utile ici car elle renvoie aRange
. Le produit cartésien des plages donne directement tous les points avec des coordonnées entières.la source
05AB1E , 26 octets
Réponse de Jelly du port de @ Pietu1998 .
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
la source
Matlab, 73 octets
Trouvez simplement la plus petite solution (virgule flottante) et arrondissez au point le plus proche et plafonnez le rayon (pire cas pour le problème minimax). Je ne sais pas avec certitude si cela donne la solution correcte pour tous les cas possibles (dans la précision), mais pour les cas de test, cela devrait fonctionner (si je n'ai pas fait d'erreur de frappe).
Appelez-le avec
la source
fminimax
Pyth ,
3433 octetsLa sortie est sous la forme
[R,x,y]
Essayez-le en ligne ici ou vérifiez tous les cas de test en même temps ici .
Edit: enregistrement d'un octet en réorganisant le format de sortie, version précédente:
heDm+d.EeSm@s^R2-Vdk2Q*Fm}FhM_BSdC
la source
Wolfram Language (Mathematica) , 66 octets
Voici une approche par force brute. J'ai considéré la
BoundingRegion[#,"MinDisk"]&
fonction beaucoup plus courte mais il n'y a aucun moyen de forcer les coordonnées entières et le rayon.Essayez-le en ligne!
la source
{Round@#[[1]], Ceiling@#[[2]]} &@BoundingRegion[#, "MinDisk"]&
?Java 10,
283279277257 octets-20 octets grâce à @nwellnhof la pointe de » l' utilisation
Math.hypot
.Le tableau de résultats est dans l'ordre
[R,X,Y]
.Essayez-le en ligne.
Explication:
la source
Math.hypot
.Math.hypot
, ce qui est parfait pour ce défi! -20 octets juste là. Merci. :)Javascript, 245 octets
Version (un peu) plus lisible:
Recherche simplement la boîte englobante et teste chaque coordonnée dans cette boîte pour savoir si elle est la meilleure.
Je pourrais économiser 8 octets avec une réponse approximative, en remplaçant:
Math.ceil(Math.sqrt(n[2]))
avec~~(n[2]+1-1e-9)
la source
for(f=c;f<b;f++){for(g=e;g<d;g++){s=a.reduce((o,[p,q])=>o>(r=(p-f)**2+(q-g)**2)?o:r);n=n?n[2]>s?[f,g,s]:n:[f,g,s]}}
au golffor(f=c;f<b;f++)for(g=e;g<d;n=n?n[2]>s?[f,g,s]:n:[f,g,s],g++)s=a.reduce((o,[p,q])=>o>(r=(p-f)**2+(q-g)**2)?o:r);
. Et je suis sûr que vous pouvez supprimer l'espace àreturn[
.Math.hypot
.Rubis , 113 octets
Essayez-le en ligne!
la source
Fusain , 65 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:
Obtenez les coordonnées y
z
.Obtenez les coordonnées x dans
h
.Boucle sur les plages inclusives des minimums aux maximums de
h
etz
générer la liste de tous les centres de disques potentiels.En boucle sur tous les centres du disque, puis en boucle sur tous les points d'origine, puis en boucle sur les deux coordonnées, soustrayez, placez, additionnez, prenez le maximum et enregistrez la liste résultante.
Trouvez la position du diamètre maximal minimal et imprimez le centre du disque correspondant.
Imprimez le diamètre maximal minimal, mais arrondissez-le au nombre entier suivant.
la source