Гра факторизації


13

Вхідні дані

Одиничне ціле число .1≤x≤1015

Вихідні дані

Максимальна кількість чітких натуральних чисел, що мають добуток .x

Приклади

Вхід: 1099511627776. Вихід: 9. Один з можливих оптимальних переліку факторів: (1, 2, 4, 8, 16, 32, 64, 128, 4096).

Вхід: 127381. Вихід 4. Один з можливих оптимальних переліків факторів: (1, 17, 59, 127).

Пов’язаний із цим старим питанням .


9
Чи можете ви додати ще кілька тестових випадків? (Переважно розумних розмірів.)
— Арнольд

8
З огляду на ваші коментарі до більшості відповідей: якщо ви шукаєте ефективний код замість цього, його точно не слід позначати як code-golf. Ви можете розглянути питання про майбутній виклик fastest-codeабо fastest-algorithmпро нього. Якщо ви дійсно хотіли, щоб усі відповіді спрацювали в обмежений час у визначеному діапазоні, це повинно було бути чітко зазначено. (І я б рекомендував менший діапазон, щоб він не суперечив code-golfцілком.)
— Арнольд

@Arnauld Ні. Я обережний, щоб зробити його кодом-гольф, і ніхто за це не суджений. Було б просто здорово, якби код міг працювати для визначених діапазонів введення.
— Ануш


1
Бо x=1, 2, ...я отримую те, f(x)=1, 2, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 2, 3, 2, 3, 3, 3, 2, 4, 2, 3, 3, 3, 2, 4, 2, 3, 3, 3, 3, 4, 2, 3чого не знаходжу в ОЕІС. Досить зрозуміло, що записи з'являться за факторними номерами x. Наприклад, найменший xтакий, який f(x)=13буде 13!. Я думаю, fзалежить лише від показників основної факторизації. Тож для пошуку f(13^4*19^7*29^2)ми можемо спростити f(2^7*3^4*5^2).
— Джеппе Стіг Нільсен

Відповіді:


5

Мова Вольфрама (Mathematica) , 52 байти

