Numero di somme di fattori


12

Dato un numero intero positivo n> 1, determinare quanti numeri possono essere fatti aggiungendo numeri interi maggiori di 1 il cui prodotto è n . Ad esempio, se n = 24 possiamo esprimere n come prodotto nei seguenti modi

24 = 24             -> 24            = 24
24 = 12 * 2         -> 12 + 2        = 14
24 = 6 * 2 * 2      -> 6 + 2 + 2     = 10
24 = 6 * 4          -> 6 + 4         = 10
24 = 3 * 2 * 2 * 2  -> 3 + 2 + 2 + 2 = 9
24 = 3 * 4 * 2      -> 3 + 4 + 2     = 9
24 = 3 * 8          -> 3 + 8         = 11

Possiamo ottenere i seguenti numeri in questo modo:

24, 14, 11, 10, 9

Questo è un totale di 5 numeri, quindi il nostro risultato è 5.

Compito

Scrivi un programma o una funzione che accetta n come input e restituisce il numero di risultati che è possibile ottenere in questo modo.

Questa è una domanda di quindi le risposte verranno classificate in byte, con un numero inferiore di byte migliori.

Sequenza OEIS

OEIS A069016


1
Caso di prova suggerito 240
Jonathan Allan il

Dal momento che 36 ha suscitato molto dibattito, lo consiglio come caso di prova.
user41805

3
@WheatWizard 12 * 3
Business Cat

1
Ho 2,2,3,3 -> 10, 2,6,3 -> 11, 2,2,9 -> 13, 12,3 -> 15, 2,18 -> 20,36 -> 36
Affari Cat

2
36 dovrebbero essere 7 perché (2*3)+(2*3)=12dovrebbero essere anche nell'elenco.
Jonathan Allan,

Risposte:


6

Brachylog , 8 byte

{~×≜+}ᶜ¹

Provalo online!

Spiegazione

{    }ᶜ¹  Count unique results of this predicate:
 ~×       Create list of numbers whose product is the input.
   ≜      Label the list, forcing it to take a concrete value.
    +     Take its sum.

Non sono del tutto sicuro del perché produca solo elenchi con elementi sopra 1, ma sembra farlo, il che funziona alla grande in questa sfida.


Produce solo elenchi con elementi sopra 1 perché altrimenti ci sono infiniti elenchi, il che spesso è negativo in sfide come queste.
Fatalizza il

4

Gaia , 9 14 13 byte

Bug risolto al costo di 5 byte grazie a Jonathan Allan, quindi 1 byte giocato a golf.

ḍfḍ¦e¦Π¦¦Σ¦ul

Provalo online! o prova come suite di test

Spiegazione

ḍ              Prime factors
 f             Permutations
  ḍ¦           Get the partitions of each permutation
    e¦         Dump each list of partitions (1-level flatten the list)
      Π¦¦      Product of each partition
         Σ¦    Sum each group of products
           u   Deduplicate
            l  Length

Potete fornire un collegamento TIO contenente gli output corrispondenti dai numeri da 1 a 36 inclusi?
user41805

È esattamente come la risposta della gelatina ...
Erik the Outgolfer,

1
L'OP afferma che l'uscita per 36 dovrebbe essere 5, non 6
user41805

1
Secondo OEIS, 36 dà 7 invece di 5, ma il tuo dà 6
user41805

1
Apparentemente Gaia lascia fuori[6 6]
user41805 il

2

Gelatina ,  11 15  14 byte

+4 byte risolvendo un bug (forse un modo migliore?)
-1 byte abusando della simmetria

ÆfŒ!ŒṖ€ẎP€S€QL

Un collegamento monadico che prende e restituisce numeri interi positivi

Provalo online! o vedere una suite di test

Come?

In aggiornamento...

ÆfŒ!ŒṖ€ẎP€S€QL - Link: number, n      e.g. 30
Æf             - prime factors of n        [2,3,5]
  Œ!           - all permutations          [[2,3,5],[2,5,3],[3,2,5],[3,5,2],[5,2,3],[5,3,2]]
    ŒṖ€        - all partitions for €ach   [[[[2],[3],[5]],[[2],[3,5]],[[2,3],[5]],[[2,3,5]]],[[[2],[5],[3]],[[2],[5,3]],[[2,5],[3]],[[2,5,3]]],[[[3],[2],[5]],[[3],[2,5]],[[3,2],[5]],[[3,2,5]]],[[[3],[5],[2]],[[3],[5,2]],[[3,5],[2]],[[3,5,2]]],[[[5],[2],[3]],[[5],[2,3]],[[5,2],[3]],[[5,2,3]]],[[[5],[3],[2]],[[5],[3,2]],[[5,3],[2]],[[5,3,2]]]]
       Ẏ       - tighten                   [[[2],[3],[5]],[[2],[3,5]],[[2,3],[5]],[[2,3,5]],[[2],[5],[3]],[[2],[5,3]],[[2,5],[3]],[[2,5,3]],[[3],[2],[5]],[[3],[2,5]],[[3,2],[5]],[[3,2,5]],[[3],[5],[2]],[[3],[5,2]],[[3,5],[2]],[[3,5,2]],[[5],[2],[3]],[[5],[2,3]],[[5,2],[3]],[[5,2,3]],[[5],[3],[2]],[[5],[3,2]],[[5,3],[2]],[[5,3,2]]]
        P€     - product for €ach          [[30],[6,5],[10,3],[2,3,5],[30],[10,3],[6,5],[2,5,3],[30],[6,5],[15,2],[3,2,5],[30],[15,2],[6,5],[3,5,2],[30],[10,3],[15,2],[5,2,3],[30],[15,2],[10,3],[5,3,2]]
               -   ...this abuses the symmetry saving a byte over P€€
          S€   - sum €ach                  [30,11,13,10,30,13,11,10,30,11,17,10,30,17,11,10,30,13,17,10,30,17,13,10][10,17,11,30,10,17,13,30,10,13,11,30,10,13,17,30,10,11,13,30,10,11,17,30]
            Q  - de-duplicate              [30,11,13,10,17]
             L - length                    5

