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入力数に等しく設定し、条件はuntil $aが1以下になるまでです。このループは素因数を見つけます。
2までループし$a、Where-Object(|?{...})を使用して因子でもある素数を引き出し!($a%$_)ます。これらは|%{...}、因子を配置し$bて分割する内部ループに供給され$aます(したがって、最終的にに到達します1)。
ですから、今ではすべての主要な要因がにあり$bます。ブール出力を定式化する時間。それ$nが-notin $bである場合、それ$nが素数であることを意味するため、それがスミス数ではないことを検証する必要があります。さらに、(-and)2 桁の合計が正しいことを確認する必要があり-eqます。結果のブール値はパイプラインに残り、出力は暗黙的です。
NB--notinオペレーターにはv3以降が必要です。私はまだ4937775(これは計算が遅い)の入力を実行しているので、それが終了したらこれを更新します。3時間以上後、stackoverflowエラーが発生しました。そのため、どこかに上限があります。しかたがない。
これは負の入力、ゼロ、または1に対して機能します。なぜなら、右辺-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