PowerShell v3 +,183字节
param($n)$b=@();for($a=$n;$a-gt1){2..$a|?{'1'*$_-match'^(?!(..+)\1+$)..'-and!($a%$_)}|%{$b+=$_;$a/=$_}}$n-notin$b-and(([char[]]"$n")-join'+'|iex)-eq(($b|%{[char[]]"$_"})-join'+'|iex)
没有内置的素数检查。无内置保理。无内置数字总和。一切都是手工制作的。:D
将输入$n
作为整数,设置为$b
等于空数组。这$b
是我们收集的主要因素。
接下来是一个for
循环。我们首先设置$a
等于我们的输入数字,条件是直到$a
小于或等于1。此循环将查找我们的主要因素。
我们从环路2
最多$a
,用途Where-Object
(|?{...}
)退出素数,同时也是因素!($a%$_)
。这些因素被送入一个内部循环|%{...}
,该循环将因子放入$b
并进行除法$a
(因此我们最终将了解1
)。
因此,现在我们拥有所有主要因素$b
。是时候编写布尔输出了。我们需要验证$n
为-notin
$b
,因为如果是,则表示$n
是质数,因此不是史密斯数。另外,(-and
)我们需要确保我们的两组数字总和为-eq
ual。结果布尔值保留在管道上,并且输出是隐式的。
注意:-notin
运营商需要v3或更高版本。我仍在运行输入4937775
(计算速度很慢),因此在完成输入后将对其进行更新。3个多小时后,出现了stackoverflow错误。因此,在某处存在一些上限。那好吧。
这将适用于负输入,零或一,因为在-and
尝试计算数字总和(如下所示)时,右手将阻止错误,这将导致一半$false
在求值时用到。由于默认情况下会忽略 STDERR ,并且仍然显示正确的输出,所以可以。
测试用例
PS C:\Tools\Scripts\golfing> 4,22,27,58,85,94,18,13,666,-265,0,1|%{"$_ -> "+(.\is-this-a-smith-number.ps1 $_)}
4 -> True
22 -> True
27 -> True
58 -> True
85 -> True
94 -> True
18 -> False
13 -> False
666 -> True
Invoke-Expression : Cannot bind argument to parameter 'Command' because it is an empty string.
At C:\Tools\Scripts\golfing\is-this-a-smith-number.ps1:1 char:179
+ ... "$_"})-join'+'|iex)
+ ~~~
+ CategoryInfo : InvalidData: (:String) [Invoke-Expression], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Microsoft.PowerShell.Commands.InvokeExpressionCommand
-265 -> False
Invoke-Expression : Cannot bind argument to parameter 'Command' because it is an empty string.
At C:\Tools\Scripts\golfing\is-this-a-smith-number.ps1:1 char:179
+ ... "$_"})-join'+'|iex)
+ ~~~
+ CategoryInfo : InvalidData: (:String) [Invoke-Expression], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Microsoft.PowerShell.Commands.InvokeExpressionCommand
0 -> False
Invoke-Expression : Cannot bind argument to parameter 'Command' because it is an empty string.
At C:\Tools\Scripts\golfing\is-this-a-smith-number.ps1:1 char:179
+ ... "$_"})-join'+'|iex)
+ ~~~
+ CategoryInfo : InvalidData: (:String) [Invoke-Expression], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Microsoft.PowerShell.Commands.InvokeExpressionCommand
1 -> False