PowerShell v3 +, 183 bytes
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)
No hay verificación principal incorporada. Sin factorización incorporada. Sin suma de dígitos incorporada. Todo está hecho a mano. :RE
Toma la entrada $n
como un entero, establece $b
igual a una matriz vacía. Aquí $b
está nuestra colección de factores primos.
El siguiente es un for
bucle. Primero establecemos $a
igual a nuestro número de entrada, y el condicional es hasta que $a
sea menor o igual que 1. Este ciclo va a encontrar nuestros factores primos.
Realizamos un ciclo de 2
hasta $a
, utiliza Where-Object
( |?{...}
) para extraer primos que también son factores !($a%$_)
. Esos se alimentan en un bucle interno |%{...}
que coloca el factor $b
y lo divide $a
(por lo tanto, finalmente lo haremos 1
).
Entonces, ahora tenemos todos nuestros factores primos $b
. Es hora de formular nuestra salida booleana. Tenemos que verificar que $n
es -notin
$b
, porque si es que eso significa que $n
es primo, y por lo tanto no es un número Smith. Además, ( -and
) debemos asegurarnos de que nuestros dos conjuntos de sumas de dígitos sean -eq
ual. El booleano resultante se deja en la tubería y la salida es implícita.
NB : requiere v3 o más reciente para el -notin
operador. Todavía estoy ejecutando la entrada para 4937775
(esto es lento de calcular), así que actualizaré esto cuando termine. Después de más de 3 horas, recibí un error de stackoverflow. Entonces, hay un límite superior en alguna parte. Oh bien.
Esto funcionará para una entrada negativa, cero o uno, porque la mano derecha de la -and
barra emitirá un error mientras intenta calcular las sumas de dígitos (que se muestran a continuación), lo que hará que esa mitad vaya a $false
cuando se evalúa. Dado que STDERR se ignora por defecto , y la salida correcta todavía se muestra, esto está bien.
Casos de prueba
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