Треугольные решетки Точки рядом с началом

34

Задний план

Треугольная сетка представляет собой сетку , образованная на регулярной основе черепицы плоскости с равносторонними треугольниками с длиной стороны 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 .

правила

Применяются стандартные правила для . Самое короткое представление выигрывает.

Пожалуйста, укажите, как вы решили проблему в своем представлении.

фонтанчик для питья
источник
7
OEIS A053416 - это последовательность количества точек, содержащихся в окружности диаметра, а не радиуса n, поэтому имеет в два раза больше терминов, чем вы хотите.
Нил
Соответствующие Википедия и Mathworld . Содержит формулу xnor, а не доказательство.
user202729
4
Это сумма первых n^2+1членов OEIS A004016 .
алефальфа

Ответы:

49

Python 2 , 43 байта

f=lambda n,a=1:n*n<a/3or n*n/a*6-f(n,a+a%3)

Попробуйте онлайн!

Это черная магия.

Предлагая 250 повторений для письменного доказательства. Смотритеответ Линндля доказательства и объяснения.

XNOR
источник
7
Как это работает? Мне было интересно уже 30 минут ... Это выглядит так просто, но я не могу найти связь между этой рекурсией и кругами ...
JungHwan Мин
7
@JungHwanMin Мое доказательство - эпическое путешествие по плоской геометрии, целым числам Эйзенштейна, факторизации по числовым полям, квадратичной взаимности, арифметическим прогрессиям и взаимозаменяемым суммам - все для такого простого выражения. Написание всего этого было бы серьезным делом, на которое у меня сейчас нет времени, поэтому я надеюсь, что кто-то другой предоставит доказательство, вероятно, более простое, чем мое, которое сделает связь более ясной.
xnor
14
доказательство . Это длиннее, чем у Линн, но более самодостаточно: в нем не используются бездоказательные утверждения о факторизации по целым числам Эйзенштейна.
Питер Тейлор
2
@PeterTaylor Чеддер Монах? Как в Darths & Droids?
Нил
3
@Neil, поздравляю с тем, что ты первый, кто спросил! Я зарегистрировал домен, чтобы использовать его в качестве разменной монеты для переговоров, уровень 1 в Академии.
Питер Тейлор
30

Haskell , 48 байтов

f n=1+6*sum[(mod(i+1)3-1)*div(n^2)i|i<-[1..n^2]]

Попробуйте онлайн!

Использует формулу xnor "черная магия":

f(n)=1+6a=0n23a+1n23a+2

Можно найти доказательство его правильности и объяснение того, как xnor удалось выразить это в 43 байтах Python. здесь .

1Nn2N=(x+yω)(x+yω)(x,y)

