Saída do enésimo número par perfeito

16

Desafio

Dado um número inteiro, n, como entrada onde 0 <= n <= 2^10, gera o enésimo número par perfeito.

Números perfeitos

Um número perfeito é um número, x onde a soma de seus fatores (excluindo-se) é igual a x. Por exemplo, 6:

6: 1, 2, 3, 6

E, é claro 1 + 2 + 3 = 6, então 6 é perfeito.

Se um número perfeito,, xé par x mod 2 = 0,.

Exemplos

A seguir, são apresentados os 10 primeiros números perfeitos:

6
28
496
8128
33550336
8589869056
137438691328
2305843008139952128
2658455991569831744654692615953842176
191561942608236107294793378084303638130997321548169216

Observe que você pode indexar isso da maneira que desejar: 6 pode ser o primeiro ou o 0º número perfeito.

Ganhando

O menor código em bytes vence.

Beta Decay
fonte
2
@LeakyNun eu acho que é uma pergunta em aberto. Se essa pergunta tivesse o nésimo número perfeito ímpar ... Você precisaria de um bilhão de recompensas para resolver isso. blogs.ams.org/mathgradblog/2013/07/25/odd-perfect-numbers-exist (não existe nenhum abaixo de 10 ^ 300)
Rohan Jhunjhunwala
1
Qual é o menor número ímpar perfeito?
Freira vazada
5
Um número par n é perfeito se houver um primo de Mersenne p tal que n = p (p + 1) / 2 . Não existe uma fórmula para números perfeitos ímpares; além disso, não se sabe se existem números ímpares perfeitos.
Dennis
2
Nem tanto. Existem apenas 49 primos Mersenne conhecidos.
Dennis
1
@BetaDecay: é maior que $ 49 $, portanto, o 60º número perfeito não é conhecido.
Ross Millikan

Respostas:

7

Geléia , 7 bytes

6Æṣ=$#Ṫ

Experimente online!

Como funciona

6Æṣ=$#Ṫ  Main link. Argument: n

6        Set the return value to 6.
     #   Execute the link to the left with argument k = 6, 7, 8, ... until n
         values of k result in a truthy value. Yield the array of matches.
    $        Combine the two links to the left into a monadic chain.
 Æṣ              Compute the sum of k's proper divisors.
   =             Compare the result with k.
      Ṫ  Tail; extract the last match.
Dennis
fonte
Tantas builtins sobre divisores ...
Erik o Outgolfer
6

Mathematica, 13 bytes

Não é de surpreender que haja um built-in.

PerfectNumber

Exemplo:

In[1]:= PerfectNumber[18]                                                       

Out[1]= 33570832131986724437010877211080384841138028499879725454996241573482158\

>    45044404288204877880943769038844953577426084988557369475990617384115743842\

>    47301308070476236559422361748505091085378276585906423254824947614731965790\

>    74656099918600764404702181660294469121778737965822199901663478093006075022\

>    35922320184998563614417718592540207818507301504509772708485946474363553778\

>    15002849158802448863064617859829560720600134749556178514816801859885571366\

>    09224841817877083608951191123174885226416130683197710667392351007374503755\

>    40335253147622794359007165170269759424103195552989897121800121464177467313\

>    49444715625609571796578815564191221029354502997518133405151709561679510954\

>    53649485576150660101689160658011770193274226308280507786835049549112576654\

>    51011967045674593989019420525517538448448990932896764698816315598247156499\

>    81962616327512831278795091980742531934095804545624886643834653798850027355\

>    06153988851506645137759275553988219425439764732399824712438125054117523837\

>    43825674443705501944105100648997234160911797840456379499200487305751845574\

>    87014449512383771396204942879824895298272331406370148374088561561995154576\

>    69607964052126908149265601786094447595560440059050091763547114092255371397\

>    42580786755435211254219478481549478427620117084594927467463298521042107553\

>    17849183589266903954636497214522654057134843880439116344854323586388066453\

>    13826206591131266232422007835577345584225720310518698143376736219283021119\

>    28761789614688558486006504887631570108879621959364082631162227332803560330\

>    94756423908044994601567978553610182466961012539222545672409083153854682409\

>    31846166962495983407607141601251889544407008815874744654769507268678051757\

>    74695689121248545626112138666740771113961907153092335582317866270537439303\

>    50490226038824797423347994071302801487692985977437781930503487497407869280\

>    96033906295910199238181338557856978191860647256209708168229116156300978059\

>    19702685572687764976707268496046345276316038409383829227754491185785965832\

