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)
Nenhuma verificação básica incorporada. Sem fatoração interna. Sem soma de dígitos incorporada. Tudo feito à mão. : D
Recebe a entrada $n
como um número inteiro, define $b
igual a uma matriz vazia. Aqui $b
está nossa coleção de fatores principais.
Em seguida é um for
loop. Primeiro, definimos $a
igual ao nosso número de entrada e a condicional é até que $a
seja menor que ou igual a 1. Esse loop encontrará os principais fatores.
Fazemos um loop de 2
até $a
, uses Where-Object
( |?{...}
) para obter primos que também são fatores !($a%$_)
. Eles são alimentados em um loop interno |%{...}
que coloca o fator $b
e se divide $a
(assim, finalmente chegaremos a 1
).
Então, agora temos todos os nossos principais fatores $b
. Hora de formular nossa saída booleana. Precisamos verificar se $n
é -notin
$b
, porque se é que isso significa que $n
é primo, e por isso não é um número Smith. Além disso, ( -and
) precisamos garantir que nossos dois conjuntos de somas de dígitos sejam -eq
comuns. O booleano resultante é deixado no pipeline e a saída é implícita.
NB - Requer v3 ou mais recente para o -notin
operador. Ainda estou executando a entrada para 4937775
(isso é lento para calcular), então atualizarei isso quando terminar. Após mais de 3 horas, recebi um erro de stackoverflow. Então, há algum limite superior em algum lugar. Ah bem.
Isso funcionará para entrada negativa, zero ou uma, porque o lado direito da -and
tela exibirá um erro enquanto tenta calcular as somas de dígitos (mostradas abaixo), o que fará com que essa metade seja $false
avaliada. Como STDERR é ignorado por padrão e a saída correta ainda é exibida, tudo bem.
Casos de teste
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