Gra w faktoryzację


13

Wejście

Pojedyncza liczba całkowita .1≤x≤1015

Wynik

Maksymalna liczba wyraźnych liczb całkowitych dodatnich, które mają iloczyn .x

Przykłady

Dane wejściowe: 1099511627776. Dane wyjściowe: 9. Jedną z możliwych optymalnych list czynników jest: (1, 2, 4, 8, 16, 32, 64, 128, 4096).

Dane wejściowe: 127381. Dane wyjściowe 4. Jedną z możliwych optymalnych list czynników jest: (1, 17, 59, 127).

Powiązane z tym starym pytaniem .


9
Czy możesz dodać jeszcze kilka przypadków testowych? (Najlepiej rozsądnej wielkości.)
— Arnauld

8
Biorąc pod uwagę twoje komentarze do większości odpowiedzi: jeśli zamiast tego szukasz wydajnego kodu, zdecydowanie nie należy go oznaczać jako code-golf. Można rozważyć albo fastest-codeczy fastest-algorithmna nadchodzące wyzwania. Jeśli naprawdę chciałeś, aby wszystkie odpowiedzi działały w ograniczonym czasie w określonym zakresie, należy to wyraźnie zaznaczyć. (I zaleciłbym mniejszy zakres, aby nie był code-golfcałkowicie sprzeczny .)
— Arnauld

@Arnauld Nie Jestem ostrożny, aby uczynić go golfem i nikt nie jest za to oceniany. Byłoby po prostu fajnie, gdyby kod mógł działać dla określonych zakresów wejściowych.
— Anush


1
Bo x=1, 2, ...dostaję, 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, 3czego nie znalazłem w OEIS. Jest wystarczająco jasne, że rekordy pojawią się dla liczb silni x. Na przykład najmniejszy xtaki, który f(x)=13będzie 13!. Myślę, że fzależy tylko od wykładników pierwszej faktoryzacji. Aby znaleźć, f(13^4*19^7*29^2)możemy uprościć f(2^7*3^4*5^2).
— Jeppe Stig Nielsen

Odpowiedzi:


5

Wolfram Language (Mathematica) , 52 bajty

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

Wypróbuj online!

4 bajty zapisane dzięki @attinat

Tutaj jest także wersja 153-bajtowa, która oblicza 1099511627776i10^15

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

Wypróbuj online!

Wynik dla 10^15to 12

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


Wywala z 1099511627776
— anuś

7
@Anush To się nie zawiesza. Po prostu potrzebuje pamięci. Nie mówiłeś nic o ograniczeniach pamięci. To jest kod golfowy
— J42161217

Tak, rozumiem. Byłoby po prostu miło, gdybyś mógł faktycznie uruchomić kod zakresów wejściowych określonych w pytaniu.
— Anush

6
@Anush To jest golf golfowy. Niezłe odpowiedzi. Proszę podać swoje kryteria. Odpowiedź jest poprawna lub nie. Myślę, że problemem jest pytanie ... Może powinieneś zmienić to na „najbardziej wystarczający algorytm”
— J42161217

3
@Anush Zrobiłem edycję w mojej odpowiedzi i dodałem jeszcze jedną wersję, która jest naprawdę szybka i wydajna na wypadek, gdybyś chciał to sprawdzić
— J42161217


3

05AB1E , 9 bajtów

Bardzo nieefektywne. Przekroczę limit czasu na TIO dla liczb z dużą liczbą dzielników.

ÑæʒPQ}€gZ

Wypróbuj online!

Wyjaśnienie

Ñ          # 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

Twój kod TIO wydaje się wyprowadzać 3 zamiast 9.
— Anush

@Anush: Jest to inna liczba niż twój przykład (ponieważ jeden raz się z powodu wielu czynników). Prawdopodobnie powinienem użyć bardziej wyraźnego przykładu.
— Emigna

€gZjest nieco bardziej wydajny niż éθgdla tego samego bajtu.
— Grimmy,

@Grimy: True. Nie zrobi to dużej różnicy, ponieważ to filtr jest tutaj dużym złym facetem, ale nie zaszkodzi być trochę bardziej wydajnym :)
— Emigna

2

