Jumlah


17

Misalkan (Input)n=42

Maka pembagi adalah: 1, 2, 3, 6, 7, 14, 21, 42

Mengkuadratkan setiap pembagi: 1, 4, 9, 36, 49, 196, 441, 1764

Mengambil jumlah (menambahkan): 2500

Karena maka kami mengembalikan nilai kebenaran. Jika itu bukan kuadrat sempurna, kembalikan nilai falsy.50×50=2500

contoh:

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

Ini adalah sehingga kode terpendek dalam byte untuk setiap bahasa menang

Terima kasih kepada @Arnauld karena menunjukkan urutannya: A046655


2
Bisakah program menampilkan 0 jika hasilnya benar, dan ada angka lain jika hasilnya salah?
JosiahRyanW

Jawaban:


6

R , 39 37 byte

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

Cobalah online!

Menggunakan pendekatan "test if perfect square" klasik, mengambil bagian non-integral dari akar kuadrat S^.5%%1dan mengambil negasi logis dari itu, karena memetakan nol (kuadrat sempurna) ke TRUEdan bukan nol ke FALSE.

Terima kasih kepada Robert S karena telah menghemat beberapa byte!


1
Bisakah Anda gunakan scan()untuk menyimpan beberapa byte?
Robert S.

3
@RobertS. lakukan! Saya telah melakukan terlalu banyak pengkodean "nyata" R belakangan ini!
Giuseppe

6

JavaScript (ES7),  46 44  42 byte

Disimpan 1 byte berkat @Hedi

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

Cobalah online!

Berkomentar

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
Anda dapat menyimpan satu byte dengan dpergi dari nke 0bukan 2untuk nseperti ini:n=>!((g=d=>d?d*d*!(n%d)+g(d-1):0)(n)**.5%1)
Hedi


5

Bahasa Pemrograman Shakespeare , 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

Cobalah online!

-13 byte terima kasih kepada Jo King!

Keluaran 1untuk hasil benar, keluaran 0untuk hasil salah.


415 byte dengan karakter ketiga
Jo King


3

Neim , 5 byte

𝐅ᛦ𝐬q𝕚

Penjelasan:

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

Cobalah online!



3

Brachylog , 12 8 byte

f^₂ᵐ+~^₂

-4 Bytes berkat Fatelize karena saya tidak menyadari brachylog memiliki fungsi faktor

penjelasan

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

Cobalah online!


f^₂ᵐlebih pendek 4 byte dariḋ{⊇×^₂}ᵘ
Fatalize

3

MathGolf , 5 4 byte

─²Σ°

Cobalah online!

Penjelasan

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

Sangat mirip dengan jawaban lain, dibandingkan dengan 05AB1E saya mendapatkan satu byte untuk operator "is perfect square" saya.


Anda tahu, sesuatu yang disebut "MathGolf" benar-benar harus memiliki operator norma ... yang akan membuat Anda turun menjadi 3 byte :)
Misha Lavrov

@MishaLavrov itu bukan ide yang buruk! Saat ini saya tidak memiliki banyak operasi vektor seperti yang saya inginkan, suatu hari saya akan mengubahnya
maks

3

MATL , 9 byte

Z\UsX^tk=

Cobalah online!

Sesederhana itu

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}

Cobalah online!

Tampak panjang ...
-12 byte berkat mazzy

Melakukan persis apa yang tertulis di kaleng. Membawa rentang dari 1ke input $ndan mengalikan kuadrat $_*$_kali apakah itu pembagi atau tidak !($n%$_). Ini membuat pembagi sama dengan angka bukan nol dan pembagi tidak sama dengan nol. Kami kemudian mengambil jumlah dari mereka dengan akumulator kami $a. Selanjutnya, kita loop lagi dari 1atas ke $adan menarik angka-angka di mana |?{...}itu -eqkuadratkan ke $a. Yang tersisa di pipa dan output tersirat.

Menghasilkan bilangan bulat positif untuk kebenaran, dan tidak ada untuk falsey.


kasus langka di mana $args[0]lebih pendek :)1..$args[0]|%{$a+=$_*$_*!($n%$_)};1..$a|?{$_*$_-eq$a}
mazzy

1
@ Mazzy Bukan, karena Anda perlu $ndi dalam loop untuk !($n%$_). Tetapi, penulisan ulang jumlah yang Anda lakukan berhasil menghemat 12 byte, jadi terima kasih!
AdmBorkBork

sayang sekali. jadi saya ingin mencari $args[0]
kasing yang


2

APL (Dyalog Unicode) , 18 byte

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

Cobalah online!

