Введение (может быть проигнорировано)
Поместить все натуральные числа в их регулярном порядке (1, 2, 3, ...) немного скучно, не правда ли? Итак, вот серия проблем, связанных с перестановками (перестановками) всех натуральных чисел. Это шестая задача в этой серии (ссылки на первую , вторую , третью , четвертую и пятую задачи).
Эта задача имеет мягкую пасхальную тему (потому что это Пасха). Я черпал свое вдохновение из этого высоко украшенного (и, по моему личному мнению, довольно некрасивого) гусиного яйца.
Это напомнило мне спираль Улама , где все натуральные числа помещены в спираль против часовой стрелки. Эта спираль имеет некоторые интересные особенности, связанные с простыми числами, но это не относится к этой задаче.
Мы переходим к перестановке в этом задании положительных целых чисел, если мы возьмем числа в спирали Улама и проследим все целые числа по спирали с поворотом по часовой стрелке , начиная с 1. Таким образом, мы получим
1, 6, 5, 4, 3, 2, 9, 8, 7, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 25, 24, 23, etc.
Если бы вы нарисовали обе спирали, вы бы получили какую-то бесконечную сетку из (яичной скорлупы) спиралей ( обратите внимание на ссылку « Новый порядок» ).
Эта последовательность присутствует в OEIS под номером A090861 . Так как это «чистая последовательность» вызов, задача состоит в том, чтобы выходной для заданного качестве входных данных, где равноA090861.
задача
Учитывая целочисленный ввод , вывод в целочисленном формате, где равноA090861.
Примечание: здесь предполагается индексирование на основе 1; Вы можете использовать индексирование на основе 0, поэтому и т. д. Пожалуйста, укажите это в своем ответе, если вы решите использовать это.
Контрольные примеры
Input | Output
---------------
1 | 1
5 | 3
20 | 10
50 | 72
78 | 76
123 | 155
1234 | 1324
3000 | 2996
9999 | 9903
29890 | 29796
правила
- Вход и выход являются целыми числами.
- Ваша программа должна как минимум поддерживать ввод в диапазоне от 1 до 32767).
- Неверный ввод (0, значения с плавающей запятой, строки, отрицательные значения и т. Д.) Может привести к непредсказуемому выводу, ошибкам или (не) определенному поведению.
- Применяются правила ввода / вывода по умолчанию .
- Лазейки по умолчанию запрещены.
- Это код-гольф , поэтому самые короткие ответы в байтах выигрывают
JavaScript (ES7),
46 4541 байт0 индексированные.
Попробуйте онлайн!
Как?
Это основано на формуле с 1 индексом, используемой в примерах программ A090861 .
Попробуйте онлайн!
Попробуйте онлайн!
Попробуйте онлайн!
Который может быть переведен на:
Делая это с 0 индексами экономит 5 байтов сразу:
Формула может быть дополнительно упрощена с помощью:
который может быть выражен как:
ведущий к:
и наконец:
источник
Wolfram Language (Mathematica) , 60 байт
Попробуйте онлайн!
источник
MATL ,
1211 байтПопробуйте онлайн!
Очень мало памяти. Предоплата
X^k
делает его более эффективным .источник
C # (интерактивный компилятор Visual C #) , 67 байт
Попробуйте онлайн!
источник
Python 3.8,
10474656057 байтРедактировать: Спасибо Джонатану Аллану за получение от 74 до 57 байтов!
В этом решении используется индексация на основе 0.
источник
>
вместо<=
иx*x
вместоx**2
... вот так:def f(n):x=((n-1)**.5+1)//2;return 8*x**2+(-2,6)[n>4*x*x+2*x]*x+2-n
... TIOPython 3.8 (предварительная версия) , 53 байта
Прямой порт ответа JavaScript Арнаулда, upvote, и / или ответ Mathematica J42161217 , и / или ответ Python Капоши :)
0 индексированные.
Попробуйте онлайн!
источник
Befunge,
6757 байтЭто решение предполагает индексирование на основе 0 для входных значений.
Попробуйте онлайн!
объяснение
Начнем с вычисления "радиуса", при котором вход n найден с помощью цикла:
В конце цикла предыдущее значение n - это смещение по спирали на этом радиусе:
Затем мы можем определить, находимся ли мы в верхней или нижней части спирали, следующим образом:
И как только мы получим все эти детали, спиральное значение рассчитывается по формуле:
Радиус - это единственное значение, которое нам нужно сохранить как «переменную», ограничивая его максимальным значением 127 в Befunge-93, поэтому этот алгоритм может обрабатывать входы до 65024.
источник
Japt , 15 байт
Порт Джонатана в желе раствор. 1-индексироваться.
Попытайся
источник
x+(1-x%2)
этоx|1
(экономия байт в желе), что этот ответ также может извлечь выгоду из, я уверен.C ++ (gcc) , 88 байт
1-индексированных; использует формулу на странице OEIS, но манипулирует, чтобы сохранить несколько байтов.
Попробуйте онлайн!
источник
sqrt(n-1)/2+.5
вместо(sqrt(n-1)+1)/2