Escreva um programa ou função que, dado um raio inteiro r, retorne o número de unidades ao quadrado do círculo, com o raio r centrado na origem. Se o círculo passar exatamente por um ponto na grade que não conta como passando pelos quadrados da unidade adjacente.
Aqui está uma ilustração para r = 5 :
Ilustração de Kival Ngaokrajang, encontrada na OEIS
Exemplos:
0 → 0
1 → 4
4 → 28
5 → 28
49 → 388
50 → 380
325 → 2540
5524 → 44180
5525 → 44020
N = 50
).Respostas:
Python 2 , 54 bytes
Experimente online!
Menos golfe (55 bytes) ( TIO )
Isso estima a saída como
8*r
, em seguida, corrige os cruzamentos de vértice. O resultado é8*r-g(r*r)
, ondeg(x)
conta o número de maneiras de escreverx
como uma soma de dois quadrados (excetog(0)=0
).Se o círculo nunca passou por nenhum vértice, o número de células tocadas seria igual ao número de arestas cruzadas. O círculo passa pelas
2*r
linhas de grade verticais e2*r
horizontais, passando cada uma nas duas direções, num total de8*r
.Porém, cada cruzamento em um vértice conta como dois cruzamentos de borda, enquanto apenas entra em uma nova célula. Assim, compensamos subtraindo o número de cruzamentos de vértices. Isso inclui os pontos nos eixos
(r,0)
, assim como os triplos pitagóricos, como(4,3)
parar=5
.Contamos para um único quadrante os pontos
(x,y)
comx>=0
ey>0
comx*x+y*y==n
, em seguida, multiplicar por 4. Fazemos isso através da contagem do numer desqrt(r*r-x*x)
que são número inteiro parax
no intervalo[0,r)
.fonte
Mathematica, 48 bytes
Examina o primeiro quadrante e conta o número de células da grade para as quais a entrada fica entre as normas dos cantos inferior esquerdo e superior direito da célula (multiplicando o resultado por 4, é claro).
fonte
8#-SquaresR[2,#^2]Sign@#&
baseado no post de xnorSquaresR
existe. Sinta-se livre para postar você mesmo (ou deixe o xnor publicá-lo).Python 2 , 72 bytes
Experimente online!
fonte
Geléia ,
21131211 bytesExperimente online!
Como funciona
fonte
Perl 6, 61 bytes
Como funciona
fonte
AWK, 90 bytes
Uso:
Basta uma simples pesquisa no quadrante 1 para encontrar todas as caixas que cruzam o círculo. A simetria permite a multiplicação por 4. Poderia passar
-$1 to $1
, mas isso exigiria mais bytes e seria menos eficiente. Obviamente, esse algoritmo não é o mais eficiente em termos de tempo, mas leva apenas 16 segundos para executar o gabinete 5525 na minha máquina.fonte
Haskell, 74 bytes
Bem simples, conte o número de quadrados entre (0,0) e (n, n) onde a parte inferior esquerda está dentro do círculo e a parte superior direita está fora do círculo, e multiplique por 4.
fonte
Pyth , 29 bytes
Tente!
Explicação
fonte
Lote, 147 bytes
Um pouco inspirado pelas respostas do AWK e Haskell.
fonte
Utilitários Bash + Unix, 127 bytes
Experimente online!
Basta percorrer todos os pontos do primeiro quadrante, contá-los e multiplicar por 4. Pode ser muito lento, mas funciona.
fonte
JavaScript (ES7), 76 bytes
fonte
n
baixo para0
?n
raio e ak
iteração, e todas as tentativas saíram com os mesmos bytes.k<n?...
mas perco esses bytes ao reordenarn**2-k++**2
porque a precedência do operador está errada quando ocorre a inversão e a subtração não é comutativa, portanto o lado esquerdo sempre precisa terk-1
parênteses. A menos que você tenha encontrado um caminho?