Sum


17

Let (giriş)n=42

Sonra bölenler: 1, 2, 3, 6, 7, 14, 21, 42

Her böleni kareler: 1, 4, 9, 36, 49, 196, 441, 1764

Toplam alma (ekleme): 2500

Yana , bu nedenle bir truthy değeri döndürür. Mükemmel bir kare değilse, yanlış bir değer döndürün.50×50=2500

Örnekler:

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

Bu yani her dil için bayt cinsinden en kısa kod kazanır

@Arnauld dizisini işaret ettiği için teşekkürler: A046655


2
Sonuç doğruysa program 0, sonuç yanlışsa başka bir sayı verebilir mi?
JosiahRyanW

Yanıtlar:


6

R , 39 37 bayt

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

Çevrimiçi deneyin!

Klasik "mükemmel kare ise test" yaklaşımını kullanır, kare kökünün ayrılmaz bir parçasını alır S^.5%%1ve sıfır (mükemmel kare) ile TRUEsıfır olmayan ve sıfır olmayanları eşleştirdiği mantıksal olumsuzlamayı alır.FALSE .

Birkaç bayt kaydettiği için Robert S'ye teşekkürler !


1
scan()Birkaç bayt kaydetmek için kullanabilir misiniz ?
Robert

3
@RobertS. doh! Son zamanlarda çok fazla "gerçek" R kodlaması yapıyorum!
Giuseppe

6

JavaScript (ES7),  46 44  42 bayt

@Hedi sayesinde 1 bayt kaydedildi

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

Çevrimiçi deneyin!

Yorumlananlar

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
Sen sadece bir bayt kaydedebilirsiniz dgiden netmek 0yerine 2hiç nböyle:n=>!((g=d=>d?d*d*!(n%d)+g(d-1):0)(n)**.5%1)
Hedi


5

Shakespeare Programlama Dili , 434 428 415 bayt

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

Çevrimiçi deneyin!

Jo King sayesinde -13 bayt!

Çıkışlar 1gerçek sonuç için, çıkışı 0yanlış sonuç için.


Üçüncü bir karakterle 415 bayt
Jo King




3

Brachylog , 12 8 bayt

f^₂ᵐ+~^₂

-4 bayt Fatelize sayesinde brachylog bir faktör fonksiyonları olduğunu fark etmedi çünkü

açıklama

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

Çevrimiçi deneyin!


f^₂ᵐ4 bayt daha kısaḋ{⊇×^₂}ᵘ
2018'de Fatalize

3

MathGolf , 5 4 bayt

─²Σ°

Çevrimiçi deneyin!

açıklama

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

Diğer cevaplara çok benzer, 05AB1E ile karşılaştırıldığında "mükemmel kare" operatörüm için bir bayt kazanıyorum.


Biliyorsunuz, "MathGolf" adı verilen bir şey gerçekten bir norm operatörüne sahip olmalı ... Bu sizi 3 bayta indirir :)
Misha Lavrov

@MishaLavrov bu kötü bir fikir değil! Şu anda istediğim kadar vektör operasyonum yok, bu günlerden biri bunu değiştireceğim
maxb

3

MATL , 9 bayt

Z\UsX^tk=

Çevrimiçi deneyin!

Olabildiğince basit

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 bayt

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

Çevrimiçi deneyin!

Uzun görünüyor ...
Mazzy sayesinde -12 bayt

Teneke üzerinde tam olarak ne diyorsa onu yapar. Aralığı 1girişe alır $nve $_*$_bölen olsun ya da olmasın kare zamanlarını çarpar !($n%$_). Bu, bölenleri sıfır olmayan bir sayıya ve bölen olmayanları sıfıra eşit yapar. Akümülatörümüzle toplamını alıyoruz $a. Daha sonra, tekrar 1yukarı doğru dönüyoruz ve karenin olduğu $asayıları|?{...}-eq$a . Bu boru hattında kalır ve çıktı örtüktür.

Doğruluk için pozitif bir tamsayı verir ve falsey için hiçbir şey çıkarmaz.


nadir vaka nerede $args[0]daha kısa :)1..$args[0]|%{$a+=$_*$_*!($n%$_)};1..$a|?{$_*$_-eq$a}
mazzy

1
@mazzy Bu değil, çünkü $ndöngü içinde ihtiyacınız var !($n%$_). Ancak, toplamı yeniden yazmanız 12 bayt kurtardı, bu yüzden teşekkürler!
AdmBorkBork

ne utanç. bu yüzden $args[0]daha kısa olan bir dava bulmak istiyorum :)
mazzy


2

