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 $n
come numero intero, imposta $b
uguale a un array vuoto. Ecco la $b
nostra raccolta di fattori primi.
Il prossimo è un for
ciclo. Innanzitutto impostiamo $a
uguale 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 2
a $a
, usa Where-Object
( |?{...}
) per estrarre i numeri primi che sono anche fattori !($a%$_)
. Questi sono alimentati in un circuito interno |%{...}
che inserisce $b
e 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 $n
sia -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 -eq
effettivi. Il booleano risultante viene lasciato sulla pipeline e l'output è implicito.
NB - Richiede v3 o più recente per l' -notin
operatore. 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 -and
barfallo emetterà un errore mentre tenta di calcolare le somme delle cifre (mostrate sotto), che farà sì che quella metà vada alla $false
valutazione. 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