>    8888332628525056
alefalpha
fonte
Eu acho que existe uma brecha padrão para isso?
Paŭlo Ebermann 4/17
1
@ PaŭloEbermann correto, com 19 votos negativos e um comentário com 94 votos positivos
Tim
4

MATL , 15 bytes

`@Z\s@E=vtsG<}n

Muito devagar. Ele continua tentando aumentar os números um por um até que o n- ésimo número perfeito seja encontrado.

Experimente online!

Explicação

`        % Do...while
  @      %   Push iteration index, k (starting at 1)
  Z\     %   Array of divisors
  s      %   Sum
  @E     %   Push k. Multiply by 2
  =      %   Equal? If so, k is a perfect number
  v      %   Concatenate vertically. This gradually builds an array which at the k-th
         %   iteration contains k zero/one values, where ones indicate perfect numbers
  ts     %   Duplicate. Sum of array
  G<     %   Push input. Less than? This is the loop condition: if true, proceed with
         %   next iteration
}        % Finally (execute right before exiting loop)
  n      %   Number of elements of the array
         % End (implicit). Display (implicit)
Luis Mendo
fonte
3

Pitão , 13 bytes

e.fqsf!%ZTStZ

Experimente online!

Por favor, não tente um número maior. Apenas testa os números pares um por um.

Freira Furada
fonte
@BetaDecay obrigado, atualizado.
Freira Furada
2

05AB1E , 8 bytes

µNNѨOQ½

Experimente online!

Explicação

µ          # loop over increasing N until counter equals input
 N         # push N
  NÑ       # push factors of N
    ¨      # remove last factor (itself)
     O     # sum factors
      Q    # compare the sum to N for equality
       ½   # if true, increase counter
Emigna
fonte
2

Python 2 , 198 153 83 78 77 75 74 bytes

i=input()
j=0
while i:j+=1;i-=sum(x*(j%x<1)for x in range(1,j))==j
print j

Experimente online!

Agora, apenas lê como psuedocode.

  • Economizei 45 incontáveis ​​bytes porque o @Leaky Nun me ensinou sobre a função soma e compreensão de lista.

  • Economizou 2 bytes graças à sugestão de @ shooqie de remover os colchetes desnecessários.

Apenas iteramos todos os números pares até encontrarmos n números perfeitos.

Rohan Jhunjhunwala
fonte
observe que você gé realmente justo sum.
Leaky Nun
O @LeakyNun me serve bem, por não conhecer as bibliotecas python. Eu realmente deveria aprender mais do que apenas java e SILOS.
Rohan Jhunjhunwala
mais golfinhos
Leaky Nun
2

PHP, 111 bytes

0-Indexação

Trabalha com o conceito de que um número perfeito é um número em que n=x*y x=2^i e y=2^(i+1)-1e y devem ser primos

for(;!$r[$argn];$u?:$r[]=$z)for($z=2**++$n*($y=2**($n+1)-1),$u=0,$j=1;$j++<sqrt($y);)$y%$j?:$u++;echo$r[$argn];

Experimente online!

Jörg Hülsermann
fonte
1

Python 3 , 69 bytes

f=lambda n,k=1:n and-~f(n-(sum(j>>k%j*j for j in range(1,k))==k),k+1)

Experimente online!

Dennis
fonte
1

Scala, 103 bytes

n=>Stream.from(1).filter(_%2==0).filter(x=>Stream.from(1).take(x-1).filter(x%_==0).sum==x).drop(n).head
Fénix
fonte
1

Haskell, 61 bytes

(!!)(filter(\x->x==sum[n|n<-[1..x-1],x`mod`n==0]||x==1)[1..])
Enderperson1010
fonte
Como o índice pode começar em 0, você não precisa do ||x==1. Você também pode salvar bytes movendo o !!antes do parêntese de fechamento para criar uma seção de operador e substituindo o filterpor outra compreensão da lista.
faubi
0

JavaScript (ES6), 68 bytes

n=>eval(`for(x=5;n;s||n--)for(f=s=++x;f--;)(x/f-(x/f|0))||(s-=f);x`)

darrylyeo
fonte
0

Perl 6 , 42 bytes

{(grep {$_==[+] grep $_%%*,^$_},^∞)[$_]}

O índice de entrada é baseado em 1.

Sean
fonte
0

Clojure, 79 bytes

#(nth(for[i(range):when(=(apply +(for[j(range 1 i):when(=(mod i j)0)]j))i)]i)%)

Seguindo as especificações, uso pesado da :whencondição de.

NikoNyrh
fonte