PowerShell v3 +, 183 байта
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)
Нет встроенной первичной проверки. Нет встроенного факторинга. Нет встроенной цифры-суммы. Все сделано вручную. : D
Принимает ввод $nкак целое число, устанавливает $bравным пустому массиву. Вот $bнаша коллекция основных факторов.
Далее идет forцикл. Сначала мы устанавливаем $aравным нашему входному номеру, а условным является до тех пор, пока $aон меньше или равен 1. Этот цикл будет искать наши основные факторы.
Цикл от 2до $a, использует Where-Object( |?{...}) для извлечения простых чисел , которые также являются факторами !($a%$_). Они вводятся во внутренний цикл, |%{...}который помещает фактор в $bделитель и делит его $a(таким образом, мы в конечном итоге доберемся до 1).
Итак, теперь у нас есть все наши главные факторы $b. Время сформулировать наш логический результат. Нам нужно убедиться, что $nэто так -notin $b, потому что, если это так, это означает, что $nэто простое число, и это не число Смита. Кроме того, ( -and) нам нужно убедиться, что наши два набора цифр являются -eqдействительными. Полученное логическое значение остается в конвейере, а вывод неявным.
NB - Требуется v3 или новее для -notinоператора. Я все еще использую ввод для 4937775(это медленно для вычисления), поэтому я обновлю это, когда это закончится. Через 3+ часа я получил ошибку переполнения стека. Итак, где-то есть верхняя граница. Ну что ж.
Это будет работать для отрицательного ввода, нуля или единицы, потому что правая часть функции -andбудет отображать ошибку, пока она пытается вычислить суммы цифр (показано ниже), что приведет к тому, что эта половина перейдет $falseпри оценке. Поскольку STDERR по умолчанию игнорируется , и правильный вывод по-прежнему отображается, это нормально.
Контрольные примеры
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