PowerShell v3 +, 183 octets
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)
Pas de vérification principale intégrée. Pas d'affacturage intégré. Pas de somme de chiffres intégrée. Tout est fait à la main. :RÉ
Prend l'entrée $n
comme un entier, définit $b
égal à un tableau vide. Voici $b
notre collection de facteurs premiers.
Vient ensuite une for
boucle. Nous fixons d'abord $a
égal à notre nombre d'entrée, et le conditionnel est jusqu'à ce qu'il $a
soit inférieur ou égal à 1. Cette boucle va trouver nos facteurs premiers.
Nous bouclons de 2
jusqu'à $a
, utilise Where-Object
( |?{...}
) pour extraire des nombres premiers qui sont également des facteurs !($a%$_)
. Ceux-ci sont introduits dans une boucle interne |%{...}
qui place le facteur dans $b
et se divise $a
(ainsi nous finirons par arriver à1
).
Donc, maintenant, nous avons tous nos facteurs premiers dans $b
. Il est temps de formuler notre sortie booléenne. Nous devons vérifier que $n
c'est le cas -notin
$b
, car si c'est le cas, cela signifie que $n
c'est premier, et donc ce n'est pas un nombre Smith. De plus, ( -and
) nous devons nous assurer que nos deux ensembles de chiffres sont -eq
uaux. Le booléen résultant est laissé sur le pipeline et la sortie est implicite.
NB - Nécessite la version 3 ou plus récente pour l' -notin
opérateur. J'exécute toujours l'entrée pour 4937775
(c'est lent à calculer), donc je mettrai à jour cela quand cela se terminera. Après plus de 3 heures, j'ai eu une erreur de stackoverflow. Donc, il y a une limite supérieure quelque part. Tant pis.
Cela fonctionnera pour une entrée négative, zéro ou un, car la droite de la -and
va éliminer une erreur pendant qu'elle essaie de calculer les sommes des chiffres (illustrées ci-dessous), ce qui entraînera le passage de cette moitié $false
lors de l'évaluation. Étant donné que STDERR est ignoré par défaut et que la sortie correcte est toujours affichée, c'est très bien.
Cas de test
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