Спираль числа - бесконечная сетка, у которой верхний левый квадрат имеет номер 1. Вот первые пять слоев спирали:
Ваша задача - узнать число в строке y и столбце x.
Пример:
Input: 2 3
Out : 8
Input: 1 1
Out : 1
Input: 4 2
Out : 15
Заметка:
- Разрешен любой язык программирования.
- Это задача игры в гольф, поэтому выигрывает самый короткий код.
- Удачи!
Источник: https://cses.fi/problemset/task/1071
Ответы:
C (gcc),
4443 байтаПопробуйте онлайн!
Спираль имеет несколько «рукавов»:
Позиция расположена на рычаге (назначена переменной ). Тогда наибольшее число на плече равно , которое чередуется между левым нижним и правым верхним положением на плече. Вычитание из дает последовательность движущихся вдоль плеча , поэтому мы выбираем соответствующий знак на основе четность , отрегулируйте на чтобы получить последовательность, начинающуюся с 0, и вычтите это значение из .( х , у) n n 2 x y - n + 1 , - n + 2 , … , - 1 , 0 , 1 , … , n - 1 , n - 2 n n n - 1 n 2макс ( х , у) N N2 Икс Y - n + 1 , - n + 2 , … , - 1 , 0 , 1 , … , n - 1 , n - 2 N N n - 1 N2
z
Спасибо мистеру Xcoder за сохранение байта.
источник
f(x,y,z){z=x>y?x:y;z=z*z-~(z%2?x-y:y-x)-z;}
сохраняет 1 байт.f(1, 1)
возвращает значение1
. Нижний колонтитул секция петли через й = 1 до 5 и у = 1 до 5, вызывает функцию для всех таких значений, и выводит его выход в виде сетки, чтобы продемонстрировать , что функция является правильной для всех входов , показанных на вопросе.Python,
545049 байтов-4 байта благодаря @ChasBrown
-1 байт благодаря @Shaggy
Попробуйте онлайн!
Первый раз в гольф! Я более чем осознаю, что это не оптимально, но что угодно.
По сути, работает по тому же принципу, что и код @Doorknob C.
источник
def f(a,b):
подход, см. Здесь .M**2
может быть замененM*M
.MATL , 15 байт
Попробуйте онлайн!
Собрать и распечатать в виде матрицы
Как?
Изменить: та же техника, что и ответ @ Doorknob, только пришли по-другому.
Разница между диагональными элементами спирали заключается в арифметической последовательности . Сумма из слагаемых равна (по обычной формуле AP). Эта сумма, увеличенная на 1, дает диагональный элемент в позиции .n n ( n - 1 ) ( n , n )0,2,4,6,8,… n n(n−1) (n,n)
Учитывая , мы находим максимум этих двух, который является «слоем» спирали, к которой принадлежит эта точка. Затем мы находим диагональное значение этого слоя как . Для четных слоев значение в тогда равно , для нечетных слоев .v = n ( n - 1 ) + 1 ( x , y ) v + x - y v - x + y(x,y) v=n(n−1)+1 (x,y) v+x−y v−x+y
Альтернативное 21-байтовое решение:
Попробуйте онлайн!
Соберите и распечатайте как матрицу.
Из вышесказанного мы знаем, что функция, которую мы хотим
где .m=max(x,y)
Некоторые базовые вычисления покажут, что одно выражение для максимум двух чисел
Подставляя одно в другое, мы находим, что одна альтернативная форма для :f
где .k=abs(x−y)+x+y
Это функция, которую реализует решение.
источник
Japt , 16 байт
Адаптировано из решения Doorknob на несколько сортов пива.
Попытайся
объяснение
источник
Pyth, 20 байтов
Тестирование
Почти дословный перевод Rushabh Мехта ответа «s .
Объяснение:источник
Желе , 13 байт
Попробуйте онлайн!
Использует метод Doorknob . Слишком долго.
источник
»Ḃ-*×_‘+»²_»ʋ
Желе ,
1312 байтПопробуйте онлайн!
Вычисляет диагональный член с помощью
²_’Ṁ
и добавляет / вычитает к правильному значению индекса с помощьюṀḂḤ’×I
.источник
Brain-Flak , 76 байт
Попробуйте онлайн!
источник
05AB1E ,
1211 байт-1 байт благодаря @Emigna, изменяющему
Èi
наG
.Порт @Sundar 's MATL ответа , так что обязательно проголосуйте за него!
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник
Èi
может бытьG
.Паскаль (FPC) , 90 байтов
Попробуйте онлайн!
Ответ Порт Дурнкоба , но ответ Сундара дал мне идею, ради
z mod 2*2-1
которой я превратился,1and z*2-1
чтобы убрать пространство.источник
Mathematica 34 байта
так:
(*
54
*)
источник
Юлия 1,0 , 35 байт
Попробуйте онлайн!
источник
JavaScript (ES6), 46 байт
источник
Java (JDK 10) , 39 байт
Попробуйте онлайн!
кредиты
источник