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

Utilisateur Any3nymous
la source
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!

Giuseppe
la source
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
Arnauld
la source
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.

JosiahRyanW
la source
415 octets avec un troisième caractère
Jo King
3

Neim , 5 octets

𝐅ᛦ𝐬q𝕚

Explication:

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

Essayez-le en ligne!

Okx
la source
3

C (gcc) , 67 63 60 59 octets

-1 octets grâce à @JonathanFrech

i,s;f(n){for(s=i=0;i++<n;)s+=n%i?0:i*i;n=sqrt(s);n=n*n==s;}

Essayez-le en ligne!

cleblanc
la source
1
Peut- ++i<=nêtre i++<n?
Jonathan Frech
@JonathanFrech qui semble fonctionner, merci.
cleblanc
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!

Kroppeb
la source
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".

maxb
la source
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?
Sanchises
la source
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.

AdmBorkBork
la source
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

Japt , 11 9 7 octets

-2 octets de @Giuseppe et un autre -2 de @Shaggy

â x²¬v1

â x²¬v1             Full program. Implicity input U
â                   get all integer divisors of U
  x²                square each element and sum
    ¬               square root result
     v1           return true if divisible by 1

Essayez-le en ligne!

Luis felipe De jesus Munoz
la source
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
J. Sallé
la source
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
streetster
la source
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.

DimChtz
la source
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

totalement humain
la source
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
mudkip201
la source
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,..
ბიმო
la source
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.

LegionMammal978
la source
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.

Ciaran_McCarthy
la source
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.
user591898
la source
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!

archangel.mjj
la source
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
Kevin Cruijssen
la source
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