PowerShell v3 +, 183 bayt
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)
Dahili ana kontrol yok. Dahili faktoring yok. Dahili basamak toplamı yok. Her şeyin el yapımı. : D
Girdiyi $nbir tamsayı olarak alır, $bboş bir diziye eşit olarak ayarlar . İşte, $basal faktörler koleksiyonumuz.
Sıradaki bir fordöngü. Öncelikle $agirdi numaramıza eşit olarak belirledik ve koşullu, $a1'e eşit veya daha küçük olana kadardır. Bu döngü asal faktörlerimizi bulacaktır.
Aynı zamanda faktör olan primerleri çıkarmak 2için baştan sona loop $a, use Where-Object( |?{...}) . Bunlar faktörü içine alan ve bölen bir iç döngü içine beslenir (böylece sonunda elde edeceğiz ).!($a%$_)|%{...}$b$a1
Öyleyse, şimdi ana faktörlerimizin hepsinde var $b. Boole çıkışımızı formüle etme zamanı. Biz doğrulamak gerekir $nolduğunu -notin $bo vasıta olmasıdır çünkü eğer, $nbu nedenle asal olduğunu ve Smith sayı değildir. Ayrıca, ( -and) Emin bizim iki kümesi yapmak gerekir haneli toplamlar vardır -eqUAL. Elde edilen Boole boru hattında bırakılır ve çıktı örtüktür.
Not - -notinOperatör için v3 veya daha yenisini gerektirir . Ben hala girişini çalıştırıyorum 4937775( hesaplaması yavaş ), bu yüzden bittiğinde bunu güncelleyeceğim. 3 + saat sonra bir yığın akışı hatasıyla karşılaştım. Yani, bir yerlerde bazı üst sınırlar var. Oh iyi.
Bu, negatif giriş, sıfır veya bir için işe yarayacaktır, çünkü -andiadenin sağ tarafı, rakamların toplamını (aşağıda gösterilen şekilde) hesaplamaya çalışırken hata verir ve bu yarının $falsedeğerlendirildiğinde gitmesine neden olur . STDERR varsayılan olarak göz ardı edildiğinden ve doğru çıktı hala görüntülendiğinden, bu iyidir.
Test durumları
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