\ $n\$-números perfectos

Sep 14 2020

Un entero positivo \$x\$es un \$n\$-número perfecto si \$\sigma(x) = nx\$, donde \$\sigma(x)\$es la función de suma del divisor. Por ejemplo, \$120\$es un \$3\$-número perfecto porque sus divisores suman \$360\$:

$$360 = 3\times120 = 1+2+3+4+5+6+8+10+12+15+20+24+30+40+60+120$$

y

$$926073336514623897600 = 6\times154345556085770649600 = 1+2+3+4+5+6+7+8+9+10+11+12+\dots+51448518695256883200+77172778042885324800+154345556085770649600$$

entonces \$154345556085770649600\$es un \$6\$-número perfecto.

Vas a tomar un entero \$x\$como entrada y salida un valor \$n\$, tal que \$x\$es un \$n\$-número perfecto. Si no tal \$n\$existe, puede generar cualquier valor consistente que no sea un entero positivo. Nunca recibirá una entrada fuera de los límites de su idioma, pero su algoritmo debe funcionar para \$x\$.

Esto es código de golf, por lo que gana el código más corto en bytes.

Mini desafío: Batir 5 bytes en Jelly

Casos de prueba

    x -> n
    1 -> 1
    2 -> 0
    3 -> 0
    4 -> 0
    5 -> 0
    6 -> 2
   28 -> 2
  120 -> 3
  496 -> 2
  500 -> 0
  672 -> 3
30240 -> 4
154345556085770649600 -> 6

Respuestas

9 Zgarb Sep 14 2020 at 11:28

Cáscara , 4 bytes

¦¹ΣḊ

¡Pruébelo en línea!

El último caso de prueba expira.

Explicación

¦¹ΣḊ   Input is a number x.
   Ḋ   List of divisors.
  Σ    Sum.
¦      Division if divisible, 0 if not
 ¹     by x.

¦ suele ser solo una prueba de divisibilidad, pero aquí su valor de retorno es útil.

8 Sisyphus Sep 14 2020 at 10:59

Gelatina , 5 bytes

R×iÆs

¡Pruébelo en línea!

Explicación:

      - Explanation (sample for input 6)
R     - Range ([1, 2, 3, 4, 5, 6])
 ×    - Multiply by input ([6, 12, 18, 24, 30, 36])
   Æs - Divisor sum (12)
  i   - Index of divisor sum in list, else 0 (2)
7 xash Sep 14 2020 at 05:24

Brachylog , 6 bytes

f+;?/ℕ

¡Pruébelo en línea!

Cómo funciona

f+;?/ℕ
f+     the sum of the factors
  ;?/ℕ divided by the input
     ℕ is a natural number

Versión alternativa, creo que es más genial, pero más larga:

f+~×[?,.]∧
f+          the sum of the factors
  ~×        unifies with the multiplication of
    [?,.]   the input and the output
         ∧  return the output
6 Bismarck71 Sep 14 2020 at 14:36

05AB1E , 7 6 bytes

Ý*IÑOk

¡Pruébelo en línea!

Explicación:

Ý*IÑOk>
Ý        0-Index inclusive range of input (6 -> [1, 2, 3, 4, 5, 6])
 *       Multiply by input ([6, 12, 18, 24, 30, 36])
  IÑO    Get input -> divisors -> sum (6 -> [1, 2, 3, 6] -> 12)
     k   0-Index of divisor-sum in array or -1 if not found. ([6, >12<, 18, 24, 30, 36] -> 1)

Acabo de usar el método de Sísifo. Esto probablemente podría reducirse o incluso hacerse más eficiente, pero carezco del conocimiento de 05AB1E para hacerlo. Solo pensé en darle una oportunidad para pasar el tiempo.

-1 Byte gracias a ovs

5 AZTECCO Sep 14 2020 at 07:30

C (gcc) , 47 bytes

s,i;f(x){for(i=s=x;--i;)s+=x%i?0:i;s/=s%x*s+x;}

¡Pruébelo en línea!

Devoluciones no 0.

5 JoKing Sep 14 2020 at 11:23

