Sum -


17

Sei (Eingabe)n=42

Dann sind die Teiler: 1, 2, 3, 6, 7, 14, 21, 42

Quadrieren jedes Divisors: 1, 4, 9, 36, 49, 196, 441, 1764

Summe nehmen (addieren): 2500

Da wir einen Wahrheitswert zurück. Wenn es sich nicht um ein perfektes Quadrat handelt, geben Sie einen falschen Wert zurück.50×50=2500

Beispiele:

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

Dies ist so dass der kürzeste Code in Bytes für jede Sprache gewinnt

Vielen Dank an @Arnauld für den Hinweis auf die Sequenz: A046655


2
Kann das Programm 0 ausgeben, wenn das Ergebnis wahr ist, und eine andere Zahl, wenn das Ergebnis falsch ist?
JosiahRyanW

Antworten:


6

R , 39 37 Bytes

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

Probieren Sie es online!

Verwendet den klassischen "Test if perfect square" -Ansatz, bei dem der nichtintegrale Teil der Quadratwurzel S^.5%%1und die logische Negation davon herangezogen werden, da Null (perfektes Quadrat) auf TRUEund Nicht-Null auf abgebildet werden FALSE.

Vielen Dank an Robert S , der ein paar Bytes gespart hat!


1
Könnten Sie scan()ein paar Bytes sparen?
Robert S.

3
@RobertS. doh! Ich habe in letzter Zeit zu viel "echtes" R-Coding gemacht!
Giuseppe

6

JavaScript (ES7),  46 44  42 Byte

1 Byte dank @Hedi gespeichert

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

Probieren Sie es online!

Kommentiert

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
Sie können ein Byte sparen, dindem Sie von nnach gehen , 0anstatt dies 2zu nmögen:n=>!((g=d=>d?d*d*!(n%d)+g(d-1):0)(n)**.5%1)
Hedi


5

Shakespeare Programming Language , 434 428 415 Bytes

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

Probieren Sie es online!

-13 Bytes dank Jo King!

Ausgänge 1für wahres Ergebnis, Ausgänge 0für falsches Ergebnis.


415 Bytes mit einem dritten Zeichen
Jo King




3

Brachylog , 12 8 Bytes

f^₂ᵐ+~^₂

-4 Bytes dank Fatelize, weil ich nicht realisiert habe, dass Brachylog eine Faktorfunktion hat

Erläuterung

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

Probieren Sie es online!


f^₂ᵐist 4 Bytes kürzer alsḋ{⊇×^₂}ᵘ
Fatalize

3

MathGolf , 5 4 Bytes

─²Σ°

Probieren Sie es online!

Erläuterung

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

Sehr ähnlich zu anderen Antworten, im Vergleich zu 05AB1E erhalte ich ein Byte für meinen Operator "is perfect square".


Weißt du, etwas mit dem Namen "MathGolf" sollte wirklich einen Normoperator haben ... das hätte dich auf 3 Bytes gebracht :)
Misha Lavrov

@ Mischa Lawrow, das ist keine schlechte Idee! Im Moment habe ich nicht so viele Vektoroperationen wie ich möchte, eines Tages werde ich das ändern
maxb

3

MATL , 9 Bytes

Z\UsX^tk=

Probieren Sie es online!

So einfach wie es nur geht

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 Bytes

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

Probieren Sie es online!

Scheint lange ...
-12 Bytes dank mazzy

Macht genau das, was es verspricht. Nimmt den Bereich von 1bis zur Eingabe $nund multipliziert das Quadrat $_*$_mal, ob es sich um einen Divisor handelt oder nicht !($n%$_). Dies macht Divisoren gleich einer Zahl ungleich Null und Nicht-Divisoren gleich Null. Die Summe nehmen wir dann mit unserem Akku $a. Als nächstes wiederholen wir die Schleife von 1oben nach unten $aund ziehen die Zahlen heraus, zu denen |?{...}sie im Quadrat -eqpassen$a . Das bleibt in der Pipeline und die Ausgabe ist implizit.

Gibt eine positive Ganzzahl für die Wahrheit und nichts für die Falschheit aus.


der seltene Fall, wo $args[0]kürzer ist :)1..$args[0]|%{$a+=$_*$_*!($n%$_)};1..$a|?{$_*$_-eq$a}
mazzy

1
@mazzy geht es nicht, weil du dafür $nin der Schleife brauchst !($n%$_). Aber Ihr Umschreiben der Summe sparte 12 Bytes, also danke!
AdmBorkBork

Schade. $args[0]
Also


2

APL (Dyalog Unicode) , 18 Byte

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

Probieren Sie es online!

Anonymes Lambda. Gibt 1 für wahr und 0 für falsch zurück (Testfälle in TIO sind prettified).

Grüße an @ H.PWiz für 4 Bytes!

Wie:

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

