Sum


17

Sia (input)n=42

Quindi i divisori sono: 1, 2, 3, 6, 7, 14, 21, 42

Quadratura di ciascun divisore: 1, 4, 9, 36, 49, 196, 441, 1764

Sommando (aggiungendo): 2500

Poiché quindi restituiamo un valore veritiero. Se non è un quadrato perfetto, restituisci un valore errato.50×50=2500

Esempi:

42  ---> true
1   ---> true
246 ---> true
10  ---> false
16  ---> false

Questo è quindi il codice più breve in byte per ogni lingua vince

Grazie a @Arnauld per aver sottolineato la sequenza: A046655


2
Il programma può emettere 0 se il risultato è vero e qualsiasi altro numero se il risultato è falso?
JosiahRyanW,

Risposte:


6

R , 39 37 byte

!sum((y=1:(x=scan()))[!x%%y]^2)^.5%%1

Provalo online!

Utilizza il classico approccio "prova se quadrato perfetto", prendendo la parte non integrale della radice quadrata S^.5%%1e assumendone la negazione logica, poiché associa zero (quadrato perfetto) a TRUEe diverso da zero FALSE.

Grazie a Robert S per aver salvato un paio di byte!


1
Potresti usare scan()per salvare qualche byte?
Robert S.

3
@RobertS. doh! Ultimamente ho fatto troppa codifica R "reale"!
Giuseppe,

6

JavaScript (ES7),  46 44  42 byte

Salvato 1 byte grazie a @Hedi

n=>!((g=d=>d&&d*d*!(n%d)+g(d-1))(n)**.5%1)

Provalo online!

Commentate

n =>             // n = input
  !(             // we will eventually convert the result to a Boolean
    (g = d =>    // g is a recursive function taking the current divisor d
      d &&       //   if d is equal to 0, stop recursion 
      d * d      //   otherwise, compute d²
      * !(n % d) //   add it to the result if d is a divisor of n
      + g(d - 1) //   add the result of a recursive call with the next divisor
    )(n)         // initial call to g with d = n
    ** .5 % 1    // test whether the output of g is a perfect square
  )              // return true if it is or false otherwise

1
Puoi salvare un byte dandando da na 0invece che 2in nquesto modo:n=>!((g=d=>d?d*d*!(n%d)+g(d-1):0)(n)**.5%1)
Hedi


5

Shakespeare Programming Language , 434 428 415 byte

,.Ajax,.Ford,.Puck,.Act I:.Scene I:.[Enter Ajax and Ford]Ford:Listen tothy.Scene V:.Ajax:You be the sum ofyou a cat.Ford:Is the remainder of the quotient betweenyou I worse a cat?[Exit Ajax][Enter Puck]Ford:If soyou be the sum ofyou the square ofI.[Exit Puck][Enter Ajax]Ford:Be you nicer I?If solet usScene V.[Exit Ford][Enter Puck]Puck:Is the square ofthe square root ofI worse I?You zero.If notyou cat.Open heart

Provalo online!

-13 byte grazie a Jo King!

Output 1per il risultato vero, output 0per il risultato falso.


415 byte con un terzo carattere
Jo King,


3

Neim , 5 byte

𝐅ᛦ𝐬q𝕚

Spiegazione:

𝐅      Factors
 ᛦ      Squared
  𝐬     Summed
    𝕚   is in?
   q    infinite list of square numbers

Provalo online!



3

Brachylog , 12 8 byte

f^₂ᵐ+~^₂

-4 byte grazie a Fatelize perché non mi rendevo conto che brachylog ha una funzione di fattori

spiegazione

f^₂ᵐ+~^₂            #   full code
f                   #       get divisors
 ^₂ᵐ                #           square each one
    +               #       added together
      ~^₂           #       is the result of squaring a number

Provalo online!


f^₂ᵐè di 4 byte più breve diḋ{⊇×^₂}ᵘ
Fatalizza il

3

MathGolf , 5 4 byte

─²Σ°

Provalo online!

Spiegazione

─     Get all divisors as list (implicit input)
 ²    Square (implicit map)
  Σ   Sum
   °  Is perfect square?

Molto simile ad altre risposte, rispetto a 05AB1E guadagno un byte per il mio operatore "è quadrato perfetto".


Sai, qualcosa chiamato "MathGolf" dovrebbe davvero avere un operatore normale ... che ti avrebbe portato a 3 byte :)
Misha Lavrov

@MishaLavrov non è una cattiva idea! In questo momento non ho tutte le operazioni vettoriali che vorrei, uno di questi giorni lo cambierò
maxb

3

MATL , 9 byte

Z\UsX^tk=

Provalo online!

Semplice come si arriva

Z\ % Divisors of (implicit) input
U  % Square
s  % Sum
X^ % Square root
t  % Duplicate this value
k= % Is it equal to its rounded value?

2

PowerShell , 68 56 byte

param($n)1..$n|%{$a+=$_*$_*!($n%$_)};1..$a|?{$_*$_-eq$a}

Provalo online!

