Следующая картина показывает проблему:
Напишите функцию, которая, учитывая целое число в качестве радиуса окружности, вычисляет количество точек решетки внутри центрированной окружности (включая границу).
Изображение показывает:
f[1] = 5 (blue points)
f[2] = 13 (blue + red points)
другие значения для вашей проверки / отладки:
f[3] = 29
f[10] = 317
f[1000] = 3,141,549
f[2000] = 12,566,345
Должен иметь разумную производительность. Скажем, меньше минуты для f [1000].
Самый короткий код выигрывает. Применяются обычные правила Code-Golf.
Пожалуйста, опубликуйте расчет и время f [1001] в качестве примера.
Ответы:
J,
211918Строит комплексы от -x-xj до x + xj и принимает величину.
Изменить: с
>:
Изменить 2: с крюком и монадическим
~
. По какой-то причине работает в несколько раз медленнее, но все равно на 10 секунд для f (1000).источник
i:
, я так краду это, спасибо!>:
. сумасшедший>:
. Но это крутой ответ!:)
J,
2721Очень брутально: вычисляет sqrt (x² + y²) в диапазоне [-n, n] и считает ≤n . Все еще очень приемлемые времена для 1000.
Редактировать :
i:y
немного короче, чемy-i.>:+:y
. Спасибо Джесси Милликен !источник
Рубин 1.9,
62 5854 персонажаПример:
источник
Python 55 символов
источник
f=lambda n:1+4*sum(int((n*n-i*i)**.5)for i in range(n))
на 17 символов короче.Haskell, 41 байт
Подсчитывает точки в квадранте
x>=0, y>0
, умножает на 4, добавляет 1 к центральной точке.источник
Haskell, 44 байта
источник
w<-[-n..n]
где (обычно) есть логическое значение?JavaScript (ES6), 80 байт (не конкурирует, потому что ES6 слишком новый)
Альтернативная версия, также 80 байт:
Версия ES7, также 80 байт:
источник
Python 2, 48 байт
Подобно решению fR0DDY , но рекурсивно и возвращает число с плавающей запятой. Возвращение int составляет 51 байт:
источник
C (gcc) , 60 байтов
Попробуйте онлайн!
Зацикливает первый квадрант, умножает результат на 4 и добавляет один. Немного меньше в гольф
источник
APL (Dyalog Extended) , 14 байтов
Попробуйте онлайн!
Несмотря на отсутствие
i:
встроенного в J встроенного диапазона (от -n до n), APL Extended имеет более короткий синтаксис в других областях.источник
Japt
-x
, 12 байтПопробуйте онлайн!
Объяснение:
источник
PHP,
8583 байтаКод:
Его результат (проверьте https://3v4l.org/bC0cY для нескольких версий PHP):
Негольфированный код:
На github можно найти простую реализацию, которая проверяет
$n*($n+1)
точки (и работает на 1000 медленнее, но все еще вычисляетf(1001)
менее чем за 0,5 секунды) и набор тестов (с использованием данных примера, приведенных в вопросе) .источник
Clojure / ClojureScript, 85 символов
Грубая сила заставляет первый квадрант, включая ось Y, но не ось X. Создает 4 для каждой точки, затем добавляет их вместе с 1 для начала координат. Запускается менее чем за 2 секунды для ввода 1000.
Злоупотребляет,
for
чтобы определить переменную и сохранить несколько символов. Делая то же самое для создания псевдонимаrange
, вы не сохраняете никаких символов (и делаете его значительно медленнее), и кажется маловероятным, что вы собираетесь что-либо сохранить, создав квадратную функцию.источник
Пайк, 14 байтов, неконкурирующий
Попробуй это здесь!
источник
Mathematica, 35 символов
Поднято с https://oeis.org/A000328
https://reference.wolfram.com/language/ref/SquaresR.html
SquaresR[2,k]
число способов представить k как сумму двух квадратов, которая равна числу точек решетки на окружности радиуса k ^ 2. Суммируйте от k = 0 до k = n ^ 2, чтобы найти все точки на или внутри круга радиуса n.источник
2~SquaresR~k~Sum~{k,0,#^2}&
чтобы сделать его корочеTcl, 111 байт
Простая дискретная петля x над квадрантом I, подсчитывающая наибольшее y с помощью теоремы Пифагора на каждом шаге. Результат в 4 раза больше суммы плюс один (для центральной точки).
Размер программы зависит от значения r . Замените
{1001 0 -1}
на,"$argv 0 -1"
и вы можете запустить его с любым значением аргумента командной строки для r .Вычисляет f (1001) →
3147833.0
примерно за 1030 микросекунд, AMD Sempron 130, 2,6 ГГц, 64-разрядный процессор, Windows 7.Очевидно, что чем больше радиус, тем ближе приближение к PI: f (10000001) выполняется примерно за 30 секунд, создавая 15-значное значение, что примерно соответствует точности двойного IEEE.
источник
Stax , 11 байт
Запустите и отладьте его
источник