Max[Length/@Cases[Subsets@Divisors@#,{a__}/;1a==#]]&

Спробуйте в Інтернеті!

4 байти збережено завдяки @attinat

Ось також версія 153 байт, яка обчислює 1099511627776і10^15

Max[Length/@Table[s=RandomSample@Flatten[Table@@@FactorInteger[#]];Last@Select[Times@@@TakeList[s,#]&/@IntegerPartitions@Length@s,DuplicateFreeQ],5!]]+1&      

Спробуйте в Інтернеті!

Результат 10^15- 12

{1, 2, 4, 5, 10, 16, 25, 40, 50, 100, 125, 250}


Збитки з 1099511627776
— Ануш

7
@Anush Це не виходить з ладу. Просто потрібна пам’ять. Ви нічого не сказали про обмеження пам'яті. Це код гольфу
— J42161217

Так, я усвідомлюю. Просто було б добре, якби ви насправді могли запустити код, діапазони введення, зазначені у питанні.
— Ануш

6
@Anush Це код-гольф. Непогані відповіді. Будь ласка, вкажіть свої критерії. Відповідь чи дійсна, чи ні. Я думаю, що тут проблема - це питання ... Можливо, вам слід змінити його на "найбільш достатній алгоритм"
— J42161217

3
@Anush Я змінив свою відповідь і додав ще одну версію, яка є дуже швидкою та ефективною у випадку, якщо ви хочете перевірити це
— J42161217


3

05AB1E , 9 байт

Дуже неефективно. Вимкнеться на TIO для чисел з великою кількістю дільників.

ÑæʒPQ}€gZ

Спробуйте в Інтернеті!

Пояснення

Ñ          # push a list of divisors of the input
 æ         # push the powerset of that list
  ʒPQ}     # filter, keep only the lists whose product is the input
      €g   # get the length of each
        Z  # take the maximum

Здається, ваш код TIO виводить 3 замість 9.
— Ануш

@Anush: Це інше число, ніж ваш приклад (оскільки це один раз виходило через багато факторів). Напевно, я повинен використовувати більш чіткий приклад.
— Емінья

€gZтрохи ефективніше, ніж éθgдля одного і того ж рахунку.
— Grimmy

@Grimy: Правда. Це не призведе до великої різниці, оскільки фільтр є найбільшим поганим хлопцем тут, але це не завадить бути трохи ефективнішим :)
— Emigna

2

Perl 6 , 38 байт

{$!=$_;+grep {$!%%$_&&($!/=$_)},1..$_}

Спробуйте в Інтернеті!

Захоплюється жадібним підходом до вибору дільників.


Не припиняється з 1099511627776
— Ануш

6
@Anush Ну, з часом воно припиняється . Як правило, відповідь справедлива, якщо алгоритм програми працював би з будь-яким входом, якби йому було надано стільки пам'яті та часу, скільки хотілося. Оскільки це код-гольф , я оптимізував його за довжиною коду, а не за алгоритмічною складністю
— Джо Кінг

2

Javascript (ES6), 39 байт

f=(n,i=0)=>n%++i?n>i&&f(n,i):1+f(n/i,i)

Напевно, є кілька байтів, які можна зберегти тут і там. Просто використовує жадний алгоритм для факторів.


2

Желе , 9 байт

ŒPP=³ƊƇẈṀ

Спробуйте в Інтернеті!

-1 байт дякую комусь

-2 байти завдяки ErikTheOutgolfer


Готуючи дані для наглядача OEIS, я створив 11-байтову програму Jelly з можливістю зіграння (яка використовує інший підхід), і навряд чи я опублікую відповідь Jelly, тому я буду робити вигляд, що я грав у байт з вашого рішення: ÆE×8‘½’:2S‘(це працює з потужністю розділу «Формула» OEIS для A003056). Відмова: це може бути неправильним, але він працює на тестових випадках.
— мій займенник monicareinstate

Здається, це не припиняється з 1099511627776
— Ануш

@someone не працює на 36, але дякую
— HyperNeutrino

@Anush Так, це дуже повільно, тому що я гольфував кодом, не оптимізований для ефективності
— HyperNeutrino

1
ÆDx≥21


2

Брахілог , 8 байт

f;?⟨⊇×⟩l

Спробуйте в Інтернеті!

(Наївний підхід, {~×≠l}ᶠ⌉генерує нескінченну кількість рішень із зайвими 1-мами, перш ніж їх усунути ≠, і, таким чином, не вдається фактично припинити. Хоча це не проблема, оскільки це для одного байта!)

Приймає вхід через вхідну змінну і вихід через вихідну змінну. Заголовок у TIO містить копію більшості коду заради того, щоб показати вам, що таке список факторів, але без нього це чудово працює. Оскільки ⊇дає спочатку більші списки, цей предикат по суті робить те саме, що й більшість інших відповідей, але без явного генерування та фільтрації повного набору факторів, завдяки зворотньому відстеженню.

            The output
       l    is the length of
    ⊇       a sublist (the largest satisfying these constraints)
f           of the factors of
            the input
 ; ⟨  ⟩     which
     ×      with its elements multiplied together
  ?         is the input.


1

Гая , 10 9 байт

Π=
dz↑⁇(l

Спробуйте в Інтернеті!

Дотримується того ж "алгоритму", що і в інших місцях - фільтруйте набір потужностей дільника найдовше з продуктом, рівним кількості, і поверніть його довжину.

	| helper function
Π=	| is prod(list)==n (implicit)?
	|
	| main function; implicitly takes n
dz	| divisor powerset (in decreasing order of size)
  ↑⁇	| filter by helper function
    (l	| take the first element and take the length (implicitly output)

0

Клам , 15 байт

p}_`nq#:;qQ@s~Q

Незабаром буде посилання на TIO (коли Денніс тягне)

В основному це порт рішення 05AB1E @ Emigna @ Emigna.

Пояснення

                - Implicit Q = first input
p               - Print...
 }              - The last element of...
  _             - Sorted...
   `nq          - Lengths of... (map q => q.len)
           @s   - Items in powerset of
             ~Q - Proper divisors of Q
      #         - Where... (filter)
        ;q      - Product of subset
       :        - Equals...
          Q     - Q

0

C # (Visual C # Interactive Compiler) , 54 байти

int f(int n,int i=0)=>n%++i<1?1+f(n/i,i):n>i?f(n,i):0;

Використовується той же підхід, що і у відповідях @ vrugtehagel та @ JoKing.

Спробуйте в Інтернеті!


Якщо припустити, що я правильно застосував вашу логіку, 53-байтне рішення (що я не міг позбутися ключового слова "return"): Спробуйте це в Інтернеті!
— мій займенник monicareinstate

1
@someone Спасибі, але згідно мета, функції мають бути багаторазовими . Крім того, я не знаю, чи допустимо, щоб декларації за межами функції не залишали крапку з комою, може зробити мета-повідомлення про це.
— Втілення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.