Sum


17

Đặt (Đầu vào)n=42

Khi đó các ước là: 1, 2, 3, 6, 7, 14, 21, 42

Bình phương mỗi ước số: 1, 4, 9, 36, 49, 196, 441, 1764

Lấy tổng (thêm): 2500

Vì do đó chúng tôi trả về giá trị trung thực. Nếu nó không phải là một hình vuông hoàn hảo, hãy trả về giá trị giả.50×50=2500

Ví dụ:

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

Đây là để mã ngắn nhất tính theo byte cho mỗi ngôn ngữ sẽ thắng

Cảm ơn @Arnauld đã chỉ ra trình tự: A046655


2
Chương trình có thể xuất 0 nếu kết quả là đúng và bất kỳ số nào khác nếu kết quả là sai không?
JosiahRyanW

Câu trả lời:


6

R , 39 37 byte

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

Hãy thử trực tuyến!

Sử dụng phương pháp "kiểm tra nếu hình vuông hoàn hảo" cổ điển, lấy phần không tách rời của căn bậc hai S^.5%%1và lấy phần phủ định logic của nó, vì nó ánh xạ từ 0 (hình vuông hoàn hảo) sang TRUEvà khác không FALSE.

Cảm ơn Robert S đã lưu một vài byte!


1
Bạn có thể sử dụng scan()để lưu một vài byte?
Robert S.

3
@RobertS. doh! Gần đây tôi đã làm quá nhiều mã hóa R "thật"!
Giuseppe

6

JavaScript (ES7),  46 44  42 byte

Đã lưu 1 byte nhờ @Hedi

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

Hãy thử trực tuyến!

Đã bình luận

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
Bạn có thể tiết kiệm một byte với dđi từ nđể 0thay vì 2để nnhư thế này:n=>!((g=d=>d?d*d*!(n%d)+g(d-1):0)(n)**.5%1)
Hedi


5

Ngôn ngữ lập trình 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

Hãy thử trực tuyến!

-13 byte nhờ Jo King!

Đầu ra 1cho kết quả đúng, đầu ra 0cho kết quả sai.


415 byte với ký tự thứ ba
Jo King




3

Brachylog , 12 8 byte

f^₂ᵐ+~^₂

-4 byte nhờ Fatelize vì tôi không nhận ra brachylog có chức năng các yếu tố

giải trình

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

Hãy thử trực tuyến!


f^₂ᵐngắn hơn 4 byte so vớiḋ{⊇×^₂}ᵘ
Fatalize

3

MathGolf , 5 4 byte

─²Σ°

Hãy thử trực tuyến!

Giải trình

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

Rất giống với các câu trả lời khác, so với 05AB1E, tôi nhận được một byte cho toán tử "là hình vuông hoàn hảo" của mình.


Bạn biết đấy, một cái gì đó gọi là "MathGolf" thực sự nên có một toán tử chuẩn ... điều đó sẽ khiến bạn giảm xuống còn 3 byte :)
Misha Lavrov

@MishaLavrov đó không phải là ý kiến ​​tồi! Ngay bây giờ tôi không có nhiều hoạt động véc tơ như tôi muốn, một trong những ngày này tôi sẽ thay đổi điều đó
maxb


2

PowerShell , 68 56 byte

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

Hãy thử trực tuyến!

Có vẻ dài ...
-12 byte nhờ mazzy

Chính xác như nói trên họp thiếc. Lấy phạm vi từ 1đầu vào $nvà nhân ra số $_*$_lần bình phương cho dù đó là số chia hay không !($n%$_). Điều này làm cho các ước số bằng một số khác không và các ước số bằng 0. Sau đó chúng tôi lấy tổng của chúng với bộ tích lũy của chúng tôi $a. Tiếp theo, chúng ta lặp lại từ 1lên đến $avà kéo ra những con số mà |?{...}nó vuông là -equal tới $a. Đó là còn lại trên đường ống và đầu ra là ẩn.

Xuất ra một số nguyên dương cho sự thật, và không có gì cho falsey.


trường hợp hiếm hoi $args[0]ngắn hơn :)1..$args[0]|%{$a+=$_*$_*!($n%$_)};1..$a|?{$_*$_-eq$a}
mazzy

1
@mazzy Không phải, vì bạn cần $ntrong vòng lặp cho !($n%$_). Nhưng, việc viết lại tổng của bạn đã lưu 12 byte, cảm ơn!
admBorkBork

xấu hổ làm sao. vì vậy tôi muốn tìm một trường hợp $args[0]ngắn hơn :)
mazzy


2

APL (Dyalog Unicode) , 18 byte

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

Hãy thử trực tuyến!

Lambda ẩn danh. Trả về 1 cho sự thật và 0 cho sai lệch (các trường hợp thử nghiệm trong TIO được bổ sung).

Hét lên @ H.PWiz cho 4 byte!

Làm sao:

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

Bạn có thể làm tương đương notchứ không phải 0=để tiết kiệm một byte?
streetster