Perl 6 , 38 bajtów

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

Wypróbuj online!

Podchodzi chciwie do wyboru dzielników.


Nie kończą się 1099511627776
— anuś

6
@Anush Cóż, ostatecznie się kończy . Zasadniczo odpowiedź jest poprawna, jeśli algorytm programu działałby z dowolnym wejściem, gdyby miał tyle pamięci i czasu, ile chciał. Ponieważ jest to golf golfowy , zoptymalizowałem go pod kątem długości kodu, a nie złożoności algorytmicznej
— Jo King

2

JavaScript (ES6), 39 bajtów

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

Prawdopodobnie jest kilka bajtów, które można zapisać tu i tam. Po prostu używa chciwego algorytmu dla czynników.


2

Galaretka , 9 bajtów

ŒPP=³ƊƇẈṀ

Wypróbuj online!

-1 bajt dzięki komuś

-2 bajty dzięki ErikTheOutgolfer


Przygotowując dane wejściowe dla superseekera OEIS, stworzyłem prawdopodobnie 11-bajtowy program do gry w galaretkę (który wykorzystuje inne podejście) i raczej nie opublikuję odpowiedzi na galaretkę, więc udam, że grałem w bajt z twojego rozwiązania: ÆE×8‘½’:2S‘(to współpracuje z mocą sekcji „formuła” OEIS dla A003056). Oświadczenie: może być źle, ale działa na przypadkach testowych.
— mój zaimek to monicareinstate

Nie wydaje się, aby zakończyć z 1099511627776
— anuś

@someone nie działa przez 36, ale dzięki
— HyperNeutrino

@Anush tak, to jest naprawdę powolne, ponieważ grałem w golfa, nie zoptymalizowany pod kątem wydajności
— HyperNeutrino

1
ÆDx≥21


2

Brachylog , 8 bajtów

f;?⟨⊇×⟩l

Wypróbuj online!

(Naiwne podejście {~×≠l}ᶠ⌉generuje nieskończoną liczbę rozwiązań z dodatkowymi 1s przed ich wyeliminowaniem ≠, a tym samym nie kończy się. To jednak nie jest problem, ponieważ dotyczy tej samej liczby bajtów!)

Pobiera dane wejściowe przez zmienną wejściową i dane wyjściowe przez zmienną wyjściową. Nagłówek TIO zawiera kopię większości kodu w celu pokazania, czym jest lista czynników, ale bez tego działa ona doskonale. Ponieważ ⊇najpierw daje większe listy podrzędne, ten predykat zasadniczo robi to samo, co większość innych odpowiedzi, ale bez wyraźnego generowania i filtrowania pełnego zestawu czynników, dzięki cofnięciu.

            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 bajtów

Π=
dz↑⁇(l

Wypróbuj online!

Podąża za tym samym „algorytmem”, jak pokazano gdzie indziej - najdłużej przefiltruj zestaw dzielników z iloczynem równym liczbie i zwróć jego długość.

	| 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

Clam , 15 bajtów

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

Link do TIO już wkrótce (kiedy Dennis ściąga)

Zasadniczo port rozwiązania 05AB1E @ Emigna.

Wyjaśnienie

                - 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 # (interaktywny kompilator Visual C #) , 54 bajty

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

Stosuje to samo podejście, co odpowiedzi @ vrugtehagel i @ JoKing.

Wypróbuj online!


Zakładając, że poprawnie zaimplementowałem twoją logikę, 53-bajtowe rozwiązanie (że nie mogę pozbyć się słowa kluczowego „return”): Wypróbuj online!
— mój zaimek to monicareinstate

1
@someone Dzięki, ale według meta funkcje muszą być wielokrotnego użytku . Nie wiem też, czy dopuszczalne jest, aby deklaracje poza funkcją pomijały końcowy średnik, mogą w tym napisać meta.
— Embodiment of Ignorance

0

Rubinowy , 34 bajty

Oczywiście przekroczono limit czasu dla tej ogromnej liczby, ale ostatecznie upłynie limit czasu, jeśli będzie wystarczająco dużo czasu na innej maszynie.

->n{(1..n).count{|e|n%e<1?n/=e:p}}

Wypróbuj online!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.