Antecedentes
Quiero construir una cerca. Para eso, he recogido un montón de postes y los he pegado al suelo. También he reunido muchas tablas que clavaré a los postes para hacer la cerca real. Tiendo a dejarme llevar cuando construyo cosas, y lo más probable es que siga clavando las tablas en los postes hasta que no haya más lugar para colocarlas. Quiero que enumeres las posibles vallas con las que puedo terminar.
Entrada
Su entrada es una lista de coordenadas enteras bidimensionales que representan las posiciones de los polos, en cualquier formato conveniente. Puede suponer que no contiene duplicados, pero no puede suponer nada sobre su orden.
Los tableros están representados por líneas rectas entre los polos, y por simplicidad, solo consideramos tableros horizontales y verticales. Una tabla puede unir dos postes si no hay otros postes o tablas entre ellos, lo que significa que las tablas no pueden cruzarse entre sí. Una disposición de postes y tableros es máxima si no se le pueden agregar nuevos tableros (de manera equivalente, hay un poste o un tablero entre dos postes alineados horizontal o verticalmente).
Salida
Su salida es el número de arreglos máximos que se pueden construir utilizando los polos.
Ejemplo
Considere la lista de entrada
[(3,0),(1,1),(0,2),(-1,1),(-2,0),(-1,-1),(0,-2),(1,-1)]
Visto desde arriba, la disposición correspondiente de los postes se ve así:
o
o o
o o
o o
o
Hay exactamente tres arreglos máximos que se pueden construir utilizando estos polos:
o o o
o-o o|o o-o
o----o o||| o o| | o
o-o o|o o-o
o o o
Por lo tanto, la salida correcta es 3
.
Reglas
Puede escribir una función o un programa completo. El conteo de bytes más bajo gana, y las lagunas estándar no se permiten.
Casos de prueba
[] -> 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)
, buena captura. Cambiando ahora.Respuestas:
Mathematica, 301 bytes
Esta es una función sin nombre que toma las coordenadas como anidadas
List
y devuelve un entero. Es decir, puede darle un nombre y llamarlo, o simplemente agregarCon sangría:
Ni siquiera puedo comenzar a expresar lo ingenua que es esta implementación ... definitivamente no podría ser más fuerza bruta ...
o--o--o
solo se obtienen dos cercas en lugar de tres).Sorprendentemente, resuelve todos los casos de prueba prácticamente de inmediato.
Un buen truco que descubrí para esto es el uso de
Orderless
reducir el número de patrones que tengo que hacer coincidir. Esencialmente, cuando quiero deshacerme de conjuntos de cercas con cercas cruzadas, necesito encontrar un par de cercas vertical y horizontal y verificar la condición en ellas. Pero no sé en qué orden aparecerán. Dado que los patrones de lista normalmente dependen del orden, esto generaría dos patrones realmente largos. Entonces, en su lugar, reemplazo con la lista circundante con una funciónt
cont @@@
, que no está definida, por lo que se mantiene como está. Pero esa función esOrderless
, así que puedo verificar un solo orden en el patrón, y Mathematica lo verificará contra todas las permutaciones. Después, puse las listas de nuevo en su lugar conList @@@
.Desearía que hubiera un incorporado que sea a)
Orderless
, b) noListable
yc) no definido para 0 argumentos o argumentos de lista. Entonces podría reemplazart
por eso. Pero no parece haber tal operador.fuente
Haskell, 318 bytes
Uso:
p [(1,0),(0,1),(-1,0),(0,-1)]
. Salida:2
Cómo funciona:
fuente