Sembra lungo ...
-12 byte grazie a mazzy

Fa esattamente quello che dice sulla scatola. Prende l'intervallo da 1a input $ne moltiplica i $_*$_tempi quadrati che si tratti di un divisore o meno !($n%$_). Ciò rende i divisori uguali a un numero diverso da zero e i non divisori pari a zero. Ne prendiamo quindi la somma con il nostro accumulatore $a. Successivamente, eseguiamo nuovamente il ciclo dall'alto 1verso il $abasso e tiriamo fuori quei numeri dove |?{...}si trova al quadrato-eq sessuale a $a. Rimane sulla pipeline e l'output è implicito.

Emette un numero intero positivo per la verità e niente per la falsità.


il raro caso in cui $args[0]è più breve :)1..$args[0]|%{$a+=$_*$_*!($n%$_)};1..$a|?{$_*$_-eq$a}
mazzy

1
@mazzy Non lo è, perché è necessario $nall'interno del loop per !($n%$_). Ma la tua riscrittura della somma ha salvato 12 byte, quindi grazie!
AdmBorkBork,

che peccato. quindi vorrei trovare un caso in cui $args[0]è più breve :)
mazzy


2

APL (Dyalog Unicode) , 18 byte

0=1|.5*⍨2+.*⍨∘∪⍳∨⊢

Provalo online!

Lambda anonimo. Restituisce 1 per verità e 0 per falsa (i casi di test in TIO sono preimpostati).

Shoutouts su @ H.Piz per 4 byte!

Come:

0=1|.5*⍨2+.*⍨∘∪⍳∨⊢    Main function, argument   42
                ∨⊢    Greatest common divisor (∨) between  (⊢)
                      and the range (⍳) [1..⍵]
                     Get the unique items (all the divisors of 42; 1 2 3 6 7 14 21 42)
                      Then
                      Swap arguments of
        2+.*           dot product (.) of sum (+) and power (*) between the list and 2 
                       (sums the result of each element in the vector squared)
                      Use the result vector as base
    .5*                Take the square root
  1|                   Modulo 1
0=                     Equals 0

Puoi fare l'equivalente notpiuttosto che 0=per salvare un byte?
streetster,

@streetster purtroppo, non posso per 2 motivi. Innanzitutto, l' notoperatore di APL ( ~), se usato in modo monadico, funziona solo con valori booleani (0 o 1). Dato che qualsiasi numero modulo 1 non è mai uguale a 1, se lo usassi al ~posto di 0=, otterrei un domain errorqualsiasi numero che non sia un quadrato perfetto, poiché i valori decimali sono al di fuori del ~dominio. Inoltre, non posso semplicemente omettere il 0=, dal momento che il valore di verità di APL è 1, non 0, e non avrebbe un risultato coerente per i valori falsi.
J. Sallé,

2

K (oK) , 26 25 22 byte

Soluzione:

{~1!%+/x*x*~1!x%:1+!x}

Provalo online!

Spiegazione:

{~1!%+/x*x*~1!x%:1+!x} / the solution
{                    } / lambda taking x as input
                   !x  / range 0..x-1                        \
                 1+    / add 1                               |
              x%:      / x divided by and save result into x |
            1!         / modulo 1                            | get divisors
           ~           / not                                 |
         x*            / multiply by x                       /
       x*              / multiply by x (aka square)          > square
     +/                / sum up                              > sum up
    %                  / square root                         \  
  1!                   / modulo 1                            | check if a square
 ~                     / not                                 / 

Appunti:

  • -1 byte prendendo ispirazione da PowerShell soluzione
  • -3 byte prendendo ispirazione dalla soluzione APL


2

Matlab, 39 37 byte

@(v)~mod(sqrt(sum(divisors(v).^2)),1)

Sfortunatamente, non funziona su Octave (su tio) quindi nessun collegamento tio.

Nota Come affermato da @LuisMendo, divisors()appartiene a Symbolic Toolbox.


1
Sembra divisorsappartenere alla Toolbox simbolica. Dovresti dichiararlo nel titolo. Inoltre, puoi usare ~···invece di···==0
Luis Mendo il

Puoi accorciarlo usando sum(...)^.5invece disqrt(sum(...))
Sanchises l'

2

Haskell , 78 64 53 byte

-14 byte grazie a Ørjan Johansen . -11 byte grazie agli ovs .

f x=sum[i^2|i<-[1..x],x`mod`i<1]`elem`map(^2)[1..x^2]

Provalo online!

Ehi, è da un po 'che non scrivo un codice, quindi il mio Haskell e il golf potrebbero essere un po' arrugginiti. Ho dimenticato i fastidiosi tipi numerici di Haskell. : P


1
È più breve (ma più lento) evitare quelle conversioni cercando la radice quadrata con un'altra comprensione dell'elenco. Provalo online!
Ørjan Johansen,

1
Più breve: fx | s <-sum [i ^ 2 | i <- [1..x], mod x i <1] = round (sqrt $ toEnum s) ^ 2 == s
Damien

