Для двух положительных целых чисел a
и b
выведите два натуральных числа c
и d
, чтобы:
c
водоразделыa
d
водоразделыb
c
иd
совместно премьер- наименьшее общее кратное из
c
иd
составляет наименьшее общее кратноеa
иb
.
Если существует более одного возможного ответа, вы можете вывести только один или все из них.
Тестовые случаи:
a b c d
12 18 4 9
18 12 9 4
5 7 5 7
3 6 1 6 or 3 2
9 9 9 1 or 1 9
6 15 2 15 or 6 5
1 1 1 1
Это код-гольф . Кратчайший ответ в байтах побеждает.
code-golf
arithmetic
number-theory
Дрянная Монахиня
источник
источник
d
разделяетb
Ответы:
Желе ,
2113 байтПопробуйте онлайн!
Другими словами: начать с (c, d) = (a, b) . Затем для каждого простого числа разделите это простое число полностью от факторизации c или d : в зависимости от того, какой из показателей имеет наименьшее значение для этого простого числа. (В этой реализации, в случае связи, c теряет показатель степени.)
Поэтому, если a = 2250 = 2 1 · 3 2 · 5 3 и b = 360 = 2 3 · 3 2 · 5 1 ,
тогда с = 2 0 · 3 0 · 5 3 = 125 и d = 2 3 · 3 2 · 5 0 = 72 .
Джонатан Аллан набрал 8 байтов! Спасибо ~
источник
ÆEZ×Ụ’$€$ZÆẸ
[1,18]
для[15,18]
. Первоначальная версия возвращала правильный ответ ([5,18]
).ÆEz®0iṂ$¦€ZÆẸ
должен делать трюк в течение 13.R
143139123 байта(Спасибо @Giuseppe за эти 19 байтов!)
С отступами, новыми строками и некоторыми пояснениями:
Тестовые случаи:
источник
!
имеет более высокий приоритет, чем&
и,|
но ниже, чем+
и*
; таким образом вы сможете уложить в гольф несколько байтов; то есть,!i%%q&j%%q
должно быть эквивалентно!i%%q+j%%q
GCD(c,d)==1
, тоLCM(c,d)==c*d
. Таким образом, мы можем проверить,GCD(c,d)==1
а затем проверить, еслиc*d==a*b/GCD(a,b)
последнийLCM(a,b)
...a*b/GCD(a,b)
не короче чемLCM(a,b)
).Шелуха , 10 байт
Грубая сила. Принимает и возвращает списки, и работает для более чем двух чисел тоже. Попробуйте онлайн!
объяснение
источник
Mathematica, 82 байта
источник
Select[...][[1]]
вместо того,First@Select[...]
чтобы сохранить байт?#&@@
вместо того,[[1]]
чтобы сохранить еще один ;-)JavaScript (ES6),
908480 байтПринимает ввод в синтаксисе карри
(a)(b)
и возвращает массив из 2 целых чисел.Контрольные примеры
Показать фрагмент кода
Как?
источник
MATL ,
1716 байтПопробуйте онлайн!
Тот же метод, что и у Линн в желе
Прошло много времени с тех пор, как я использовал любой MATL (или matlab в этом отношении), поэтому возможны многие улучшения.
источник
Хаскелл ,
5048474542 байтаИдея: я это заметил
c*d = a*b/gcd(a,b)
. Итак, алгоритм выполняет два шага:c' = a/gcd(a,b)
иd' = b
. Это соответствует всем требованиям, кроме этого,c'
иd'
должно быть совместным.e = gcd(c',d')
а затем устанавливаюc = c'*e
иd = d'/e
. При этом сохраняются все свойства (поскольку объединенные факторы остаются неизменными), но, поскольку я удаляю все общие факторыd
, я делаюc
иd
взаимно простую.В моей реализации
c'
просто называетсяc
.Попробуйте онлайн!
-3 байта благодаря Лайкони
источник
c
экономит 3 байта: попробуйте онлайн!05AB1E , 12 байтов
Попробуйте онлайн! или как тестовый набор
источник
R , 126 байт
Попробуйте онлайн!
Это требует другого (и , видимо , менее golfy) подход к нахождению значений , чем другой R ответа .
Объяснение:
за исключением того, что я включаю все определения в качестве аргументов по умолчанию и делаю все расчеты на одну строчку для игры в гольф.
источник
J , 19 байт
Попробуйте онлайн!
Основано на решении @ Линн .
объяснение
источник
Haskell ,
9174 байтаПопробуйте онлайн!
Сохранено 17 байтов благодаря Laikoni
источник
u*v`div`gcd u v
сохраняет байт.lcm
функцию?rem a x+rem b y+gcd x y<2
должно работать.lcm
существовало.rem a x+rem b y+gcd x y<2
работает, и мне интересно, еслиrem a x+rem b y+gcd x y+lcm a b-lcm x y<2
работает. Существует , может быть , а (математическая) гарантия того, чтоlcm a b>=lcm x y
.lcm a b>=lcm x y
потому что 1.x=x1*...*xi
(простое разложение)y=y1*...yj
,lcm x y=z1*...*zk
гдеz1,...,zk
общие дляx1,...,xi
иy1,...,yj
. 2.a=u1*...*um*x1*...*xi
(простое разложение)b=v1*...vn*y1*...yj
,lcm a b=t1*...*tl
гдеt1,...,tl
общие дляu1*...*um*x1*...*xi
иv1*...vn*y1*...yj
. Очевидно, чтоt1,...,tl
содержитz1,...,zk
, таким образомlcm a b>=lcm x y
. Но это не полезно для записи условия в виде суммы.Python 2 , 75 байт
Ввод принимается как список, который функция изменяет на месте.
Попробуйте онлайн!
источник
Python 3 , 129 байт
Попробуйте онлайн!или попробуйте тестовый набор.
Выводит все возможные комбинации в виде вложенного списка.
источник
-~a
и-~b
можете просто переписать какa+1
иb+1
для удобочитаемости: PЖеле ,
19 1514 байтов-4 с указателем от Leaky Nun (используйте встроенный делитель)
Я почти на 100% уверен, что на самом деле это не так, но вот первая попытка.
Давайте посмотрим, кто превосходит его с семью или восемью байтами!
Да ... см ответ Линн с объяснением!
Монадическая ссылка, берущая список из двух чисел и возвращающая список списков возможностей.
Попробуйте онлайн!
Как?
источник
ÆD
но (пожимая плечами) мозг явно не в снаряжении ...Perl 6 , 72 байта
Попробуйте онлайн!
Занимает список (а, б). Возвращает список всех возможных списков (c, d).
Объяснение:
источник
Python 2 ,
126121 байтПопробуйте онлайн!
источник
Python 2 + sympy , 148 байт
Попробуйте онлайн!
-1 спасибо Джонатану Фреху .
Этот ответ работает в Python 2 (не Python 3), используя
sympy.gcd
иsympy.lcm
вместоmath.gcd
иmath.lcm
которые доступны только в Python 3. И да, это грубая сила :)источник
Q=c==z;
(+7 байт) в начале цикла While и заменяяor(c==z)+d
сor Q+d
(-4 байт) иc=+(c==z)or
сc=+Q or
(-4 байт). ( TIO )+
операторd=+E
илиc=+(c==z)
для преобразования логического числа в целое число?True
иFalse
вместо,1
и0
в симпати.+...
имеет какое-либо применение.Желе , 13 байт
Попробуйте онлайн! Мой первый желе ответ! Редактировать:
ÆEz0µỤ€’×µZÆẸ
также работает на 13 байтов. Объяснение:источник
PARI / GP, 86 байт
Это просто делает то, что Линн говорит в своем ответе:
Если я не считаю
f(a,b)=
часть, это 79 байтов.источник
05AB1E ,
322624222019 байтовПопробуйте онлайн! Я до сих пор не знаю, как писать на этом языке, но, по крайней мере, это не грубый алгоритм. Объяснение:
источник