Contexte
Je veux construire une clôture. Pour cela, j'ai rassemblé un tas de poteaux et les ai collés au sol. J'ai également rassemblé beaucoup de planches que je clouerai aux poteaux pour faire la clôture réelle. J'ai tendance à m'emporter lors de la construction de trucs, et je vais probablement continuer à clouer les planches aux poteaux jusqu'à ce qu'il n'y ait plus de place pour les mettre. Je veux que vous énumériez les clôtures possibles avec lesquelles je peux me retrouver.
Contribution
Votre entrée est une liste de coordonnées entières bidimensionnelles représentant les positions des pôles, dans n'importe quel format pratique. Vous pouvez supposer qu'il ne contient aucun doublon, mais vous ne pouvez rien supposer de son ordre.
Les planches sont représentées par des lignes droites entre les pôles, et pour simplifier, nous ne considérons que les planches horizontales et verticales. Deux poteaux peuvent être joints par une planche s'il n'y a pas d'autres poteaux ou planches entre eux, ce qui signifie que les planches ne peuvent pas se croiser. Un arrangement de poteaux et de panneaux est maximal si aucun nouveau panneau ne peut y être ajouté (de manière équivalente, il y a un poteau ou un panneau entre deux poteaux alignés horizontalement ou verticalement).
Production
Votre sortie est le nombre d'arrangements maximaux qui peuvent être construits à l'aide des pôles.
Exemple
Considérez la liste d'entrée
[(3,0),(1,1),(0,2),(-1,1),(-2,0),(-1,-1),(0,-2),(1,-1)]
Vu de dessus, l'agencement correspondant des poteaux ressemble à ceci:
o
o o
o o
o o
o
Il existe exactement trois dispositions maximales qui peuvent être construites à l'aide de ces pôles:
o o o
o-o o|o o-o
o----o o||| o o| | o
o-o o|o o-o
o o o
Ainsi, la sortie correcte est 3
.
Règles
Vous pouvez écrire soit une fonction soit un programme complet. Le nombre d'octets le plus bas l'emporte et les failles standard sont interdites.
Cas de test
[] -> 1
[(0,0),(1,1),(2,2)] -> 1
[(0,0),(1,0),(2,0)] -> 1
[(0,0),(0,1),(1,0),(1,1)] -> 1
[(1,0),(0,1),(-1,0),(0,-1)] -> 2
[(3,0),(1,1),(0,2),(-1,1),(-2,0),(-1,-1),(0,-2),(1,-1)] -> 3
[(0,0),(4,0),(1,1),(1,-2),(3,1),(3,-2),(2,-1),(4,-1)] -> 3
[(0,0),(4,0),(1,1),(1,-2),(3,1),(3,-2),(2,-1),(4,-1),(0,-1)] -> 4
[(0,0),(4,0),(1,1),(1,-2),(3,1),(3,-2),(2,-1),(0,-1),(2,2)] -> 5
[(0,0),(4,0),(1,1),(1,-2),(3,1),(3,-2),(2,-1),(4,-1),(0,-1),(2,2)] -> 8
(0,-2)
bonne prise. En train de changer maintenant.Réponses:
Mathematica, 301 octets
Il s'agit d'une fonction sans nom qui prend les coordonnées comme imbriquées
List
et renvoie un entier. Autrement dit, vous pouvez soit lui donner un nom et l'appeler, ou simplement ajouterAvec retrait:
Je ne peux même pas commencer à exprimer à quel point cette implémentation est naïve ... elle ne pourrait certainement pas être plus brutale ...
o--o--o
ne donne que deux clôtures au lieu de trois).Étonnamment, il résout tous les cas de test presque immédiatement.
Une astuce vraiment intéressante que j'ai découverte pour cela est l'utilisation de
Orderless
pour réduire le nombre de motifs que je dois faire correspondre. Essentiellement, lorsque je veux abandonner des ensembles de clôtures avec des clôtures croisées, je dois trouver une paire de clôture verticale et horizontale et vérifier leur état. Mais je ne sais pas dans quel ordre ils apparaîtront. Comme les modèles de liste dépendent normalement de l'ordre, cela entraînerait deux modèles très longs. Donc, au lieu de cela, je remplace par la liste environnante par une fonctiont
avect @@@
- qui n'est pas définie de sorte qu'elle est maintenue telle quelle. Mais cette fonction estOrderless
, donc je peux juste vérifier un seul ordre dans le motif, et Mathematica le vérifiera par rapport à toutes les permutations. Ensuite, j'ai remis les listes en place avecList @@@
.Je souhaite qu'il y ait un intégré qui est a)
Orderless
, b) pasListable
et c) non défini pour 0 arguments ou arguments de liste. Ensuite, je pourrais remplacert
par cela. Mais il ne semble pas y avoir un tel opérateur.la source
Haskell, 318 octets
Utilisation:
p [(1,0),(0,1),(-1,0),(0,-1)]
. Production:2
Comment ça fonctionne:
la source