Antecedentes
Tengo un montón de cajas cuadradas de igual tamaño, y como soy una persona ordenada, quiero organizarlas todas en una formación cuadrada. Sin embargo, su número no es necesariamente un cuadrado perfecto, por lo que es posible que tenga que aproximar la forma cuadrada. Quiero que me encuentres el arreglo más estéticamente agradable, programáticamente, por supuesto.
Entrada
Su entrada es un solo entero positivo k
, que representa el número de cuadros.
Salida
Su programa elegirá dos enteros positivos m, n
tales que se m*(n-1) < k ≤ m*n
mantengan. Representan el ancho y la altura de la gran forma cuadrada que estamos organizando. Como estamos buscando formas estéticamente agradables, la cantidad será mínima, de modo que la forma esté cerca de un cuadrado y su área esté cerca . Si todavía hay varios candidatos para el par , elija el que tenga el ancho máximo.(m - n)2 + (m*n - k)2
k
(m, n)
m
Ahora, su salida real no será los números m
y n
. En su lugar, deberá imprimir la disposición de las cajas, utilizando el carácter #
para representar una caja. Más específicamente, deberá imprimir n-1
filas, cada una de las cuales consta de m
caracteres #
, y luego una fila de k - m*(n-1)
caracteres #
. Tenga en cuenta que la salida contiene exactamente k
caracteres #
.
Reglas y puntuación
No habrá espacios en blanco iniciales o finales en la salida, excepto que la última fila puede rellenarse con espacios finales para ser de longitud m
, si se desea. Puede haber una nueva línea final, pero no nuevas líneas anteriores. Puede usar cualquier carácter ASCII imprimible en lugar de #
, si lo desea.
Puede escribir un programa completo o devolver una cadena de una función. El conteo de bytes más bajo gana, y las lagunas estándar no se permiten.
Casos de prueba
Aquí están las salidas correctas para algunos valores de entrada.
1
#
2
##
3
##
#
4
##
##
8
###
###
##
13
#####
#####
###
17
######
######
#####
18
#####
#####
#####
###
20
#####
#####
#####
#####
21
######
######
######
###
22
######
######
######
####
23
#####
#####
#####
#####
###
fuente
:
falta en la línea 5. La coma es lo que define una tupla, los corchetes()
se pueden quitar en la línea 6. Los espacios entre)
y (if
ofor
) también.max
puede obtener generador como parámetro, por lo tanto, los corchetes[]
son redundantes. Usted itera sobre lasd
teclas, por lo que puede usarlo de manera segurad[i]
.(i+1)*x
a-~i*x
oi*x+x
.(i*x+x
...CJam (
4442 bytes)Demostración en línea
Más bien esperaba que hubiera una solución más simple que involucrara raíces cuadradas, pero no es tan simple. Por ejemplo, para la entrada,
31
el ancho de la fila es dos veces mayor que el techo de la raíz cuadrada; para273
(raíz cuadrada de poco más de 16.5) el mejor cuadrado aproximado es un rectángulo perfecto de 21x13.fuente
CJam, 42 bytes
Pruébalo en línea
Explicación:
fuente