总和


17

(输入)n=42

然后除数是:1,2,3,6,7,14,14,21,42

平方除数:1,4,9,9,36,49,196,441,1764

求和(加法):2500

由于因此我们返回真实值。如果它不是理想的正方形,则返回虚假值。50×50=2500

例子 :

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

这是因此每种语言的最短代码(以字节为单位)获胜

感谢@Arnauld指出了序列:A046655


2
如果结果为true,程序可以输出0,如果结果为false,则可以输出其他数字吗?
JosiahRyanW

Answers:


6

R39 37字节

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

在线尝试!

使用经典的“测试是否为理想平方”方法,取平方根的非整数部分S^.5%%1并对其进行逻辑求反,因为它将零(完美平方)映射到TRUE,非零映射到FALSE

感谢Robert S节省了几个字节!


1
您可以scan()用来节省一些字节吗?
罗伯特S.18年

3
@RobertS。h!最近我做了太多的“真实” R编码!
朱塞佩

6

JavaScript(ES7), 46 44  42字节

@Hedi节省了1个字节

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从去n0,而不是2n:像这样n=>!((g=d=>d?d*d*!(n%d)+g(d-1):0)(n)**.5%1)
赫迪拉


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

Brachylog12 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个字节短ḋ{⊇×^₂}ᵘ
Fatalize

3

MathGolf5 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

3

MATL,9个字节

Z\UsX^tk=

在线尝试!

变得如此简单

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

PowerShell68 56字节

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

在线尝试!

似乎很长...
-12字节归功于mazzy

完全按照锡罐上的说明去做。取从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+.*⍨∘∪⍳∨⊢

在线尝试!

匿名lambda。对于真实,返回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我不能基于两个原因。首先,APL的not运算符(~)一元使用时,仅适用于布尔值(0或1)。由于任何以1为模的数字都不会等于1,如果我使用~而不是0=,则我会domain error在不是理想平方的任何数字上得到a ,因为十进制值不在~的域内。此外,我不能简单地省略0=,因为APL的真实值是1,而不是0,并且对于伪造的值不会有一致的输出。
J.Sallé18年

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                                 / 

笔记:



2

Matlab,39 37字节

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

不幸的是,它在Octave上不起作用(在tio上),因此没有tio链接。

注意正如@LuisMendo所说,divisors()属于Symbolic Toolbox。


1
似乎divisors属于Symbolic Toolbox。您应该在标题中注明。此外,您还可以使用~···,而不是···==0
路易斯Mendo

您可以使用sum(...)^.5而不是sqrt(sum(...))
Sanchises '18

2

哈斯克尔78 64 53字节

-14个字节,感谢ØrjanJohansen。-11字节感谢ovs

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

在线尝试!

嘿,自从我写任何代码已经有一段时间了,所以我的Haskell和打高尔夫球可能会有点生锈。我忘记了麻烦的Haskell数字类型。:P


1
通过搜索具有另一个列表理解的平方根来避免这些转换的时间较短(但较慢)。在线尝试!
与Orjan约翰森

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

2
在ØrjanJohansen的建议的基础上,应该可以使用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

外壳,6个字节

£İ□ṁ□Ḋ

在线尝试!

说明

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

IntegerQ@Sqrt[2~DivisorSigma~#]&

纯功能。将数字作为输入并返回TrueFalse作为输出。不完全确定是否有较短的方法来检查完美平方。






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和0之间的所有数字的除数n。在main函数中u,第一行将所有平方除数的和分配给m。第二行获取的除数,m并确定它们是否平方等于m


1

Perl 5,47个字节

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

返回1表示true,否则返回false。

说明:

$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个字节

接受数字参数的lambda。

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

说明

(1..n) 创建一个值从1到n的数组

n%i为假(0是falsy)如果i分裂n无剩余

n%i ? 0 : i*i是值的平方和(i如果它除以无余n数),否则为0

sum{ i-> n%i ? 0 : i*i }i对数组中所有元素的前一个结果求和。

s%Math.sqrt(s)为假(0是falsy)如果满足SQRT s划分s而不剩余

!(s%Math.sqrt(s))从拉姆达返回(return在最后一条语句隐含的)!false时的开方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
嗨,您可以删除t变量来减少5个字节(在for循环的主体内进行eval和赋值),如下所示: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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.