APL (Dyalog Unicode) , 16 15 13 bytes

Gracias a Bubbler por señalar que puedo cambiar el formato de salida para ahorrar un par de bytes

⍸×∘⍳⍨=1⊥∘∪⊢∨⍳

¡Pruébelo en línea!

Genera una lista singleton de ncuando nexiste y una matriz vacía en caso contrario. Encuentra el índice de ( ⍸) donde la suma de ( 1⊥) los divisores ( ∪⊢∨⍳) es igual a ( =) un múltiplo de la entrada ( ×∘⍳⍨). Utilizo ⍸y en =lugar de solo ⍳para encontrar el índice porque devuelve una lista vacía cuando el elemento no está allí en lugar de la longitud de la lista.

4 KevinCruijssen Sep 14 2020 at 16:17

Espacio en blanco , 153 bytes

[S S S N
_Push_0][S N
S _Duplicate_0][T   N
T   T   _Read_STDIN_as_integer][T   T   T   _Retrieve_input][S N
S _Duplicate_input][S N
S _Duplicate_input][N
S S N
_Create_Label_LOOP][S S S T N
_Push_1][T  S S T   _Subtract][S N
S _Duplicate][N
T   S S N
_If_0_Jump_to_Label_REACHED_ZERO][S T   S S T   S N
_Copy_0-based_2nd_input][S T    S S T   N
_Copy_0-based_1st_integer][T    S T T   _Modulo][N
T   S T N
_If_0_Jump_to_Label_ADD_TO_SUM][N
S N
N
_Jump_to_Label_LOOP][N
S S T   N
_Create_Label_ADD_TO_SUM][S N
T   _Swap_top_two][S T  S S T   N
_Copy_0-based_1st_integer][T    S S S _Add_top_two][S N
T   _Swap_top_two][N
S N
N
_Jump_to_Label_LOOP][N
S S S N
_Create_Label_REACHED_ZERO][S N
N
_Discard_top][S N
S _Duplicate_top][S T   S S T   S N
_Copy_0-based_2nd_input][T  S T T   _Modulo][N
T   S S S N
_If_0_Jump_to_Label_DIVISIBLE][S S S N
_Push_0][N
S N
S T 
_Jump_to_Label_OUTPUT][N
S S S S N
_Create_Label_DIVISIBLE][S N
T   _Swap_top_two][T    S T S _Integer_divide_top_two][N
S S S T N
_Create_Label_OUTPUT][T N
S T _Output_as_integer]

Las letras S(espacio), T(tabulador) y N(nueva línea) se agregaron solo como resaltado.
[..._some_action]añadido sólo como explicación.

Pruébelo en línea (solo con espacios sin formato, pestañas y nuevas líneas).

Explicación en pseudocódigo:

Integer input = STDIN as input
Integer sum = input
Integer i = input
Start LOOP:
  i = i - 1
  If(i == 0):
    Jump to Label REACHED_ZERO
  If(input % i == 0):
    sum = sum + i
  Go to next iteration of LOOP

Label REACHED_ZERO:
  Integer output
  If(sum % input == 0):
    output = sum integer-divided by input
  Else:
    output = 0

  Print output as integer to STDOUT

Ejecución de ejemplo: input = 6

Command    Explanation                       Stack         Heap   STDIN  STDOUT  STDERR

SSSN       Push 0                            [0]
SNS        Duplicate top (0)                 [0,0]
TNTT       Read STDIN as integer             [0]           {0:6}  6
TTT        Retrieve at address (0)           [6]           {0:6}
SNS        Duplicate top (6)                 [6,6]         {0:6}
SNS        Duplicate top (6)                 [6,6,6]       {0:6}
NSSN       Create Label LOOP                 [6,6,6]       {0:6}
 SSSTN     Push 1                            [6,6,6,1]     {0:6}
 TSST      Subtract top two (6-1)            [6,6,5]       {0:6}
 SNS       Duplicate top (5)                 [6,6,5,5]     {0:6}
 NTSSN     If 0: Jump to Label REACHED_ZERO  [6,6,5]       {0:6}
 STSSTSN   Copy 0-based 2nd (6)              [6,6,5,6]     {0:6}
 STSSTN    Copy 0-based 1st (5)              [6,6,5,6,5]   {0:6}
 TSTT      Modulo top two (6%5)              [6,6,5,1]     {0:6}
 NTSTN     If 0: Jump to Label ADD_TO_SUM    [6,6,5]       {0:6}
 NSNN      Jump to Label LOOP                [6,6,5]       {0:6}

 SSSTN     Push 1                            [6,6,5,1]     {0:6}
 TSST      Subtract top two (5-1)            [6,6,4]       {0:6}
 SNS       Duplicate top (4)                 [6,6,4,4]     {0:6}
 NTSSN     If 0: Jump to Label REACHED_ZERO  [6,6,4]       {0:6}
 STSSTSN   Copy 0-based 2nd (6)              [6,6,4,6]     {0:6}
 STSSTN    Copy 0-based 1st (4)              [6,6,4,6,4]   {0:6}
 TSTT      Modulo top two (6%4)              [6,6,4,2]     {0:6}
 NTSTN     If 0: Jump to Label ADD_TO_SUM    [6,6,4]       {0:6}
 NSNN      Jump to Label LOOP                [6,6,4]       {0:6}

 SSSTN     Push 1                            [6,6,4,1]     {0:6}
 TSST      Subtract top two (4-1)            [6,6,3]       {0:6}
 SNS       Duplicate top (3)                 [6,6,3,3]     {0:6}
 NTSSN     If 0: Jump to Label REACHED_ZERO  [6,6,3]       {0:6}
 STSSTSN   Copy 0-based 2nd (6)              [6,6,3,6]     {0:6}
 STSSTN    Copy 0-based 1st (3)              [6,6,3,6,3]   {0:6}
 TSTT      Modulo top two (6%3)              [6,6,3,0]     {0:6}
 NTSTN     If 0: Jump to Label ADD_TO_SUM    [6,6,3]       {0:6}
 NSSTN     Create Label ADD_TO_SUM           [6,6,3]       {0:6}
  SNT      Swap top two                      [6,3,6]       {0:6}
  STSSTN   Copy 0-based 1st (3)              [6,3,6,3]     {0:6}
  TSSS     Add top two (6+3)                 [6,3,9]       {0:6}
  SNT      Swap top two                      [6,9,3]       {0:6}
  NSNN     Jump to Label LOOP                [6,9,3]       {0:6}

 SSSTN     Push 1                            [6,9,3,1]     {0:6}
 TSST      Subtract top two (3-1)            [6,9,2]       {0:6}
 SNS       Duplicate top (2)                 [6,9,2,2]     {0:6}
 NTSSN     If 0: Jump to Label REACHED_ZERO  [6,9,2]       {0:6}
 STSSTSN   Copy 0-based 2nd (6)              [6,9,2,6]     {0:6}
 STSSTN    Copy 0-based 1st (5)              [6,9,2,6,2]   {0:6}
 TSTT      Modulo top two (6%5)              [6,9,2,0]     {0:6}
 NTSTN     If 0: Jump to Label ADD_TO_SUM    [6,9,2]       {0:6}
  SNT      Swap top two                      [6,2,9]       {0:6}
  STSSTN   Copy 0-based 1st (2)              [6,2,9,2]     {0:6}
  TSSS     Add top two (9+2)                 [6,2,11]      {0:6}
  SNT      Swap top two                      [6,11,2]      {0:6}
  NSNN     Jump to Label LOOP                [6,11,2]      {0:6}

 SSSTN     Push 1                            [6,11,2,1]    {0:6}
 TSST      Subtract top two (2-1)            [6,11,1]      {0:6}
 SNS       Duplicate top (1)                 [6,11,1,1]    {0:6}
 NTSSN     If 0: Jump to Label REACHED_ZERO  [6,11,1]      {0:6}
 STSSTSN   Copy 0-based 2nd (6)              [6,11,1,6]    {0:6}
 STSSTN    Copy 0-based 1st (1)              [6,11,1,6,1]  {0:6}
 TSTT      Modulo top two (6%1)              [6,11,1,0]    {0:6}
 NTSTN     If 0: Jump to Label ADD_TO_SUM    [6,11,1]      {0:6}
  SNT      Swap top two                      [6,1,11]      {0:6}
  STSSTN   Copy 0-based 1st (1)              [6,1,11,1]    {0:6}
  TSSS     Add top two (11+1)                [6,1,12]      {0:6}
  SNT      Swap top two                      [6,12,1]      {0:6}
  NSNN     Jump to Label LOOP                [6,12,1]      {0:6}

 SSSTN     Push 1                            [6,12,1,1]    {0:6}
 TSST      Subtract top two (1-1)            [6,12,0]      {0:6}
 SNS       Duplicate top (1)                 [6,12,0,0]    {0:6}
 NTSSN     If 0: Jump to Label REACHED_ZERO  [6,12,0]      {0:6}
 NSSSN     Create Label REACHED_ZERO         [6,12,0]      {0:6}
  SNN      Discard top (0)                   [6,12]        {0:6}
  SNS      Duplicate top (12)                [6,12,12]     {0:6}
  STSSTSN  Copy 0-based 2nd (6)              [6,12,12,6]   {0:6}
  TSTT     Modulo top two (12%6)             [6,12,0]      {0:6}
  NTSSSN   If 0: Jump to Label DIVISIBLE     [6,12]        {0:6}
  NSSSSN   Create Label DIVISIBLE            [6,12]        {0:6}
   SNT     Swap top two                      [12,6]        {0:6}
   TSTS    Integer-divide top two (12/6)     [2]           {0:6}
   NSSSTN  Create Label OUTPUT               [2]           {0:6}
    TNST   Output top as integer (2)         []            {0:6}         2
                                                                                 error

Se detiene con un error después de imprimir el resultado, porque no se define ninguna salida.

4 Mukundan314 Sep 14 2020 at 09:38

Pyth , 15 bytes

&!%Jsf!%QTSQQ/J

¡Pruébelo en línea!

Explicación

&!%Jsf!%QTSQQ/J
   J              # set J to
    s             # sum of
     f    SQ      # filtering the range [1, input] with
      !%QT        # lambda T: not (input % T)    (divisibility test)
                  # implicit print the
&                 # short-circuiting and of
 !%J        Q     # not (J % input)
             /J   # and J / input
3 Arnauld Sep 14 2020 at 04:59

JavaScript (ES6), 41 bytes

Devuelve 0 si no hay solución.

x=>(g=k=>x=k&&k*!(x%k)/x+g(k-1))(x)%1?0:x

¡Pruébelo en línea!

3 JonathanAllan Sep 14 2020 at 05:22

Gelatina , 6 bytes

Æs0:%?

Un enlace monádico que acepta un número entero positivo que da como resultado un número entero no negativo.

¡Pruébelo en línea! O vea la suite de pruebas .

¿Cómo?

Æs0:%? - Link: x
Æs     - divisor sum
     ? - if...
    %  - ...condition: has a remainder when divided
  0    - ...then: zero
    :  - ...else: integeger divide
3 Razetime Sep 14 2020 at 11:22

APL (Dyalog Unicode) , 19 18 bytes

⊢(÷⍨×0=|)1⊥∘⍸0=⍳|⊢

¡Pruébelo en línea!

Conversión a tren por Jo King. (- 3 bytes)

-1 byte más de Jo King después de cambiar la condición de verificación.

Respuesta anterior, 22 bytes

{(⊢×⌊=⊢)⍵÷⍨+/⍸0=⍵|⍨⍳⍵}

Explicación

{(⊢×⌊=⊢)⍵÷⍨+/⍸0=⍵|⍨⍳⍵} ⍵ → input
                   ⍳⍵  range 1-⍵
                ⍵|⍨    mod ⍵
              0=       check which ones are divisors
             ⍸         get the indices (factors)
           +/          sum the factors
        ⍵÷⍨            divide by ⍵
 (⊢×⌊=⊢)               Inner tacit fn:
    ⌊=⊢                Floor equals right? (integer test, returns 0 or 1)
  ⊢×                   times right 
3 ovs Sep 14 2020 at 06:15

Haskell , 51 46 bytes

a!b=0^mod a b*div a b
f n=sum(map(n!)[1..n])!n

¡Pruébelo en línea!

3 J42161217 Sep 14 2020 at 06:24

Wolfram Language (Mathematica) , 30 bytes

Tr@Divisors@#/#/._Rational->0&

¡Pruébelo en línea!

-6 bytes de @att

3 Neil Sep 14 2020 at 05:55

Carbón , 23 20 bytes

NθI⌕E⊕θ×θιΣΦ⊕θ∧ι¬﹪θι

¡Pruébelo en línea! El enlace corresponde a la versión detallada del código. Puerto del algoritmo de @ Sisyphus pero usando el comentario de @ ovs para lidiar con la indexación 0. Salidas -1por inexistencia. Explicación:

Nθ                      Input `x` as a number
             θ          `x`
            ⊕           Incremented
           Φ            Filter over implicit range
               ι        Current index
              ∧         Logical AND
                  θ     `x`
                 ﹪      Modulo
                   ι    Current index
                ¬       Logical NOT
          Σ             Take the sum
      θ                 `x`
     ⊕                  Incremented
    E                   Map over implicit range
        θ               `x`
       ×                Multiplied by
         ι              Current index
   ⌕                    Find the index
  I                     Cast to string
                        Implicitly print

Desafortunadamente para Charcoal, la suma de []no es cero, lo que significa que no puedo guardar un byte eliminando los dos incrementos de xe incrementando el resultado.

Solución anterior de 23 bytes:

Nθ≔ΣΦ⊕θ∧ι¬﹪θιη¿¬﹪ηθI÷ηθ

¡Pruébelo en línea! El enlace corresponde a la versión detallada del código. Explicación:

Nθ

Entrada x.

≔ΣΦ⊕θ∧ι¬﹪θιη

Crea una lista 1..x, filtra los números que no se dividen xy calcula la suma.

¿¬﹪ηθI÷ηθ

Si xdivide la suma, imprima el cociente.

3 DominicvanEssen Sep 14 2020 at 14:55

R , 42 41 39 bytes

Editar: -1 byte (e, inspirado por esto, -2 bytes más) gracias a Robin Ryder

function(x)(d=sum(1:x*!x%%1:x))/x*!d%%x

¡Pruébelo en línea!

Comentó:

perfect_n=
function(x)
 (d=            # d is the divisor sum, calculated as...
  sum(          # sum of...
   1:x*         # the values of 1..x that have...
    !           # zero values for...
     x%%1:x)    # x MOD 1..x
  )
 )/x            # output d/x...
    *!d%%x      # but only if it's an integer 
                # (so d MOD x == 0)
2 user Sep 14 2020 at 05:38

Scala, 54 53 bytes

x=>{val s=1 to x filter(x%_<1)sum;s/x*(1-(s%x).sign)}

Pruébalo en Scastie

Suma todos los divisores de x1 ax, inclusive. Si esa suma es divisible por x, devuelve la dividida por x; de lo contrario, devuelve 0.

2 Neil Sep 14 2020 at 06:05

Retina , 51 bytes

.+
*
|""Lw`^(.+)(?=\1*$) ^ $-1;
L$`^(.+);(\1)+$
$#2

¡Pruébelo en línea! Link incluye casos de prueba menos lentos. Explicación:

.+
*

Convierta la entrada en unario.

|""Lw`^(.+)(?=\1*$)

Enumere todos los factores sin delimitarlos, sumando así.

^
$-1;

Recupera el valor unario original.

L$`^(.+);(\1)+$ $#2

Cuenta cuántas veces divide la suma. (O no envíe nada si no lo hace).

2 LuisMendo Sep 14 2020 at 06:33

Octava , 36 34 bytes

@(x)~mod(s=~mod(x,r=1:x)*r',x)*s/x

Función anónima que toma como entrada un número entero o de punto flotante. El último caso de prueba falla debido a limitaciones de memoria.

¡Pruébelo en línea! O verifique los casos de prueba .

Explicación

@(x)~mod(s=~mod(x,r=1:x)*r',x)*s/x

@(x)                                 % anonymous function with input x
                    1:x              % row vector [1 2 ... x]
                  r=                 % call that r
            mod(x,     )             % x modulo [1 2 ... x]. Gives a row vector
           ~                         % negate each element. Gives 1 for divisors
                         r'          % column vector [1; 2; ... ; x]
                        *            % matrix-multiply. Gives the sum of divisors
         s=                          % call that s
     mod(                  ,x)       % sum of divisors modulo x
    ~                                % negate. Gives 1 if x divides sum of divisors
                               s/x   % sum of divisors divided by x
                              *      % multiply
2 Mukundan314 Sep 14 2020 at 12:10

Python 3.8 (versión preliminar) , 62 bytes

lambda x:(a:=sum(x/i*(x%i<1)for i in range(1,x+1)))%x<1and a/x

¡Pruébelo en línea!

2 KevinCruijssen Sep 14 2020 at 17:29

MathGolf , 7 bytes

─Σk‼÷/*

Pruébelo en línea.

Explicación:

─       # Get the divisors of the (implicit) input-integer
 Σ      # Sum those divisors
  k     # Push the input-integer again
   ‼    # Apply the following two commands separately to the stack:
    ÷   #  Check if the divisor-sum is divisible by the input (1 if truthy; 0 if falsey)
    /   #  Integer-divide the divisor-sum by the input
     *  # Multiply the two together
        # (after which the entire stack joined together is output implicitly as result)
2 Shaggy Sep 14 2020 at 18:22

Rockstar , 141 135 131 bytes

No genera nada si no nexiste.

listen to N
X's0
T's0
while N-X
let X be+1
let D be N/X
turn up D
let T be+D is N/X and X

let D be T/N
turn up D
if D is T/N
say D

Pruébelo aquí (deberá pegar el código)

1 GalenIvanov Sep 14 2020 at 13:51

Icono , 67 bytes

procedure f(n)
s:=0
n%(i:=1to n)=0&s+:=i&\z
return(0=s%n&s/n)|0
end

¡Pruébelo en línea!

1 Shaggy Sep 14 2020 at 14:00

Japonés -æ , 7 bytes

Salidas undefinedsi no nse encuentra.

*N¶Îâ x

Intentalo

1 GalenIvanov Sep 14 2020 at 14:17

Factor , 84 bytes

: f ( n -- n ) dup [1,b] [ dupd mod 0 = ] filter sum swap /mod 0 > [ drop 0 ] when ;

¡Pruébelo en línea!

1 user Sep 15 2020 at 02:19

Prólogo, 117 bytes

s(X,D,S):-D<1,!,S is 0;E is D-1,(0 is X mod D,!,s(X,E,T),S is T+D;s(X,E,S)).
f(X,N):-s(X,X,S),0 is S mod X,N is S//X.

¡Pruébelo en línea! (No lo modifiques directamente, también cambiaría mi versión)


Si alguien pudiera averiguar por qué esta versión más corta (96 bytes) no funciona, estaría muy agradecido.

s(X,D,S):-D<1,!,S is 0;E is D-1,(0 is X mod D,!,s(X,E,T),S is T+D;s(X,E,S)).
f(X,N):-s(X,X,N*X).

Versión con depuración de impresión

1 2014MELO03 Sep 17 2020 at 02:48

GolfScript , 22 bytes

~:x),{.x\%!*+}*.x%!*x/

¡Pruébelo en línea!

~:x                     # Store the input in x
   ),                   # Make an array from 0 to x
     {       }*         # For each number in the array, execute this block
      .                 # Copy current number
       x\%!             # The copy becomes 1 if it is a divisor of x and 0 if it isn't
           *+           # Multiply and add
               .        # Copy the sum of the divisors
                x%!     # The copy becomes 1 if it is a divisor of x and 0 if it isn't
                   *    # Multiply
                    x/  # Divide by x