6×((# of divisors of N1 (mod 3))(# of divisors of N2 (mod 3)))

1n2

Линн
источник
4
Я, конечно, не ожидал этого, когда Кснор сказал: «За игрой в гольф стоит глубокая математическая идея».
Bubbler
29

Wolfram Language (Mathematica) , 53 51 50 байт

-1 байт благодаря @miles

Sum[Boole[x(x+y)+y^2<=#^2],{x,-2#,2#},{y,-2#,2#}]&

Попробуйте онлайн!

Как?

Вместо того, чтобы думать об этом:

введите описание изображения здесь

Думайте об этом так:

введите описание изображения здесь

Таким образом, мы применяем матрицу [[sqrt(3)/2, 0], [1/2, 1]]преобразования, чтобы преобразовать вторую фигуру в первую.

Затем мы должны найти круг в треугольной сетке в терминах декартовых координат.

(sqrt(3)/2 x)^2 + (1/2 x + y)^2 = x^2 + x y + y^2

Таким образом, мы находим точки решетки x, yтакие, чтоx^2 + x y + y^2 <= r^2

Например, с r = 3 :

введите описание изображения здесь

Юнг Хван Мин
источник
1
К вашему сведению, формула x^2+x y+y^2также может быть выведена из закона косинусов с 120 градусами.
Bubbler
3
x^2+x y+y^2-> x(x+y)+y^2сохраняет байт
мили
Формула x^2 + xy + y^2также может быть получена из нормы целого числа Эйстенштейна, которое есть a^2 - ab + b^2. Обратите внимание, что знак aи не bимеет значения, за исключением термина, abпоэтому он имеет такое же количество решений.
orlp
7

CJam (24 байта)

{_*_,f{)_)3%(@@/*}1b6*)}

Это анонимный блок (функция), который принимает один аргумент в стеке и оставляет результат в стеке. Набор онлайн-тестов . Обратите внимание, что два самых больших случая слишком медленные.

объяснение

алефальф отметил в комментарии на вопрос, что

Это сумма первых n ^ 2 + 1 членов OEIS A004016

е(N)знак равно1+6Σaзнак равно0N23a+1-N23a+2

Мое доказательство правильности этой формулы основано на некоторой информации, полученной из ссылки OEIS алефальфы:

Gf: 1 + 6 * Sum_ {n> = 1} x ^ (3 * n-2) / (1-x ^ (3 * n-2)) - x ^ (3 * n-1) / (1- х ^ (3 * п-1)). - Пол Д. Ханна, 3 июля 2011 г.

Иксa

ΠКзнак равно0(1-QК+1)(1+ИксQК+1)(1+Икс-1QК)знак равноΣКZQК(К+1)/2ИксК
Σм,NZωм-NQм2+мN+N2знак равноΠКзнак равно1(1-QК)31-Q3К
где ωявляется примитивным кубическим корнем единства. Последний большой шаг - использовать это, чтобы показать, что
Σм,NZQм2+мN+N2знак равно1+6ΣК0(Q3К+11-Q3К+1-Q3К+21-Q3К+2)

Вскрытие кода

{          e# Define a block. Stack: ... r
  _*       e#   Square it
  _,f{     e#   Map with parameter: invokes block for (r^2, 0), (r^2, 1), ... (r^2, r^2-1)
    )      e#     Increment second parameter. Stack: ... r^2 x with 1 <= x <= r^2
    _)3%(  e#     Duplicate x and map to whichever of 0, 1, -1 is equal to it (mod 3)
    @@/*   e#     Evaluate (r^2 / x) * (x mod 3)
  }
  1b6*     e#   Sum and multiply by 6
  )        e#   Increment to count the point at the origin
}
Питер Тейлор
источник
4

J , 27 байт

[:+/@,*:>:(*++&*:)"{~@i:@+:

Попробуйте онлайн!

На основе JungHwan Мин методы .

объяснение

[:+/@,*:>:(*++&*:)"{~@i:@+:  Input: n
                         +:  Double
                      i:     Range [-2n .. 2n]
                  "{~        For each pair (x, y)
                *:             Square both x and y
              +                Add x^2 and y^2
             +                 Plus
            *                  Product of x and y
        >:                   Less than or equal to
      *:                     Square of n
     ,                       Flatten
  +/                         Reduce by addition
миль
источник
3

Желе ,  15  13 байт

-2 благодаря Деннису (просто увеличивайте квадрат, чтобы избежать конкатенации нуля; избегайте заголовка, используя пост-разностный по модулю срез, а не доразностный срез)

Использует метод "черной магии" для оттачивания ответа, который был представлен xnor в их ответе на Python , но использует итерацию, а не рекурсию (и немного меньше вычислений)

²:Ѐ‘$Im3S×6C

Монадическая ссылка, принимающая неотрицательное целое число и возвращающая положительное целое число.

Попробуйте онлайн! Или посмотрите набор тестов .

Как?

²:Ѐ‘$Im3S×6C - Main Link: non-negative integer, n     e.g. 7
²             - square                                     49
     $        - last two links as a monad:
    ‘         -   increment                                50
  Ѐ          -   map across (implicit range of) right with:
 :            -     integer division                       [49,24,16,12,9,8,7,6,5,4,4,4,3,3,3,3,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0]
      I       - incremental differences                    [-25,-8,-4,-3,-1,-1,-1,-1,-1,0,0,-1,0,0,0,-1,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1]
       m3     - every third element                        [-25,-3,-1,0,0,-1,0,0,0,0,0,0,0,0,0,0,-1]
         S    - sum (vectorises)                           -31
          ×6  - multiply by six                           -186
            C - complement (1-X)                           187
Джонатан Аллан
источник
2

JavaScript (ES6), 65 байт

Это порт решения @ JungHwanMin .

f=(n,y=x=w=n*2)=>y-~w&&(x*x+x*y+y*y<=n*n)+f(n,y-=--x<-w&&(x=w,1))

Попробуйте онлайн!


Оригинальный ответ (ES7), 70 байт

Просто идет по сетке и считает подходящие точки.

f=(n,y=x=n*=2)=>y+n+2&&(x*x*3+(y-x%2)**2<=n*n)+f(n,y-=--x<-n&&(x=n,2))

Попробуйте онлайн!

Arnauld
источник
Портирование ответа xnor короче: 42 байта (вывод trueвместо 1; 46, если мы также делим его на целое число). И я не знаю JavaScript достаточно хорошо, чтобы играть в гольф целочисленных делений ~~(a/b), но я уверен, что есть и более короткий путь для них ..
Кевин Круйссен
1

Пари / ГП , 42 байта

Использование встроенного qfrep.

n->1+2*vecsum(Vec(qfrep([2,1;1,2],n^2,1)))

qfrep (q, B, {flag = 0}): вектор (половины) числа векторов норм от 1 до B для целочисленной и определенной квадратичной формы q. Если флаг равен 1, считать векторы четной нормы от 1 до 2В.

Попробуйте онлайн!

alephalpha
источник
0

C # (интерактивный компилятор Visual C #) , 68 байт

n=>{int g(int x,int y)=>x*x<y/3?1:x*x/y*6-g(x,y+y%3);return g(n,1);}

Попробуйте онлайн!

Как и все остальные, к сожалению. Я знаю, что, возможно, есть лучший способ написать это, но объявлять и вызывать лямбду одновременно в c # - это не совсем то, что я делаю, ну, когда-нибудь. Хотя в свою защиту я не могу придумать вескую причину (конечно, вне гольф-кода) сделать это. Тем не менее, если кто-то знает, как вы можете сделать это, дайте мне знать и / или украсть кредит, я думаю.

Эндрю Баумер
источник
0

05AB1E , 15 байтов

nD>L÷¥ā3%ÏO6*±Ì

Порт @JonathanAllan сек Jelly ответ , который , в свою очередь , является производным от @ XNOR Формулы «черной магии» .

Попробуйте онлайн или проверьте все контрольные примеры .

Объяснение:

n                # Square the (implicit) input-integer
 D>              # Duplicate it, and increase the copy by 1
   L             # Create a list in the range [1, input^2+1]
    ÷            # Integer divide input^2 by each of these integers
     ¥           # Take the deltas
      ā          # Push a list in the range [1, length] without popping the deltas itself
       3%        # Modulo each by 3
         Ï       # Only leave the values at the truthy (==1) indices
          O      # Take the sum of this list
           6*    # Multiply it by 6
             ±   # Take the bitwise NOT (-n-1)
              Ì  # And increase it by 2
                 # (after which the result is output implicitly)
Кевин Круйссен
источник