Lambda anonim Mengembalikan 1 untuk truey dan 0 untuk falsy (kasus uji di TIO sudah dipraih).

Shoutouts to @ H.PWiz selama 4 byte!

Bagaimana:

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

Bisakah Anda melakukan yang setara notdaripada 0=menyimpan byte?
streetster

@streetster sayangnya, saya tidak bisa karena 2 alasan. Pertama, notoperator APL ( ~), bila digunakan secara monadik, hanya bekerja dengan boolean (baik 0 atau 1). Karena angka apa pun modulo 1 tidak pernah sama dengan 1, jika saya menggunakan ~alih-alih 0=, saya akan mendapatkan domain errorangka berapa pun yang bukan kuadrat sempurna, karena nilai desimal berada di luar ~domain. Selain itu, saya tidak bisa begitu saja menghilangkan 0=, karena nilai kebenaran APL adalah 1, bukan 0, dan itu tidak akan memiliki output yang konsisten untuk nilai-nilai palsu.
J. Sallé

2

K (oK) , 26 25 22 byte

Larutan:

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

Cobalah online!

Penjelasan:

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

Catatan:

  • -1 byte mengambil inspirasi dari PowerShell solusi
  • -3 byte mengambil inspirasi dari solusi APL


2

Matlab, 39 37 byte

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

Sayangnya, itu tidak berfungsi pada Oktaf (pada tio) jadi tidak ada tautan tio.

Catatan Seperti yang dikatakan @LuisMendo, divisors()milik Symbolic Toolbox.


1
Sepertinya divisorsmilik Symbolic Toolbox. Anda harus menyatakannya dalam judul. Selain itu, Anda dapat menggunakannya ~···sebagai pengganti···==0
Luis Mendo

Anda dapat mempersingkat ini dengan menggunakan sum(...)^.5bukansqrt(sum(...))
Sanchises

2

Haskell , 78 64 53 byte

-14 byte terima kasih Ørjan Johansen . -11 byte berkat ovs .

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

Cobalah online!

Hei, sudah lama sejak saya ... menulis apa pun kode , sehingga Haskell dan golf saya mungkin agak berkarat. Saya lupa tipe numerik Haskell yang merepotkan. : P


1
Lebih pendek (tapi lebih lambat) untuk menghindari konversi dengan mencari akar kuadrat dengan pemahaman daftar lain. Cobalah online!
Ørjan Johansen

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

2
Membangun atas saran Ørjan Johansen, ini harus bekerja selama 53 byte.
Ovs

2

Pyt , 7 byte

ð²ƩĐř²∈

Cobalah online!

Penjelasan

            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

ð²Ʃ√ĐƖ=

Cobalah online!

Penjelasan

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

Cobalah online!

Penjelasan

            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

Sekam , 6 byte

£İ□ṁ□Ḋ

Cobalah online!

Penjelasan

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

Fungsi murni. Mengambil angka sebagai input dan mengembalikan Trueatau Falsesebagai output. Tidak sepenuhnya yakin apakah ada metode yang lebih pendek untuk memeriksa kuadrat sempurna.






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)

Cobalah online!

Jadi ddapatkan pembagi untuk semua angka antara 1 dan ninklusif. Dalam fungsi utama u, baris pertama menetapkan jumlah semua pembagi kuadrat m. Baris kedua mendapatkan pembagi untuk mdan menentukan apakah ada yang kuadrat sama m.


1

Perl 5, 47 byte

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

Mengembalikan 1 untuk true dan nothing for false.

Penjelasan:

$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

Asyik , 47 byte

Seorang lambda menerima argumen numerik.

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

Penjelasan

(1..n) menciptakan larik nilai 1 hingga n

n%isalah (seperti 0 adalah salah) jika imembaginya ntanpa sisa

n%i ? 0 : i*iadalah jumlah kuadrat dari nilai ijika ia membagi ntanpa sisa, jika tidak adalah 0

sum{ i-> n%i ? 0 : i*i }menjumlahkan hasil sebelumnya di semua idalam array.

s%Math.sqrt(s)salah (seperti 0 adalah salah) jika sqrt dari smembagi stanpa sisa

!(s%Math.sqrt(s))kembali dari lambda ( returntersirat pada pernyataan terakhir) !falseketika sqrt dari smembagis tanpa sisa

Cobalah 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 terima kasih kepada @ archangel.mjj .

Cobalah online.

Penjelasan:

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
Hai, Anda dapat memotong 5 byte dengan menghapus variabel t (lakukan evaluasi dan penugasan di dalam tubuh for for loop), seperti: 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, tentu saja. Tidak yakin bagaimana saya melewatkan itu. Terima kasih! :)
Kevin Cruijssen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.