Napisz program lub funkcję, która podając całkowity promień r zwraca liczbę jednostek kwadratów, przez które przechodzi promień r wyśrodkowany na początku. Jeśli okrąg przechodzi dokładnie przez punkt na siatce, który nie jest liczony jako przejście przez sąsiednie kwadraty jednostek.
Oto ilustracja dla r = 5 :
Ilustracja Kival Ngaokrajang, znaleziona w OEIS
Przykłady:
0 → 0
1 → 4
4 → 28
5 → 28
49 → 388
50 → 380
325 → 2540
5524 → 44180
5525 → 44020
N = 50
).Odpowiedzi:
Python 2 , 54 bajty
Wypróbuj online!
Mniej golfa (55 bajtów) ( TIO )
Ocenia to wynik jako
8*r
, a następnie koryguje przecięcia wierzchołków. Wynik jest taki8*r-g(r*r)
, żeg(x)
liczy się liczba sposobów pisaniax
jako suma dwóch kwadratów (opróczg(0)=0
).Jeśli okrąg nigdy nie przechodzi przez żadne wierzchołki, liczba dotkniętych komórek byłaby równa liczbie skrzyżowanych krawędzi. Okrąg przechodzi przez
2*r
pionowe linie siatki i2*r
poziome linie siatki, mijając je w obu kierunkach, w sumie8*r
.Ale każde przejście na wierzchołku liczy się jako dwa skrzyżowania krawędzi, jednocześnie wchodząc tylko do jednej nowej komórki. Tak więc kompensujemy odejmując liczbę skrzyżowań wierzchołków. Obejmuje to punkty na osiach, jak
(r,0)
również tróje pitagorejskie, jak(4,3)
nar=5
.Liczymy na jednym kwadrancie punkty
(x,y)
zx>=0
iy>0
zx*x+y*y==n
, a następnie pomnożyć przez 4. Robimy to poprzez zliczanie LICZBAsqrt(r*r-x*x)
które są cały numer dox
w przedziale[0,r)
.źródło
Mathematica, 48 bajtów
Patrzy na pierwszy kwadrant i liczy liczbę komórek siatki, dla których dane wejściowe mieszczą się między normami lewego dolnego i prawego górnego rogu komórki (oczywiście mnożąc wynik przez 4).
źródło
8#-SquaresR[2,#^2]Sign@#&
oparta jest na poście xnorSquaresR
istnieje. Możesz to opublikować samodzielnie (lub pozwolić, aby xnor opublikował to).Python 2 , 72 bajty
Wypróbuj online!
źródło
Galaretka ,
21131211 bajtówWypróbuj online!
Jak to działa
źródło
Perl 6, 61 bajtów
Jak to działa
źródło
AWK, 90 bajtów
Stosowanie:
Wystarczy przeszukać kwadrant 1, aby znaleźć wszystkie pola, które przecinają okrąg. Symetria pozwala na pomnożenie przez 4. Może pochodzić z
-$1 to $1
, ale to zajmie więcej bajtów i będzie mniej wydajne. Oczywiście nie jest to najbardziej efektywny czasowo algorytm, ale uruchomienie skrzynki 5525 na moim komputerze zajmuje tylko około 16 sekund.źródło
Haskell, 74 bajty
Całkiem prosto, policz liczbę kwadratów między (0,0) a (n, n), gdzie lewy dolny jest wewnątrz koła, a prawy górny jest poza okręgiem, a następnie pomnóż przez 4.
źródło
Pyth , 29 bajtów
Spróbuj!
Wyjaśnienie
źródło
Partia, 147 bajtów
Nieco inspirowane odpowiedziami AWK i Haskell.
źródło
Narzędzia Bash + Unix, 127 bajtów
Wypróbuj online!
Wystarczy przejrzeć wszystkie punkty w pierwszej ćwiartce, policzyć je i pomnożyć przez 4. Może być bardzo wolny, ale działa.
źródło
JavaScript (ES7), 76 bajtów
źródło
n
do do0
?n
promień, jak ik
iterację, a wszystkie próby wychodziły z tych samych bajtówk<n?...
ale tracę te bajty, które zmieniają kolejność,n**2-k++**2
ponieważ pierwszeństwo operatora jest błędne podczas cofania, a odejmowanie nie jest przemienne, więc lewa strona zawsze musi miećk-1
i potrzebuje nawiasów. Chyba że znalazłeś sposób?