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
нереальними. Булевий залишок залишається на конвеєрі і вихід неявний.
Примітка. Потрібна версія v3 або новіша для -notin
оператора. Я все ще виконую введення для 4937775
(це повільно обчислювати), тому я оновлю це, коли це закінчиться. Через 3+ годин у мене з’явилася помилка stackoverflow. Отже, десь є верхня межа. Ну добре.
Це буде спрацьовувати при негативному введенні, нулі чи одиниці, тому що права рука -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