Задний план
Последовательность OEIS A272573 описывает спираль на гексагональной сетке следующим образом:
Начните спираль чисел на гексагональной плитке с начальным шестиугольником как a (1) = 1. a (n) - наименьшее положительное целое число, не равное или ранее смежное с его соседями.
Последовательность начинается
1, 2, 3, 4, 5, 6, 7, 4, 6, 8, 5, 9, 8, 10, 2, 11, ...
Вот иллюстрация спирального узора:
a(11) != 1
потому что тогда3
и1
будет смежным в двух местах.a(11) != 2
потому что тогда3
и2
будет смежным в двух местах.a(11) != 3
потому что тогда3
было бы прилегающим к себе.a(11) != 4
потому что тогда3
и4
будет смежным в двух местах.- Поэтому
a(11) = 5
.
Вызов
Задача состоит в том, чтобы написать программу, которая вычисляет A272573 . Это код-гольф , поэтому выигрывает самый короткий код.
code-golf
sequence
hexagonal-grid
Питер Кейджи
источник
источник
Ответы:
JavaScript (ES6),
267 .. 206199 байтВозвращает массив, содержащийN
Попробуйте онлайн!
Как?
Определения
По соглашению, мы будем называть угловой ячейкой ячейкой, которая имеет только одно ребро, общее с предыдущим слоем спирали, а боковую ячейку - ячейкой, которая имеет два общих ребра с предыдущим слоем. Как предложено Ourous, мы также можем рассматривать их как ячейки порядка 1 и порядка 2 соответственно.
Угловые клетки показаны желтым цветом ниже. Все остальные ячейки являются боковыми (кроме центральной ячейки, которая является частным случаем).
О сотовых соседях
Нам не нужно отслеживать координаты ячеек в сетке. Единственное, что нам нужно знать, это список соседних ячеек для каждой ячейки в спирали в любой момент времени.
На следующих диаграммах соседи в предыдущем слое показаны светлым оттенком, а дополнительные соседи в текущем слое - более темным.
Ячейка имеет 2 соседей среди предыдущих ячеек, если:
Ячейка имеет 3 соседей среди предыдущих ячеек, если:
Реализация сотовых соседей
В приведенном выше коде:
Затем мы обрабатываемК в индексы (я - к ) и выдвинуть текущую ячейку в качестве нового соседа для всех соседних ячеек, чтобы обеспечить симметрию соседства.
map()
цикл, который преобразует смещенияНахождение следующего члена последовательности
Теперь, когда у нас есть актуальный список соседей для всех ячеек, мы можем наконец вычислить следующий членК последовательности, используя другую рекурсивную вспомогательную функцию.
Значение ячейкиN хранится в V [ N ] ,
источник
Чистый ,
284279272262 байтаПопробуйте онлайн!
Создает последовательность навсегда.
Отображение шестиугольника
Большая часть кода идет в сопоставление шестиугольников уникальным образом для
(x,y)
координаты, поэтому существует единственная простая функция для определения смежности, которая выполняется для всех точечных отображений.Отображенные точки выглядят так:
Отсюда определение смежности является тривиальным и происходит, когда один из:
x1 == x2
а такжеabs(y1-y2) == 1
y1 == y2
а такжеabs(x1-x2) == 1
y1 == y2 - 1
а такжеx2 == x1 - 1
y1 == y2 + 1
а такжеx2 == x1 + 1
x1 == x2
а такжеy1 == y2
Точка генерации
Обратите внимание, что при прохождении шестиугольника по спирали различия повторяются для каждого слоя
n
:n
шаги(1,0)
n-1
шаги(1,-1)
n
шаги(0,-1)
n
шаги(-1,0)
n
шаги(-1,1)
n
шаги(0,1)
Это генерирует точки в правильном порядке, принимая суммы префиксов этой последовательности:
Объединяя это
Код, который фактически находит последовательность из вопроса, просто:
Который, в свою очередь, в основном фильтрует
and[r<>j\\(u,v)<-m|c h u,(p,q)<-m|q==v,(i,j)<-m|c p i]
Этот фильтр получает точки из
m
(списка уже сопоставленных точек):j
(i,j)
гдеi
рядом сp
(p,q)
где значениеq
равноv
(u,v)
местаu
рядом с текущей точкойисточник