Игра в гольф, программа или функция, которая дает местоположение гну, который начинается в квадрате на бесконечной шахматной доске, которая пронумерована в квадратной спирали против часовой стрелки, где гну всегда посещает квадрат с наименьшим номером она может достичь того, что еще не посетила. 1
Вдохновение: пойманный рыцарь и OEIS A316667 .
Изменить: эта последовательность в настоящее время на OEIS как A323763 .
Код может создавать местоположение , первые мест или генерировать последовательность без ввода.
Не стесняйтесь указывать ее местоположение после (или до) прыжков вместо этого, но если это так, пожалуйста, четко сформулируйте это в своем ответе и убедитесь, что ввод дает (или, если необходимо).1
[1]
Это код-гольф , поэтому цель состоит в том, чтобы создать рабочий код с минимальным количеством байтов на выбранном вами языке.
Примечание: антилопа гну попадает в ловушку (так же, как рыцарь делает это в своем местоположении в , квадрат , а верблюд - в своем , квадрат ) в своем расположение на площади . Поведение вашего кода может быть неопределенным для больше, чем это. (Спасибо Deadcode за код C ++, который нашел это!)
подробность
Доска выглядит так, как показано ниже, и продолжается до бесконечности:
101 100 99 98 97 96 95 94 93 92 91
102 65 64 63 62 61 60 59 58 57 90
103 66 37 36 35 34 33 32 31 56 89
104 67 38 17 16 15 14 13 30 55 88
105 68 39 18 5 4 3 12 29 54 87
106 69 40 19 6 1 2 11 28 53 86
107 70 41 20 7 8 9 10 27 52 85
108 71 42 21 22 23 24 25 26 51 84
109 72 43 44 45 46 47 48 49 50 83
110 73 74 75 76 77 78 79 80 81 82
111 112 113 114 115 116 117 118 119 120 121
Гну является «ГНУ» фея шахматной фигуры - нестандартное шахматной фигуры , которые могут двигаться как в качестве рыцаря (а -leaper) и в качестве верблюда (а -leaper).
Таким образом, она может переместиться в любое из этих мест из своего начального местоположения :( 1 , 3 ) 1
. . . . . . . . . . .
. . . . 35 . 33 . . . .
. . . . 16 . 14 . . . .
. . 39 18 . . . 12 29 . .
. . . . . (1) . . . . .
. . 41 20 . . . 10 27 . .
. . . . 22 . 24 . . . .
. . . . 45 . 47 . . . .
. . . . . . . . . . .
Наименьшее из них - и она еще не посещала этот квадрат, поэтому - это второе слагаемое в последовательности.
Затем она может перейти с на любое из этих мест:
. . . . . . . . . . .
. . . . . . 14 . 30 . .
. . . . . . 3 . 29 . .
. . . . 6 1 . . . 53 86
. . . . . . . (10) . . .
. . . . 22 23 . . . 51 84
. . . . . . 47 . 49 . .
. . . . . . 78 . 80 . .
. . . . . . . . . . .
Тем не менее, она уже посетила квадрат поэтому ее третье местоположение - квадрат , самый низкий, который она еще не посещала.
Первые условий пути антилоп гну:
1, 10, 3, 6, 9, 4, 7, 2, 5, 8, 11, 14, 18, 15, 12, 16, 19, 22, 41, 17, 33, 30, 34, 13, 27, 23, 20, 24, 44, 40, 21, 39, 36, 60, 31, 53, 26, 46, 25, 28, 32, 29, 51, 47, 75, 42, 45, 71, 74, 70, 38, 35, 59, 56, 86, 50, 78, 49, 52, 80, 83, 79, 115, 73, 107, 67, 64, 68, 37, 61, 93, 55, 58, 54, 84, 48, 76, 43, 69, 103, 63, 66, 62, 94, 57, 87, 125, 82, 118, 77, 113, 72, 106, 148, 65, 97, 137, 91, 129, 85
Первые прыжков - ход коня, поэтому первые членов совпадают с A316667 .
Ответы:
JavaScript (Node.js) ,
191 ... 166164 байтаСохранено 2 байта благодаря @grimy .
ВозвращаетN й член.
Попробуйте онлайн! или посмотрите форматированную версию
Как?
Спиральные индексы
Чтобы преобразовать координаты( х , у) в спиральный индекс я , мы сначала вычисляем слой L с помощью:
Который дает:
Затем мы вычисляем позицию в слое с помощью:п
Который дает:
Окончательный индекс определяется как:я
Примечание: приведенная выше формула дает 0-индексированную спираль.
В коде JS мы фактически вычисляем сразу с помощью:4 л2
И затем вычтите с помощью:п
Ходы гну
Учитывая текущую позицию , 16 возможных целевых квадратов антилопы гну проверяются в следующем порядке:( х, у)
Мы пройдемся по ним, применяя 16 пар значений со . Каждая пара кодируется как один символ ASCII.( дИкс , дY)
Мы отслеживаем минимальное найденное значение в и координаты соответствующей ячейки в .м ( H, V)
Как только лучший кандидат найден, мы помечаем его как посещенного, устанавливая флаг в объекте , который также является нашей основной рекурсивной функцией.г
На первой итерации мы начинаем с и . Это гарантирует, что первая выбранная ячейка будет и что первая ячейка будет помечена как посещенная.х = 1 Y= 2 ( 0 , 0 )
источник
Buffer
чтобы каждый символ интерпретировался как один байт?Buffer
конструктор все еще принимает строку. Так что, да, это довольно дешевый способ преобразования его в список байтов, в отличие от[..."string"].map(c=>do_something_with(c.charCodeAt()))
.Кокос ,
337276 байтВозвращает генератор значений. Возможно, будет в гольф больше. (Особенно последовательность разностных кортежей.) Спиральный алгоритм взят из этого математического ответа .
Попробуйте онлайн!
источник
for a,b in (
->for a,b in(
(может быть, вы можете сыграть в гольф и сам набор дельта-кортежей)q
и почтовый индекс короче для кортежей: 306 байтов могут все еще быть пригодными для игры в гольф, конечно0.5
->.5
для сохранения другого байта;A**2
-> ещеA*A
один.05AB1E ,
7765585752 байта-6 байт благодаря @Arnauld , используя порт его формулы.
Попробуйте онлайн (
ï
нижний колонтитул удаляет,.0
чтобы сделать вывод более компактным, но вы можете удалить его, чтобы увидеть реальный результат).Объяснение кода:
Общее объяснение:
global_array
[1]
X
[0,0]
X
Это та же формула, которую @Arnauld использует в своем ответе , но написанная по-другому, чтобы использовать встроенные 05AB1E для double, square, -1, +1 и т. Д.
(Если вы хотите увидеть только эту спиральную часть кода в действии: попробуйте это онлайн .)
global_array
global_array
X
После того, как мы зациклили
input
количество раз, программа выдаст этоglobal_array
как результат.источник