2
Basandosi sul suggerimento di Ørjan Johansen, questo dovrebbe funzionare per 53 byte.
Ovs,

2

Pyt , 7 byte

ð²ƩĐř²∈

Provalo online!

Spiegazione

            Implicit input
ð           Get list of divisors
 ²          Square each element
  Ʃ         Sum the list [n]
   Đ        Duplicate the top of the stack
    ř²      Push the first n square numbers
      ∈     Is n in the list of square numbers?
            Implicit output

ð²Ʃ√ĐƖ=

Provalo online!

Spiegazione

            Implicit input
ð           Get list of divisors
 ²          Square each element
  Ʃ         Sum the list [n]
   √        Take the square root of n
    Đ       Duplicate the top of the stack
     Ɩ      Cast to an integer
      =     Are the top two elements on the stack equal to each other?
            Implicit output

ð²Ʃ√1%¬

Provalo online!

Spiegazione

            Implicit input
ð           Get list of divisors
 ²          Square each element
  Ʃ         Sum the list [n]
   √        Take the square root of n
    1%      Take the square root of n modulo 1
      ¬     Negate [python typecasting ftw :)]
            Implicit output

1

Buccia , 6 byte

£İ□ṁ□Ḋ

Provalo online!

Spiegazione

£İ□ṁ□Ḋ  -- example input 12
     Ḋ  -- divisors: [1,2,3,4,6,12]
   ṁ    -- map the following ..
    □   -- | square: [1,4,9,16,36,144]
        -- .. and sum: 210
£       -- is it element of (assumes sorted)
 İ□     -- | list of squares: [1,4,9,16..196,225,..



1

Mathematica, 32 byte

IntegerQ@Sqrt[2~DivisorSigma~#]&

Funzione pura. Prende un numero come input e restituisce Trueo Falsecome output. Non sono del tutto sicuro se esiste un metodo più breve per controllare i quadrati perfetti.






1

F #, 111 byte

let d n=Seq.where(fun v->n%v=0){1..n}
let u n=
 let m=d n|>Seq.sumBy(fun x->x*x)
 d m|>Seq.exists(fun x->x*x=m)

Provalo online!

Quindi dottiene i divisori per tutti i numeri tra 1 e ncompreso. Nella funzione principale u, la prima riga assegna la somma di tutti i divisori quadrati a m. La seconda riga ottiene i divisori per me determina se uno qualsiasi di essi è uguale al quadrato m.


1

Perl 5, 47 byte

$a+=$_*$_*!($n%$_)for 1..$n;$a=!($a**.5=~/\D/); 

Restituisce 1 per vero e niente per falso.

Spiegazione:

$a+=              for 1..$n;                      sum over i=1 to n
    $_*$_                                         square each component of the sum
         *!($n%$_)                                multiply by 1 if i divides n.
                            $a=                   a equals
                                ($a**.5           whether the square root of a
                               !       =~/\D/);   does not contain a non-digit.

1

Groovy , 47 byte

Un lambda che accetta un argomento numerico.

n->s=(1..n).sum{i->n%i?0:i*i}
!(s%Math.sqrt(s))

Spiegazione

(1..n) crea una matrice dei valori da 1 a n

n%iè falso (poiché 0 è falso) se si idivide nsenza resto

n%i ? 0 : i*iè la somma del quadrato del valore ise si divide nsenza resto, altrimenti è 0

sum{ i-> n%i ? 0 : i*i }somma il risultato precedente in tutto il'array.

s%Math.sqrt(s)è falso (poiché 0 è falso) se lo sqrt di sdivide ssenza resto

!(s%Math.sqrt(s))ritorna dalla lambda ( returnimplicita sull'ultima istruzione) !falsequando il sqrt di sdivides senza resto

Provalo online!


1

Java 8, 75 70 byte

n->{int s=0,i=0;for(;++i<=n;)s+=n%i<1?i*i:0;return Math.sqrt(s)%1==0;}

-5 byte grazie a @ archangel.mjj .

Provalo online.

Spiegazione:

n->{             // Method with integer parameter and boolean return-type
  int s=0,       //  Sum-integer, starting at 0
      i=0;       //  Divisor integer, starting at 0
  for(;++i<=n;)  //  Loop `i` in the range [1, n]
    s+=n%i<1?    //   If `n` is divisible by `i`:
        i*i      //    Increase the sum by the square of `i`
       :         //   Else:
        0;       //    Leave the sum the same by adding 0
  return Math.sqrt(s)%1==0;}
                 //  Return whether the sum `s` is a perfect square

1
Ciao, puoi tagliare 5 byte rimuovendo la variabile t (fai la valutazione e l'assegnazione all'interno del corpo del ciclo for), in questo modo:n->{int s=0,i=0;for(;++i<=n;)s+=n%i<1?i*i:0;return Math.sqrt(s)%1==0;}
archangel.mjj

@ archangel.mjj Ah, certo. Non sono sicuro di come mi sia perso. Grazie! :)
Kevin Cruijssen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.