Ein Faktorisierungsspiel

13

Eingang

Eine einzelne ganze Zahl 1x1015 .

Ausgabe

Die maximale Anzahl eindeutiger positiver Ganzzahlen mit dem Produkt x .

Beispiele

Eingabe: 1099511627776. Ausgabe: 9. Eine mögliche optimale Liste von Faktoren ist: (1, 2, 4, 8, 16, 32, 64, 128, 4096).

Eingabe: 127381. Ausgabe 4. Eine mögliche optimale Liste von Faktoren ist: (1, 17, 59, 127).

Bezogen auf diese alte Frage .

Anush
quelle
9
Könnten Sie noch ein paar Testfälle hinzufügen? (Vorzugsweise von angemessener Größe.)
Arnauld
8
Angesichts Ihrer Kommentare zu den meisten Antworten: Wenn Sie stattdessen nach effizientem Code suchen, sollte dieser definitiv nicht als markiert werden code-golf. Sie können entweder fastest-codeoder fastest-algorithmfür eine bevorstehende Herausforderung in Betracht ziehen . Wenn Sie wirklich wollten, dass alle Antworten in einer begrenzten Zeit innerhalb des angegebenen Bereichs funktionieren, sollte dies ausdrücklich erwähnt worden sein. (Und ich hätte einen kleineren Bereich empfohlen, damit er nicht code-golfvöllig in Konflikt gerät .)
Arnauld
@Arnauld Nein, ich bin sehr vorsichtig, wenn es um Code-Golf geht, und niemand wird dafür beurteilt. Es wäre einfach cool, wenn der Code für die angegebenen Eingabebereiche ausgeführt werden könnte.
Anush
1
Denn x=1, 2, ...ich bekomme 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, 3was ich in OEIS nicht finde. Es ist klar genug, dass Datensätze für Fakultätszahlen angezeigt werden x. Zum Beispiel die kleinste , xso dass f(x)=13sein wird 13!. Ich denke, fhängt nur von den Exponenten der Primfaktorisierung ab. Also zu finden f(13^4*19^7*29^2), könnten wir zu vereinfachen f(2^7*3^4*5^2).
Jeppe Stig Nielsen

Antworten:

5

Wolfram Language (Mathematica) , 52 Byte

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

Probieren Sie es online!

4 Bytes gespart dank @attinat

Hier ist auch eine 153-Byte- Version, die 1099511627776und berechnet10^15

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

Probieren Sie es online!

Das Ergebnis für 10^15ist 12

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

J42161217
quelle
Abstürze mit 1099511627776
Anush
7
@Anush Es stürzt nicht ab. Braucht nur Erinnerung. Sie haben nichts über Speicherbeschränkungen gesagt. Das ist Code Golf
J42161217
Ja, das merke ich. Es wäre nur schön, wenn Sie den Code tatsächlich in den in der Frage angegebenen Eingabebereichen ausführen könnten.
Anush
6
@Anush Das ist Code-Golf. Keine netten Antworten. Bitte geben Sie Ihre Kriterien an. Eine Antwort ist entweder gültig oder nicht. Ich denke, das Problem hier ist die Frage ... Vielleicht sollten Sie es auf "am besten
geeigneten
3
@Anush Ich habe in meiner Antwort eine Änderung vorgenommen und eine weitere Version hinzugefügt, die wirklich schnell und effizient ist, falls Sie sie überprüfen möchten
J42161217
3

05AB1E , 9 Bytes

Sehr ineffizient. Timeout bei TIO für Zahlen mit einer großen Anzahl von Teilern.

ÑæʒPQ}€gZ

Probieren Sie es online!

Erläuterung

Ñ          # 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
Emigna
quelle
Ihr TIO-Code scheint 3 statt 9
auszugeben
@Anush: Es ist eine andere Zahl als in Ihrem Beispiel (da dies aufgrund vieler Faktoren nicht funktioniert). Ich sollte wahrscheinlich ein eindeutigeres Beispiel verwenden.
Emigna
€gZist ein bisschen effizienter als éθgfür den gleichen bytecount.
Grimmy
@ Grimy: Stimmt. Es macht keinen großen Unterschied, da es der Filter ist, der hier der große Bösewicht ist, aber es tut nicht weh, ein bisschen effizienter zu sein :)
Emigna
2

Perl 6 , 38 Bytes

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

Probieren Sie es online!

Übernimmt den gierigen Ansatz zur Auswahl von Teilern.

