Entrada
Su entrada en este desafío es una lista de pares enteros. Representan las esquinas sudoeste de cuadrados unitarios en el plano, y la lista representa su unión como un subconjunto del plano. Por ejemplo, la lista
[(0,0),(1,0),(0,1),(1,1),(2,1),(1,2),(2,2)]
representa el conjunto de color rojo en esta imagen:
Salida
Su salida es una lista de cuádruples enteros, que representan subconjuntos rectangulares del plano. Más explícitamente, un cuádruple (x,y,w,h)
repite un rectángulo de ancho w > 0
y alto h > 0
cuya esquina suroeste está (x,y)
. Los rectángulos deben formar una cobertura exacta de la región de entrada, en el sentido de que cada uno de los cuadrados unitarios es un subconjunto de algún rectángulo, cada rectángulo es un subconjunto de la región y dos rectángulos pueden solaparse solo en sus bordes. Para prohibir soluciones triviales, la cubierta no debe contener dos rectángulos que puedan fusionarse en un rectángulo más grande.
Por ejemplo, la lista
[(0,0,2,1),(0,1,3,1),(1,2,2,1)]
representa la cobertura legal
de la región anterior, mientras que la cobertura dada por
[(0,0,2,2),(2,1,1,1),(1,2,1,1),(2,2,1,1)]
es ilegal, ya que los cuadrados vecinos 1 por 1 podrían fusionarse:
Reglas
Puedes dar un programa completo o una función. El formato preciso de la entrada y salida no es importante, dentro de lo razonable. El conteo de bytes más corto gana, y las lagunas estándar no se permiten. Se le recomienda que proporcione una explicación de su algoritmo y algunos resultados de ejemplo.
Casos de prueba
Una región en forma de U:
[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(1,0),(1,1),(1,2),(1,3),(1,4),(1,5),(2,0),(2,1),(3,0),(3,1),(4,0),(4,1),(4,2),(4,3),(4,4),(4,5),(5,0),(5,1),(5,2),(5,3),(5,4),(5,5)]
Un gran triángulo:
[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7),(0,8),(0,9),(1,0),(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),(1,8),(2,0),(2,1),(2,2),(2,3),(2,4),(2,5),(2,6),(2,7),(3,0),(3,1),(3,2),(3,3),(3,4),(3,5),(3,6),(4,0),(4,1),(4,2),(4,3),(4,4),(4,5),(5,0),(5,1),(5,2),(5,3),(5,4),(6,0),(6,1),(6,2),(6,3),(7,0),(7,1),(7,2),(8,0),(8,1),(9,0)]
Un cuadrado con agujeros:
[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7),(0,8),(1,0),(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),(1,8),(1,9),(2,0),(2,1),(2,2),(2,3),(2,4),(2,5),(2,6),(2,7),(2,8),(2,9),(3,0),(3,1),(3,2),(3,4),(3,5),(3,6),(3,7),(3,8),(3,9),(4,0),(4,1),(4,2),(4,3),(4,4),(4,5),(4,6),(4,7),(4,8),(4,9),(5,0),(5,1),(5,2),(5,3),(5,4),(5,5),(5,7),(5,8),(5,9),(6,1),(6,2),(6,3),(6,5),(6,6),(6,7),(6,8),(6,9),(7,0),(7,1),(7,2),(7,3),(7,4),(7,5),(7,6),(7,7),(7,8),(7,9),(8,0),(8,1),(8,2),(8,3),(8,4),(8,5),(8,6),(8,7),(8,8),(8,9),(9,0),(9,1),(9,2),(9,3),(9,4),(9,5),(9,6),(9,7),(9,8),(9,9)]
Regiones desconectadas:
[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7),(0,8),(1,0),(1,1),(1,2),(1,3),(1,4),(1,6),(1,7),(1,8),(1,9),(2,1),(2,2),(2,3),(2,4),(2,5),(2,6),(2,7),(2,8),(2,9),(4,0),(4,1),(4,2),(4,4),(4,5),(4,6),(4,7),(4,8),(4,9),(5,0),(5,1),(5,2),(5,3),(5,4),(5,5),(5,6),(5,7),(5,8),(5,9),(6,0),(6,1),(6,2),(6,4),(6,5),(6,6),(6,7),(6,8),(6,9),(8,0),(8,1),(8,2),(8,3),(8,4),(8,5),(8,6),(8,7),(8,8),(8,9),(9,0),(9,1),(9,2),(9,3),(9,7),(9,8),(9,9),(10,0),(10,1),(10,2),(10,3),(10,4),(10,5),(10,6),(10,7),(10,8),(10,9)]
Verificador
Use este programa Python 2 para verificar su solución. Toma de STDIN una lista de tuplas (la entrada) y una lista de cuádruples (su salida), separadas por una coma.
También escribí este programa Python 2 para generar las imágenes, y también puedes usarlo. Toma de STDIN una lista de tuplas o cuádruples, y produce un archivo llamado out.png
. Requiere la biblioteca PIL. También puede cambiar el tamaño de las celdas de la cuadrícula y el ancho de las líneas de ceñido, si lo desea.
3-h
a~h
?Python -
272261258251224Creo que puedo jugar más al golf.
Estoy bastante seguro de que esto funciona, pero aún no he terminado de probarlo en todos los casos de prueba.Terminé de probarlo. Funciona para todos los casos de prueba.Estoy trabajando para agregar imágenes de los resultados.Editar: Aquí están los resultados del ejemplo y los casos de prueba:Estoy tratando de escribir esto en Perl, pero no puedo entender cómo obtener matrices multidimensionales de stdin sin una gran cantidad de caracteres. ¿Alguien tiene alguna sugerencia?
fuente
(i[0]+w,i[1]+j)not in c
a{(i[0]+w,i[1]+j)}-c
y se puede moverw=h=1
a lac=set(a)-set(b)
líneab+=[(j+i[0],k+i[1])]
ab+=(j+i[0],k+i[1]),
y utilizarange
tres veces lo que es más corto para asignarr=range
x,y=i
usandox
y eny
lugar dei[0]
yi[1]
? Eso ahorraría muchos bytes.while not[j for j in r(h)if(x+w,y+j)not in c]:w+=1
usarwhile all((x+w,y+j)in c for j in r(h)):w+=1
.Pitón 2, 139
El programa acepta listas de pares ordenados rodeados por llaves en la entrada estándar. P.ej,
{(0,0),(1,0),(0,1),(1,1),(2,1),(1,2),(2,2)}
A menudo es irritante (no solo en el golf) que Python no permita una asignación dentro de una prueba de bucle. Para evitar esto, utilicé operaciones de formateo de cadenas.
fuente
Mathematica -
315 285267 bytesCon algo de ayuda de @ MartinBüttner.
Sin golf:
Uso:
Casos de prueba
Una región en forma de U
Un gran triangulo
Un cuadrado con agujeros
Regiones desconectadas
fuente
Haskell, 158
Los casos de prueba y las imágenes estarán aquí en breve.
Algoritmo: toma el primer cuadrado. Llegue a la derecha sin encontrar un cuadrado que no esté en la entrada. Luego llegue lo más arriba posible sin tener un cuadrado que no esté en la entrada. Ahora tenemos un rectángulo sin un cuadrado faltante. Agréguelo a la salida, elimine todos sus cuadrados de la entrada y llame de forma recursiva.
fuente
not$all(\x->elem(x,i)s)
conany(\x->notElem(x,i)s)
.JavaScript (ES6) 148
155 199Edit2 Un poco más de sintonía
Edit Some golfing + rewrite using recursion. No esperaba tal reducción. Ahora es un poco difícil de seguir, pero el algoritmo es el mismo.
El algoritmo es similar a la respuesta @jakube.
Sí? El primer elemento crece, el segundo elemento se borra, comience de nuevo en el paso 2 De lo
contrario, continúe con el siguiente elemento
Prueba en fragmento
fuente
Mathematica,
153 151 144 136133Ejemplo:
Entrada:
Salida:
Entrada:
Salida:
Algoritmo:
Cubra la región con cuadrados unitarios, luego combínelos.
fuente