¡Los moldes de limo pueden contar!

10

Antecedentes

Los moldes de limo son increíbles. Si los coloca en una superficie con fuentes de alimento, extenderán sus zarcillos para encontrar el alimento, luego de lo cual formarán una red de conexiones entre las fuentes. En este desafío, simularás un molde de limo buscando comida. Además, este molde particular se detendrá una vez que se encuentre lo suficiente.

Entrada

Sus entradas serán una lista Lde coordenadas enteras 2D en el formato nativo de su idioma, y ​​un número entero no negativo N. Se Lgarantiza que la lista no tendrá duplicados, pero es posible que no se ordene. La entrada Nestá entre 0 y la longitud de L, inclusive.

La lista Lrepresenta un conjunto de coordenadas para las fuentes de alimentos. Por ejemplo, la lista

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

podría interpretarse visualmente como

     o
o


   o
o
  o

Salida

Su salida es otra lista libre de duplicados Kde coordenadas enteras 2D en el mismo formato que la entrada. Representa la red formada por el molde de limo y debe cumplir las siguientes condiciones:

  • La intersección de Ly Ktiene tamaño exactamente N.
  • El conjunto Kestá conectado como un subconjunto de la cuadrícula entera (a través de adyacencias ortogonales o diagonales).
  • Si Kse elimina cualquier coordenada de , ya no cumple las dos primeras condiciones.

Tenga en cuenta que si N = 0, la salida debe ser una lista vacía.

Un ejemplo de una salida aceptable para la lista anterior Ly N = 4sería

[(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)]

que se puede visualizar como

   xxO
Oxx
x  x
x  x
x  O
O
  o

donde cada uno Orepresenta una coordenada en ambos Ly K, y cada uno xrepresenta una coordenada en Kpero no en L. Otros resultados también son aceptables, y los "zarcillos" no tienen que ser lo más cortos posible. Por ejemplo, esta también es una solución aceptable:

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

Reglas

Tanto la entrada como la salida serán listas, no conjuntos u otros tipos de datos. Las coordenadas mismas pueden ser listas o tuplas. Puede cambiar el orden de las dos entradas si es necesario.

Puede escribir un programa completo o una función. El conteo de bytes más bajo gana, y las lagunas estándar no se permiten.

Casos de prueba

Su programa debería funcionar en estas listas para todos los valores aplicables 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)]

Visualizado:

===
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
fuente

Respuestas:

3

CJam, 77 95 bytes

Creo que esto se puede jugar un poco más, pero aquí va:

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

La entrada va como N <Array of coordinate array>. Por ejemplo:

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

Salida:

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

algoritmo :

El algoritmo es bastante sencillo y dice así:

  • Ordenar la matriz de coordenadas de entrada. Esto hace que las coordenadas se ordenen primero por fila y luego por columna.
  • Ahora elegimos los primeros Npuntos
  • Ahora reducimos en estos Npuntos. El destino es el último punto y la fuente es el punto de cierre de ese último punto.
  • Luego comenzamos con el punto más a la izquierda superior, caminamos a la derecha (o izquierda) hasta que esté sobre o directamente encima del siguiente punto.
  • Luego caminamos hacia abajo para llegar al siguiente punto.
  • Se garantiza que no quedará ningún punto descubierto hasta el punto anterior en la misma fila. Esto asegura que no toquemos ningún otro punto que el elegido N. Elegir el punto de cierre también asegura que la segunda regla se mantenga verdadera.

Pruébalo en línea aquí

Optimizador
fuente