Calcola il numero più basso in cui la somma della sequenza di numeri supera un determinato valore


14

Dato che hai una sequenza infinita di numeri definita come segue:

1: 1 = 1
2: 1 + 2 = 3
3: 1 + 3 = 4
4: 1 + 2 + 4 = 7
5: 1 + 5 = 6
6: 1 + 2 + 3 + 6 = 12
7: 1 + 7 = 8
...

La sequenza è la somma dei divisori di n, inclusi 1 e n.

Dato un numero intero positivo xcome input, calcola il numero più basso nche produrrà un risultato maggiore di x.

Casi test

f(100) = 48, ∑ = 124
f(25000) = 7200, ∑ = 25389
f(5000000) = 1164240, ∑ = 5088960

Uscita prevista

Il tuo programma dovrebbe restituire sia n la somma dei suoi divisori, in questo modo:

$ ./challenge 100
48,124

Regole

Questo è code-golf, quindi vince il codice più breve in byte, in ogni lingua.


4
Quella sequenza è solo la somma di ns divisori? Probabilmente vorrai affermarlo esplicitamente.
— Martin Ender,

3
Inoltre, a giudicare dal tuo "output atteso", vuoi entrambi n e f(n) , ma non lo dici da nessuna parte nelle specifiche.
— Martin Ender,

2
I bonus sono cattivi , specialmente quando sono vaghi. Ho deciso di rimuoverlo, al fine di proteggere questo dal downgrade.
— Mr. Xcoder,

2
Potresti ricontrollare f(1000) = 48? La somma divisore di 48is124
— caird coinheringaahing il

3
È bene aspettare almeno una settimana prima di accettare una risposta, altrimenti potresti scoraggiare nuove soluzioni.
— Zgarb,

Risposte:


8

Brachylog , 9 byte

∧;S?hf+S>

Questo programma prende l'input dalla "variabile di output" .e l'output alla "variabile di input" ?. Provalo online!

Spiegazione

∧;S?hf+S>
∧;S        There is a pair [N,S]
   ?       which equals the output
    h      such that its first element's
     f     factors'
      +    sum
       S   equals S,
        >  and is greater than the input.

La variabile implicita Nviene elencata in ordine crescente, quindi il suo valore legale più basso viene utilizzato per l'output.


10

Gelatina , 18 12 11 10 byte

1Æs>¥#ḢṄÆs

Provalo online!

-1 byte grazie a Mr. Xcoder !

Come funziona

1Æs>¥#ḢṄÆs - Main link. Argument: n (integer)
1   ¥#     - Find the first n integers where...
 Æs        -   the divisor sum
   >       -   is greater than the input
       Ṅ   - Print...
      Ḣ    -   the first element
        Æs - then print the divisor sum

Potresti spiegare perché 1è necessario e come ¥agisce?
— dylnan,

1
@dylnan Il 1dice #di iniziare a contare da 1 e ¥prende i due collegamenti precedenti ( Æse >) e li applica come una diade (cioè con due argomenti), con l'argomento sinistro come l'iterazione e l'argomento giusto come input.
— caird coinheringaahing il

Oh, ora ha senso. #in alcuni casi mi aveva confuso un po 'prima.
— Dylnan il

4

Wolfram Language (Mathematica) , 53 byte

{#,f@#}&@@Select[Range[x=#]+1,(f=Tr@*Divisors)@#>x&]&

Provalo online!

Cerca tutti i valori tra 2 e x + 1, dove x è l'input.

( SelectRestituisce un elenco di tutti i valori che funzionano, ma la funzione {#,f@#}&accetta tutti questi come input e quindi ignora tutti i suoi input tranne il primo.)



4

Buccia , 12 11 byte

§eVḟ>⁰moΣḊN

-1 byte, grazie a @Zgarb!

Provalo online!


Intelligente! Strano però come ,non funziona (o l'inferenza impiega troppo tempo?).
— ბიმო

Ne deduce un tipo, ma genera un elenco infinito. Può essere causato dal sovraccarico di ḟ che accetta un numero intero come secondo argomento, ma è solo una supposizione.
— Zgarb,


4

Japt , 15 byte

[@<(V=Xâ x}a V]

Provalo


Spiegazione

Input implicito di numero intero U. []è il nostro wrapper di array. Per il primo elemento, @ }aè una funzione che viene eseguita continuamente fino a quando non restituisce un valore di verità, passando ogni volta un numero intero incrementale (a partire da 0) e producendo il valore finale di quel numero intero. âottiene i divisori dell'intero corrente ( X), xli somma e quel risultato viene assegnato alla variabile V. <controlla se Uè inferiore a V. Il secondo elemento dell'array è quindi giusto V.


4

Clojure , 127 byte

(defn f[n](reduce +(filter #(zero?(rem n %))(range 1(inc n)))))
(defn e[n](loop[i 1 n n](if(>(f i)n){i,(f i)}(recur(inc i)n))))

Provalo online!

grazie a @steadybox per -4 byte!


1
Benvenuti nel sito!
— caird coinheringaahing

Alcuni spazi bianchi possono essere rimossi per salvare pochi byte. Provalo online!
— Steadybox

In questo caso reducepuò essere sostituito da apply, anche la funzione epotrebbe essere espressa come una funzione anonima tramite la #(...)sintassi, non è necessario nominarla su Code Golf. #(=(rem n %)0)è più corto di #(zero?(rem n %)). E ricorda che ,è uno spazio bianco e può essere rimosso in questo caso poiché è seguito da (, quindi verrà analizzato correttamente.
— NikoNyrh,

@NikoNyrh piacere di conoscere un collega chierista, modificherò presto questo post
— Alonoaky,

3

Rubino , 58 byte

Programma completo perché non sono sicuro che i lambda siano ammessi. / scrollata di spalle

gets
$.+=1until$_.to_i.<v=(1..$.).sum{|n|$.%n<1?n:0}
p$.,v

Provalo online!

Spiegazione

gets     # read line ($_ is used instead of v= because it cuts a space)
$.+=1    # $. is "lines read" variable which starts at 1 because we read 1 line
    until     # repeat as long as the next part is not true
$_.to_i  # input, as numeric
  .<v=   # is <, but invoked as function to lower operator prescedence
  (1..$.)        # Range of 1 to n
  .sum{|n|       # .sum maps values into new ones and adds them together
     $.%n<1?n:0  # Factor -> add to sum, non-factor -> 0
  }
p$.,v    # output n and sum

3
Lambdas sono certamente ammessi.
— Giuseppe,

3

JavaScript (ES6), 61 58 byte

f=(n,i=1,s=j=0)=>j++<i?f(n,i,i%j?s:s+j):s>n?[i,s]:f(n,++i)
<input type=number min=0 oninput=o.textContent=f(this.value)><pre id=o>

Modifica: salvato 3 byte grazie a @Arnauld.


Ottengo "Errore di script". quando si immette un valore superiore a 545
— StudleyJr

Prova a usare Safari; a quanto pare supporta l'ottimizzazione delle chiamate di coda. (O se riesci a trovarli, alcune versioni di Chrome lo abilitano tramite le "Funzioni JavaScript sperimentali".)
— Neil



2

SOGL V0.12 , 14 byte

1[:Λ∑:A.>?ao←I

Provalo qui!

Spiegazione:

1               push 1
 [              while ToS != 0
  :Λ              get the divisors
    ∑             sum
     :A           save on variable A without popping
       .>?  ←     if greater than the input
          ao        output the variable A
            ←       and stop the program, implicitly outputting ToS - the counter
             I    increment the counter


2

MATL , 12 byte

`@Z\sG>~}@6M

Provalo online!

Spiegazione

`      % Do...while
  @    %   Push iteration index (1-based)
  Z\   %   Array of divisors
  s    %   Sum of array
  G    %   Push input
  >~   %   Greater than; logical negate. This is the loop condition
}      % Finally (execute on loop exit)
  @    %   Push latest iteration index
  6M   %   Push latest sum of divisors again
       % End (implicit). Run new iteration if top of the stack is true
       % Display stack (implicit)




2

Fattore , 88

USE: math.primes.factors [ 0 0 [ drop 1 + dup divisors sum pick over > ] loop rot drop ]

Ricerca della forza bruta. È una citazione (lambda), callcon xnello stack, foglie nef(n) nello stack.

Come una parola:

: f(n)>x ( x -- n f(n) )
  0 0 [ drop 1 + dup divisors sum pick over > ] loop rot drop ;

2

Python 3, 163 byte

def f(x):
    def d(x):return[i for i in range(1,x+1) if x%i==0]
    return min(i for i in range(x) if sum(d(i)) >x),sum(d(min(i for i in range(x) if sum(d(i)) >x)))

3
Ciao e benvenuto in PPCG; bel primo post! Da un aspetto golfistico, è possibile salvare alcuni byte rimuovendo gli spazi bianchi, utilizzando le funzioni lambda, comprimendo tutto su una riga e non ripetendosi. Di solito ci colleghiamo anche a un ambiente di test online, come ad esempio TIO ( 105 byte , utilizzando le tecniche sopra descritte)
— Jonathan Frech,

@JonathanFrech: eccellente commento. Grazie per la pazienza con i noobies in generale e noobin particolare;)
— Eric Duminil,

2

Python 3 , 100 byte

d=lambda y:sum(i+1for i in range(y)if y%-~i<1)
f=lambda x:min((j,d(j))for j in range(x+1)if x<=d(j))

Provalo online!

Grazie a Jonathan Frech commento sul precedente tentativo di Python 3, ho appena ampliato notevolmente la mia conoscenza della sintassi di Python. Non avrei mai pensato al trucco - ~ i per i + 1, che salva due personaggi.

Tuttavia, quella risposta è 1) non minima e 2) non funziona per x = 1 (a causa di un errore off-by-one che è facile da fare mentre si va per brevità; suggerisco a tutti gli altri di controllare le loro risposte per questo vantaggio Astuccio!).

Spiegazione rapida: sum(i+1for i in range(y)if y%-~i<1)equivale a sum(i for i in range(1,y+1)if y%i<1)ma salva due caratteri. Grazie ancora a Mr. Frech.

d=lambda y:sum(i+1for i in range(y)if y%-~i<1) pertanto restituisce i divisori di y.

f=lambda x:min((j,d(j))for j in range(x+1)if x<=d(j))è dove ho lavorato davvero. Dato che il confronto di una tupla funziona nell'ordine del dizionario, possiamo confrontare j, d (j) con la stessa facilità con cui possiamo confrontare j, e questo non ci permette di trovare il minimo j, memorizzarlo in una variabile e / quindi / calcolare il tupla in un'operazione separata. Inoltre, dobbiamo avere <=, non <, in x<=d(j), perché d (1) è 1, quindi se x è 1 non ottieni nulla. Questo è anche il motivo per cui abbiamo bisogno range(x+1)e nonrange(x).

In precedenza avevo restituito la tupla, ma poi devo sottoscriverla in f, quindi sono necessari altri tre caratteri.


1
Welcome to the site and nice first post. You can get to 98 bytes by removing the f= as anonymous functions are perfectly acceptable here!
— caird coinheringaahing

You can't call an anonymous function from another line of code, is the problem -- I have a separate print(f(100)) statement to test that the function works.
— Michael Boger

That's not a problem here. It's perfectly acceptable and works to not include the f= in your byte count, and is a good way to golf in Python. Check this for more golfing tips in Python!
— caird coinheringaahing

Hm. I can equal, but not better, my submission by appending q=range and replacing range with q in both existing instances. Sadly, this doesn't improve it and since lambda is a keyword I can't use it for that, I'd have to do exec() tricks wasting too many characters.
— Michael Boger

@MichaelBoger Well, you can call an anonymous function in Python; lambda expressions do not have to be assigned to a variable.
— Jonathan Frech

2

Python 2, 81 bytes

def f(n):
 a=b=0
 while b<n:
	a+=1;i=b=0
	while i<a:i+=1;b+=i*(a%i<1)
 return a,b

Try it online!



Replacing the tabs with two spaces makes this work in python 3 at 83 bytes, although to try it I had to put parentheses in the print statement. You can also replace the return statement with a print statement and not need an auxiliary function to print it; the bytes stay the same.
— Michael Boger



0

Clojure, 102 bytes

#(loop[i 1](let[s(apply +(for[j(range 1(inc i)):when(=(mod i j)0)]j))](if(> s %)[i s](recur(inc i)))))

0

PHP, 69 bytes

for(;$argv[1]>=$t;)for($t=$j=++$i;--$j;)$t+=$i%$j?0:$j;echo$i,',',$t;

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.