tło
Trójkątny siatka jest siatką tworzą płaszczyznę płytki z regularnie trójkątów równobocznych o boku 1. Poniższy rysunek przedstawia przykład trójkątnej kratki.
Trójkątny punkt kratowy jest wierzchołkiem trójkąta tworzącego trójkątną siatkę.
Pochodzenie jest stałym punktem na płaszczyźnie, która jest jednym z trójkątnych punktów kratowych.
Wyzwanie
Biorąc pod uwagę nieujemną liczbę całkowitą n
, znajdź liczbę trójkątnych punktów sieci, których odległość euklidesowa od początku jest mniejsza lub równa n
.
Przykład
Poniższy rysunek jest przykładem n = 7
(pokazujący dla wygody tylko obszar 60 stopni, z którego punktem początkowym jest punkt A):
Przypadki testowe
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
Wskazówka : Ta sekwencja nie jest OEIS A003215 .
Zasady
Obowiązują standardowe zasady gry w golfa kodowego . Najkrótsze zgłoszenie wygrywa.
W zgłoszeniu prosimy o uwzględnienie sposobu rozwiązania problemu.
n
, więc ma dwa razy więcej terminów, niż chcesz.n^2+1
warunków OEIS A004016 .Odpowiedzi:
Python 2 , 43 bajty
Wypróbuj online!
To jest czarna magia.
Oferowanie 250 powtórzeń za pisemny dowód.Zobaczodpowiedź Lynn,aby uzyskać dowód i wyjaśnienie.źródło
Haskell , 48 bajtów
Wypróbuj online!
Wykorzystuje formułę „czarnej magii” xnor:
Dowód jego poprawności oraz wyjaśnienie, w jaki sposób xnor zdołał wyrazić to w 43 bajtach Pythona, można znaleźć tutaj .
źródło
Wolfram Language (Mathematica) ,
535150 bajtów-1 bajt dzięki @miles
Wypróbuj online!
W jaki sposób?
Zamiast myśleć w ten sposób:
Pomyśl o tym w ten sposób:
Dlatego stosujemy macierz
[[sqrt(3)/2, 0], [1/2, 1]]
transformacji, aby przekształcić drugą cyfrę na pierwszą.Następnie musimy znaleźć okrąg w trójkątnej siatce pod względem współrzędnych kartezjańskich.
Tak więc znajdujemy
x, y
takie punkty siatkix^2 + x y + y^2 <= r^2
Na przykład z
r = 3
:źródło
x^2+x y+y^2
może również pochodzić z prawa cosinusów o 120 stopniach.x^2+x y+y^2
->x(x+y)+y^2
zapisuje bajtx^2 + xy + y^2
można również wyprowadzić z normy liczby całkowitej Eistensteina, którą jesta^2 - ab + b^2
. Zauważ, że znaka
ib
jest nieistotny, z wyjątkiem terminu,ab
więc ma taką samą ilość rozwiązań.Wolfram Language (Mathematica) , 48 bajtów
Na podstawie OEIS A004016 .
Wypróbuj online!
źródło
CJam (24 bajty)
Jest to anonimowy blok (funkcja), który pobiera jeden argument ze stosu i pozostawia wynik na stosie. Zestaw testów online . Zauważ, że dwa największe przypadki są zbyt wolne.
Wyjaśnienie
alephalpha zauważył w komentarzu do pytania, że
a odpowiedź xnora implementuje tę sumę (chociaż nie jestem pewien, czy ich nieopublikowany dowód używa jej jawnie) jako
Mój dowód poprawności tej formuły opiera się na pewnych informacjach uzyskanych z linku OEIS Alephalpha:
dla których odnośnikiem jest artykuł Hirschhorna. Elementarny dowód jest możliwy przy użyciu wyłącznie podstawowego zrozumienia liczb zespolonych (pierwiastki sześcianu jedności, wielkości), koncepcji generowania funkcji, pochodnej i reguły łańcucha różnicowania. Podsumowując, na podstawie pierwszych zasad najpierw potwierdzamy tożsamość potrójnego produktu Jacobi To następnie ładuje dowód, że gdzie jest pierwotnym pierwiastkiem kostki jedności. Ostatnim dużym krokiem jest użycie tego, aby to pokazaćxa
Rozbiór kodu
źródło
J , 27 bajtów
Wypróbuj online!
Na podstawie metody JungHwan Min .
Wyjaśnienie
źródło
APL (Dyalog Classic) , 23 bajty
Wypróbuj online!
hołd XNOR użytkownika i Lynn odpowiedzi
ostatni test jest komentowany, ponieważ potrzebuje więcej pamięci, np.
MAXWS=200M
w envźródło
Galaretka , 14 bajtów
Wykorzystuje metodę @ JungHwanMin .
Wypróbuj online!
źródło
Galaretka ,
1513 bajtów-2 dzięki Dennisowi (wystarczy zwiększyć kwadrat, aby uniknąć konkatenacji zera; unikaj głowy, używając plastra modulo po różnicy zamiast plastra przed różnicą)
Używa metody „czarnej magii” do szlifowania odpowiedzi, która została ujawniona przez xnor w odpowiedzi Pythona , ale używa iteracji zamiast rekurencji (i trochę mniej obliczeń)
Łącze monadyczne akceptuje nieujemną liczbę całkowitą i zwraca dodatnią liczbę całkowitą.
Wypróbuj online! Lub zobacz pakiet testowy .
W jaki sposób?
źródło
JavaScript (ES6), 65 bajtów
To jest port rozwiązania @ JungHwanMin .
Wypróbuj online!
Oryginalna odpowiedź (ES7), 70 bajtów
Po prostu przechodzi przez siatkę i liczy pasujące punkty.
Wypróbuj online!
źródło
true
zamiast1
; 46, jeśli podzielimy ją również na liczby całkowite). I nie znam JavaScript na tyle dobrze, by grać w podziały na liczby całkowite~~(a/b)
, ale jestem pewien, że jest też krótsza droga dla tych.Java 8, 65 bajtów
Port odpowiedzi @xnor na Python 2 .
Wypróbuj online.
źródło
Pari / GP , 42 bajty
Korzystanie z wbudowanego
qfrep
.Wypróbuj online!
źródło
C # (interaktywny kompilator Visual C #) , 68 bajtów
Wypróbuj online!
Niestety tak samo jak wszyscy inni. Wiem, że istnieje prawdopodobnie lepszy sposób na napisanie tego, ale zadeklarowanie i wywołanie lambda w tym samym czasie w c # nie jest dokładnie czymś, co robię, cóż, zawsze. Chociaż w mojej obronie nie mogę wymyślić dobrego powodu (oczywiście poza golfem), aby to zrobić. Jeśli jednak ktoś wie, jak to zrobić, daj mi znać i / lub ukraść kredyt.
źródło
Wolfram Language (Mathematica) , 39 bajtów
Wypróbuj online!
Za pomocą transformacji współrzędnych JungHwan Min i po prostu zliczając rozwiązania nad liczbami całkowitymi.
źródło
05AB1E , 15 bajtów
Port @JonathanAllan s Jelly odpowiedzi , który z kolei jest pochodną od użytkownika @ XNOR wzoru „czarna magia” .
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło