\ $n\$-numeri perfetti
Un numero intero positivo \$x\$è un \$n\$-numero perfetto se \$\sigma(x) = nx\$, dove \$\sigma(x)\$è la funzione somma divisore. Ad esempio, \$120\$è un \$3\$-numero perfetto perché i suoi divisori si sommano a \$360\$:
$$360 = 3\times120 = 1+2+3+4+5+6+8+10+12+15+20+24+30+40+60+120$$
e
$$926073336514623897600 = 6\times154345556085770649600 = 1+2+3+4+5+6+7+8+9+10+11+12+\dots+51448518695256883200+77172778042885324800+154345556085770649600$$
quindi \$154345556085770649600\$è un \$6\$-numero perfetto.
Devi prendere un numero intero \$x\$come input e output un valore \$n\$, tale che \$x\$è un \$n\$-numero perfetto. In caso contrario \$n\$esiste, è possibile restituire qualsiasi valore coerente che non sia un numero intero positivo. Non riceverai mai un input al di fuori dei limiti della tua lingua, ma il tuo algoritmo deve funzionare per arbitrariamente grandi \$x\$.
Questo è il codice del golf, quindi vince il codice più breve in byte.
Mini sfida: batti 5 byte in Jelly
Casi test
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
Risposte
Buccia , 4 byte
¦¹ΣḊ
Provalo online!
L'ultimo caso di test è scaduto.
Spiegazione
¦¹ΣḊ Input is a number x.
Ḋ List of divisors.
Σ Sum.
¦ Division if divisible, 0 if not
¹ by x.
¦ di solito è solo un test di divisibilità, ma qui il suo valore di ritorno è utile.
Gelatina , 5 byte
R×iÆs
Provalo online!
Spiegazione:
- 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 byte
f+;?/ℕ
Provalo online!
Come funziona
f+;?/ℕ
f+ the sum of the factors
;?/ℕ divided by the input
ℕ is a natural number
Versione alternativa, penso sia più interessante, ma più lunga:
f+~×[?,.]∧
f+ the sum of the factors
~× unifies with the multiplication of
[?,.] the input and the output
∧ return the output
05AB1E ,
7
6 byte
Ý*IÑOk
Provalo online!
Spiegazione:
Ý*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)
Ho appena usato il metodo di Sisyphus. Questo potrebbe probabilmente essere giocato a golf o addirittura reso più efficiente, ma mi manca la conoscenza 05AB1E per farlo. Ho solo pensato di fare un tentativo per passare il tempo.
-1 Byte grazie a ovs
C (gcc) , 47 byte
s,i;f(x){for(i=s=x;--i;)s+=x%i?0:i;s/=s%x*s+x;}
Provalo online!
Restituisce no 0.
APL (Dyalog Unicode) , 16 15 13 byte
Grazie a Bubbler per aver sottolineato che posso cambiare il formato di output per salvare un paio di byte
⍸×∘⍳⍨=1⊥∘∪⊢∨⍳
Provalo online!
Restituisce un elenco singleton di nquando nesiste e un array vuoto in caso contrario. Trova l'indice di ( ⍸) dove la somma di ( 1⊥) i divisori ( ∪⊢∨⍳) è uguale a ( =) un multiplo di input ( ×∘⍳⍨). Uso ⍸e =invece di solo ⍳per trovare l'indice perché restituisce un elenco vuoto quando l'elemento non è presente piuttosto che la lunghezza dell'elenco.
Spazio bianco , 153 byte
[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]
Lettere S(spazio), T(tabulazione) e N(nuova riga) aggiunte solo come evidenziazione.
[..._some_action]aggiunto solo come spiegazione.
Provalo online (solo con spazi grezzi, tabulazioni e nuove righe).
Spiegazione in pseudo-codice:
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
Esempio di esecuzione: 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
Si ferma con un errore dopo aver stampato il risultato, perché non è definita alcuna uscita.
Pyth , 15 byte
&!%Jsf!%QTSQQ/J
Provalo online!
Spiegazione
&!%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 byte
Restituisce 0 se non c'è soluzione.
x=>(g=k=>x=k&&k*!(x%k)/x+g(k-1))(x)%1?0:x
Provalo online!
Gelatina , 6 byte
Æs0:%?
Un collegamento monadico che accetta un numero intero positivo che produce un numero intero non negativo.
Provalo online! Oppure guarda la suite di test .
Come?
Æs0:%? - Link: x
Æs - divisor sum
? - if...
% - ...condition: has a remainder when divided
0 - ...then: zero
: - ...else: integeger divide
APL (Dyalog Unicode) , 19 18 byte
⊢(÷⍨×0=|)1⊥∘⍸0=⍳|⊢
Provalo online!
Conversione in train di Jo King. (- 3 byte)
-1 byte in più da Jo King dopo aver cambiato la condizione di controllo.
Risposta precedente, 22 byte
{(⊢×⌊=⊢)⍵÷⍨+/⍸0=⍵|⍨⍳⍵}
Spiegazione
{(⊢×⌊=⊢)⍵÷⍨+/⍸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 byte
a!b=0^mod a b*div a b
f n=sum(map(n!)[1..n])!n
Provalo online!
Wolfram Language (Mathematica) , 30 byte
Tr@Divisors@#/#/._Rational->0&
Provalo online!
-6 byte da @att
Carboncino , 23 20 byte
NθI⌕E⊕θ×θιΣΦ⊕θ∧ι¬﹪θι
Provalo online! Il collegamento è alla versione dettagliata del codice. Porta dell'algoritmo di @ Sisyphus ma utilizza il commento di @ovs per gestire l'indicizzazione 0. Uscite -1per inesistenza. Spiegazione:
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
Sfortunatamente per Charcoal la somma di []non è zero, il che significa che non posso salvare un byte rimuovendo i due incrementi di xe incrementando invece il risultato.
Precedente soluzione a 23 byte:
Nθ≔ΣΦ⊕θ∧ι¬﹪θιη¿¬﹪ηθI÷ηθ
Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:
Nθ
Input x.
≔ΣΦ⊕θ∧ι¬﹪θιη
Crea un elenco da 1..x, filtra i numeri che non dividono xe prendi la somma.
¿¬﹪ηθI÷ηθ
Se xdivide la somma, stampa il quoziente.
R , 42 41 39 byte
Modifica: -1 byte (e, ispirato da questo, -2 byte in più) grazie a Robin Ryder
function(x)(d=sum(1:x*!x%%1:x))/x*!d%%x
Provalo online!
Commentato:
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 byte
x=>{val s=1 to x filter(x%_<1)sum;s/x*(1-(s%x).sign)}
Provalo in Scastie
Somma ogni divisore xcompreso tra 1 e x, inclusi. Se quella somma è divisibile per x, restituisce quella divisa per x, altrimenti restituisce 0.
Retina , 51 byte
.+
*
|""Lw`^(.+)(?=\1*$) ^ $-1;
L$`^(.+);(\1)+$
$#2
Provalo online! Il collegamento include casi di test meno lenti. Spiegazione:
.+
*
Converti l'input in unario.
|""Lw`^(.+)(?=\1*$)
Elencare tutti i fattori senza delimitarli, sommandoli così.
^
$-1;
Recupera il valore unario originale.
L$`^(.+);(\1)+$ $#2
Conta quante volte divide la somma. (O non restituisce nulla se non lo fa.)
Ottava , 36 34 byte
@(x)~mod(s=~mod(x,r=1:x)*r',x)*s/x
Funzione anonima che accetta come input un numero intero o in virgola mobile. L'ultimo caso di test fallisce a causa dei limiti di memoria.
Provalo online! Oppure verifica i casi di test .
Spiegazione
@(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 (pre-rilascio) , 62 byte
lambda x:(a:=sum(x/i*(x%i<1)for i in range(1,x+1)))%x<1and a/x
Provalo online!
MathGolf , 7 byte
─Σk‼÷/*
Provalo online.
Spiegazione:
─ # 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 byte
Non restituisce nulla se non nesiste.
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
Provalo qui (il codice dovrà essere incollato)
Icona , 67 byte
procedure f(n)
s:=0
n%(i:=1to n)=0&s+:=i&\z
return(0=s%n&s/n)|0
end
Provalo online!
Japt -æ , 7 byte
Emette undefinedse non nviene trovato.
*N¶Îâ x
Provalo
Fattore , 84 byte
: f ( n -- n ) dup [1,b] [ dupd mod 0 = ] filter sum swap /mod 0 > [ drop 0 ] when ;
Provalo online!
Prologo, 117 byte
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.
Provalo online! (Per favore non modificarlo direttamente, cambierebbe anche la mia versione)
Se qualcuno potesse capire perché questa versione più breve (96 byte) non funziona, sarei davvero grato.
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).
Versione con debug di stampa
GolfScript , 22 byte
~:x),{.x\%!*+}*.x%!*x/
Provalo online!
~: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