Answers:
@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
d
从去n
到0
,而不是2
到n
:像这样n=>!((g=d=>d?d*d*!(n%d)+g(d-1):0)(n)**.5%1)
,.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
为假结果。
─²Σ°
─ Get all divisors as list (implicit input)
² Square (implicit map)
Σ Sum
° Is perfect square?
与其他答案非常相似,与05AB1E相比,我的“ is perfect square”运算符获得了一个字节。
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}
$n
在的循环内!($n%$_)
。但是,您重写的总和节省了12个字节,所以谢谢!
$args[0]
较短的情况:)
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=
保存字节吗?
not
运算符(~
)一元使用时,仅适用于布尔值(0或1)。由于任何以1为模的数字都不会等于1,如果我使用~
而不是0=
,则我会domain error
在不是理想平方的任何数字上得到a ,因为十进制值不在~
的域内。此外,我不能简单地省略0=
,因为APL的真实值是1,而不是0,并且对于伪造的值不会有一致的输出。
解:
{~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 /
笔记:
@(v)~mod(sqrt(sum(divisors(v).^2)),1)
不幸的是,它在Octave上不起作用(在tio上),因此没有tio链接。
注意正如@LuisMendo所说,divisors()
属于Symbolic Toolbox。
divisors
属于Symbolic Toolbox。您应该在标题中注明。此外,您还可以使用~···
,而不是···==0
sum(...)^.5
而不是sqrt(sum(...))
-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
ð²ƩĐř²∈
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
$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.
接受数字参数的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
没有剩余
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
n->{int s=0,i=0;for(;++i<=n;)s+=n%i<1?i*i:0;return Math.sqrt(s)%1==0;}