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


13

Вхідні дані

Одиничне ціле число .1x1015

Вихідні дані

Максимальна кількість чітких натуральних чисел, що мають добуток .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
ÆDx21


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.