Le problème de la fin heureuse (en fait un théorème) déclare que
Tout ensemble de cinq points dans le plan en position générale a un sous-ensemble de quatre points qui forment les sommets d'un quadrilatère convexe.
Le problème a été ainsi nommé par Paul Erdős lorsque deux mathématiciens qui ont d'abord travaillé sur le problème, Ester Klein et George Szekeres, se sont fiancés puis se sont mariés.
Clarifications:
- La position générale ici signifie qu'il n'y a pas trois points colinéaires.
Le quadrilatère formé par les quatre sommets sera toujours considéré comme non intersecté, quel que soit l'ordre des points. Par exemple, étant donné les quatre points
[1 1]
,[1 2]
,[2 1]
,[2 2]
le quadrilatère visé est la place, pas le nœud papillon:Un quadrilatère sans intersection est convexe si aucun angle intérieur ne dépasse 180 degrés; ou de manière équivalente si les deux diagonales se trouvent à l'intérieur du quadrilatère.
Le défi
Étant donné 5 points avec des coordonnées entières positives, affichez 4 de ces points qui forment un quadrilatère convexe.
Règles
S'il existe plusieurs solutions (c'est-à-dire plusieurs ensembles de 4 points), vous pouvez toujours choisir de sortir l'une d'entre elles ou toutes.
Les formats d'entrée et de sortie sont flexibles comme d'habitude (tableaux, listes, liste de listes, chaînes avec des séparateurs raisonnables, etc.).
Code golf, le moins d'octets gagne.
Cas de test
Contribution:
[6 8] [1 10] [6 6] [5 9] [8 10]
Il n'y a qu'une seule sortie possible:
[6 8] [1 10] [6 6] [5 9]
Contribution:
[3 8] [7 5] [6 9] [7 8] [5 1]
Il existe cinq solutions:
[3 8] [7 5] [6 9] [7 8] [3 8] [7 5] [6 9] [5 1] [3 8] [7 5] [7 8] [5 1] [3 8] [6 9] [7 8] [5 1] [7 5] [6 9] [7 8] [5 1]
Contribution:
[4 8] [1 9] [9 9] [10 2] [1 6]
Il existe trois solutions:
[4 8] [1 9] [10 2] [1 6] [4 8] [9 9] [10 2] [1 6] [1 9] [9 9] [10 2] [1 6]
Pour illustrer, voici les trois solutions à ce cas:
Réponses:
CJam,
373432 octetsJe ne sais pas si
:-V
c'est assez heureux, mais comme le souligne K Zhang, il y a le=}
à la fin. :)Cela n'imprime qu'une seule solution car la suppression des doublons serait plus coûteuse.
Testez-le ici.
Explication
L'idée est assez simple. Nous générons tous les quadrilatères possibles (y compris tous les ordres des points) et sélectionnons ensuite les convexes. Nous testons la convexité en examinant chaque paire d'arêtes et en vérifiant qu'elles tournent toutes dans la même direction.
Le sens de rotation peut être obtenu assez facilement à partir d'un produit scalaire. Si vous prenez les trois points consécutifs sur un quadrilatère, et tracez des lignes du premier au deuxième et du premier au troisième, puis projetez ce dernier sur la perpendiculaire du premier ... vous obtenez un nombre dont le signe vous indique que ces trois points tournent à gauche ou à droite. (Je devrais probablement ajouter un diagramme pour cela.) Cette "projection sur la perpendiculaire" semble assez impliquée, mais signifie simplement que nous inversons l'un des deux vecteurs et soustrayons les composants après la multiplication au lieu de les ajouter. Voici donc le code ...
la source
!}
pourrait aussi être considéré comme un clin d'oeilMATLAB, 67 octets
L'entrée se présente sous la forme d'une matrice 2D où les colonnes sont respectivement X et Y:
Tous les ensembles de 4 points qui créent des quadrilatères convexes sont affichés dans le même format.
Voici une démo légèrement modifiée pour fonctionner avec Octave
Explication
Cette solution prend tous les sous-ensembles de 4 points d'entrée (l'ordre n'a pas d'importance). Pour ce faire, nous créons la matrice d'identité et nier:
~eye(5)
. Nous parcourons les colonnes de cette matrice etk
(l'index de boucle) est un tableau logique qui spécifie lequel des 4 points à considérer. Nous l'utilisons ensuite pour saisir ces 4 points XY de l'entrée (I(k,:)
).Nous calculons ensuite la coque convexe de ces 4 points (
convhull
). La sortie deconvhull
est les indices de l'entrée qui correspondent aux points qui composent la coque convexe (avec le premier index dupliqué pour fermer la coque).Pour un quadrilatère convexe, les quatre points feront partie de la coque convexe des mêmes points (
nnz(convhull(points)) > 4
). Si nous détectons que c'est le cas, nous affichons les points qui ont été utilisés pour cette itération particulière.la source
Javascript (ES6),
306293283 octetsExplication :
La fonction
c
calcule le produit croisé du vecteur entre 3 points adjacents du polygone et renvoie 1 s'il est positif et 0 sinon (remarque: le produit croisé ne peut pas être nul car les points ne peuvent pas être colinéaires).La fonction
k
etj
génère toutes les permutations cycliques (en ignorant l'inversion de l'ordre) du tableau d'entrée.La fonction «i» est alors appelée pour chaque permutation cyclique pour calculer la somme de la fonction
c
pour chacun des 4 triplets de coordonnées adjacentes. Si les produits croisés ont tous le même signe, ils seront tous soit 0 ou 1 et totaux à 0 (modulo 4) et le polygone est concave et est poussé dans le tableau de sortie. Si un triplet a un signe différent, le total sera non nul (modulo 4) et le polygone sera convexe.La fonction
f
est utilisée pour initialiser le tableau de sortie, puis appeler les fonctions ci-dessus avant de renvoyer la sortie.Tests :
Modifier :
Peut également gérer des points colinéaires en utilisant la version originale et en changeant les deux premières lignes en:
Cependant, comme ce cas est spécifiquement exclu dans la question, les caractères supplémentaires ne sont pas nécessaires.
la source
Mathematica
10596 octetsSelect[#~Subsets~{4},f@#&]&
sélectionne, dans une liste de (5) points, les sous-ensembles de 4 points qui satisfontf
.f
est satisfaite lorsque chaque point, sur les 4 points d'un set, repose sur leRegionBoundary
desConvexHull
4 points.Cas de test
1. Regardons les 5 coques convexes de sous-ensembles (chacun de 4 points) de {{6, 8}, {1, 10}, {6, 6}, {5, 9}, {8, 10}} .
{{{6, 8}, {1, 10}, {6, 6}, {5, 9}}}
{{6, 8}, {1, 10}, {6, 6}, {5, 9}} est la seule solution; chacun des quatre points sert de sommet de la coque convexe (des mêmes 4 points).
{{6, 8}, {1, 10}, {6, 6}, {8, 10}} n'est pas une solution; la coque convexe n'a que 3 sommets. {6, 8} se trouve dans la coque.
Les sous-ensembles restants ne sont pas non plus des solutions:
2. {{4, 8}, {1, 9}, {9, 9}, {10, 2}, {1, 6}} propose trois solutions.
{
{{4, 8}, {1, 9}, {10, 2}, {1, 6}},
{{4, 8}, {9, 9}, {10, 2}, {1, 6 }},
{{1, 9}, {9, 9}, {10, 2}, {1, 6}}
}
3. {{3, 8}, {7, 5}, {6, 9}, {7, 8}, {5, 1}} propose 5 solutions.
{
{{3, 8}, {7, 5}, {6, 9}, {7, 8}},
{{3, 8}, {7, 5}, {6, 9}, {5, 1 }},
{{3, 8}, {7, 5}, {7, 8}, {5, 1}},
{{3, 8}, {6, 9}, {7, 8}, {5 , 1}},
{{7, 5}, {6, 9}, {7, 8}, {5, 1}}
}
Notez que chacun des cinq points se trouve à la limite de la coque convexe de tous les points.
Si l'un des points est supprimé, les 4 points restants seront chacun des sommets de la coque convexe réduite.
la source