Les moules visqueux peuvent compter!

10

Contexte

Les moules visqueux sont impressionnants. Si vous les placez sur une surface avec des sources de nourriture, ils étaleront leurs vrilles pour trouver la nourriture, après quoi ils formeront un réseau de connexions entre les sources. Dans ce défi, vous simulerez un moule visqueux à la recherche de nourriture. De plus, ce moule particulier s'arrêtera une fois qu'il sera suffisamment trouvé.

Contribution

Vos entrées doivent être une liste Lde coordonnées entières 2D dans le format natif de votre langue, et un entier non négatif N. La liste Lest garantie sans doublon, mais elle ne peut pas être triée. L'entrée Nest comprise entre 0 et la longueur de L, inclus.

La liste Lreprésente un ensemble de coordonnées pour les sources de nourriture. Par exemple, la liste

[(0,0),(2,-1),(3,1),(0,4),(5,5)]

pourrait être interprété visuellement comme

     o
o


   o
o
  o

Production

Votre sortie est une autre liste sans doublon Kde coordonnées entières 2D sur le même format que l'entrée. Il représente le réseau formé par la moisissure visqueuse et doit satisfaire aux conditions suivantes:

  • L'intersection de Let Ka exactement la taille N.
  • L'ensemble Kest connecté en tant que sous-ensemble de la grille entière (via des contiguïtés orthogonales ou diagonales).
  • Si une coordonnée de Kest supprimée, elle ne remplit plus les deux premières conditions.

Notez que si N = 0, la sortie doit être une liste vide.

Un exemple de sortie acceptable pour la liste ci-dessus Let N = 4serait

[(0,0),(0,1),(0,2),(0,3),(0,4),(1,4),(2,4),(3,3),(3,2),(3,1),(3,5),(4,5),(5,5)]

qui peut être visualisé comme

   xxO
Oxx
x  x
x  x
x  O
O
  o

où chacun Oreprésente une coordonnée dans les deux Let K, et chacun xreprésente une coordonnée dans Kmais pas dans L. D'autres sorties sont également acceptables, et les "vrilles" ne doivent pas être les plus courtes possible. Par exemple, c'est également une solution acceptable:

   xxOxx
Oxx     x
  x    x
 x    x
x  o x
O   x
  Ox 

Règles

L'entrée et la sortie doivent être des listes et non des ensembles ou d'autres types de données. Les coordonnées elles-mêmes peuvent être des listes ou des tuples. Vous pouvez modifier l'ordre des deux entrées si nécessaire.

Vous pouvez écrire soit un programme complet soit une fonction. Le nombre d'octets le plus bas gagne et les failles standard sont interdites.

Cas de test

Votre programme doit fonctionner sur ces listes pour toutes les valeurs applicables de N.

[]
[(2,3)]
[(0,0),(1,0),(0,1),(1,1)]
[(0,0),(2,-1),(3,1),(0,4),(5,5)]
[(0,0),(1,0),(2,0),(3,0),(0,3),(1,3),(2,3),(3,3)]
[(0,0),(1,0),(2,0),(3,0),(0,3),(1,3),(2,3),(3,3),(0,1),(0,2),(3,1),(3,2),(8,1),(8,2),(-5,1),(-5,2)]
[(0,0),(20,0),(15,15),(-10,4),(-10,3),(0,-5),(7,6),(7,7),(8,8),(9,8),(10,-2),(-1,12),(-3,10)]
[(0,0),(1,0),(2,0),(3,0),(5,0),(6,0),(7,0),(0,9),(1,9),(2,9),(3,8),(4,9),(5,10),(6,10),(7,9),(3,3),(4,4),(5,5)]

Visualisé:

===
o
===
oo
oo
===
     o
o     


   o  
o     
  o   
===
oooo


oooo
===
     oooo     
o    o  o    o
o    o  o    o
     oooo     
===
                         o     


         o                     

       o                       

                  oo           
                 o             
                 o             

o                              
o                              


          o                   o

                    o          


          o                    
===
     oo 
ooo o  o
   o    


     o  
    o   
   o    


oooo ooo
Zgarb
la source

Réponses:

3

CJam, 77 95 octets

Je pense que cela peut être joué un peu plus, mais voici:

q~$<_{{:X;]{[X\]z::-~mhW*}$~:Y{_)Y1{_@=X@=}:B~-g-{+__X=!\}:C~1B=!&}g{_(Y0B-g-\C0B=!&}g}*]_&}L?p

L'entrée va comme N <Array of coordinate array>. Par exemple:

4 [[0 0] [1 5] [2 1] [0 3] [5 0] [5 5]]

Production:

[[0 5] [1 5] [0 4] [0 3] [0 0] [0 2] [0 1] [1 1] [2 1]]

Algorithme :

L'algorithme est assez simple et se présente comme suit:

  • Triez le tableau de coordonnées en entrée. Cela fait que les coordonnées sont triées d'abord par ligne puis par colonne.
  • Maintenant, nous choisissons les premiers Npoints
  • Maintenant, nous réduisons sur ces Npoints. La destination est le dernier point et la source est le point de fermeture de ce dernier point.
  • Ensuite, nous commençons avec le point le plus en haut à gauche, marchons à droite (ou à gauche) jusqu'à ce qu'il soit sur ou directement au-dessus du point suivant.
  • Ensuite, nous descendons pour atteindre le point suivant.
  • Il est garanti qu'il ne restera aucun point découvert au point ci-dessus dans la même ligne. Cela garantit que nous ne touchons à aucun autre point que celui choisi N. Le choix du point de fermeture garantit également que la deuxième règle reste vraie.

Essayez-le en ligne ici

Optimiseur
la source