Напишите программу или функцию, которая при заданном целочисленном радиусе r возвращает количество единичных квадратов, через которые проходит круг с радиусом r с центром в начале координат. Если круг проходит точно через точку на сетке, которая не считается проходящей через соседние единичные квадраты.
Вот иллюстрация для r = 5 :
Иллюстрация Киваля Нгаокражанга, найденная в OEIS
Примеры:
0 → 0
1 → 4
4 → 28
5 → 28
49 → 388
50 → 380
325 → 2540
5524 → 44180
5525 → 44020
N = 50
).Ответы:
Python 2 , 54 байта
Попробуйте онлайн!
Меньше гольфа (55 байт) ( TIO )
Это оценивает выходные данные как
8*r
, а затем корректирует пересечение вершин. Результат8*r-g(r*r)
, гдеg(x)
считается количество способов записиx
в виде суммы двух квадратов (кромеg(0)=0
).Если бы окружность никогда не проходила через какие-либо вершины, количество прикосновений к ячейкам равнялось бы количеству пересеченных ребер. Круг проходит через
2*r
вертикальные линии сетки и2*r
горизонтальные линии сетки, проходя каждый в обоих направлениях, в общей сложности8*r
.Но каждое пересечение в вершине считается как два пересечения ребер при входе только в одну новую ячейку. Таким образом, мы компенсируем, вычитая количество пересечений вершин. Это включает в себя точки на осях,
(r,0)
а также пифагорейские тройки, как(4,3)
дляr=5
.Мы рассчитываем для одного квадранта точки
(x,y)
сx>=0
иy>0
сx*x+y*y==n
, затем умножаем на 4. Мы делаем это путем подсчета числа, являющегосяsqrt(r*r-x*x)
целым числом дляx
интервала[0,r)
.источник
Mathematica, 48 байтов
Просматривает первый квадрант и подсчитывает количество ячеек сетки, для которых входные данные попадают между нормами нижнего левого и верхнего правого угла ячейки (конечно, умножая результат на 4).
источник
8#-SquaresR[2,#^2]Sign@#&
основан на сообщении xnorSquaresR
существует. Не стесняйтесь опубликовать это самостоятельно (или позвольте xnor опубликовать это).Python 2 , 72 байта
Попробуйте онлайн!
источник
Желе ,
21131211 байтПопробуйте онлайн!
Как это работает
источник
Perl 6, 61 байт
Как это работает
источник
AWK, 90 байт
Использование:
Просто выполните поиск в квадранте 1, чтобы найти все поля, которые будут пересекать круг. Симметрия допускает умножение на 4. Можно было бы пойти
-$1 to $1
, но это заняло бы больше байтов и было бы менее эффективным. Очевидно, что это не самый эффективный по времени алгоритм, но для запуска случая 5525 на моей машине требуется всего около 16 секунд.источник
Haskell, 74 байта
Довольно просто, посчитайте количество квадратов между (0,0) и (n, n), где нижний левый находится внутри круга, а верхний правый за пределами круга, затем умножьте на 4.
источник
Pyth , 29 байт
Попытайся!
объяснение
источник
Пакет, 147 байт
Несколько вдохновленный ответами AWK и Haskell.
источник
Утилиты Bash + Unix, 127 байт
Попробуйте онлайн!
Просто пройдите все точки в первом квадранте, сосчитайте их и умножьте на 4. Это может быть очень медленно, но это работает.
источник
JavaScript (ES7), 76 байт
источник
n
вниз0
?n
радиус, иk
итерацию, и все попытки выходили из одних и тех же байтовk<n?...
но я теряю эти байты при переупорядочении,n**2-k++**2
потому что при обратном ходе оператор неверен, а вычитание некоммутативно, поэтому левой стороне всегдаk-1
нужны скобки. Если вы не нашли способ?