APL (Dyalog Unicode) , 18 bayt

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

Çevrimiçi deneyin!

Anonim lambda. Doğruluk için 1, yanlış için 0 döndürür (TIO'daki test senaryoları önceden hazırlanmıştır).

4 baytlık @ H.PWiz'e seslenin!

Nasıl:

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

Bayt kaydetmek notyerine eşdeğeri yapabilir misiniz 0=?
streetster

@streetster maalesef 2 nedenden dolayı yapamam. İlk olarak, APL'nin notoperatörü ( ~), tek tek kullanıldığında, yalnızca booleans (0 veya 1) ile çalışır. Herhangi bir sayı modulo 1 asla 1'e eşit olmadığından, ~bunun yerine kullanırsam, ondalık değerler alan adının dışında olduğundan, mükemmel bir kare olmayan herhangi bir sayı 0=alırım . Dahası, APL'nin doğruluk değeri 0 değil, 1 olduğundan ve yanlış değerler için tutarlı bir çıktıya sahip olmayacağı için basitçe atlayamam. domain error~0=
J. Sallé

2

K (ok) , 26 25 22 bayt

Çözüm:

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

Çevrimiçi deneyin!

Açıklama:

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

Notlar:

  • PowerShell çözümünden ilham alan -1 bayt
  • APL çözümünden ilham alan -3 bayt


2

Matlab, 39 37 bayt

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

Ne yazık ki, Octave (tio'da) üzerinde çalışmıyor, bu yüzden tio bağlantısı yok.

Not @LuisMendo'nun belirttiği gibi, divisors()Symbolic Toolbox'a aittir.


1
divisorsSembolik Araç Kutusuna ait gibi görünüyor . Bunu başlıkta belirtmelisiniz. Ayrıca, kullanabilirsiniz ~···yerine···==0
Luis Mendo

Bunu sum(...)^.5yerine kullanarak kısaltabilirsinizsqrt(sum(...))
Sanchises

2

Haskell , 78 64 53 bayt

Ørjan Johansen sayesinde -14 bayt . -11 sayesinde bayt OVS .

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

Çevrimiçi deneyin!

Hey, bir kod yazdýđýmdan beri uzun zaman geçti , bu yüzden Haskell'im ve golf oyunum biraz paslý olabilir. Zahmetli Haskell sayısal türlerini unuttum. : P


1
Başka bir liste kavrayışı ile karekök arayarak bu dönüşümlerden kaçınmak daha kısa (ancak daha yavaş). Çevrimiçi deneyin!
Ørjan Johansen

1
Daha kısa: fx | s <-sum [i ^ 2 | i <- [1..x], mod x i <1] = yuvarlak (sqrt $ toEnum s) ^ 2 == s
Damien

2
Ørjan Johansen'ın önerisine dayanarak, bu 53 bayt için çalışmalıdır.
ovs

2

Pyt , 7 bayt

ð²ƩĐř²∈

Çevrimiçi deneyin!

açıklama

            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

ð²Ʃ√ĐƖ=

Çevrimiçi deneyin!

açıklama

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

Çevrimiçi deneyin!

açıklama

            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

Kabuk , 6 bayt

£İ□ṁ□Ḋ

Çevrimiçi deneyin!

açıklama

£İ□ṁ□Ḋ  -- 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~#]&

Pure function. Takes a number as input and returns True or False as output. Not entirely sure if there's a shorter method for checking perfect squares.






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)

Try it online!

So d gets the divisors for all numbers between 1 and n inclusive. In the main function u, the first line assigns the sum of all squared divisors to m. The second line gets the divisors for m and determines if any of them squared equals m.


1

Perl 5, 47 bytes

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

Returns 1 for true and nothing for false.

Explanation:

$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

A lambda accepting a numeric argument.

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

Explanation

(1..n) creates an array of the values 1 to n

n%i is false (as 0 is falsy) if i divides n without remainder

n%i ? 0 : i*i is the sum of the square of the value i if it divides n without remainder, otherwise is 0

sum{ i-> n%i ? 0 : i*i } sums the previous result across all i in the array.

s%Math.sqrt(s) is false (as 0 is falsy) if the sqrt of s divides s without remainder

!(s%Math.sqrt(s)) returns from the lambda (return implicit on last statement) !false when the sqrt of s divides s without remainder

Try it 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 thanks to @archangel.mjj.

Try it online.

Explanation:

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
Hi, you can cut 5 bytes by removing the t variable (do the eval and assignment within the body of the for loop), like so: 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, of course. Not sure how I missed that. Thanks! :)
Kevin Cruijssen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.