Игра факторизации


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чего не нахожу в OEIS. Достаточно ясно, что записи появятся для факторных чисел x. Например самый маленький xтакой, который f(x)=13будет 13!. Я думаю, fзависит только от показателей простой факторизации. Так что найти f(13^4*19^7*29^2)мы могли бы упростить до f(2^7*3^4*5^2).
Джепп Стиг Нильсен

Ответы:


5

Wolfram Language (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
Anush

7
@ Ануш Это не терпит крах. Просто нужна память. Вы ничего не сказали об ограничении памяти. Это код гольфа
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

@Anush: Это другое число, чем в вашем примере (так как это время из-за многих факторов). Я, вероятно, должен использовать более четкий пример.
Эминья

€gZнемного эффективнее, чем éθgдля того же bytecount.
Grimmy

@ Грими: Правда. Это не будет иметь большого значения, так как это фильтр, который является большим плохим парнем здесь, но это не мешает быть немного более эффективным :)
Emigna

2

Perl 6 , 38 байт

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

Попробуйте онлайн!

Принимает жадный подход к выбору делителей.


Не заканчивается с 1099511627776
Anush

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


При подготовке ввода для superseeker OEIS, я создал 11-байтовое вероятно golfable программы Желе (который использует другой подход), и я вряд ли отправить ответ Желе , так что я сделаю вид , что golfed байт из вашего решения: ÆE×8‘½’:2S‘(это работает с мощностью раздела «формула» OEIS для A003056). Отказ от ответственности: это может быть неправильно, но это работает на тестовых случаях.
мое местоимение monicareinstate

Кажется, он не заканчивается 1099511627776
Anush

@ someone не работает на 36, но спасибо
HyperNeutrino

@ Ануш, да, это действительно медленно, потому что я играю в гольф, а не оптимизирован для эффективности
HyperNeutrino

1
Вы можете удалить ÆD, это не значит, что будет создано больше разделов, как это, просто это займет гораздо больше времениИкс21).
Эрик Outgolfer


2

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

f;?⟨⊇×⟩l

Попробуйте онлайн!

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

Принимает ввод через входную переменную и выводит через выходную переменную. Заголовок на 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

Gaia , 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 скоро появится (когда Деннис тянет)

В основном это порт решения @ Emigna 05AB1E.

объяснение

                - 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 #) , 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.