Scherzen
quelle
Endet nicht mit 1099511627776
Anush
6
@Anush Nun, es endet schließlich . Im Allgemeinen ist die Antwort gültig, wenn der Algorithmus des Programms mit einer Eingabe arbeiten würde, wenn ihm so viel Speicher und Zeit gegeben würde, wie er wollte. Da dies Code-Golf ist , habe ich es für die Codelänge optimiert, nicht für die algorithmische Komplexität
Jo King
2

Javascript (ES6), 39 Byte

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

Es gibt wahrscheinlich ein paar Bytes, die hier und da gespeichert werden können. Verwendet einfach den gierigen Algorithmus für die Faktoren.

vrugtehagel
quelle
2

Gelee , 9 Bytes

ŒPP=³ƊƇẈṀ

Probieren Sie es online!

-1 Byte danke an jemanden

-2 Bytes dank ErikTheOutgolfer

HyperNeutrino
quelle
Bei der Vorbereitung einer Eingabe für den OEIS-Superseeker habe ich ein 11-Byte-Programm für wahrscheinlich golffähige Jellys erstellt (das einen anderen Ansatz verwendet), und es ist unwahrscheinlich, dass eine Jelly-Antwort veröffentlicht wird. Daher werde ich so tun, als hätte ich ein Byte aus Ihrer Lösung golfen: ÆE×8‘½’:2S‘(it arbeitet mit der Kraft des OEIS "Formel" -Abschnitts für A003056). Haftungsausschluss: Es könnte falsch sein, aber es funktioniert auf den Testfällen.
Mein Pronomen ist monicareinstate
Es scheint nicht mit 1099511627776
Anush
@someone funktioniert nicht für 36, aber danke
HyperNeutrino
@Anush ja, es ist wirklich langsam, weil ich Code-Golf, nicht für die Effizienz optimiert
HyperNeutrino
1
Sie können es entfernen ÆD, es ist nicht so, als würden mehr Partitionen erstellt werden. Es wird nur viel mehr Zeit in Anspruch nehmenx21).
Erik der Outgolfer
2

Brachylog , 8 Bytes

f;?⟨⊇×⟩l

Probieren Sie es online!

(Der naive Ansatz {~×≠l}ᶠ⌉generiert eine unendliche Anzahl von Lösungen mit zusätzlichen Einsen, bevor sie entfernt werden , und kann daher nicht beendet werden. Es ist jedoch kein Problem, da es sich um dieselbe Bytezahl handelt!)

Übernimmt die Eingabe über die Eingabevariable und die Ausgabe über die Ausgabevariable. Die Kopfzeile von TIO enthält eine Kopie des größten Teils des Codes, um Ihnen die Liste der Faktoren anzeigen zu können. Ohne diese Angabe funktioniert dies jedoch einwandfrei. Da es zuerst größere Unterlisten gibt, verhält sich dieses Prädikat im Wesentlichen genauso wie die meisten anderen Antworten, ohne jedoch dank Backtracking den vollständigen Potenzsatz der Faktoren explizit zu generieren und zu filtern.

            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.
Nicht verwandte Zeichenfolge
quelle
1

Gaia , 10 9 Bytes

Π=
dz↑⁇(l

Probieren Sie es online!

Folgt demselben "Algorithmus" wie an anderer Stelle - filtern Sie das Divisor-Powerset nach dem längsten mit Produkt gleich der Zahl und geben Sie seine Länge zurück.

	| 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)
Giuseppe
quelle
0

Muschel , 15 Bytes

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

TIO Link kommt bald (wenn Dennis zieht)

Grundsätzlich ein Port der @ Emigna 05AB1E-Lösung.

Erläuterung

                - 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
Skidsdev
quelle
0

C # (Visual C # Interactive Compiler) , 54 Byte

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

Verwendet den gleichen Ansatz wie die Antworten von @ vrugtehagel und @ JoKing.

Probieren Sie es online!

Verkörperung der Ignoranz
quelle
Vorausgesetzt, ich habe Ihre Logik korrekt implementiert, eine 53-Byte-Lösung (die ich nicht von dem Schlüsselwort "return" befreien konnte): Probieren Sie es online aus!
Mein Pronomen ist monicareinstate
1
@someone Danke, aber laut Meta müssen Funktionen wiederverwendbar sein . Ich weiß auch nicht, ob es akzeptabel ist, dass Deklarationen außerhalb der Funktion ein nachstehendes Semikolon auslassen. Möglicherweise wird ein Meta-Post darüber verfasst.
Verkörperung der Unwissenheit
0

Ruby , 34 Bytes

Zeitüberschreitung bei dieser massiven Anzahl, aber schließlich Zeitüberschreitung, wenn auf einem anderen Computer genügend Zeit zur Verfügung steht.

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

Probieren Sie es online!

Wert Tinte
quelle