PowerShell v3 +, 183 Byte
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)
Keine eingebaute Hauptprüfung. Kein eingebautes Factoring. Keine eingebaute Ziffernsumme. Alles ist handgemacht. : D
Übernimmt die Eingabe $nals Ganzzahl und setzt sie $bgleich einem leeren Array. Hier $bist unsere Sammlung von Primfaktoren.
Weiter ist eine forSchleife. Wir setzen zuerst $agleich unserer Eingangszahl und die Bedingung ist bis $aist kleiner als oder gleich 1. Diese Schleife wird unsere Primfaktoren finden.
Wir durchlaufen eine Schleife von 2bis zu $aund verwenden Where-Object( |?{...}), um Primzahlen zu extrahieren , die auch Faktoren sind !($a%$_). Diese werden in einer inneren Schleife zugeführt |%{...}, die den Faktor in platziert $bund dividieren $a(so werden wir schließlich bekommen 1).
Jetzt haben wir alle unsere Hauptfaktoren in $b. Zeit für die Formulierung unserer Booleschen Ausgabe. Wir müssen sicherstellen , dass $nist -notin $b, denn wenn es ist , dass Mittel , die eine $nPrimzahl ist, und so ist kein Smith Zahl. Zusätzlich ( -and) müssen wir sicherstellen, dass unsere zwei Sätze von Ziffernsummen gleich sind -eq. Der resultierende Boolesche Wert verbleibt in der Pipeline und die Ausgabe ist implizit.
NB - Erfordert v3 oder neuer für den -notinBetreiber. Ich führe immer noch die Eingabe für aus 4937775(dies ist langsam zu berechnen), daher aktualisiere ich diese, sobald dies abgeschlossen ist . Nach mehr als 3 Stunden habe ich einen Stackoverflow-Fehler erhalten. Also gibt es irgendwo eine Obergrenze. Naja.
Dies funktioniert bei negativen Eingaben (0 oder 1), da die rechte Seite der -andeinen Fehler ausblendet, während versucht wird, die Ziffernsummen (siehe unten) zu berechnen. Dadurch wird diese Hälfte $falsebei der Auswertung auf " 0" gesetzt. Da STDERR standardmäßig ignoriert wird und weiterhin die richtige Ausgabe angezeigt wird, ist dies in Ordnung.
Testfälle
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