Mash-up di Divisor corretto


20

Un vero divisore è un divisore di un numero n , che non è n stesso. Ad esempio, i divisori propri di 12 sono 1, 2, 3, 4 e 6.

Ti verrà dato un numero intero x , x ≥ 2, x ≤ 1000 . Il tuo compito è quello di sommare tutti i più alti divisori propri degli interi da 2 a x (incluso) (OEIS A280050 ).

Esempio (con x = 6):

  • Trova tutti i numeri interi tra 2 e 6 (inclusi): 2,3,4,5,6.

  • Prendi i divisori appropriati di tutti loro e scegli quelli più alti da ciascun numero:

    • 2 -> 1
    • 3 -> 1
    • 4 -> 1, 2
    • 5 -> 1
    • 6 -> 1, 2, 3 .
  • Sommare i più alti divisori propri: 1 + 1 + 2 + 1 + 3 = 8.

  • Il risultato finale è 8.

Casi test

Input | Produzione
------- + ---------
       |
 2 | 1
 4 | 4
 6 | 8
 8 | 13
 15 | 41
 37 | 229
 100 | 1690
 1000 | 165279

Regole



5
Se hai intenzione di sandbox qualcosa, lascialo lì per più di due ore.
Peter Taylor,

@PeterTaylor Ho sandboxato il post solo per ricevere feedback, perché questa è una sfida molto semplice che di solito non pubblicherei affatto nella sandbox. A proposito grazie per la modifica.
Mr. Xcoder,

Risposte:


13

Oasi , 4 byte

Codice:

nj+U

Provalo online!

Spiegazione:

Versione estesa:

nj+00

    0   = a(0)
   0    = a(1)

a(n) =

n       # Push n
 j      # Get the largest divisor under n
  +     # Add to a(n - 1)

5

Buccia , 7 byte

ṁȯΠtptḣ

Provalo online!

Spiegazione

Husk non ha un built-in per il calcolo diretto dei divisori (ancora), quindi sto usando invece la scomposizione in fattori primi. Il più grande divisore proprio di un numero è il prodotto dei suoi fattori primi tranne il più piccolo. Mappare questa funzione nell'intervallo da 2 all'input e sommare i risultati.

ṁȯΠtptḣ  Define a function:
      ḣ  Range from 1 to input.
     t   Remove the first element (range from 2).
ṁ        Map over the list and take sum:
 ȯ        The composition of
    p     prime factorization,
   t      tail (remove smallest prime) and
  Π       product.

5

Python 2 , 50 byte

f=lambda n,k=2:n/k and(f(n,k+1),n/k+f(n-1))[n%k<1]

Questo è lento e non può nemmeno far fronte con l'ingresso 15 su TIO.

Provalo online!

Tuttavia, la memoization ( thanks @ musicman523 ) può essere utilizzata per verificare tutti i casi di test.

Provalo online!

Versione alternativa, 52 byte

Al costo di 2 byte, possiamo scegliere se calcolare f(n,k+1)o n/k+f(n-1).

f=lambda n,k=2:n>1and(n%k and f(n,k+1)or n/k+f(n-1))

Con qualche trucco, questo funziona per tutti i casi di test, anche su TIO.

Provalo online!


Poiché fè una funzione pura , puoi memorizzarla per eseguire i casi più grandi su TIO
musicman523

Bene, non potermi usare un decoratore mi ha buttato via. Grazie!
Dennis,

4

Gelatina , 6 byte

ÆḌ€Ṫ€S

Provalo online!

Come funziona

ÆḌ€Ṫ€S
ÆḌ€    map proper divisor (1 would become empty array)
           implicitly turns argument into 1-indexed range
   Ṫ€  map last element
     S sum


4

JavaScript (ES6), 40 byte

f=(n,i=2)=>n<2?0:n%i?f(n,i+1):n/i+f(n-1)
<input type=number oninput=o.textContent=f(this.value)><pre id=o>

Un numero è uguale al prodotto del suo divisore più alto e del suo primo fattore più piccolo.


