Esse desafio é encontrar o menor disco que contenha alguns pontos. Isso é um pouco mais complicado, no entanto, pelo fato de que neste desafio, as coordenadas e o raio do disco devem ser inteiros.
Sua entrada será uma lista de pontos com coordenadas inteiras x
e y
. Você pode considerar isso como uma lista de tuplas, uma lista de listas ou qualquer outra maneira de representar uma coleção de pares. x
e y
serão ambos (possivelmente negativos) números inteiros. Cada ponto é garantido como único e haverá pelo menos um ponto.
Sua saída será um disco na forma de três números, X
, Y
, e R
. X
, Y
E R
são todos inteiros, X
e Y
representam o centro do disco e R
representa o seu raio. A distância entre cada ponto especificado e o centro deve ser menor ou igual a R
e não deve existir um disco com um menor R
que também satisfaça essa condição.
É possível que existam várias soluções possíveis para uma determinada entrada; seu código deve gerar pelo menos uma delas nesse caso.
Você pode usar qualquer tipo de geometria embutida em seu idioma, se houver, e a entrada / saída pode ser através de objetos de ponto / disco embutidos, em vez de apenas números.
Casos de teste
Input (Possible) Output(s)
(x,y) (X,Y,R)
-------------------------
(0,0) (0,0,0)
-------------------------
(0,1) (0,0,1)
(1,0) (1,1,1)
-------------------------
(1,4) (4,4,3)
(3,2)
(4,1)
(4,5)
(5,2)
(7,4)
-------------------------
(-1,0) (0,0,2)
(2,0) (1,0,2)
-------------------------
(-1,0) (1,0,2)
(2,1) (0,1,2)
-------------------------
(0,0) (1,0,1)
(1,1) (0,1,1)
Menos bytes ganha.
Respostas:
Geléia ,
252422212018 bytesObrigado a @EriktheOutgolfer por me informar
)
, economizando 1 byte.Obrigado a @Dennis por salvar 2 bytes.
Experimente online!
Explicação
fonte
€
?Brachylog v2, 19 bytes
Experimente online!
Esse programa foi fácil de escrever - o Brachylog é quase perfeito para esse tipo de problema - mas difícil de jogar. Não me surpreenderia se houvesse um byte salvando em algum lugar aqui, pois poucas coisas que fiz pareciam ter algum efeito (e contém instruções de mapa aninhadas, normalmente um sinal de que você deveria estar usando member / findall, mas não posso veja uma maneira de fazê-lo).
Este é um envio de função. A entrada é do argumento esquerdo para a função no formato
[[x,y],[x,y],…]
, a saída do argumento direito no formulário[r,[[x,y]]]
. (Se você quiser tentar números negativos na entrada, observe que o Brachylog usa_
para o sinal de menos, não-
. Isso é confuso porque a função → wrapper de programa completo que o Brachylog envia, solicitada usando o argumento da linha de comandoZ
, apresentará números negativos na saída com um sinal de menos regular.)Explicação
Isso é interessante, pois estamos solicitando ao Brachylog que encontre um valor de determinadas propriedades (nesse caso, o raio de um disco centrado no ponto
A
que se encaixa em todos os pontos de entrada), mas dificilmente forçando requisitos (tudo o que exigimos é que o raio é um número). No entanto, o Brachylog calculará internamente o raio em questão simbolicamente, em vez de tentar usar números concretos; portanto, quando a final≜
é alcançada, ele realiza duas coisas ao mesmo tempo: primeiro, garante que apenas números inteiros sejam usados para as coordenadas deA
e para o raio (forçando o raio quadrado a ser um número quadrado e explicando o uso de≤ᵛ
para encontrar um "máximo ou maior"); segundo, encontra o menor raio viável possível (como o raio aparece primeiro na saída).Uma coisa que não está especificada no programa é que todos os pontos são medidos no mesmo centro de um disco; como está escrito, não há restrições de que não usamos um centro diferente para cada ponto. No entanto, a ordem de desempate (que neste caso é definida pelo terceiro
ᵐ
e que como restrição de estrutura será avaliada antes da restrição de valor implícita por≜
) desejaA
ser o mais curta possível (ou seja, um único elemento, portanto, usamos o mesmo centralize cada vez; ele tenta um comprimento zeroA
primeiro, mas isso obviamente não funciona, então tenta uma lista única). Como resultado, acabamos recebendo uma restrição útil (que só temos um disco) "de graça".Essa solução generaliza para qualquer número de dimensões , sem alterações no código-fonte; aqui não há suposições de que as coisas sejam bidimensionais. Portanto, se você precisar da menor esfera inteira, poderá ter isso também.
fonte
Perl 6 , 81 bytes
Experimente online!
Toma uma lista de pontos como listas de 2 elementos
((X1, Y1), (X2, Y2), ...)
. Retorna uma lista(R, (X, Y))
. Usa a mesma abordagem que a resposta de Pietu1998 Jelly:O
minmax
método é útil aqui, pois retorna aRange
. O produto cartesiano de faixas produz diretamente todos os pontos com coordenadas inteiras.fonte
05AB1E , 26 bytes
Porto da resposta de @ Pietu1998 Jelly .
Experimente online ou verifique todos os casos de teste .
Explicação:
fonte
Matlab, 73 bytes
Basta encontrar a menor solução (ponto flutuante) e arredondar para o ponto mais próximo e limitar o raio (pior caso para o problema minimax). Não sei ao certo se isso gera a solução correta para todos os casos possíveis (dentro da precisão), mas para os casos de teste deve funcionar (se eu não cometer um erro de digitação).
Ligue com
fonte
fminimax
Pitão ,
3433 bytesA saída está no formato
[R,x,y]
Experimente online aqui ou verifique todos os casos de teste de uma vez aqui .
Editar: salvou um byte reorganizando o formato de saída, versão anterior:
heDm+d.EeSm@s^R2-Vdk2Q*Fm}FhM_BSdC
fonte
Wolfram Language (Mathematica) , 66 bytes
Aqui está uma abordagem de força bruta. Eu considerei a
BoundingRegion[#,"MinDisk"]&
função muito mais curta , mas não há como forçar coordenadas e raios inteiros.Experimente online!
fonte
{Round@#[[1]], Ceiling@#[[2]]} &@BoundingRegion[#, "MinDisk"]&
?Java 10,
283279277257 bytes-20 bytes graças à dica de uso do @nwellnhof
Math.hypot
.A matriz de resultados está na ordem
[R,X,Y]
.Experimente online.
Explicação:
fonte
Math.hypot
.Math.hypot
, o que é perfeito para esse desafio! -20 bytes ali. Obrigado. :)Javascript, 245 bytes
Versão (mais ou menos) mais legível:
Apenas encontra a caixa delimitadora e testa cada coordenada nessa caixa para saber se é a melhor.
Eu poderia salvar 8 bytes com uma resposta aproximada, substituindo:
Math.ceil(Math.sqrt(n[2]))
com~~(n[2]+1-1e-9)
fonte
for(f=c;f<b;f++){for(g=e;g<d;g++){s=a.reduce((o,[p,q])=>o>(r=(p-f)**2+(q-g)**2)?o:r);n=n?n[2]>s?[f,g,s]:n:[f,g,s]}}
parafor(f=c;f<b;f++)for(g=e;g<d;n=n?n[2]>s?[f,g,s]:n:[f,g,s],g++)s=a.reduce((o,[p,q])=>o>(r=(p-f)**2+(q-g)**2)?o:r);
. E eu tenho certeza que você pode remover o espaço emreturn[
.Math.hypot
.Ruby , 113 bytes
Experimente online!
fonte
Carvão , 65 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Obtenha as coordenadas y em
z
.Obtenha as coordenadas x em
h
.Passe pelos intervalos inclusivos, dos mínimos aos máximos
h
ez
gerando a lista de todos os potenciais centros de disco.Faça um loop sobre todos os centros do disco, depois faça um loop sobre todos os pontos originais e, em seguida, faça um loop sobre as duas coordenadas, subtraia, quadrado, soma, obtenha o máximo e salve a lista resultante.
Encontre a posição do diâmetro máximo mínimo e imprima o centro do disco correspondente.
Imprima o diâmetro máximo mínimo, mas arredonde-o para o próximo número inteiro.
fonte