Dado um número inteiro positivo abaixo de 1000, exiba todos os retângulos possíveis com essa área.
Tarefa
Digamos que a entrada seja 20. Podemos fazer um retângulo 20 × 1, 10 × 2 ou 5 × 4, portanto, essa é uma saída válida:
********************
**********
**********
*****
*****
*****
*****
Observe que cada retângulo possível aparece exatamente uma vez.
Os retângulos podem aparecer em qualquer ordem, orientação ou posição, mas dois retângulos podem se sobrepor ou tocar, mesmo nos cantos. O seguinte também é válido:
********************
****
********** ****
********** ****
****
****
Pontuação
A área da caixa delimitadora (BBA) de uma saída é a área do retângulo mínimo que envolve todos os retângulos. No primeiro exemplo de saída, o tamanho é 20 × 9, então o BBA é 180. No segundo exemplo de saída, o tamanho é 20 × 7, então o BBA é apenas 140.
Encontre o BBA da saída quando a entrada for 60, 111, 230, 400 e 480 e adicione-os. Multiplique essa soma pelo tamanho do seu código em bytes. O resultado é sua pontuação; menor pontuação ganha.
Regras
- O programa (ou função) deve produzir uma saída válida para qualquer número inteiro positivo abaixo de 1000.
- A saída deve conter apenas asteriscos (
*
), espaços () e novas linhas.
- Pode haver qualquer quantidade de espaço entre os retângulos, mas isso conta para o BBA.
- Linhas ou colunas iniciais ou finais, se tiverem apenas espaços, não contam para o BBA.
fonte
Respostas:
Ruby, 228 bytes * 21895 = 4992060
Várias mudanças no código não-destruído. A maior delas é a mudança de significado da variável
m
da altura do retângulo quadrado, para a altura do retângulo quadrado maisn
.Trivialmente,
*40
foi alterado para o*n
que significa muito espaço em branco desnecessário à direita para grandesn
; e-2
é alterado para o0
que significa que os retângulos plotados na parte inferior sempre perdem as duas primeiras colunas (isso resulta em menor empacotamento para números cuja única fatoração é(n/2)*2
)Explicação
Finalmente encontrei tempo para voltar a isso.
Para um dado
n
campo, o menor campo deve ter espaço suficiente para o retângulo mais longo1*n
e o mais quadradox*y
. Deve ficar claro que o melhor layout pode ser alcançado se ambos os retângulos tiverem os lados longos orientados na mesma direção.Ignorando o requisito de espaço em branco entre os retângulos, descobrimos que a área total é
(n+y)*x = (n+n/x)*x
oun*(x+1)
. De qualquer maneira, isso avalia comon*x + n
. Incluindo o espaço em branco, precisamos incluir um extrax
se colocarmos os retângulos de ponta a ponta oun
se colocarmos os retângulos lado a lado. O primeiro é, portanto, preferível.Isso fornece os seguintes limites inferiores
(n+y+1)*x
para a área de campo:Isso sugere o seguinte algoritmo:
Na verdade, é possível obter todos os retângulos para os casos de teste necessários dentro dos limites inferiores mencionados acima, com exceção de 60, que fornece a seguinte saída de 71 * 8 = 568. Isso pode ser ligeiramente melhorado para 60 * 9 = 540 movendo os dois retângulos mais finos para a direita um quadrado e depois para cima, mas a economia é mínima, portanto provavelmente não vale nenhum código extra.
Isso fornece uma área total de 21895.
Código ungolfed
fonte
CJam, 90385 * 31 bytes = 2801935
Teste aqui. Use este script para calcular os BBAs.
Esta é apenas a solução ingênua para começar.
fonte
Ruby, 56 bytes
90385 * 56 = 5061560 assumindo a mesma saída que a de Martin (acredito que seja).
Aqui está outra função útil, em um programa de teste útil
O que fornece a seguinte saída, para referência:
fonte