Sum


17

Soit (entrée)n=42

Alors les diviseurs sont: 1, 2, 3, 6, 7, 14, 21, 42

Équerrage de chaque diviseur: 1, 4, 9, 36, 49, 196, 441, 1764

Prise de somme (addition): 2500

Puisque 50×50=2500 nous retournons donc une valeur véridique. S'il ne s'agit pas d'un carré parfait, renvoyez une valeur fausse.

Exemples :

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

C'est du donc le code le plus court en octets pour chaque langue gagne

Merci à @Arnauld d'avoir souligné la séquence: A046655


2
Le programme peut-il afficher 0 si le résultat est vrai et tout autre nombre si le résultat est faux?
JosiahRyanW

Réponses:


6

R , 39 37 octets

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

Essayez-le en ligne!

Utilise l'approche classique "tester si carré parfait", en prenant la partie non intégrale de la racine carrée S^.5%%1et en prenant la négation logique de celle-ci, car elle mappe zéro (carré parfait) à TRUEet non nul à FALSE.

Merci à Robert S d' avoir économisé quelques octets!


1
Pourriez-vous utiliser scan()pour enregistrer quelques octets?
Robert S.

3
@RobertS. doh! J'ai fait trop de "vrai" codage R ces derniers temps!
Giuseppe

6

JavaScript (ES7),  46 44  42 octets

1 octet enregistré grâce à @Hedi

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

Essayez-le en ligne!

Commenté

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
Vous pouvez enregistrer un octet avec dallant nau 0lieu de 2à ncomme ceci:n=>!((g=d=>d?d*d*!(n%d)+g(d-1):0)(n)**.5%1)
Hedi


5

Langage de programmation Shakespeare , 434 428 415 octets

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

Essayez-le en ligne!

-13 octets grâce à Jo King!

Sorties 1pour vrai résultat, sorties 0pour faux résultat.


415 octets avec un troisième caractère
Jo King




3

Brachylog , 12 8 octets

f^₂ᵐ+~^₂

-4 octets grâce à Fatelize car je ne savais pas que le brachylog a un facteur fonctions

explication

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

Essayez-le en ligne!


f^₂ᵐest de 4 octets plus court queḋ{⊇×^₂}ᵘ
Fatalize

3

MathGolf , 5 4 octets

─²Σ°

Essayez-le en ligne!

Explication

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

Très similaire aux autres réponses, par rapport à 05AB1E je gagne un octet pour mon opérateur "is perfect square".


Vous savez, quelque chose appelé "MathGolf" devrait vraiment avoir un opérateur de norme ... qui vous aurait fait descendre à 3 octets :)
Misha Lavrov

@MishaLavrov ce n'est pas une mauvaise idée! En ce moment, je n'ai pas autant d'opérations vectorielles que je le souhaiterais, un de ces jours je changerai ça
maxb

3

MATL , 9 octets

Z\UsX^tk=

Essayez-le en ligne!

Aussi simple que possible

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 octets

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

Essayez-le en ligne!

Semble long ...
-12 octets grâce à mazzy

Est-ce exactement ce qu'il dit sur l'étain. Prend la plage de 1à l'entrée $net multiplie les $_*$_temps carrés , que ce soit un diviseur ou non !($n%$_). Cela rend les diviseurs égaux à un nombre différent de zéro et les non-diviseurs égaux à zéro. Nous en prenons ensuite la somme avec notre accumulateur $a. Ensuite, on boucle à nouveau de 1jusqu'à $aet retirer ces chiffres où|?{...} il est carré -equel à $a. Cela reste sur le pipeline et la sortie est implicite.

Génère un entier positif pour true, et rien pour falsey.


le cas rare où $args[0]est plus court :)1..$args[0]|%{$a+=$_*$_*!($n%$_)};1..$a|?{$_*$_-eq$a}
mazzy

1
@mazzy Ce n'est pas le cas, car vous avez besoin de l' $nintérieur de la boucle pour !($n%$_). Mais, votre réécriture de la somme a permis d'économiser 12 octets, alors merci!
AdmBorkBork

C'est dommage. donc je voudrais trouver un cas où $args[0]est plus court :)
mazzy


2

APL (Dyalog Unicode) , 18 octets

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

Essayez-le en ligne!

Lambda anonyme. Renvoie 1 pour la vérité et 0 pour la fausse (les cas de test dans TIO sont prettifiés).

Shoutouts à @ H.PWiz pour 4 octets!

Comment:

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