Können Sie das Äquivalent tun, notanstatt 0=ein Byte zu speichern?
Streetster

@streetster kann ich leider aus 2 gründen nicht. Erstens funktioniert der notOperator ( ~) von APL , wenn er monadisch verwendet wird, nur mit Booleschen Werten (entweder 0 oder 1). Da eine beliebige Zahl Modulo 1 niemals gleich 1 ist, würde ich, wenn ich sie ~anstelle von verwende 0=, eine domain errorbeliebige Zahl erhalten, die kein perfektes Quadrat ist, da Dezimalwerte außerhalb des ~Bereichs liegen. Außerdem kann ich das nicht einfach weglassen 0=, da der Wahrheitswert von APL 1 und nicht 0 ist und es keine konsistente Ausgabe für falsche Werte gibt.
J. Sallé

2

K (oK) , 26 25 22 Bytes

Lösung:

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

Probieren Sie es online!

Erläuterung:

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

Anmerkungen:

  • -1 Bytes, inspiriert von der PowerShell Lösung
  • -3 Bytes, inspiriert von der APL- Lösung


2

Matlab, 39 37 Bytes

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

Leider funktioniert es nicht auf Octave (auf tio), also kein tio Link.

Hinweis Wie @LuisMendo angibt, divisors()gehört zu Symbolic Toolbox.


1
Es sieht so aus, als ob divisorses zur Symbolic Toolbox gehört. Das solltest du im Titel angeben. Sie können auch ~···anstelle von···==0
Luis Mendo

Sie können dies abkürzen, indem Sie sum(...)^.5anstelle vonsqrt(sum(...))
Sanchises

2

Haskell , 78 64 53 Bytes

-14 Bytes dank Ørjan Johansen . -11 bytes dank ovs .

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

Probieren Sie es online!

Hey, es ist schon eine Weile her, dass ich ... irgendeinen Code geschrieben habe , so dass mein Haskell und Golfen ein bisschen verrostet sein könnten. Ich habe die lästigen numerischen Typen von Haskell vergessen. : P


1
Es ist kürzer (aber langsamer), diese Konvertierungen zu vermeiden, indem nach der Quadratwurzel mit einem anderen Listenverständnis gesucht wird. Probieren Sie es online!
Ørjan Johansen

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

2
Aufbauend auf Ørjan Johansen Vorschlag, diese sollte für 53 Bytes arbeiten.
Ovs

2

Pyt , 7 Bytes

ð²ƩĐř²∈

Probieren Sie es online!

Erläuterung

            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

ð²Ʃ√ĐƖ=

Probieren Sie es online!

Erläuterung

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

Probieren Sie es online!

Erläuterung

            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

Schale , 6 Bytes

£İ□ṁ□Ḋ

Probieren Sie es online!

Erläuterung

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

IntegerQ@Sqrt[2~DivisorSigma~#]&

Funktion pur. Nimmt eine Zahl als Eingabe und gibt sie zurück Trueoder Falseals Ausgabe. Nicht ganz sicher, ob es eine kürzere Methode zur Überprüfung perfekter Quadrate gibt.






1

F #, 111 Bytes

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)

Probieren Sie es online!

So derhält man die Teiler für alle Zahlen zwischen 1 und neinschließlich. In der Hauptfunktion uweist die erste Zeile die Summe aller quadrierten Teiler zu m. Die zweite Zeile enthält die Divisoren für mund bestimmt, ob eines der Quadrate gleich ist m.


1

Perl 5, 47 Bytes

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

Gibt 1 für wahr und nichts für falsch zurück.

Erläuterung:

$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 Bytes

Ein Lambda, das ein numerisches Argument akzeptiert.

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

Erläuterung

(1..n) Erstellt ein Array mit den Werten 1 bis n

n%ifalsch ist (als 0 falsy ist) , wenn idividieren nohne Rest

n%i ? 0 : i*iist die Summe des Quadrats des Wertes, iwenn er nohne Rest dividiert , ansonsten ist sie 0

sum{ i-> n%i ? 0 : i*i }summiert das vorherige Ergebnis über alle iim Array.

s%Math.sqrt(s)falsch ist (als 0 falsy ist) , wenn der von sqrt sdividieren sohne Rest

!(s%Math.sqrt(s))ergibt sich aus dem Lambda ( returnimplizit in der letzten Anweisung), !falsewenn sich das Quadrat ohne Rest steilts

Probieren Sie es online!


1

Java 8, 75-70 Bytes

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

-5 Bytes dank @ archangel.mjj .

Probieren Sie es online aus.

Erläuterung:

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
Hallo, Sie können 5 Bytes kürzen, indem Sie die Variable t entfernen (führen Sie die Auswertung und Zuweisung im Rumpf der for-Schleife durch), wie folgt: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, natürlich. Ich bin mir nicht sicher, wie ich das verpasst habe. Vielen Dank! :)
Kevin Cruijssen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.