Определения
- Идеальный квадрат представляет собой целое число , которое может быть выражено как квадрат другого целого числа. Например,
36
это идеальный квадрат, потому что6^2 = 36
. - Бесквадратное число является целым числом , которое не делится на любой совершенной площади, за исключением
1
. Например,10
это число без квадратов. Тем12
не менее, это не квадратное число, потому что12
делится на4
и4
является идеальным квадратом.
задача
Учитывая положительное целое число n
, выведите наибольшее число без квадратов, которое делится n
.
Testcases
n output
1 1
2 2
3 3
4 2
5 5
6 6
7 7
8 2
9 3
10 10
11 11
12 6
13 13
14 14
15 15
16 2
17 17
18 6
19 19
20 10
21 21
22 22
23 23
24 6
25 5
26 26
27 3
28 14
29 29
30 30
31 31
32 2
33 33
34 34
35 35
36 6
37 37
38 38
39 39
40 10
41 41
42 42
43 43
44 22
45 15
46 46
47 47
48 6
49 7
50 10
счет
Это код-гольф . Кратчайший ответ в байтах побеждает.
Применяются стандартные лазейки .
Ссылка
code-golf
math
arithmetic
number-theory
Дрянная Монахиня
источник
источник
Ответы:
05AB1E , 2 байта
Попробуйте онлайн!
Как это работает
источник
Брахилог , 3 байта
Попробуйте онлайн!
Очень оригинальный ответ ...
объяснение
источник
JavaScript (ES6),
55545046 байтЦитируя OEIS :
a (n) - наименьший делитель u из n такой, что n делит u ^ n
Обновленная реализация:
a (n) - наименьший
делитель u из nнатуральных чисел u, такой что n делит u ^ nисточник
MATL ,
64 байта2 байта сохранены с помощью @LeakyNun
Попробуйте онлайн!
объяснение
Рассмотрим ввод
48
.источник
Желе , 4 байта
Попробуйте онлайн!
источник
CJam , 8 байт
Почему каждая операция в этой программе должна быть 2 байта -_-
Попробуйте онлайн!
источник
Сетчатка ,
363028 байтВвод и вывод в одинарный .
Попробуйте онлайн! (Включает верхний и нижний колонтитулы для десятичного <-> унарного преобразования и для запуска нескольких тестовых случаев одновременно.)
объяснение
Идея состоит в том, чтобы сопоставить входные данные как квадрат, умноженный на некоторый коэффициент. Основное регулярное выражение для сопоставления квадрата использует прямую ссылку для сопоставления сумм последовательных нечетных целых чисел:
Так как мы не хотим сопоставлять идеальные квадраты, а числа, которые делятся на квадрат, мы заменяем
1
это самой обратной ссылкой:Таким образом, теперь внешняя группа
1
будет использоваться n раз, где n 2 - это самый большой квадрат, который делит входные данные, а группа2
хранит оставшийся коэффициент. Нам нужно разделить целое число на n, чтобы убрать квадрат. Результат может быть выражен как число итераций группы1
времен группы2
, но это немного сложно сделать. Retina - х$*
, вероятно , скоро будет улучшено , чтобы взять несимвольный маркер в его правый аргументе в этом случае мы могли бы просто заменить это$#1$*$2
, но пока не работает.Вместо этого мы разлагаем нечетные числа по-разному. Давайте вернемся к более простому примеру соответствия идеальных квадратов с
(^1|11\1)+$
. Вместо счетчика,\1
который инициализируется в 1 и увеличивается на 2 на каждой итерации, у нас будет два счетчика. Один инициализируется до 0, а другой инициализируется до 1 , и они оба увеличиваются на 1 на каждой итерации. Таким образом, мы в основном разложили нечетные числа 2n + 1 в (n) + (n + 1) . Преимущество заключается в том , что мы в конечном итоге с п в одной из групп. В простейшем виде это выглядит так:Там , где
\2
это п и\3
является п + 1 . Однако мы можем сделать это немного более эффективно, заметив, что n + 1 одной итерации равно n следующей итерации, поэтому мы можем сэкономить на1
здесь:Теперь нам просто нужно вернуться к использованию начального коэффициента вместо того,
1
чтобы сопоставлять входные данные, которые делятся на идеальный квадрат:Теперь все, что нам нужно сделать, это заменить всю эту вещь
$3
в конце, которая хранит начальный коэффициент, умноженный на количество шагов, который отбрасывает один фактор квадрата от ввода.Это делается неоднократно с
+
самого начала программы, чтобы учесть входные данные, которые содержат более высокие степени, чем квадраты.источник
Октава, 27 байт
Подобный подход, как и другие ответы. Разница в том, что функции имеют гораздо более длинные имена. Я считаю, что код действительно объясняет себя: принимает
prod
числоunique
простыхfactor
чисел числа.источник
Wolfram Language,
2928 байт-1 Спасибо @Martin Ender ♦
Объяснение:
источник
Times@@(#&@@@FactorInteger@#)&
Most
оставляет это как список. Вам нужноFirst
получить значение.Python , 37 байт
Попробуйте онлайн!
Наибольший квадратный делитель
n
- это наименьшее числоr
со всеми первымиn
факторами. Мы можем проверить это какr**n%n==0
, посколькуr**n
создаемn
копии каждого простого множителяr
, и делится на него,n
только если представлен каждый изn
основных факторов.Это
1>>r**n%n
эквивалентноint(r**n%n==0)
. ЕслиTrue
можно использовать вывод 1, это на 2 байта короче.источник
Математика , 40 байт
Попробуйте онлайн!
источник
Times@@#&@@Transpose@FactorInteger@#&
сохраняет 3 байта (#&@@
это стандартная уловка,[[1]]
и в подобных случаях часто можно сохранить дополнительные байты в скобках).Thread
вместоTranspose
. В Mathematica также есть 3-байтовый оператор дляTranspose
, но я не знаю, поддерживает ли Mathics его.#&@@(1##&@@FactorInteger@#)&
избегает необходимости вTranspose
целом. (1##&@@
ТолькоTimes@@
в маскировке, которая прекрасно работает на упорядоченных пары , обеспечиваемыхFactorInteger
, и'#&@@
этоFirst@
в маскировке.)Алиса , 4 байта
Попробуйте онлайн!
Ввод и вывод даны как кодовая точка символа (работает для всех допустимых кодовых точек Unicode).
объяснение
Что ж, у Алисы есть встроенная
D
функция, чье определение «Дедуплицированные простые факторы». То есть, пока значение делится на некоторое p 2 для простого p , делим это значение на p . Это как раз та функция, которая требуется для этой задачи. Остальное только ввод, вывод, завершение программы.Причина, по которой это было добавлено к Алисе, на самом деле не имеет ничего общего с этой целочисленной последовательностью. Я пытался придерживаться темы ассоциирования делителей с подстроками и простых факторов с символами. И мне нужна была функция, которая работает с «дедуплицирующими символами» (которая в целом гораздо полезнее, потому что она позволяет вам рассматривать строки как наборы, особенно когда они используются вместе с различными операторами мультимножества).
источник
Haskell , 31 байт
Попробуйте онлайн!
источник
Пайк , 3 байта
Попробуйте онлайн!
источник
Пролог (SWI) ,
8439 байтПопробуйте онлайн!
Адаптировал идею ответа Хаскелла @ xnor на Пролог.
источник
PHP, 70 байт
Попробуйте онлайн!
источник
Pyth,
86 байтов* -2 байта благодаря @LeakyNun
Было бы 3, если бы Pyth имел встроенный для продуктов списков ...
Попытайся!
источник
*F+1{P
вместо этого.C
6550 байтСпасибо @ Örjan Johansen за устранение необходимости
r
. Благодаря этому и другим грязным трюкам мне удалось выжать 15 байтов!while
ушел и заменил на||
указатель поворота.<=
должен был быть<
все время.<=
поворачивается<
на приращение, чтобы получитьn%(++d*d)
(должно быть четко определено из-за приоритета оператора).Оригинальный код:
источник
r
и вместо этого использоватьwhile(n%(d*d)<1)n/=d;
.++d*d
абсолютно не определяется стандартами Си - это классический случай явно неопределенного поведения. Но мы все равно будем здесь реализовывать.d++<n
, что хорошо определено, все еще работать? Я думаю, что старая версия прошла весь путьn+1
(безвредно).d++<n
что вы правы, по какой-то причине я не видел этого, когда переписывал код.Аксиома, 89 байт
тест и результаты
это одна из неиспользуемых функций factor ()
но это всего 125 байтов
источник
R, 52 байта
читает
n
со стандартного ввода. Требует установкиgmp
библиотеки (чтобы TIO не работал). Использует тот же подход, что и многие из приведенных выше ответов, но он падает на входе1
, потому чтоfactorize(1)
возвращает пустой вектор классаbigz
, которыйunique
, увы , падает .источник
На самом деле , 2 байта
Попробуйте онлайн!
Объяснение:
источник
Пари / ГП , 28 байт
Попробуйте онлайн!
источник
Пыть , 3 байта
Объяснение:
источник