A figura a seguir mostra o problema:
Escreva uma função que, dado um número inteiro como o raio do círculo, calcule o número de pontos de treliça dentro do círculo centralizado (incluindo o limite).
A imagem mostra:
f[1] = 5 (blue points)
f[2] = 13 (blue + red points)
outros valores para sua verificação / depuração:
f[3] = 29
f[10] = 317
f[1000] = 3,141,549
f[2000] = 12,566,345
Deve ter um desempenho razoável. Digamos menos de um minuto para f [1000].
O menor código vence. Aplicam-se regras usuais do Código-Golfe.
Por favor, poste o cálculo e o tempo de f [1001] como exemplo.
Respostas:
J
212118Constrói complexos de -x-xj a x + xj e leva magnitude.
Editar: Com
>:
Edit 2: Com gancho e monádico
~
. É executado algumas vezes mais devagar por algum motivo, mas ainda assim 10 segundos para f (1000).fonte
i:
, estou roubando tanto isso, obrigado!>:
. derp>:
. Mas ei, essa é uma resposta legal!:)
J,
2721Muito brutal: calcula o sqrt (x² + y²) no intervalo [-n, n] e conta os itens ≤n . Tempos ainda muito aceitáveis para 1000.
Edit :
i:y
é um pouco menor quey-i.>:+:y
. Obrigado Jesse Millikan !fonte
Ruby 1.9,
62 5854 caracteresExemplo:
fonte
Python 55 Chars
fonte
f=lambda n:1+4*sum(int((n*n-i*i)**.5)for i in range(n))
é 17 caracteres menor.Haskell, 41 bytes
Conta pontos no quadrante
x>=0, y>0
, multiplica por 4 e adiciona 1 ao ponto central.fonte
Haskell, 44 bytes
fonte
w<-[-n..n]
onde (geralmente) existe um valor booleano?JavaScript (ES6), 80 bytes (não concorrente porque o ES6 é muito novo)
Versão alternativa, também 80 bytes:
Versão ES7, também 80 bytes:
fonte
Python 2, 48 bytes
Como a solução de fR0DDY , mas recursiva, e retorna um float. Retornar um int é de 51 bytes:
fonte
C (gcc) , 60 bytes
Experimente online!
Loops sobre o primeiro quadrante, multiplica o resultado por 4 e adiciona um. Um pouco menos golfe
fonte
APL (Dyalog Extended) , 14 bytes
Experimente online!
Apesar de não possuir o
i:
(inclusive intervalo de -n a n) do J, o APL Extended possui uma sintaxe mais curta em outras áreas.fonte
Japonês
-x
, 12 bytesExperimente online!
Explicação:
fonte
PHP,
8583 bytesO código:
Seu resultado (consulte https://3v4l.org/bC0cY para várias versões do PHP):
O código não destruído:
Uma implementação ingênua que verifica
$n*($n+1)
pontos (e roda 1000 mais devagar, mas ainda calculaf(1001)
em menos de 0,5 segundos) e o conjunto de testes (usando os dados de amostra fornecidos na pergunta) podem ser encontrados no github .fonte
Clojure / ClojureScript, 85 caracteres
Brute força o primeiro quadrante, incluindo o eixo y, mas não o eixo x. Gera um 4 para cada ponto e depois os adiciona com 1 para a origem. É executado em menos de 2 segundos para entrada de 1000.
Abusa muito
for
para definir uma variável e salvar alguns caracteres. Fazer o mesmo para criar um alias pararange
não salva nenhum caractere (e o torna significativamente mais lento), e parece improvável que você salve algo criando uma função quadrada.fonte
Pyke, 14 bytes, não concorrente
Experimente aqui!
fonte
Mathematica, 35 caracteres
Retirado de https://oeis.org/A000328
https://reference.wolfram.com/language/ref/SquaresR.html
SquaresR[2,k]
é o número de maneiras de representar k como a soma de dois quadrados, que é o mesmo que o número de pontos de treliça em um círculo de raio k ^ 2. Soma de k = 0 a k = n ^ 2 para encontrar todos os pontos dentro ou dentro de um círculo de raio n.fonte
2~SquaresR~k~Sum~{k,0,#^2}&
para torná-lo mais curtoTcl, 111 bytes
Loop x discreto simples sobre o quadrante I, contando o maior y usando o Teorema de Pitágoras em cada etapa. O resultado é 4 vezes a soma mais um (para o ponto central).
O tamanho do programa depende do valor de r . Substitua
{1001 0 -1}
por"$argv 0 -1"
e você pode executá-lo com qualquer valor de argumento da linha de comandos para r .Calcula f (1001) →
3147833.0
em cerca de 1030 microssegundos, processador AMD Sempron 130 de 2,6 GHz e 64 bits, Windows 7.Obviamente, quanto maior o raio, mais próxima a PI: f (10000001) é executada em cerca de 30 segundos, produzindo um valor de 15 dígitos, que é a precisão de um duplo IEEE.
fonte
Stax , 11 bytes
Execute e depure
fonte