Antecedentes
Al expandir y cancelar los términos, es fácil mostrar la siguiente identidad:
Sin embargo, es un problema abierto si todos los rectángulos 1 / n por 1 / (n + 1) pueden enlosar el cuadrado de la unidad.
La tarea
Su programa debe tomar un número entero positivo N como entrada de cualquier manera conveniente, y empaque todos los rectángulos abiertos 1 / n-por-1 / (n + 1) con n entre 1 y N inclusive en el cuadrado de la unidad, de modo que no se superpongan dos .
Para cada rectángulo, debe generar los siguientes enteros en orden:
- 1 si los bordes horizontales son más largos que los bordes verticales, de lo contrario 0
- El numerador y el denominador de la coordenada x de la esquina inferior izquierda
- El numerador y el denominador de la coordenada y de la esquina inferior izquierda
Tenga en cuenta que consideramos que el cuadrado de la unidad es (0, 1) x (0, 1)
, con valores de x de izquierda a derecha y valores de y de abajo hacia arriba.
El resultado final esperado es la concatenación de estos enteros para cada rectángulo en orden de aumentar n, en cualquier formato conveniente (por ejemplo, impreso en stdout, o como una lista devuelta por una función).
Ejemplo de entrada y salida
Entrada:
3
Salida:
0 0 1 0 1 1 1 2 0 1 1 1 2 1 3
Esto se analiza de la siguiente manera:
0 (0/1, 0/1) 1 (1/2, 0/1) 1 (1/2, 1/3)
Puntuación
Este es un desafío de código de golf, por lo que gana la respuesta con la menor cantidad de bytes. Sin embargo, su algoritmo también debe ser razonablemente eficiente; debería poder ejecutarse para todos N<=100
en un total de alrededor de 10 minutos.
Su solución debe proporcionar soluciones válidas para todos N<=100
, pero los algoritmos demostrablemente completos también son bienvenidos, incluso si no son los más cortos.
Respuestas:
Haskell,
263262 bytesEsto sigue el algoritmo descrito en Paulhus 1997, An Algorithm for Packing Squares , doi: 10.1006 / jcta.1997.2836 . La observación clave en el documento, que se verifica empíricamente si no se verifica teóricamente, es que la región que queda después de colocar un rectángulo en una caja se puede dividir en dos subcajas cuyo relleno se puede considerar independiente.
En lugar de encontrar el subcuadro de ancho más pequeño para encajar en el siguiente rectángulo, el código realiza una búsqueda en todos los subcajones posibles; En la práctica, esto no hace una desaceleración apreciable para n <100.
La salida tiene la forma de una lista de entradas como tuplas con el marcador de fracción
%
aún incluido. Los enteros en la salida formateada están en el orden deseado, pero estrictamente hablando se requeriría algo de procesamiento posterior para producir solo la lista de enteros.Ejecución de muestra:
*Main> f 5 (0,0 % 1,0 % 1),(0,1 % 2,0 % 1),(0,1 % 2,1 % 2),(0,3 % 4,1 % 2),(1,1 % 2,5 % 6)
Editar: eliminó un espacio errante después de a
let
.fuente