\ $n\$-numeri perfetti

Sep 14 2020

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

9 Zgarb Sep 14 2020 at 11:28

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.

8 Sisyphus Sep 14 2020 at 10:59

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)
7 xash Sep 14 2020 at 05:24

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
6 Bismarck71 Sep 14 2020 at 14:36

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

5 AZTECCO Sep 14 2020 at 07:30

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.

5 JoKing Sep 14 2020 at 11:23

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.

4 KevinCruijssen Sep 14 2020 at 16:17

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.

4 Mukundan314 Sep 14 2020 at 09:38

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
3 Arnauld Sep 14 2020 at 04:59

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!

3 JonathanAllan Sep 14 2020 at 05:22

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
3 Razetime Sep 14 2020 at 11:22

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 
3 ovs Sep 14 2020 at 06:15

Haskell , 51 46 byte

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

Provalo online!

3 J42161217 Sep 14 2020 at 06:24

Wolfram Language (Mathematica) , 30 byte

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

Provalo online!

-6 byte da @att

3 Neil Sep 14 2020 at 05:55

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.

3 DominicvanEssen Sep 14 2020 at 14:55

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)
2 user Sep 14 2020 at 05:38

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.

2 Neil Sep 14 2020 at 06:05

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

2 LuisMendo Sep 14 2020 at 06:33

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
2 Mukundan314 Sep 14 2020 at 12:10

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!

2 KevinCruijssen Sep 14 2020 at 17:29

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)
2 Shaggy Sep 14 2020 at 18:22

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)

1 GalenIvanov Sep 14 2020 at 13:51

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!

1 Shaggy Sep 14 2020 at 14:00

Japt -æ , 7 byte

Emette undefinedse non nviene trovato.

*N¶Îâ x

Provalo

1 GalenIvanov Sep 14 2020 at 14:17

Fattore , 84 byte

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

Provalo online!

1 user Sep 15 2020 at 02:19

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

1 2014MELO03 Sep 17 2020 at 02:48

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