\ $n\$-números perfectos
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
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.
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)
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
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
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.
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.
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.
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
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!
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
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
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!
Wolfram Language (Mathematica) , 30 bytes
Tr@Divisors@#/#/._Rational->0&
¡Pruébelo en línea!
-6 bytes de @att
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.
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)
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.
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).
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
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!
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)
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)
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!
Japonés -æ , 7 bytes
Salidas undefinedsi no nse encuentra.
*N¶Îâ x
Intentalo
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!
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
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