Pouvez-vous faire l'équivalent de notplutôt que 0=d'enregistrer un octet?
streetster

@streetster malheureusement, je ne peux pas pour 2 raisons. Tout d'abord, l' notopérateur APL ( ~), lorsqu'il est utilisé de manière monadique, ne fonctionne qu'avec des booléens (0 ou 1). Étant donné que tout nombre modulo 1 n'est jamais égal à 1, si j'utilisais à la ~place de 0=, j'obtiendrais un domain errorsur n'importe quel nombre qui n'est pas un carré parfait, car les valeurs décimales sont hors du ~domaine de. De plus, je ne peux pas simplement omettre le 0=, car la valeur véridique d'APL est 1, pas 0, et elle n'aurait pas de sortie cohérente pour les valeurs de falsification.
J. Sallé

2

K (oK) , 26 25 22 octets

Solution:

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

Essayez-le en ligne!

Explication:

{~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                                 / 

Remarques:

  • -1 octets s'inspirant de la solution PowerShell
  • -3 octets en s'inspirant de la solution APL


2

Matlab, 39 37 octets

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

Malheureusement, cela ne fonctionne pas sur Octave (sur tio) donc pas de lien tio.

Remarque Comme @LuisMendo l'a indiqué, divisors()appartient à Symbolic Toolbox.


1
Il semble divisorsappartenir à la boîte à outils symbolique. Vous devez l'indiquer dans le titre. En outre, vous pouvez utiliser à la ~···place de···==0
Luis Mendo

Vous pouvez raccourcir cela en utilisant sum(...)^.5au lieu desqrt(sum(...))
Sanchises

2

Haskell , 78 64 53 octets

-14 octets grâce à Ørjan Johansen . -11 octets grâce aux ovs .

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

Essayez-le en ligne!

Hé, ça fait un moment que je n'ai ... écrit aucun code, donc mon Haskell et mon golf pourraient être un peu rouillés. J'ai oublié les types numériques Haskell gênants. : P


1
Il est plus court (mais plus lent) pour éviter ces conversions en recherchant la racine carrée avec une autre compréhension de la liste. Essayez-le en ligne!
Ørjan Johansen

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

2
S'appuyant sur la suggestion de Ørjan Johansen, cela devrait fonctionner pour 53 octets.
ovs

2

Pyt , 7 octets

ð²ƩĐř²∈

Essayez-le en ligne!

Explication

            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

ð²Ʃ√ĐƖ=

Essayez-le en ligne!

Explication

            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%¬

Essayez-le en ligne!

Explication

            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

Husk , 6 octets

£İ□ṁ□Ḋ

Essayez-le en ligne!

Explication

£İ□ṁ□Ḋ  -- 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 octets

IntegerQ@Sqrt[2~DivisorSigma~#]&

Fonction pure. Prend un nombre en entrée et retourne Trueou Falseen sortie. Je ne sais pas exactement s'il existe une méthode plus courte pour vérifier les carrés parfaits.






1

F #, 111 octets

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)

Essayez-le en ligne!

Obtient donc dles diviseurs pour tous les nombres entre 1 et ninclus. Dans la fonction principale u, la première ligne affecte la somme de tous les diviseurs carrés à m. La deuxième ligne obtient les diviseurs pour met détermine si l'un d'eux est égal au carré m.


1

Perl 5, 47 octets

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

Renvoie 1 pour vrai et rien pour faux.

Explication:

$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

Sensationnel , 47 octets

Un lambda acceptant un argument numérique.

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

Explication

(1..n) crée un tableau des valeurs 1 à n

n%iest faux (comme 0 est faux) si idivisen sans reste

n%i ? 0 : i*iest la somme du carré de la valeur isi elle se divisen sans reste, sinon est 0

sum{ i-> n%i ? 0 : i*i }additionne le résultat précédent sur l'ensemble idu tableau.

s%Math.sqrt(s)est faux (comme 0 est faux) si le sqrt de sdivise ssans reste

!(s%Math.sqrt(s))retourne du lambda ( returnimplicite sur la dernière instruction) !falselorsque le sqrt de sdivises sans reste

Essayez-le en ligne!


1

Java 8, 75 70 octets

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

-5 octets grâce à @ archangel.mjj .

Essayez-le en ligne.

Explication:

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
Salut, vous pouvez couper 5 octets en supprimant la variable t (faire l'évaluation et l'affectation dans le corps de la boucle for), comme ceci: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, bien sûr. Je ne sais pas comment j'ai raté ça. Merci! :)
Kevin Cruijssen
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.