Задний план
Треугольная сетка представляет собой сетку , образованная на регулярной основе черепицы плоскости с равносторонними треугольниками с длиной стороны 1. На рисунке ниже приведена пример треугольной сетки.
Треугольная решетка точка является вершиной треугольника , образующего треугольную сетку.
Начало координат - это фиксированная точка на плоскости, которая является одной из точек треугольной решетки.
Вызов
Дайте неотрицательное целое число n
, найдите количество треугольных точек решетки, евклидово расстояние от которых меньше или равно n
.
пример
На следующем рисунке приведен пример n = 7
(для удобства показана только 60-градусная область, где точка A является исходной точкой):
Тестовые случаи
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
Подсказка : эта последовательность не OEIS A003215 .
правила
Применяются стандартные правила для код-гольфа . Самое короткое представление выигрывает.
Пожалуйста, укажите, как вы решили проблему в своем представлении.
n
, поэтому имеет в два раза больше терминов, чем вы хотите.n^2+1
членов OEIS A004016 .Ответы:
Python 2 , 43 байта
Попробуйте онлайн!
Это черная магия.
Предлагая 250 повторений для письменного доказательства.Смотритеответ Линндля доказательства и объяснения.источник
Haskell , 48 байтов
Попробуйте онлайн!
Использует формулу xnor "черная магия":
Можно найти доказательство его правильности и объяснение того, как xnor удалось выразить это в 43 байтах Python. здесь .
источник
Wolfram Language (Mathematica) ,
535150 байт-1 байт благодаря @miles
Попробуйте онлайн!
Как?
Вместо того, чтобы думать об этом:
Думайте об этом так:
Таким образом, мы применяем матрицу
[[sqrt(3)/2, 0], [1/2, 1]]
преобразования, чтобы преобразовать вторую фигуру в первую.Затем мы должны найти круг в треугольной сетке в терминах декартовых координат.
Таким образом, мы находим точки решетки
x, y
такие, чтоx^2 + x y + y^2 <= r^2
Например, с
r = 3
:источник
x^2+x y+y^2
также может быть выведена из закона косинусов с 120 градусами.x^2+x y+y^2
->x(x+y)+y^2
сохраняет байтx^2 + xy + y^2
также может быть получена из нормы целого числа Эйстенштейна, которое естьa^2 - ab + b^2
. Обратите внимание, что знакa
и неb
имеет значения, за исключением термина,ab
поэтому он имеет такое же количество решений.Wolfram Language (Mathematica) , 48 байтов
Основано на OEIS A004016 .
Попробуйте онлайн!
источник
CJam (24 байта)
Это анонимный блок (функция), который принимает один аргумент в стеке и оставляет результат в стеке. Набор онлайн-тестов . Обратите внимание, что два самых больших случая слишком медленные.
объяснение
алефальф отметил в комментарии на вопрос, что
Мое доказательство правильности этой формулы основано на некоторой информации, полученной из ссылки OEIS алефальфы:
Вскрытие кода
источник
J , 27 байт
Попробуйте онлайн!
На основе JungHwan Мин методы .
объяснение
источник
APL (Dyalog Classic) , 23 байта
Попробуйте онлайн!
дань уважения к ответам xnor и lynn
последний тест прокомментирован, потому что ему нужно больше памяти, например
MAXWS=200M
в envисточник
Желе , 14 байт
Использует метод @ JungHwanMin .
Попробуйте онлайн!
источник
Желе ,
1513 байт-2 благодаря Деннису (просто увеличивайте квадрат, чтобы избежать конкатенации нуля; избегайте заголовка, используя пост-разностный по модулю срез, а не доразностный срез)
Использует метод "черной магии" для оттачивания ответа, который был представлен xnor в их ответе на Python , но использует итерацию, а не рекурсию (и немного меньше вычислений)
Монадическая ссылка, принимающая неотрицательное целое число и возвращающая положительное целое число.
Попробуйте онлайн! Или посмотрите набор тестов .
Как?
источник
JavaScript (ES6), 65 байт
Это порт решения @ JungHwanMin .
Попробуйте онлайн!
Оригинальный ответ (ES7), 70 байт
Просто идет по сетке и считает подходящие точки.
Попробуйте онлайн!
источник
true
вместо1
; 46, если мы также делим его на целое число). И я не знаю JavaScript достаточно хорошо, чтобы играть в гольф целочисленных делений~~(a/b)
, но я уверен, что есть и более короткий путь для них ..Java 8, 65 байт
Порт @xnor 's Python 2 ответа .
Попробуйте онлайн.
источник
Пари / ГП , 42 байта
Использование встроенного
qfrep
.Попробуйте онлайн!
источник
C # (интерактивный компилятор Visual C #) , 68 байт
Попробуйте онлайн!
Как и все остальные, к сожалению. Я знаю, что, возможно, есть лучший способ написать это, но объявлять и вызывать лямбду одновременно в c # - это не совсем то, что я делаю, ну, когда-нибудь. Хотя в свою защиту я не могу придумать вескую причину (конечно, вне гольф-кода) сделать это. Тем не менее, если кто-то знает, как вы можете сделать это, дайте мне знать и / или украсть кредит, я думаю.
источник
Wolfram Language (Mathematica) , 39 байт
Попробуйте онлайн!
Использование преобразования координат JungHwan Min и простой подсчет решений по целым числам.
источник
05AB1E , 15 байтов
Порт @JonathanAllan сек Jelly ответ , который , в свою очередь , является производным от @ XNOR Формулы «черной магии» .
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник