Calcule o número mais baixo em que a soma da sequência de números excede um determinado valor


14

Dado que você tem uma sequência infinita de números definidos da seguinte maneira:

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
...

A sequência é a soma dos divisores de n, incluindo 1 e n.

Dado um número inteiro positivo xcomo entrada, calcule o número mais baixo nque produzirá um resultado maior que x.

Casos de teste

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

Saída esperada

Seu programa deve retornar ambos n e a soma de seus divisores, da seguinte maneira:

$ ./challenge 100
48,124

Regras

Este é o código-golfe, portanto o código mais curto em bytes, em cada idioma, vence.


4
Essa sequência é apenas a soma dos ns divisores? Você provavelmente desejará declarar isso explicitamente.
Martin Ender

3
Além disso, a julgar pela sua "saída esperada", você deseja ambos n e f(n) , mas não o diz em nenhum lugar da especificação.
Martin Ender

2
Os bônus são ruins , especialmente quando são vagos. Decidi removê-lo, a fim de evitar que isso fosse prejudicado.
Xcoder

2
Você poderia verificar novamente f(1000) = 48? A soma do divisor de 48is é124
caird coinheringaahing

3
É bom esperar pelo menos uma semana antes de aceitar uma resposta, caso contrário, você pode desencorajar novas soluções.
Zgarb

Respostas:


8

Braquilog , 9 bytes

∧;S?hf+S>

Este programa recebe entrada da "variável de saída" .e sai para a "variável de entrada" ?. Experimente online!

Explicação

∧;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.

A variável implícita Né enumerada em ordem crescente, portanto seu menor valor legal é usado para a saída.


10

Geléia , 18 12 11 10 bytes

1Æs>¥#ḢṄÆs

Experimente online!

-1 byte graças ao Sr. Xcoder !

Como funciona

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

Você poderia explicar por que o 1é necessário e como os ¥atos?
precisa saber é o seguinte

1
@dylnan A 1diz# para começar a contar de 1 e ¥pega os dois links anteriores ( Æse >) e os aplica como díade (ou seja, com dois argumentos), com o argumento esquerdo sendo a iteração e o argumento correto sendo a entrada.
você precisa saber é o seguinte

Oh, isso faz sentido agora. #tinha sido um pouco confuso para mim antes em alguns casos.
perfil completo de Dylnan

4

Wolfram Language (Mathematica) , 53 bytes

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

Experimente online!

Tenta todos os valores entre 2 e x + 1, onde x é a entrada.

(Ele Selectretorna uma lista de todos os valores que funcionam, mas a função {#,f@#}&aceita todos esses itens como entradas e depois ignora todas as entradas, exceto a primeira.)



4

Husk , 12 11 bytes

§eVḟ>⁰moΣḊN

-1 byte, graças a @Zgarb!

Experimente online!


Esperto! Por mais estranho que seja, como ,não funciona (ou a inferência leva muito tempo?).
ბიმო

Ele infere um tipo, mas gera uma lista infinita. Pode ser causado pela sobrecarga de ḟ que recebe um número inteiro como segundo argumento, mas isso é apenas um palpite.
Zgarb 2/17/17


4

Japonês , 15 bytes

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

Tente


Explicação

Entrada implícita de número inteiro U. []é o nosso wrapper de matriz. Para o primeiro elemento, @ }aé uma função que é executada continuamente até retornar um valor de verdade, passando para si um número inteiro incremental (começando em 0) a cada vez e emitindo o valor final desse número inteiro. ârecebe os divisores do inteiro atual ( X), xresume-los e esse resultado é atribuído à variável V. <verifica se Ué menor que V. O segundo elemento na matriz é então apenas V.


4

Clojure , 127 bytes

(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))))

Experimente online!

graças a @steadybox por -4 bytes!


1
Bem vindo ao site!
caird coinheringaahing

Alguns espaços em branco podem ser removidos para salvar alguns bytes. Experimente online!
Steadybox

Nesse caso, reducepode ser substituído por apply, também a função epode ser expressa como uma função anônima através da #(...)sintaxe, você não precisa nomeá-lo no Code Golf. #(=(rem n %)0)é mais curto que #(zero?(rem n %)). E lembre-se de que ,é um espaço em branco e, nesse caso, pode ser removido conforme for seguido (, para que seja analisado corretamente.
NikoNyrh 17/0118

@NikoNyrh bom conhecer um companheiro clojurist, eu vou editar este post em breve
Alonoaky

3

Rubi , 58 bytes

Programa completo, porque não tenho certeza se lambdas são permitidas. /dar de ombros

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

Experimente online!

Explicação

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 certamente são permitidas.
21417 Giuseppe #

3

JavaScript (ES6), 61 58 bytes

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>

Editar: salvou 3 bytes graças a @Arnauld.


Eu recebo "Erro de script". ao inserir um valor acima de 545
StudleyJr 4/17/17

Tente usar o Safari; aparentemente, ele suporta otimização de chamada de cauda. (Ou se você pode encontrá-los, algumas versões do Chrome habilitá-lo através das "características Experimental JavaScript".)
Neil



2

SOGL V0.12 , 14 bytes

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

Experimente aqui!

Explicação:

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 bytes

`@Z\sG>~}@6M

Experimente online!

Explicação

`      % 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

Fator , 88

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

Pesquisa por força bruta. É uma cotação (lambda), callcomx na pilha, folhas nef(n) na pilha.

Como uma palavra:

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

2

Python 3, 163 bytes

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
Olá e bem-vindo ao PPCG; bom primeiro post! Do ponto de vista do golfe, você pode salvar alguns bytes removendo o espaço em branco, usando as funções lambda, recolhendo tudo em uma linha e não se repetindo. Também geralmente vinculamos a um ambiente de teste on-line, como, por exemplo, TIO ( 105 bytes , usando as técnicas descritas acima).
Jonathan Frech

@ JonathanFrech: Excelente comentário. Obrigado pela sua paciência com noobies em geral e noob, em particular;)
Eric Duminil

2

Python 3 , 100 bytes

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))

Experimente online!

Graças a Jonathan Frech sobre a tentativa anterior do python 3, eu apenas ampliei bastante meu conhecimento da sintaxe do python. Eu nunca teria pensado no truque - ~ i for i + 1, que salva dois caracteres.

No entanto, essa resposta é 1) não é mínima e 2) não funciona para x = 1 (devido a um erro de um por um que é fácil de fazer enquanto se busca brevidade; sugiro que todos os demais verifiquem suas respostas para obter essa vantagem) caso!).

Explicação rápida: sum(i+1for i in range(y)if y%-~i<1)é equivalente asum(i for i in range(1,y+1)if y%i<1) mas salva dois caracteres. Mais uma vez obrigado ao Sr. Frech.

d=lambda y:sum(i+1for i in range(y)if y%-~i<1) portanto, retorna os divisores de y.

f=lambda x:min((j,d(j))for j in range(x+1)if x<=d(j))é onde eu realmente trabalhei. Como comparar uma tupla funciona em ordem de dicionário, podemos comparar j, d (j) tão facilmente quanto podemos comparar j, e isso não nos permite encontrar o mínimo j, armazená-lo em uma variável e / depois / calcular o tupla em uma operação separada. Além disso, temos que ter <=, não <, em x<=d(j), porque d (1) é 1; portanto, se x é 1, você não obtém nada. É também por isso que precisamos range(x+1)e não range(x).

Eu já havia retornado a tupla, mas preciso inscrevê-la em f, para que sejam necessários mais três caracteres.


1
Bem-vindo ao site e bom primeiro post. Você pode obter 98 bytes removendo as f=funções anônimas que são perfeitamente aceitáveis ​​aqui!
caird coinheringaahing

Você não pode chamar uma função anônima de outra linha de código, é o problema - eu tenho uma instrução print (f (100)) separada para testar se a função funciona.
Michael Boger

Isso não é um problema aqui. É perfeitamente aceitável e trabalha para não incluir o f=número de bytes e é uma boa maneira de jogar golfe no Python. Verifique isso para obter mais dicas de golfe em Python!
você precisa saber é o seguinte

Hum. Posso igualar, mas não melhor, minha submissão anexando q=rangee substituindo rangepor qnas duas instâncias existentes. Infelizmente, isso não o melhora e, como lambda é uma palavra-chave, não posso usá-la para isso, eu teria que fazer truques exec () desperdiçando muitos caracteres.
Michael Boger

@ MichaelBoger Bem, você pode chamar uma função anônima em Python; As expressões lambda não precisam ser atribuídas a uma variável.
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

Experimente online!



Substituir as guias por dois espaços torna este trabalho em python 3 a 83 bytes, embora, para tentar, eu precisei colocar parênteses na instrução print. Você também pode substituir a declaração de devolução por uma declaração de impressão e não precisa de uma função auxiliar para imprimi-la; os bytes permanecem os mesmos.
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;

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.