Poniższy obrazek pokazuje problem:
Napisz funkcję, która, biorąc pod uwagę liczbę całkowitą jako promień okręgu, oblicza liczbę punktów sieci wewnątrz wyśrodkowanego koła (łącznie z granicą).
Obraz pokazuje:
f[1] = 5 (blue points)
f[2] = 13 (blue + red points)
inne wartości dla twojego sprawdzania / debugowania:
f[3] = 29
f[10] = 317
f[1000] = 3,141,549
f[2000] = 12,566,345
Powinien mieć rozsądną wydajność. Powiedzmy, że mniej niż minuta dla f [1000].
Najkrótszy kod wygrywa. Obowiązują zwykłe zasady gry w golfa.
Proszę zamieścić obliczenie i czas dla f [1001] jako przykład.
Odpowiedzi:
J,
211918Buduje kompleksy od -x-xj do x + xj i nabiera wielkości.
Edycja: Z
>:
Edycja 2: Z hakiem i monadycznie
~
. Działa kilka razy wolniej z jakiegoś powodu, ale wciąż 10-sekundowych sekund dla f (1000).źródło
i:
, tak bardzo to kradnę, dzięki!>:
. derp>:
. Ale hej, to fajna odpowiedź!:)
J,
2721Bardzo brutalny: oblicza sqrt (x² + y²) w zakresie [-n, n] i zlicza elementy ≤n . Nadal bardzo dopuszczalne czasy dla 1000.
Edycja :
i:y
jest nieco krótsza niży-i.>:+:y
. Dzięki Jesse Millikan !źródło
Ruby 1.9,
62 5854 znakówPrzykład:
źródło
Python 55 znaków
źródło
f=lambda n:1+4*sum(int((n*n-i*i)**.5)for i in range(n))
ma 17 znaków krótszy.Haskell, 41 bajtów
Liczy punkty w kwadrancie
x>=0, y>0
, mnoży przez 4, dodaje 1 do punktu środkowego.źródło
Haskell, 44 bajty
źródło
w<-[-n..n]
gdzie (zwykle) jest wartość logiczna?JavaScript (ES6), 80 bajtów (niekonkurencyjny, ponieważ ES6 jest zbyt nowy)
Alternatywna wersja, także 80 bajtów:
Wersja ES7, również 80 bajtów:
źródło
Python 2, 48 bajtów
Podobnie jak rozwiązanie fR0DDY , ale rekurencyjne i zwraca liczbę zmiennoprzecinkową. Zwrócenie liczby całkowitej wynosi 51 bajtów:
źródło
C (gcc) , 60 bajtów
Wypróbuj online!
Pętle w pierwszym kwadrancie mnoży wynik przez 4 i dodaje jeden. Nieco mniej golfa
źródło
APL (Dyalog Extended) , 14 bajtów
Wypróbuj online!
Pomimo braku
i:
wbudowanego J (włącznie z zakresu od -n do n), APL Extended ma krótszą składnię w innych obszarach.źródło
Japt
-x
, 12 bajtówWypróbuj online!
Wyjaśnienie:
źródło
PHP,
8583 bajtówKod:
Jego wynik (sprawdź https://3v4l.org/bC0cY dla wielu wersji PHP):
Nieskluczony kod:
Naiwną implementację, która sprawdza
$n*($n+1)
punkty (i działa 1000 wolniej, ale nadal obliczaf(1001)
w czasie krótszym niż 0,5 sekundy) oraz zestaw testów (używając przykładowych danych podanych w pytaniu) można znaleźć na github .źródło
Clojure / ClojureScript, 85 znaków
Brute wymusza pierwszą ćwiartkę, w tym oś y, ale nie oś x. Generuje 4 dla każdego punktu, a następnie dodaje je razem z 1 dla początku. Działa w czasie poniżej 2 sekund dla wejścia 1000.
Nadużywają,
for
aby zdefiniować zmienną i zapisać kilka znaków. Robiąc to samo, aby utworzyć alias dlarange
, nie zapisujesz żadnych znaków (i sprawia, że działa on znacznie wolniej) i wydaje się mało prawdopodobne, że cokolwiek uratujesz, wykonując kwadratową funkcję.źródło
Pyke, 14 bajtów, niekonkurujący
Wypróbuj tutaj!
źródło
Mathematica, 35 znaków
Odebrano z https://oeis.org/A000328
https://reference.wolfram.com/language/ref/SquaresR.html
SquaresR[2,k]
jest liczbą sposobów przedstawienia k jako sumy dwóch kwadratów, która jest taka sama jak liczba punktów sieci na okręgu o promieniu k ^ 2. Suma od k = 0 do k = n ^ 2, aby znaleźć wszystkie punkty na lub wewnątrz okręgu o promieniu n.źródło
2~SquaresR~k~Sum~{k,0,#^2}&
aby było krótszeTcl, 111 bajtów
Prosta dyskretna pętla x w kwadrancie I, licząc największe y, używając twierdzenia Pitagorasa na każdym kroku. Wynik to 4-krotność sumy plus jeden (dla punktu środkowego).
Rozmiar programu zależy od wartości r . Wymień
{1001 0 -1}
się"$argv 0 -1"
i można go uruchomić z dowolnej wartości argumentów wiersza polecenia do r .Oblicza f (1001) →
3147833.0
w około 1030 mikrosekund, 64-bitowy procesor AMD Sempron 130 2,6 GHz, Windows 7.Oczywiście im większy promień, tym bliższe przybliżenie do PI: f (10000001) biegnie w około 30 sekund, dając 15-cyfrową wartość, która jest o precyzji podwójnej IEEE.
źródło
Stax , 11 bajtów
Uruchom i debuguj
źródło