Dado un entero positivo por debajo de 1000, muestre todos los rectángulos posibles con esa área.
Tarea
Digamos que la entrada es 20. Podemos hacer un rectángulo de 20 × 1, 10 × 2 o 5 × 4, por lo que esta es una salida válida:
********************
**********
**********
*****
*****
*****
*****
Tenga en cuenta que cada posible rectángulo aparece exactamente una vez.
Los rectángulos pueden aparecer en cualquier orden, orientación o posición, pero no pueden superponerse o tocarse dos rectángulos, incluso en las esquinas. Lo siguiente también es válido:
********************
****
********** ****
********** ****
****
****
Puntuación
El área del cuadro delimitador (BBA) de una salida es el área del rectángulo mínimo que encierra todos los rectángulos. En el primer ejemplo de salida, el tamaño es 20 × 9, por lo que el BBA es 180. En el segundo ejemplo de salida, el tamaño es 20 × 7, por lo que el BBA es solo 140.
Encuentre el BBA de la salida cuando la entrada sea 60, 111, 230, 400 y 480, y sume. Multiplique esta suma por el tamaño de su código en bytes. El resultado es tu puntaje; gana el puntaje más bajo.
Reglas
- El programa (o función) debe producir una salida válida para cualquier entero positivo por debajo de 1000.
- La salida debe contener solo asteriscos (
*
), espacios () y líneas nuevas.
- Puede haber cualquier cantidad de espacio entre los rectángulos, pero esto cuenta para el BBA.
- Las líneas o columnas iniciales o finales, si solo tienen espacios, no cuentan para el BBA.
fuente
Respuestas:
Rubí, 228 bytes * 21895 = 4992060
Varios cambios de código no golfizado. El más grande es el cambio de significado de la variable
m
desde la altura del rectángulo más cuadrado, hasta la altura del rectángulo más cuadrado másn
.Trivialmente,
*40
se ha cambiado a lo*n
que significa una gran cantidad de espacios en blanco innecesarios a la derecha para grandesn
; y-2
se cambia a lo0
que significa que los rectángulos trazados en la parte inferior siempre pierden las dos primeras columnas (esto da como resultado un embalaje más pobre para los números cuya única factorización es(n/2)*2
)Explicación
Finalmente encontré tiempo para volver a esto.
Para un determinado,
n
el campo más pequeño debe tener suficiente espacio para el rectángulo más largo1*n
y el rectángulo más cuadradox*y
. Debería ser evidente que el mejor diseño se puede lograr si ambos rectángulos tienen sus lados largos orientados en la misma dirección.Ignorando el requisito de espacio en blanco entre los rectángulos, encontramos que el área total es
(n+y)*x = (n+n/x)*x
on*(x+1)
. De cualquier manera, esto se evalúa comon*x + n
. Incluyendo el espacio en blanco, tenemos que incluir un extrax
si colocamos los rectángulos de extremo a extremo, on
si colocamos los rectángulos uno al lado del otro. Por lo tanto, lo primero es preferible.Esto proporciona los siguientes límites inferiores
(n+y+1)*x
para el área de campo:Esto sugiere el siguiente algoritmo:
En realidad, es posible obtener todos los rectángulos para los casos de prueba requeridos dentro de los límites inferiores mencionados anteriormente, con la excepción de 60, que proporciona el siguiente resultado de 71 * 8 = 568. Esto se puede mejorar ligeramente a 60 * 9 = 540 moviendo los dos rectángulos más delgados a la derecha un cuadrado y luego hacia arriba, pero el ahorro es mínimo, por lo que probablemente no valga ningún código adicional.
Esto da un área total de 21895.
Código sin golf
fuente
CJam, 90385 * 31 bytes = 2801935
Pruébalo aquí. Use este script para calcular los BBA.
Esta es solo la solución ingenua para comenzar las cosas.
fuente
Ruby, 56 bytes
90385 * 56 = 5061560 suponiendo que la salida sea igual a la de Martin (creo que es).
Aquí hay otra función útil, en un programa de prueba útil
Lo que da el siguiente resultado, para referencia:
fuente