Sum


17

ให้n=42 (อินพุต)

จากนั้นตัวหารคือ: 1, 2, 3, 6, 7, 14, 21, 42

กำลังสองแต่ละตัวหาร: 1, 4, 9, 36, 49, 196, 441, 1764

กำลังรวม (เพิ่ม): 2500

ตั้งแต่ดังนั้นเราจึงคืนค่าความจริง ถ้ามันไม่ใช่สแควร์ที่สมบูรณ์แบบให้คืนค่าที่ผิดพลาด50×50=2500

ตัวอย่าง :

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

นี่คือสั้นที่สุดในหน่วยไบต์สำหรับแต่ละภาษาที่ชนะ

ขอบคุณ @Arnauld ที่ชี้ให้เห็นลำดับ: A046655


2
ผลลัพธ์ของโปรแกรมเป็น 0 หากผลลัพธ์เป็นจริงและหมายเลขอื่นใดหากผลลัพธ์เป็นเท็จ
JosiahRyanW

คำตอบ:


6

R , 39 37 ไบต์

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

ลองออนไลน์!

การใช้ "การทดสอบที่สมบูรณ์แบบถ้าตาราง" คลาสสิกวิธีการไม่ใช่ส่วนหนึ่งที่สำคัญของรากS^.5%%1และการปฏิเสธตรรกะของมันเป็นมันแผนที่ศูนย์ (ตารางที่สมบูรณ์) ไปและจะไม่ใช่ศูนย์TRUEFALSE

ขอบคุณRobert Sสำหรับการบันทึกสองสามไบต์!


1
คุณสามารถใช้scan()เพื่อบันทึกไม่กี่ไบต์?
Robert S.

3
@RobertS DOH! ฉันได้ทำการเข้ารหัส R "ของจริง" มากเกินไปเมื่อเร็ว ๆ นี้!
Giuseppe

6

JavaScript (ES7),  46 44  42 ไบต์

บันทึก 1 ไบต์ขอบคุณ @Hedi

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

ลองออนไลน์!

แสดงความคิดเห็น

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
คุณสามารถบันทึกหนึ่งไบต์กับdไปจากnการ0แทน2ไปnนี้:n=>!((g=d=>d?d*d*!(n%d)+g(d-1):0)(n)**.5%1)
Hedi


5

ภาษาการเขียนโปรแกรมของเช็คสเปียร์ , 434 428 415 ไบต์

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

ลองออนไลน์!

-13 ไบต์ขอบคุณ Jo King!

เอาต์พุต1สำหรับผลลัพธ์ที่แท้จริงเอาต์พุต0สำหรับผลลัพธ์ที่เป็นเท็จ


415 ไบต์ด้วยอักขระที่สาม
Jo King




3

Brachylogขนาด12 8 ไบต์

f^₂ᵐ+~^₂

-4 ไบต์ขอบคุณ Fatelize สาเหตุที่ฉันไม่ได้ตระหนักถึง brachylog มีฟังก์ชั่นปัจจัย

คำอธิบาย

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

ลองออนไลน์!


f^₂ᵐสั้นกว่า 4 ไบต์ḋ{⊇×^₂}ᵘ
ทำให้เสียชีวิต

3

MathGolf , 5 4 ไบต์

─²Σ°

ลองออนไลน์!

คำอธิบาย

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

คล้ายกับคำตอบอื่น ๆ เมื่อเทียบกับ 05AB1E ฉันได้หนึ่งไบต์สำหรับตัวดำเนินการ "is perfect square" ของฉัน


คุณจะรู้ว่าสิ่งที่เรียกว่า "MathGolf" จริงๆควรจะมีผู้ประกอบการบรรทัดฐาน ... ที่จะได้รับคุณลงถึง 3 ไบต์ :)
Misha Lavrov

@MishaLavrov นั่นไม่ใช่ความคิดที่แย่! ตอนนี้ฉันไม่มีการดำเนินการเวคเตอร์เท่าที่ฉันต้องการวันหนึ่งฉันจะเปลี่ยนมัน
maxb


2

PowerShell , 68 56 ไบต์

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

ลองออนไลน์!

