Vamos dizer que você tem um número inteiro positivo N . Primeiro, construa um polígono regular , com N vértices, com a distância entre os vértices vizinhos sendo 1. Em seguida, conecte linhas de todos os vértices a todos os outros vértices. Por fim, calcule o comprimento de todas as linhas somadas.
Exemplo
Dada a entrada N = 6 , construa um hexágono com linhas conectando todos os vértices aos outros vértices.
Como você pode ver, há um total de 6 linhas de borda (comprimento = 1), 3 linhas com o dobro do comprimento da borda (comprimento = 2) e 6 outras linhas que nós, usando o Teorema de Pitágoras, podemos calcular o comprimento para , qual é
Se somarmos os comprimentos das linhas, obtemos (6 * 1) + (3 * 2) + (6 * 1,732) = 22,392 .
informação adicional
Como estruturas com 2 ou menos vértices não estão sendo consideradas polígonos, a saída 0 (ou NaN
, como a distância entre um único vértice não faz muito sentido) para N = 1, pois um único vértice não pode ser conectado a outros vértices e 1 para N = 2, pois dois vértices são conectados por uma única linha.
Entrada
Um número inteiro N, em qualquer formato razoável.
Resultado
O comprimento de todas as linhas somadas, com precisão de pelo menos três casas decimais, como retorno de função ou impresso diretamente em stdout
.
Regras
- As brechas padrão são proibidas.
- Isso é código-golfe , então o código mais curto em bytes, em qualquer idioma, vence.
Boa sorte!
Casos de teste
(Input) -> (Output)
1 -> 0 or NaN
2 -> 1
3 -> 3
5 -> 13.091
6 -> 22.392
1
? Minha entrada atual retornaria emnan
vez de zero, por exemplo, e exigiria apenas um revestimento especial para ela.nan
é bom, já que a distância entre um único vértice não faz muito sentido.n=1
eu acho.N
, pois as saídas aumentam e os flutuadores ficam menos precisos.Respostas:
Python 3
(com sympy ),61 60 58 5448 bytes-6 (talvez até -10 se não precisarmos lidar com isso
n=1
) graças ao xnor (simplificação trigonométrica adicional e golfe adicional para lidar com o caso de borda 1 e salvar parênteses movendo umfloat
elenco (agora desnecessário) ).Esperançosamentesuperável sem bibliotecas deterceiros? Sim!!masvamos fazer as coisas rolar ...Experimente online!
Isso usa uma fórmula para a soma dos comprimentos se um polígono estiver inscrito dentro de um círculo unitário
n*cot(pi/2/n)/2
e ajusta o resultado a um para o comprimento lateral sendo um dividindo pelo pecado do comprimento do cordãosin(pi/n)
.A primeira fórmula é adquirida considerando os
n-1
comprimentos das cordas de todas as diagonais que emanam de um canto e que são de comprimentossin(pi/n)
(novamente) ,,sin(2*pi/n)
...,sin((n-1)pi/n)
. A soma disso écot(pi/2/n)
que existemn
cantos, então multiplicamos porn
, mas depois contamos duas vezes todos os cabos, então dividimos por dois.O resultado
n*cot(pi/2/n)/2/sin(pi/n)
foi então simplificado pelo xnor paran/2/(1-cos(pi/n))
(mantendo pressionadon>1
)... isso (contanto que a precisão seja aceitável) agora não requer
sympy
mais omath
módulo embutido (math.pi=3.141592653589793
).fonte
n/2/(1-cos(pi/n))
.0.25
paran=1
- mas embalagem especial pode ser menor também ...)1/4
é o resultadon=1
. Pode ser corrigido com1%n*
. Além disso, é possível salvar parênteses movendo ofloat
interior parafloat(1-cos(pi/n))
. Não sei muito sobre o sympy, mas talvez exista uma maneira aritmética de forçar um carro alegórico.float
mudança). O sympy gera uma expressão - por exemplo, paran=6
nenhum resultado de conversão em uma expressão com uma representação3.0/(-sqrt(3)/2 + 1)
- pode haver uma maneira mais curta, mas ainda não a conheço.Python , 34 bytes
Experimente online!
Usa a fórmula
n/2/(1-cos(pi/n))
simplificada de Jonathan Allan . Neil economizou 10 bytes observando que o Python pode calcular raízes da unidade como potências fracionárias de1j
.Python sem importações não possui funções trigonométricas embutidas
pi
, oue
. Paran=1
dar, em0
vez de0.25
, acrescentamos1%n*
.Uma versão mais longa usando apenas poderes de número natural:
Experimente online!
fonte
lambda n:1%n*n/(1-(1j**(2/n)).real)/2
abs()
faz embora.MATL ,
1615 bytesExperimente online! Ou verifique todos os casos de teste .
Isso usa um commit que introduziu a função FFT (Fast Fourier Transform) e que antecede o desafio em 8 dias.
Explicação
O código usa esse truque (adaptado ao MATL) para gerar as raízes da unidade. Eles fornecem as posições dos vértices como números complexos, exceto que a distância entre vértices consecutivos não é normalizada para 1. Para resolver que, depois de calcular todas as distâncias em pares, o programa as divide pela distância entre vértices consecutivos.
fonte
Gafanhoto, 25 primitivas (11 componentes, 14 fios)
Li um meta post sobre programas no GH e no LabVIEW e sigo instruções semelhantes para medir uma linguagem visual.
Imprima
<null>
para N =0, 1, 2
, porquePolygon Primitive
não é possível gerar um polígono com 2 ou menos arestas e você obterá uma lista vazia de linhas.Componentes da esquerda para a direita:
Side count
controle deslizante: entradaPolygon Primitive
desenha um polígono com base no raio, precisamos escalar a formafonte
Mathematica, 26 bytes
usa a fórmula de Jonathan Allan
Experimente online!
-1 byte junghwan min
fonte
N@Cot[Pi/2/#]/2Csc[Pi/#]#&
since1/sin(x) = csc(x)
.5Csc[x=Pi/#]Cot[x/2]#&
Haskell , 27 bytes
Experimente online!
Acabei de mergulhar em Haskell, então isso acaba sendo um golfe para iniciantes (ou seja, copiar a fórmula de outras respostas).
Eu também tentei muito colocar em
$
algum lugar, mas o compilador continua gritando comigo, então esse é o melhor que eu tenho. : Pfonte
Geléia ,
131211 bytesUsa a fórmula de Jonathan Allan (e obrigado por salvar 2 bytes)
Experimente online!
Eu sempre fui muito fascinado por Jelly, mas não o usei muito, então essa pode não ser a forma mais simples.
fonte
ɓ
, para inline seu link ajudante assim:ØP÷ÆẠCḤɓn1×÷
’
e lógico-e,ȧ
:ØP÷ÆẠCḤɓ’ȧ÷
:)Javascript (ES6), 36 bytes
Port of @ JonathanAllan's Python 3 resposta
fonte