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