ดูเหมือนจะนาน ...
-12 ไบต์ต้องขอบคุณเขาที่บ้าคลั่ง

ทำสิ่งที่พูดบนกระป๋องอย่างแน่นอน ใช้เวลาช่วงจาก1การป้อนข้อมูล$nและคูณออกตารางเวลาไม่ว่าจะเป็นตัวหารหรือไม่$_*$_ !($n%$_)สิ่งนี้ทำให้ตัวหารเท่ากับจำนวนที่ไม่ใช่ศูนย์และตัวหารที่ไม่ใช่เท่ากับศูนย์ $aจากนั้นเราจะใช้ผลรวมของพวกเขาที่มีการสะสมของเรา ต่อไปเราวนซ้ำอีกครั้งจาก1ขึ้นไป$aและดึงออกหมายเลขเหล่านั้นที่|?{...}มันยกกำลังทางเพศที่จะ-eq $aที่เหลืออยู่บนไปป์ไลน์และเอาท์พุทเป็นนัย

ส่งออกจำนวนเต็มบวกสำหรับความจริงและไม่มีอะไรผิดพลาด


กรณีที่หายากที่$args[0]จะสั้นกว่า :)1..$args[0]|%{$a+=$_*$_*!($n%$_)};1..$a|?{$_*$_-eq$a}
Mazzy

1
@mazzy มันไม่ได้เพราะคุณจะต้องอยู่ภายในวงสำหรับ$n !($n%$_)แต่การเขียนผลรวมของคุณได้บันทึกไว้ 12 ไบต์ดังนั้นขอบคุณ!
AdmBorkBork

สิ่งที่น่าละอาย ดังนั้นผมจึงต้องการที่จะหากรณีที่$args[0]สั้น :)
Mazzy


2

APL (Dyalog Unicode)ขนาด 18 ไบต์

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

ลองออนไลน์!

แลมบ์ดานิรนาม ส่งคืน 1 สำหรับความจริงและ 0 สำหรับความเท็จ (กรณีทดสอบใน TIO ได้รับการกำหนดล่วงหน้า)

ส่งเสียงถึง @ H.PWiz นาน 4 ไบต์!

วิธี:

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

คุณสามารถทำnotแทน0=การบันทึกไบต์ได้หรือไม่?
streetster

@streetster น่าเสียดายที่ฉันไม่สามารถด้วยเหตุผล 2 ประการ ขั้นแรกnotผู้ดำเนินการของ APL ( ~) เมื่อใช้แบบ monadically จะใช้งานได้กับ booleans (ทั้ง 0 หรือ 1) เท่านั้น เนื่องจากโมดูโลหมายเลข 1 ไม่เคยมีค่าเท่ากับ 1 ถ้าฉันใช้~แทน0=ฉันจะได้domain errorจำนวนที่ไม่ใช่สี่เหลี่ยมจัตุรัสเนื่องจากค่าทศนิยมอยู่นอก~โดเมน นอกจากนี้ฉันไม่สามารถละเว้นได้0=เนื่องจากค่าความจริงของ APL คือ 1 ไม่ใช่ 0 และจะไม่มีผลลัพธ์ที่สอดคล้องกันสำหรับค่าที่ผิดพลาด
J. Sallé

2

K (oK) , 26 25 22 ไบต์

วิธีการแก้:

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

ลองออนไลน์!

คำอธิบาย:

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

หมายเหตุ:

  • -1 ไบต์รับแรงบันดาลใจจากPowerShellโซลูชัน
  • -3 ไบต์รับแรงบันดาลใจจากโซลูชันAPL


2

Matlab, 39 37 ไบต์

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

น่าเสียดายที่มันใช้งานไม่ได้กับ Octave (บน tio) ดังนั้นจึงไม่มีลิงค์ของ tio

หมายเหตุตามที่ @LuisMendo ระบุไว้divisors()เป็นของ Symbolic Toolbox


1
ดูเหมือนว่าdivisorsเป็นของ Symbolic Toolbox คุณควรระบุไว้ในชื่อเรื่อง นอกจากนี้คุณสามารถใช้~···แทน···==0
Luis Mendo

คุณสามารถย่อให้สั้นลงได้โดยใช้sum(...)^.5แทนsqrt(sum(...))
Sanchises

