Sua tarefa é escrever um programa que encontre o maior raio que N círculos possam ter e ainda caibam dentro de um retângulo com X por Y pixels de largura. (semelhante a este artigo da wikipedia ) Seu programa deve encontrar o maior raio possível e a posição ideal desses N círculos para que
- Não há dois círculos sobrepostos
- Todos os círculos se encaixam dentro do retângulo.
Seu programa deve imprimi-lo no console:
Highest possible radius: <some_number>
Circle 1 Focus: (x, y)
Circle 2 Focus: (x, y)
...
Circle N-1 Focus: (x, y)
Circle N Focus: (x, y)
(Obviamente, você deve substituir some_number pelo raio que o seu programa calcula, N pelo número de círculos que você acaba usando, e xey pelas coordenadas reais do círculo)
Por fim, ele deve criar e salvar uma imagem com esses círculos desenhados.
Regras:
Este programa deve ser executado com qualquer tamanho de retângulo e qualquer número de círculos e ainda obter uma resposta válida. Você pode usar argumentos de linha de comando, entrada do usuário, variáveis codificadas ou qualquer outra coisa que desejar.
Se algum círculo se sobrepuser ou não couber totalmente dentro da caixa, seu envio será inválido.
Cada círculo deve ter o mesmo raio.
Apenas para tornar isso razoável e factível, todos os números devem ser precisos até a 2ª casa decimal.
Este é o código de golfe, pelo que o programa mais curto (a partir de 28/10/2014) vence.
Respostas:
Javascript
782725 caracteresprimeiro post, seja gentil!
O programa agora é chamado através da função agrupada. Por exemplo:
(function(e,f,g){...})(100,200,10)
.Teste 1
(function(e,f,g){...})(200,200,4)
Obviamente, esperávamos que o raio fosse exatamente 50, mas, por razões discutidas nos comentários da pergunta, eu não poderia razoavelmente fazer isso acontecer. O SVG fica assim ...
Teste 2
(function(e,f,g){...})(100,400,14)
E o SVG fica assim ...
Teste 3
(function(e,f,g){...})(400,400,3)
E o SVG fica assim ...
Eles não são todos bonitos.
Como funciona
Código não destruído abaixo. Este programa tem duas suposições:
O programa começa calculando um raio grande com base nas dimensões da caixa. Em seguida, tenta ajustar um círculo no canto da caixa. Se esse círculo se encaixar, ele estende uma linha de diâmetro a partir desse círculo e tenta criar um círculo no final da linha. Se o novo círculo se encaixar, outra linha será estendida a partir do novo círculo. Se não couber, a linha oscilará 360 graus, verificando se há espaços abertos. Se a caixa for preenchida antes da criação do número desejado de círculos, o raio será reduzido e tudo começará novamente.
Código Ungolfed (snippet)
fonte