fundo
Uma grade triangular é uma grade formada pela disposição regular do plano com triângulos equilaterais de comprimento lateral 1. A figura abaixo é um exemplo de uma grade triangular.
Um ponto de rede triangular é um vértice de um triângulo que forma a grade triangular.
A origem é um ponto fixo no plano, que é um dos pontos da estrutura triangular.
Desafio
Dado um número inteiro não negativo n
, encontre o número de pontos de rede triangular cuja distância euclidiana da origem é menor ou igual a n
.
Exemplo
A figura a seguir é um exemplo de n = 7
(mostrando apenas uma área de 60 graus por conveniência, com o ponto A sendo a origem):
Casos de teste
Input | Output
---------------
0 | 1
1 | 7
2 | 19
3 | 37
4 | 61
5 | 91
6 | 127
7 | 187
8 | 241
9 | 301
10 | 367
11 | 439
12 | 517
13 | 613
14 | 721
15 | 823
16 | 931
17 | 1045
18 | 1165
19 | 1303
20 | 1459
40 | 5815
60 | 13057
80 | 23233
100 | 36295
200 | 145051
500 | 906901
1000 | 3627559
Dica : esta sequência não é OEIS A003215 .
Regras
Aplicam -se regras padrão para o código-golfe . A finalização mais curta vence.
Inclua como você resolveu o desafio em sua inscrição.
n
, portanto, possui o dobro dos termos que você deseja.n^2+1
termos do OEIS A004016 .Respostas:
Python 2 , 43 bytes
Experimente online!
Isso é magia negra.
Oferecendo 250 representantes para uma prova de redação.Vejaa resposta de Lynnpara uma prova e explicação.fonte
Haskell , 48 bytes
Experimente online!
Usa a fórmula "magia negra" do xnor:
Uma prova de sua correção e uma explicação de como o xnor conseguiu expressá-lo em 43 bytes de Python, podem ser encontradas aqui .
fonte
Wolfram Language (Mathematica) ,
535150 bytes-1 byte graças a @miles
Experimente online!
Quão?
Em vez de pensar nisso:
Pense assim:
Então aplicamos a matriz
[[sqrt(3)/2, 0], [1/2, 1]]
de transformação para transformar a segunda figura na primeira.Então, devemos encontrar o círculo na grade triangular em termos de coordenadas cartesianas.
Então, encontramos pontos de rede
x, y
tais quex^2 + x y + y^2 <= r^2
Por exemplo, com
r = 3
:fonte
x^2+x y+y^2
também pode ser derivada da Lei dos Cossenos com 120 graus.x^2+x y+y^2
->x(x+y)+y^2
salva um bytex^2 + xy + y^2
também pode ser derivada da norma de um número inteiro de Eistenstein, que éa^2 - ab + b^2
. Observe que o sinal dea
eb
é irrelevante, exceto no termo,ab
portanto ele tem a mesma quantidade de soluções.Wolfram Language (Mathematica) , 48 bytes
Baseado no OEIS A004016 .
Experimente online!
fonte
CJam (24 bytes)
Este é um bloco anônimo (função) que pega um argumento na pilha e deixa o resultado na pilha. Conjunto de testes online . Observe que os dois casos maiores são muito lentos.
Explicação
alefalpha observou em um comentário sobre a pergunta que
e a resposta do xnor implementa essa soma (embora eu não tenha certeza se a prova não publicada a usa explicitamente) como
Minha prova de correção dessa fórmula é baseada em algumas informações obtidas no link OEIS dos alefalpha:
para o qual a referência relevante é o artigo de Hirschhorn. Uma prova elementar é possível usando nada além de uma compreensão básica de números complexos (raízes de unidade de cubo, magnitude), o conceito de funções geradoras, a derivada dexuma e a regra da cadeia de diferenciação. Em resumo, primeiro provamos, a partir dos primeiros princípios, a identidade do produto triplo Jacobi
Code dissection
fonte
J, 27 bytes
Try it online!
Based on JungHwan Min's method.
Explanation
fonte
APL (Dyalog Classic), 23 bytes
Try it online!
tribute to xnor's and lynn's answers
the last test is commented because it needs more memory, e.g.
MAXWS=200M
in the envfonte
Jelly, 14 bytes
Uses @JungHwanMin's method.
Try it online!
fonte
Jelly,
1513 bytes-2 thanks to Dennis (just increment the square to avoid concatenation of a zero; avoid head by using a post-difference modulo-slice rather than a pre-difference slice)
Uses the "black magic" method of honing in on the answer that was exposed by xnor in their Python answer, but uses iteration rather than recursion (and a little less calculation)
A monadic link accepting a non-negative integer and returning a positive integer.
Try it online! Or see the test-suite.
How?
fonte
JavaScript (ES6), 65 bytes
This is a port of @JungHwanMin's solution.
Try it online!
Original answer (ES7), 70 bytes
Simply walks through the grid and counts the matching points.
Try it online!
fonte
true
instead of1
; 46 if we also integer-divide it). And I don't know JavaScript well enough to golf the integer-divisions~~(a/b)
, but I'm sure there is a shorter way for those as well..Java 8, 65 bytes
Port of @xnor's Python 2 answer.
Try it online.
fonte
Pari/GP, 42 bytes
Using the built-in
qfrep
.Try it online!
fonte
C# (Visual C# Interactive Compiler), 68 bytes
Try it online!
Same as everyone else, unfortunately. I know there's probably a better way of writing this, but declaring and calling a lambda at the same time in c# is not exactly something I do, well, ever. Though in my defense, I can't think of a good reason (outside code golf, of course) to do so. Still, if someone knows how you can do this, let me know and/or steal the credit, I guess.
fonte
Wolfram Language (Mathematica), 39 bytes
Try it online!
Using JungHwan Min's coordinate transformation and simply counting the solutions over the integers.
fonte
05AB1E, 15 bytes
Port of @JonathanAllans Jelly answer, which in turn is a derivative from @xnor's 'black magic' formula.
Try it online or verify all test cases.
Explanation:
fonte