fundo
Tenho um monte de caixas quadradas de tamanho igual e, como sou uma pessoa elegante, quero organizá-las em uma formação quadrada. No entanto, o número deles não é necessariamente um quadrado perfeito; portanto, talvez seja necessário aproximar o formato do quadrado. Quero que você me encontre o arranjo mais esteticamente agradável - programaticamente, é claro.
Entrada
Sua entrada é um número inteiro positivo único k
, representando o número de caixas.
Resultado
Seu programa deve escolher dois números inteiros positivos, m, n
tal como m*(n-1) < k ≤ m*n
é o caso. Eles representam a largura e a altura da grande forma quadrada que estamos organizando. Como procuramos formas esteticamente agradáveis, a quantidade deve ser mínima, para que a forma fique próxima a um quadrado e sua área fique próxima . Se ainda houver vários candidatos para o par , escolha aquele em que a largura seja máxima.(m - n)2 + (m*n - k)2
k
(m, n)
m
Agora, sua saída real não deve ser os números m
e n
. Em vez disso, você deve imprimir o arranjo das caixas, usando o caractere #
para representar uma caixa. Mais especificamente, você deve imprimir n-1
linhas, cada uma das quais composta por m
caracteres #
e, em seguida, uma linha de k - m*(n-1)
caracteres #
. Observe que a saída contém exatamente k
caracteres #
.
Regras e Pontuação
Não deve haver nenhum espaço em branco à esquerda ou à direita na saída, exceto que a última linha pode ser preenchida com espaços à direita de comprimento m
, se desejado. Pode haver uma nova linha final, mas nenhuma nova linha anterior. Você pode usar qualquer caractere ASCII imprimível no lugar de #
, se desejado.
Você pode escrever um programa completo ou retornar uma string de uma função. A contagem de bytes mais baixa vence e as brechas padrão não são permitidas.
Casos de teste
Aqui estão as saídas corretas para alguns valores de entrada.
1
#
2
##
3
##
#
4
##
##
8
###
###
##
13
#####
#####
###
17
######
######
#####
18
#####
#####
#####
###
20
#####
#####
#####
#####
21
######
######
######
###
22
######
######
######
####
23
#####
#####
#####
#####
###
fonte
:
ausente na linha 5. Vírgula é o que define uma tupla, os colchetes()
podem ser removidos na linha 6. Os espaços entre)
e (if
oufor
) também.max
pode obter o gerador como parâmetro, portanto, os colchetes[]
são redundantes. Você itera sobre asd
chaves, para poder usá-lo com segurançad[i]
.(i+1)*x
para-~i*x
oui*x+x
.(i*x+x
...CJam (
4442 bytes)Demonstração online
Eu esperava que houvesse uma solução mais simples envolvendo raízes quadradas, mas não é tão simples assim. Por exemplo, para entrada,
31
a largura da linha é dois maior que o teto da raiz quadrada; para273
(raiz quadrada pouco mais de 16,5), o melhor quadrado aproximado é um retângulo 21x13 perfeito.fonte
CJam, 42 bytes
Experimente online
Explicação:
fonte