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)
Nessun controllo primario incorporato. Nessun factoring incorporato. Nessuna cifra integrata. Tutto è fatto a mano. : D
Accetta l'input $ncome numero intero, imposta $buguale a un array vuoto. Ecco la $bnostra raccolta di fattori primi.
Il prossimo è un forciclo. Innanzitutto impostiamo $auguale al nostro numero di input e il condizionale è fino a quando $aè minore o uguale a 1. Questo ciclo troverà i nostri fattori primi.
Passiamo da 2a $a, usa Where-Object( |?{...}) per estrarre i numeri primi che sono anche fattori !($a%$_). Questi sono alimentati in un circuito interno |%{...}che inserisce $be divide il fattore $a(quindi alla fine ci arriveremo 1).
Quindi, ora abbiamo tutti i nostri fattori primi in $b. È ora di formulare la nostra produzione booleana. Dobbiamo verificare che $nsia -notin $b, perché se è che significa che $nè primo, e quindi non è un numero di Smith. Inoltre, ( -and) dobbiamo assicurarci che i nostri due insiemi di somme di cifre siano -eqeffettivi. Il booleano risultante viene lasciato sulla pipeline e l'output è implicito.
NB - Richiede v3 o più recente per l' -notinoperatore. Sto ancora eseguendo l'input per 4937775(questo è lento da calcolare), quindi lo aggiornerò al termine. Dopo oltre 3 ore, ho riscontrato un errore StackOverflow. Quindi, c'è qualche limite superiore da qualche parte. Oh bene.
Questo funzionerà per input negativo, zero o uno, perché la mano destra del -andbarfallo emetterà un errore mentre tenta di calcolare le somme delle cifre (mostrate sotto), che farà sì che quella metà vada alla $falsevalutazione. Poiché STDERR è ignorato per impostazione predefinita e viene ancora visualizzato l'output corretto, va bene.
Casi 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