Если мы возьмем натуральные числа и свернем их по часовой стрелке в спираль, мы получим следующую бесконечную спираль:
....--57--56
|
36--35--34--33--32--31--30 55
| | |
37 16--15--14--13--12 29 54
| | | | |
38 17 4---3---2 11 28 53
| | | | | | |
39 18 5 0---1 10 27 52
| | | | | |
40 19 6---7---8---9 26 51
| | | |
41 20--21--22--23--24--25 50
| |
42--43--44--45--46--47--48--49
Учитывая некоторое число в этой спирали, ваша задача - определить его соседей, то есть элемент выше, слева, справа и ниже.
пример
Если мы посмотрим на это, 27
то увидим, что у него есть следующие соседи:
- над:
28
- осталось:
10
- право:
52
- ниже:
26
Таким образом, результат будет: [28,10,52,26]
правила
- На входе будет число в любом формате ввода / вывода по умолчанию
- Вывод будет список / матрица / .. из 4 соседей этих чисел в любом (последовательном!) Порядке
- Вы можете работать со спиралью, которая начинается с 1 вместо 0, однако вы должны указать это в своем ответе
Примеры
Вывод в формате [above,left,right,below]
и использует спираль на основе 0:
0 -> [3,5,1,7]
1 -> [2,0,10,8]
2 -> [13,3,11,1]
3 -> [14,4,2,0]
6 -> [5,19,7,21]
16 -> [35,37,15,17]
25 -> [26,24,50,48]
27 -> [28,10,52,26]
73 -> [42,72,74,112]
101 -> [100,146,64,102]
2000 -> [1825,1999,2001,2183]
1000000 -> [1004003,1004005,999999,1000001]
Ответы:
R 156 байт
Попробуйте онлайн!
round
и использование 6 байтов,cospi(x)/sinpi(x)
которые более точны, чемcos(x*pi)/sin(x*pi)
в случае половинных чисел (0.5
и1.5
т. д.)Пояснение:
Если мы посмотрим на матричные координаты значений, учитывая первое значение,
0
помещенное вx=0, y=0
, они:Эти
x
координаты следуют последовательность A174344 OEIS с рекурсивной формулой:Та же самая формула верна для
y
координат матрицы, но сcos
вместоsin
и с отрицанием:Итак, в R мы можем перевести формулу в эту функцию, взяв в
sinpi/cospi
качестве параметра:и мы генерируем два вектора координат (мы не отменяем координаты y, так как мы получим тот же результат, только с обратными соседями вверх / вниз):
Обратите внимание, что мы сгенерировали
(n+2)^2
координаты, которые больше, чем минимально необходимые координаты, содержащие какn
их, так и соседей (более(floor(sqrt(n))+2)^2
жесткая граница была бы, но, к сожалению, меньше "гольфы").Поэтому теперь, когда у нас есть все координаты, мы сначала ищем координаты,
a,b
соответствующие нашимn
:наконец мы выбираем позиции своих соседей, т.е.
where x == a and y == b+1 or b-1
where y == b and x == a+1 or a-1
с помощью :
источник
Perl 6 ,
9483 байта{my \ s = 0, | [+] flat ((1, i ... ) Zxx flat (1..Inf Z 1..Inf)); map {first: k, s [$ _] + $ ^ d, S}, я, -1,1, -i}Попробуйте онлайн!
s
это ленивый, бесконечный список спиральных координат, представленный в виде комплексных чисел. Он состоит из двух других бесконечных списков:1, *i ... *
составляет список1, i, -1, -i ...
.1, 1.5 ... *
делает список1, 1.5, 2, 2.5, 3, 3.5 ...
. Архивирование этих два списка вместе с репликацией списка производит список шагов от каждой спирали координат к следующему:1, i, -1, -1, -i, -i, 1, 1, 1, i, i, i ...
. (Дробные части правых аргументов оператора репликации списка отбрасываются.) Выполнение треугольного сложения ([\+]
) в этом списке (и вставка 0 вперед) создает список спиральных координат.Наконец, начиная от комплексного числа
s[$_]
($_
будучи единственным аргументом функции), мы ищем индексы (first :k
) в спирали комплексных чисел , которые смещены от этого числа поi
,-1
,1
и-i
.источник
Brain-Flak , 238 байт
Попробуйте онлайн!
Вывод в порядке слева, вверх, вправо, вниз.
объяснение
источник
MATL , 15 байт
Вход и выход основаны на 1.
Выходные данные дают соседей влево, вниз, вверх и вправо в указанном порядке.
Попробуйте онлайн! Или проверьте все тестовые случаи, кроме двух последних, время которых истекло на TIO.
источник
1YL
- У MATLAB естьspiral
функция? Когда MATLAB превратился в Mathematica ?!R 172 байта
Попробуйте онлайн!
Это R, поэтому очевидно, что ответ 0-индексирован.
Большая часть работы заключается в создании матрицы. Код вдохновлен: https://rosettacode.org/wiki/Spiral_matrix#R
источник
JavaScript (ES6), 165 байт
Печатает индексы с
alert()
.Попробуйте онлайн!
Как?
(адаптировано из этого ответа из math.stackexchange)
источник
RangeError: Maximum call stack size exceeded
и ошибки в консоли браузера:InternalError: too much recursion
. Я делаю что-то неправильно?Python 2 ,
177164146144 байтаПопробуйте онлайн!
Рассчитывает
u,l,r,d
прямо изn
.источник
PHP (> = 5,4), 208 байт
Чтобы запустить это:
Пример:
Или попробуйте онлайн!
Примечания:
-d error_reporting=0
Опция используется для вывода уведомлений не / предупреждений.Как?
Я создаю спираль с измененной версией этого ответа в двумерном массиве.
Я выбираю размер спирали на основе входных данных
n
с формулой, чтобы всегда получать дополнительный раунд чисел в спирали (гарантия существования выше / ниже / слева / справа). Дополнительный раунд чисел означает+2
высоту и+2
ширину двумерного массива.Так что если
n
будет располагаться спираль с максимальным размером3*3
, то сгенерированная спираль будет5*5
.Размер спирали
c*c
гдеc = ceil(sqrt(n)) + k
, еслиceil(sqrt(n))
нечетный, тоk
2, а еслиceil(sqrt(n))
четный, тоk
3.Например, приведенная выше формула приведет к этому:
n = 1
тогдаc = 3
и размер спирали будет3*3
n <= 9
тогдаc = 5
и размер спирали будет5*5
n <= 25
тогдаc = 7
и размер спирали будет7*7
n <= 49
тогдаc = 9
и размер спирали будет9*9
При генерации спирали, я хранить
x
иy
изn
и после генерации, я выводить выше / ниже элементов / влево / вправо от него.источник