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