¡Atrapa esas ovejas!

16

¡Eres un granjero y tu rebaño de ovejas se ha escapado! ¡Oh no!

Redondee esas ovejas construyendo cercas para contenerlas. Como agricultor con un presupuesto limitado, desea utilizar la menor cantidad de cerca posible. Sin embargo, afortunadamente para ti, no son las ovejas más inteligentes del mundo y no se molestan en moverse después de haber escapado.

Tarea

Dada una lista de coordenadas, genere la menor cantidad de segmentos de cerca necesarios para contener las ovejas.

Reglas

  • Las ovejas están contenidas si no pueden alejarse (sin agujeros en la cerca).
  • No es necesario que contenga todas las ovejas en un bloque de cerca; podría haber múltiples áreas cercadas independientes entre sí.
  • Los segmentos de cerca están orientados en direcciones cardinales.
  • Cada tupla de coordenadas representa una sola oveja.
  • La entrada debe ser pares enteros positivos, x>0& y>0, pero puede formatearse adecuadamente para su idioma.
    • es decir: {{1,1},{2,1},{3,7}, .. }o[1,2],[2,1],[3,7], ..
  • Los espacios vacíos dentro de un área cercada están bien.
  • No puede asumir que las coordenadas se ingresan en un orden específico.

Por ejemplo, una sola oveja requiere que los 4segmentos de la cerca estén completamente contenidos.

Casos de prueba

[1,1]
4

[1,1],[1,2],[2,2]
8

[2,1],[3,1],[2,3],[1,1],[1,3],[3,2],[1,2],[3,3]
12

[1,1],[1,2],[2,2],[3,7],[4,9],[4,10],[4,11],[5,10]
22

[1,1],[2,2],[3,3],[4,4],[5,5],[6,6],[7,7],[8,8],[9,9]
36

[1,1],[2,2],[3,3],[4,4],[6,6],[7,7],[8,8],[9,9]
32

[2,1],[8,3],[8,4]
10

Notas

  • Puede asumir que las coordenadas de entrada son válidas.
  • Su algoritmo debería funcionar teóricamente para cualquier coordenada entera razonablemente grande (hasta el valor máximo admitido de su idioma).
  • Las respuestas completas al programa o a la función están bien.

Este es el , por lo que la respuesta más corta en bytes gana.

CzarMatt
fuente
¿Puede la entrada ser una lista de coordenadas x, seguida de una lista de coordenadas y? por ejemplo{1,2,3,4},{5,6,7,8} -> {1,5},{2,6},{3,7},{4,8}
Pavel
@ Phoenix Nope, cada x,yentrada debe estar junta. Buen pensamiento, sin embargo, no había pensado en eso yo mismo.
CzarMatt
¿Cuáles son los límites en las coordenadas? ¿Son posibles los ceros y los negativos?
AGourd
3
Esto es sorprendentemente difícil. Cada vez que pienso que tengo una heurística que maneja todos los casos, hay algo que me he perdido.
xnor
1
Wow, qué desafío. Admito mi pérdida; tornillo haciendo esto en 05AB1E.
Magic Octopus Urn

Respuestas:

5

JavaScript (ES6), 251 244 275 bytes

a=>Math.min(...(P=(a,r=[[a]],c=a[0])=>(a[1]&&P(a.slice(1)).map(l=>(r.push([[c],...l]),l.map((_,i)=>r.push([[c,...l[i]],...((b=[...l]).splice(i,1),b)])))),r))(a).map(L=>L.reduce((p,l)=>l.map(([h,v])=>(x=h<x?h:x,X=h<X?X:h,y=v<y?v:y,Y=v<Y?Y:v),x=y=1/0,X=Y=0)&&p+X-x+Y-y+2,0)))*2

¿Cómo?

Usamos la función recursiva P () para crear una lista de todas las particiones posibles de la lista de entrada. Esta función es actualmente subóptima, ya que devuelve algunas particiones duplicadas, lo que sin embargo no altera el resultado final.

Para cada partición, calculamos el número de cercas requeridas para rodear a todas las ovejas en cada grupo con un rectángulo. La suma de estas cercas da el puntaje de la partición. Finalmente devolvemos el puntaje más bajo.

Casos de prueba

Arnauld
fuente
Sobre el paso 2, ¿por qué no [ [1,1],[2,2] ] , [ [1,2] ]?
edc65
@ edc65 Espero que ahora se solucione.
Arnauld