@streetster thật không may, tôi không thể vì 2 lý do. Đầu tiên, nottoán tử của APL ( ~), khi được sử dụng một cách đơn điệu, chỉ hoạt động với booleans (0 hoặc 1). Vì bất kỳ số modulo 1 nào không bao giờ bằng 1, nếu tôi sử dụng ~thay vì 0=, tôi sẽ nhận được một domain errorsố bất kỳ không phải là một hình vuông hoàn hảo, vì các giá trị thập phân nằm ngoài ~miền. Hơn nữa, tôi không thể đơn giản bỏ qua 0=, vì giá trị trung thực của APL là 1, không phải 0 và nó sẽ không có đầu ra nhất quán cho các giá trị giả.
J. Sallé

2

K (oK) , 26 25 22 byte

Giải pháp:

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

Hãy thử trực tuyến!

Giải trình:

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

Ghi chú:

  • -1 byte lấy cảm hứng từ giải pháp PowerShell
  • -3 byte lấy cảm hứng từ giải pháp APL


2

Matlab, 39 37 byte

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

Thật không may, nó không hoạt động trên Octave (trên tio) nên không có liên kết tio.

Lưu ý Như @LuisMendo đã nêu, divisors()thuộc về Hộp công cụ tượng trưng.


1
Có vẻ như divisorsthuộc về Hộp công cụ tượng trưng. Bạn nên nói rằng trong tiêu đề. Ngoài ra, bạn có thể sử dụng ~···thay vì···==0
Luis Mendo

Bạn có thể rút ngắn này bằng cách sử dụng sum(...)^.5thay vìsqrt(sum(...))
Sanchises

2

Haskell , 78 64 53 byte

-14 byte nhờ Ørjan Johansen . -11 byte nhờ vào các lò nướng .

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

Hãy thử trực tuyến!

Này, đã được một thời gian kể từ khi tôi ... viết bất kỳnào , vì vậy Haskell và chơi gôn của tôi có thể hơi rỉ sét. Tôi quên các loại số Haskell rắc rối. : P


1
Nó ngắn hơn (nhưng chậm hơn) để tránh những chuyển đổi đó bằng cách tìm kiếm căn bậc hai với sự hiểu biết danh sách khác. Hãy thử trực tuyến!
Ørjan Johansen

1
Ngắn hơn: fx | s <-sum [i ^ 2 | i <- [1..x], mod x i <1] = round (sqrt $ toEnum s) ^ 2 == s
Damien

2
Dựa trên đề xuất của Ørjan Johansen, điều này sẽ hoạt động với 53 byte.
trứng

2

Pyt , 7 byte

ð²ƩĐř²∈

Hãy thử trực tuyến!

Giải trình

            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

ð²Ʃ√ĐƖ=

Hãy thử trực tuyến!

Giải trình

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

Hãy thử trực tuyến!

Giải trình

            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 byte

£İ□ṁ□Ḋ

Hãy thử trực tuyến!

Giải trình

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

Toán học, 32 byte

IntegerQ@Sqrt[2~DivisorSigma~#]&

Chức năng thuần túy. Lấy một số làm đầu vào và trả về Truehoặc Falselà đầu ra. Không hoàn toàn chắc chắn nếu có một phương pháp ngắn hơn để kiểm tra các hình vuông hoàn hảo.






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)

Hãy thử trực tuyến!

Vì vậy, dcó được ước số cho tất cả các số từ 1 đến nbao gồm. Trong hàm chính u, dòng đầu tiên gán tổng của tất cả các ước số bình phương cho m. Dòng thứ hai lấy các ước số mvà xác định xem có bất kỳ trong số chúng bình phương không m.


1

Perl 5, 47 byte

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

Trả về 1 cho đúng và không có gì cho sai.

Giải trình:

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

Một lambda chấp nhận một đối số số.

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

Giải trình

(1..n) tạo một mảng các giá trị từ 1 đến n

n%ilà sai (vì 0 là sai) nếu ichia nmà không có phần dư

n%i ? 0 : i*ilà tổng bình phương của giá trị inếu nó chia nmà không có phần dư, nếu không là 0

sum{ i-> n%i ? 0 : i*i }tổng kết quả trước đó trên tất cả itrong mảng.

s%Math.sqrt(s)là sai (vì 0 là sai) nếu sqrt schia smà không có phần dư

!(s%Math.sqrt(s))trả về từ lambda ( returnẩn trong câu lệnh cuối) !falsekhi sqrt schia skhông có phần dư

Hãy thử trực tuyến!


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 nhờ vào @ archangel.mjj .

Hãy thử trực tuyến.

Giải trình:

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
Xin chào, bạn có thể cắt 5 byte bằng cách loại bỏ biến t (thực hiện eval và gán trong phần thân của vòng lặp for), như vậy: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, tất nhiên rồi. Không chắc làm thế nào tôi bỏ lỡ điều đó. Cảm ơn! :)
Kevin Cruijssen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.