Contexte
J'ai un tas de boîtes de forme carrée de taille égale, et comme je suis une personne soignée, je veux les disposer toutes en une formation carrée. Cependant, leur nombre n'est pas nécessairement un carré parfait, donc je devrai peut-être approximer la forme carrée. Je veux que vous me trouviez l'arrangement le plus agréable sur le plan esthétique - par programmation, bien sûr.
Contribution
Votre entrée est un seul entier positif k
, représentant le nombre de cases.
Production
Votre programme doit choisir deux entiers positifs m, n
tels que ceux-ci sont m*(n-1) < k ≤ m*n
valables. Ils représentent la largeur et la hauteur de la grande forme carrée que nous organisons. Puisque nous recherchons des formes esthétiquement agréables, la quantité doit être minimale, de sorte que la forme soit proche d'un carré et que sa surface soit proche . S'il y a encore plusieurs candidats pour la paire , choisissez celui dont la largeur est maximale.(m - n)2 + (m*n - k)2
k
(m, n)
m
Maintenant, votre sortie réelle ne doit pas être les chiffres m
et n
. Au lieu de cela, vous devez imprimer la disposition des boîtes, en utilisant le caractère #
pour représenter une boîte. Plus précisément, vous devez imprimer des n-1
lignes, chacune composée de m
caractères #
, puis une ligne de k - m*(n-1)
caractères #
. Notez que la sortie contient exactement des k
caractères #
.
Règles et notation
Il ne doit y avoir aucun espace de début ou de fin dans la sortie, sauf que la dernière ligne peut être complétée avec des espaces de fin pour être de longueur m
, si vous le souhaitez. Il peut y avoir une nouvelle ligne de fin, mais aucune nouvelle ligne précédente. Vous pouvez utiliser n'importe quel caractère ASCII imprimable à la place de #
, si vous le souhaitez.
Vous pouvez écrire un programme complet ou renvoyer une chaîne à partir d'une fonction. Le nombre d'octets le plus bas gagne et les failles standard sont interdites.
Cas de test
Voici les sorties correctes pour quelques valeurs d'entrée.
1
#
2
##
3
##
#
4
##
##
8
###
###
##
13
#####
#####
###
17
######
######
#####
18
#####
#####
#####
###
20
#####
#####
#####
#####
21
######
######
######
###
22
######
######
######
####
23
#####
#####
#####
#####
###
:
manquant à la ligne 5. La virgule est ce qui définit un tuple, les crochets()
peuvent être supprimés à la ligne 6. Les espaces entre)
et (if
oufor
) aussi.max
peut obtenir le générateur comme paramètre, donc les crochets[]
sont redondants. Vous parcourez lesd
clés afin de pouvoir les utiliser en toute sécuritéd[i]
.(i+1)*x
en-~i*x
oui*x+x
.(i*x+x
...CJam (
4442 octets)Démo en ligne
Je m'attendais plutôt à une solution plus simple impliquant des racines carrées, mais ce n'est pas du tout aussi simple. Par exemple, pour la saisie,
31
la largeur de la ligne est supérieure de deux au plafond de la racine carrée; pour273
(racine carrée un peu plus de 16,5) le meilleur carré approximatif est un rectangle 21x13 parfait.la source
CJam, 42 octets
Essayez-le en ligne
Explication:
la source