Stack Overflows n>352(almeno in questo frammento, non so se è la mia dipendenza dal browser / macchina) mentre si suppone che supporti almeno fino a n=1000.
officialaimm,

@officialaimm Funziona per n=1000se usi ad es node --stack_size=8000.
Neil,

4

05AB1E , 9 8 byte

-1 Byte grazie al trucco del fattore principale di Leaky Nun nella sua risposta Pyth

L¦vyÒ¦PO

Provalo online!

Spiegazione

L¦vyÒ¦PO
L¦       # Range [2 .. input]
  vy     # For each...
    Ò¦    # All prime factors except the first one
      P   # Product
       O  # Sum with previous results
         # Implicit print

Soluzione alternativa a 8 byte (che non funziona su TIO)

L¦vyѨθO    

e ofc soluzione alternativa a 9 byte (che funziona su TIO)

L¦vyѨ®èO    

4

Retina , 31 24 byte

7 byte grazie a Martin Ender.

.+
$*
M!&`(1+)(?=\1+$)
1

Provalo online!

Come funziona

La regex /^(1+)\1+$/cattura il più grande divisore proprio di un certo numero rappresentato in unario. Nel codice, \1+viene trasformato in una sintassi lookahead.




4

Python 2 (PyPy) , 73 71 70 byte

n=input();r=[0]*n;d=1
while n:n-=1;r[d+d::d]=n/d*[d];d+=1
print sum(r)

Non è la risposta più breve di Python, ma questo non fa che aumentare i casi di test. TIO gestisce input fino a 30.000.000 senza sudare; il mio computer desktop gestisce 300.000.000 in un minuto.

Al costo di 2 byte , la condizionen>d potrebbe essere utilizzata per un accelerazione del 10% circa.

Grazie a @xnor per l' r=[0]*nidea, che ha salvato 3 byte!

Provalo online!


Divertente, ho appena scritto praticamente lo stesso codice .
xnor

l=[0]*ndovrebbe permetterti di sbarazzarti di -2. execun po 'uccide la velocità, ma anche un whileloop sarebbe più corto del mio approccio.
Dennis,

Questo sembra essere leggermente più veloce del mio approccio. Ti dispiace se lo modifico nella mia risposta?
Dennis,

Per favore, provaci.
xnor

1
@ Mr.Xcoder Non in PyPy, ma sì, i setacci vanno bene per questo tipo di problema.
Dennis,

4

Haskell, 48 46 43 byte

f 2=1
f n=until((<1).mod n)pred(n-1)+f(n-1)

Provalo online!

Modifica: @rogaos ha salvato due byte. Grazie!

Modifica II: ... e @xnor altri 3 byte.


-2 byte:f 2=1 f n=last[d|d<-[1..n-1],mod n d<1]+f(n-1)
vroomfondel

@rogaos: grazie! Ho provato personalmente la ricorsione esplicita, ma non l'ho rimossa sum, quindi ho pensato che non fosse più breve.
Nome del modello

1
untilsalva ancora un po ':until((<1).mod n)pred(n-1)+f(n-1)
xnor

4

Japt , 8 + 2 = 10 8 6 byte

òâ1 xo

Provalo

  • 1 byte salvato grazie a ETHproductions.

Spiegazione

    :Implicit input of integer U.
ò   :Generate an array of integers from 1 to U, inclusive
â   :Get the divisors of each number,
1   :  excluding itself.
x   :Sum the main array
o   :by popping the last element from each sub-array.
    :Implicit output of result

Si noti che -xconta come due byte in base a questo post . Tuttavia, penso che puoi salvare un byte con ò2_â1 o( âesclude il numero originale quando viene fornito un argomento)
ETHproductions

Grazie, @ETHproductions; Mi mancavano entrambe queste cose. Mi chiedo che si applichi retroattivamente a tutte le soluzioni in cui abbiamo contato i flag come 1 byte? Stavo elaborando una soluzione alternativa che non usasse comunque una bandiera; sottolineando l' âargomento mi ha procurato il risparmio che stavo cercando.
Shaggy,

Suppongo di si, dal momento che non stavamo davvero seguendo un consenso prima. BTW, ero stato a giocare con la õ Åprima e trovato un paio 8 e 9-byters: õ Åx_/k g, õ Åx_k Å×, õ Åx_â¬o. E combinando õe Åcon il tuo xotrucco geniale ho trovato una soluzione a 7 byte :-)
ETHproductions

3

MATL, 12 byte

q:Q"@Z\l_)vs

Provalo su MATL Online

Spiegazione

        % Implicitly grab input (N)
q       % Subtract one
:       % Create an array [1...(N-1)]
Q       % Add one to create [2...N]
"       % For each element
  @Z\   % Compute the divisors of this element (including itself)
  l_)   % Grab the next to last element (the largest that isn't itself)
  v     % Vertically concatenate the entire stack so far
  s     % Sum the result



3

Cubix , 27 39 byte

?%\(W!:.U0IU(;u;p+qu.@Op\;;

Provalo online!

Cubified

      ? % \
      ( W !
      : . U
0 I U ( ; u ; p + q u .
@ O p \ ; ; . . . . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

Guardalo correre

  • 0IUImposta lo stack con un accumulatore e il numero intero iniziale. Inversione a U nel circuito esterno
  • :(? duplicare l'attuale top di stack, decrementare e testare
  • \pO@ se zero loop attorno al cubo verso uno specchio, afferrare il fondo dello stack, emettere e arrestare
  • %\! se positivo, mod, relect e test.
    • u;.W se è vero, inverti, rimuovi il risultato mod e cambia corsia nel loop interno
    • U;p+qu;;\(se false, inversione a U, rimuovere il risultato mod, portare l'accumulatore in alto, aggiungere il divisore intero corrente (in alto) spingere verso il basso e l'inversione a U. Pulisci lo stack per avere solo l'accumulatore e il numero intero corrente, decrementa il numero intero e inserisci nuovamente il ciclo esterno.



2

Python 3 , 78 75 73 71 byte

Nemmeno vicino alla risposta del pitone di Leaky nun nel conteggio dei byte.

f=lambda z:sum(max(i for i in range(1,y)if 1>y%i)for y in range(2,z+1))

Provalo online!


1
Ti stai avvicinando alla prima revisione della mia risposta ... puoi controllare la mia cronologia delle modifiche.
Leaky Nun,

Oh, haha ​​... giuro che non l'ho rubato ... :)
officialaimm,

2

Python 3 , 69 63 59 byte

4 byte grazie a Dennis.

f=lambda n:n-1and max(j for j in range(1,n)if n%j<1)+f(n-1)

Provalo online!

Ho impostato il limite di ricorsione su 2000 affinché funzioni per 1000.


+1 Hai i miei punti brownie! Questa è la soluzione di cui parlavo quando dicevo "meno di 70 byte" ...
Mr. Xcoder,

Inoltre, funziona anche in Python 2
Mr. Xcoder,

2

Carbone , 37 byte

A⁰βF…·²N«A⟦⟧δF⮌…¹ι«¿¬﹪ικ⊞δκ»A⁺β⌈δβ»Iβ

Provalo online!

Il collegamento è alla versione dettagliata. Mi ci è voluto quasi tutto il giorno per capire come avrei potuto risolvere una domanda relativa all'arte non ASCII in Charcoal, ma alla fine l'ho capito e sono molto orgoglioso di me. :-D

Sì, sono sicuro che questo può essere giocato molto a golf. Ho appena tradotto la mia risposta in C # e sono sicuro che le cose possono essere fatte diversamente in Charcoal. Almeno risolve il 1000caso in un paio di secondi ...



2

Python 2 (PyPy) , 145 byte

Poiché trasformare le competizioni di code-golf in competizioni con codici più veloci è divertente, ecco un algoritmo O ( n ) che, su TIO, risolve n = 5.000.000.000 in 30 secondi. ( Il setaccio di Dennis è O ( n log n ).)

import sympy
n=input()
def g(i,p,k,s):
 while p*max(p,k)<=n:l=k*p;i+=1;p=sympy.sieve[i];s-=g(i,p,l,n/l*(n/l*k+k-2)/2)
 return s
print~g(1,2,1,-n)

Provalo online!

Come funziona

Contiamo le dimensioni del set

S = {( a , b ) | 2 ≤ an , 2 ≤ b ≤ divisore proprio più grande ( a )},

riscrivendolo come unione, su tutti i numeri primi p ≤ √n, di

S p = {( pd , b ) | 2 ≤ dn / p , 2 ≤ bd },

e usando il principio di inclusione-esclusione :

| S | = ∑ (−1) m - 1 | S p 1 ∩ ⋯ ∩ S p m | oltre m ≥ 1 e numeri primi p 1 <⋯ < p m ≤ √n,

dove

S p 1 ∩ ⋯ ∩ S p m = {( p 1p me , b ) | 1 ≤ en / ( p 1p m ), 2 ≤ bp 1p m - 1 e },
| S p 1 ∩ ⋯ ∩ S p m | = ⌊ n / ( p 1p m ) ⌋⋅ ( p 1 p m - 1 ⋅ (⌊ n / ( p 1p m ) ⌋ + 1) - 2) / 2.

La somma ha Cn termini diversi da zero, dove C converge in una costante che è probabilmente 6⋅ (1 - ln 2) / π 2 ≈ 0,186544. Il risultato finale è quindi | S | + n - 1.


Oooh, è veloce ...
Mr. Xcoder il

2

NewStack , 5 byte

Fortunatamente, in realtà c'è un built-in.

Nᵢ;qΣ

La ripartizione:

Nᵢ       Add the first (user's input) natural numbers to the stack.
  ;      Perform the highest factor operator on whole stack.
   q     Pop bottom of stack.
    Σ    Sum stack.

In inglese reale:

Facciamo un esempio per un input di 8.

Nᵢ: Crea un elenco di numeri naturali da 1 a 8: 1, 2, 3, 4, 5, 6, 7, 8

;: Calcola i maggiori fattori: 1, 1, 1, 2, 1, 3, 1, 4

q. Rimuovi il primo elemento:1, 1, 2, 1, 3, 1, 4

ΣE prendi la somma: 1+1+2+1+3+1+4=13


1+1+2+1+3+1+4= 13no 8. A parte questo: ottima risposta quindi +1.
Kevin Cruijssen il

@KevinCruijssen Whoops, grazie per averlo scoperto!
Graviton,

2

Java 8, 78 74 72 byte

n->{int r=0,j;for(;n>1;n--)for(j=n;j-->1;)if(n%j<1){r+=j;j=0;}return r;}

Porta della risposta C # di @CarlosAlejo .

Provalo qui.

Vecchia risposta (78 byte):

n->{int r=0,i=1,j,k;for(;++i<=n;r+=k)for(j=1,k=1;++j<i;k=i%j<1?j:k);return r;}

Provalo qui.

Spiegazione (della vecchia risposta):

n->{                    // Method with integer parameter and integer return-type
  int r=0,              //  Result-integers
      i=1,j,k;          //  Some temp integers
  for(;++i<=n;          //  Loop (1) from 2 to `n` (inclusive)
      r+=k)             //    And add `k` to the result after every iteration
    for(j=1,k=1;++j<i;  //   Inner loop (2) from `2` to `i` (exclusive)
      k=i%j<1?j:k       //    If `i` is dividable by `j`, replace `k` with `j`
    );                  //   End of inner loop (2)
                        //  End of loop (2) (implicit / single-line body)
  return r;             //  Return result-integer
}                       // End of method



1

Impilato , 31 byte

[2\|>[divisors:pop\MAX]map sum]

Provalo online! (Tutti i casi di prova tranne 1000, che supera il limite di tempo online di 60 secondi.)

Spiegazione

[2\|>[divisors:pop\MAX]map sum]
 2\|>                               range from 2 to the input inclusive
     [                ]map          map this function over the range
      divisors                      get the divisors of the number (including the number)
              :pop\                 pop a number off the array and swap it with the array
                   MAX              gets the maximum value from the array
                           sum      sum's all the max's

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.