2

Haskell , 78 64 53 ไบต์

-14 ไบต์ขอบคุณที่Orjan ฮันเซน -11 ไบต์ขอบคุณที่OVS

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

ลองออนไลน์!

เฮ้มันเป็นเวลานานแล้วที่ข้าได้ ... เขียนรหัสใด ๆดังนั้น Haskell และการเล่นกอล์ฟของฉันอาจเป็นสนิมเล็กน้อย ฉันลืมประเภทตัวเลข Haskell ที่ยุ่งยาก : P


1
มันสั้นกว่า (แต่ช้ากว่า) เพื่อหลีกเลี่ยงการแปลงเหล่านั้นด้วยการค้นหาสแควร์รูทด้วยความเข้าใจในรายการอื่น ลองออนไลน์!
Ørjan Johansen

1
สั้น: fx | s <-sum [i ^ 2 | i <- [1..x], mod x i <1] = รอบ (sqrt $ toEnum s) ^ 2 == s
Damien

2
สร้างขึ้นตามคำแนะนำของØrjan Johansen สิ่งนี้จะทำงานได้ 53 ไบต์
OVS

2

Pyt , 7 ไบต์

ð²ƩĐř²∈

ลองออนไลน์!

คำอธิบาย

            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

ð²Ʃ√ĐƖ=

ลองออนไลน์!

คำอธิบาย

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

ลองออนไลน์!

คำอธิบาย

            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

Mathematica ขนาด 32 ไบต์

IntegerQ@Sqrt[2~DivisorSigma~#]&

ฟังก์ชั่นบริสุทธิ์ ใช้ตัวเลขเป็นอินพุตและส่งคืนTrueหรือFalseเป็นเอาต์พุต ไม่แน่ใจทั้งหมดหากมีวิธีที่สั้นกว่าสำหรับการตรวจสอบสี่เหลี่ยมที่สมบูรณ์แบบ






1

F #, 111 ไบต์

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)

ลองออนไลน์!

ดังนั้น dได้รับหารสำหรับตัวเลขทั้งหมดระหว่าง 1 และnรวม ในฟังก์ชั่นหลักuบรรทัดแรกกำหนดผลรวมของตัวหาร Squared mทั้งหมดไปยัง บรรทัดที่สองได้รับหารสำหรับและกำหนดถ้าพวกเขากำลังสองเท่ากับmm


1

Perl 5, 47 ไบต์

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

ส่งคืน 1 สำหรับจริงและไม่มีอะไรที่เป็นเท็จ

คำอธิบาย:

$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 ไบต์

แลมบ์ดายอมรับอาร์กิวเมนต์ที่เป็นตัวเลข

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

คำอธิบาย

(1..n) สร้างอาร์เรย์ของค่า 1 ถึง n

n%iเป็นเท็จ (เป็น 0 เป็นเท็จ) หากiแบ่งnส่วนที่เหลือ

n%i ? 0 : i*iคือผลรวมของกำลังสองของค่าiถ้ามันหารnส่วนที่เหลือ, มิฉะนั้นคือ 0

sum{ i-> n%i ? 0 : i*i } สรุปผลก่อนหน้านี้ในทุกรายการ iแถว

s%Math.sqrt(s)เป็นเท็จ (เป็น 0 เป็นเท็จ) หาก sqrt ของการsหารsโดยไม่เหลือ

!(s%Math.sqrt(s))ผลตอบแทนจากแลมบ์ดา ( returnโดยนัยในคำสั่งสุดท้าย) !falseเมื่อ sqrt ของการsหารsโดยไม่เหลือ

ลองออนไลน์!


1

Java 8, 75 70 ไบต์

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

-5 ไบต์ขอบคุณที่@ archangel.mjj

ลองออนไลน์

คำอธิบาย:

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
สวัสดีคุณสามารถตัด 5 ไบต์โดยการลบตัวแปร t (ทำ eval และการมอบหมายภายในเนื้อความของ for loop) ดังนี้: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 อ่าแน่นอน ไม่แน่ใจว่าฉันพลาดอย่างไร ขอบคุณ! :)
Kevin Cruijssen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.