Dê uma olhada nesta imagem. Especificamente, como os orifícios nas extremidades são organizados.
( Fonte da imagem )
Observe como os tubos nesta imagem são compactados em um padrão hexagonal. Sabe-se que em 2D, uma rede hexagonal é o empacotamento mais denso de círculos. Neste desafio, estaremos focados em minimizar o perímetro de uma embalagem de círculos. Uma maneira útil de visualizar o perímetro é imaginar colocar um elástico ao redor da coleção de círculos.
A tarefa
Dado um número inteiro positivo n
como entrada, mostre uma coleção de n
círculos compactados o mais firmemente possível.
Regras e esclarecimentos
- Suponha que os círculos tenham um diâmetro de 1 unidade.
- A variável a ser minimizada é o comprimento do perímetro, definido como o casco convexo dos centros dos círculos no grupo. Veja esta imagem:
Os três círculos em uma linha reta têm um perímetro de 4 (o casco convexo é um retângulo 2x0 e o 2 é contado duas vezes), aqueles dispostos em um ângulo de 120 graus têm um perímetro de cerca de 3,85 e o triângulo tem um perímetro de apenas 3 unidades. Observe que estou ignorando as unidades pi adicionais que o perímetro real seria porque estou apenas olhando para os centros dos círculos, não para as bordas.
- Pode (e quase certamente haverá) várias soluções para qualquer dado
n
. Você pode emitir qualquer uma dessas opções a seu critério. Orientação não importa. - Os círculos devem estar em uma estrutura hexagonal.
- Os círculos devem ter pelo menos 10 pixels de diâmetro e podem ser preenchidos ou não.
- Você pode escrever um programa ou uma função.
- A entrada pode ser obtida através do STDIN, como argumento de função ou equivalente mais próximo.
- A saída pode ser exibida ou em um arquivo.
Exemplos
Abaixo, tenho exemplos de saídas válidas e inválidas para n de 1 a 10 (exemplos válidos apenas para os cinco primeiros). Os exemplos válidos estão à esquerda; todo exemplo à direita tem um perímetro maior que o exemplo válido correspondente.
Muito obrigado a steveverrill pela ajuda na elaboração deste desafio. Embalagem feliz!
fonte
Respostas:
Mathematica
295950 bytesNota: Esta versão ainda por jogar aborda questões levantadas por Steve Merrill em relação às minhas tentativas anteriores.
Embora seja uma melhoria em relação à primeira versão, ela não encontrará a configuração de alça mais densa, na qual se procuraria uma forma geral circular, e não hexagonal.
Ele encontra soluções construindo um hexágono interno completo (para n> = 6 e, em seguida, examina todas as configurações para concluir o shell externo com os círculos restantes.
Curiosamente, como Steve Merrill observou nos comentários, a solução para
n+1
círculos nem sempre consiste na solução para n círculos com outro círculo adicionado. Compare a solução fornecida para 30 círculos com a solução fornecida para 31 círculos. (Nota: existe uma solução exclusiva para 30 círculos.)Algumas das verificações envolveram comparações de mais de cem mil casos para um valor único de n (incluindo simetrias). Demorou aproximadamente 5 minutos para executar o total de 34 casos de teste. Escusado será dizer que, com maior
n's
essa abordagem de força bruta logo se mostraria impraticável. Certamente, existem abordagens mais eficientes.Os números à direita de cada embalagem são os perímetros dos respectivos cascos azuis convexos. Abaixo está a saída para
3 < n < 35
. Os círculos vermelhos são aqueles adicionados em torno de um hexágono regular.fonte