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 $n
bir tamsayı olarak alır, $b
boş bir diziye eşit olarak ayarlar . İşte, $b
asal faktörler koleksiyonumuz.
Sıradaki bir for
döngü. Öncelikle $a
girdi numaramıza eşit olarak belirledik ve koşullu, $a
1'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 2
iç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
$a
1
Öyleyse, şimdi ana faktörlerimizin hepsinde var $b
. Boole çıkışımızı formüle etme zamanı. Biz doğrulamak gerekir $n
olduğunu -notin
$b
o vasıta olmasıdır çünkü eğer, $n
bu nedenle asal olduğunu ve Smith sayı değildir. Ayrıca, ( -and
) Emin bizim iki kümesi yapmak gerekir haneli toplamlar vardır -eq
UAL. Elde edilen Boole boru hattında bırakılır ve çıktı örtüktür.
Not - -notin
Operatö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ü -and
iadenin sağ tarafı, rakamların toplamını (aşağıda gösterilen şekilde) hesaplamaya çalışırken hata verir ve bu yarının $false
değ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