1

Python 2 , 206 byte

k=lambda n,i=2:n/i*[k]and[k(n,i+1),[i]+k(n/i)][n%i<1]
def l(t):
 r=[sum(t)]
 for i,a in enumerate(t):
    for j in range(i+1,len(t)):r+=l(t[:i]+[a*t[j]]+t[i+1:j]+t[j+1:])
 return r
u=lambda n:len(set(l(k(n))))

Provalo online!

Spiegazione

    # Finds the prime factors
k=lambda n,i=2:n/i*[k]and[k(n,i+1),[i]+k(n/i)][n%i<1]
    # Function for finding all possible numbers with some repetition
def l(t):
    # Add the current sum
 r=[sum(t)]
    # For each number in the current factors
 for i,a in enumerate(t):
    # For all numbers further back in the current factors, find all possible numbers when we multiply together two of the factors
    for j in range(i+1,len(t)):r+=l(t[:i]+[a*t[j]]+t[i+1:j]+t[j+1:])
 return r
    # Length of set for distinct elements
u=lambda n:len(set(l(k(n))))


1

Mathematica, 110 byte

If[#==1,1,Length@Union[Tr/@Select[Array[f~Tuples~{#}&,Length[f=Rest@Divisors[s=#]]]~Flatten~1,Times@@#==s&]]]&

1

JavaScript (ES6) 107 byte

f=(n,o,s=0,i=2,q=n/i)=>(o||(o={},o[n]=t=1),i<n?(q>(q|0)|o[e=s+i+q]||(o[e]=t+=1),f(q,o,s+i),f(n,o,s,i+1)):t)

Ungolfed:

f=(n,                                 //input
   o,                                 //object to hold sums
   s=0,                               //sum accumulator
   i=2,                               //start with 2
   q=n/i                              //quotient
  )=>(
  o||(o={},o[n]=t=1),                 //if first call to function, initialize o[n]
                                      //t holds the number of unique sums
  i<n?(                               //we divide n by all numbers between 2 and n-1
    q>(q|0)|o[e=s+i+q]||(o[e]=t+=1),  //if q is integer and o[s+i+q] is uninitialized,
                                      //... make o[s+i+q] truthy and increment t
    f(q,o,s+i),                       //recurse using q and s+i
    f(n,o,s,i+1)                      //recurse using n with the next i
  ):t                                 //return t
)

Casi test:

Per verificare che la funzione calcoli le somme corrette, possiamo produrre le chiavi dell'oggetto invece di t:

f=(n,o,s=0,i=2,q=n/i)=>(o||(o={},o[n]=t=1),i<n?(q>(q|0)|o[e=s+i+q]||(o[e]=t+=1),f(q,o,s+i),f(n,o,s,i+1)):Object.keys(o))

console.log(f(24));  //9, 10, 11, 14, 24


1

Python 3 , 251 byte

lambda n:1 if n==1else len(set(sum(z)for z in t(f(n))))
f=lambda n:[]if n==1else[[i]+f(n//i)for i in range(2,n+1)if n%i==0][0]
t=lambda l:[l] if len(l)==1else[[l[0]]+r for r in t(l[1:])]+[r[:i]+[l[0]*e]+r[i+1:]for r in t(l[1:])for i,e in enumerate(r)]

Provalo online!

Il design è di base:

  1. fattorizza n nei suoi fattori primi (un fattore primo può apparire più volte:) 16 -> [2,2,2,2]. Questa è la funzione f.

  2. calcola le partizioni dell'elenco dei fattori primi e moltiplica i fattori in ciascuna partizione. Le partizioni si trovano come in /programming//a/30134039 e i prodotti vengono calcolati al volo. Questa è la funzione t.

  3. La funzione finale ottiene i prodotti di ogni partizione di n e li somma, ottenendo il numero di valori diversi.

Il risultato per 2310=2*3*5*7*11è 49.

EDIT : Forse ha bisogno di essere riparato, ma non ho tempo di guardarlo ora (ho fretta). Suggerimento: il risultato è corretto per 2310=2*3*5*7*11? Non la penso così.

EDIT2 : correzione enorme. Vedi sopra. La versione precedente (buggy) era: provala online!

fcalcola i fattori (, con un (0, n)invece di (1, n)come primo elemento.

La lambda suddivide ogni fattore in "sotto-fattori" e somma i "sotto-fattori".




Grazie a @notjagan, ma il codice iniziale era così sbagliato ...
jferard

Grazie a @HalvardHummel, ma stessa osservazione di cui sopra.
jferard,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.