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 $n
als Ganzzahl und setzt sie $b
gleich einem leeren Array. Hier $b
ist unsere Sammlung von Primfaktoren.
Weiter ist eine for
Schleife. Wir setzen zuerst $a
gleich unserer Eingangszahl und die Bedingung ist bis $a
ist kleiner als oder gleich 1. Diese Schleife wird unsere Primfaktoren finden.
Wir durchlaufen eine Schleife von 2
bis zu $a
und 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 $b
und 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 $n
ist -notin
$b
, denn wenn es ist , dass Mittel , die eine $n
Primzahl 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 -notin
Betreiber. 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 -and
einen Fehler ausblendet, während versucht wird, die Ziffernsummen (siehe unten) zu berechnen. Dadurch wird diese Hälfte $false
bei 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