PowerShell v3 +, 183 bajty
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)
Brak wbudowanego sprawdzania liczby pierwszych. Brak wbudowanego faktoringu. Brak wbudowanej sumy cyfrowej. Wszystko wykonane ręcznie. :RE
Pobiera dane wejściowe $njako liczbę całkowitą, ustawia wartość $brówną pustej tablicy. Oto $bnasza kolekcja czynników głównych.
Dalej jest forpętla. Najpierw ustawiamy wartość $arówną naszej liczbie wejściowej, a warunek jest do momentu, gdy $abędzie mniejsza lub równa 1. Ta pętla znajdzie nasze czynniki pierwsze.
Pętlujemy od 2do $a, uses Where-Object( |?{...}), aby wyciągać liczby pierwsze, które są również czynnikami !($a%$_). Są one wprowadzane do wewnętrznej pętli, |%{...}która umieszcza czynnik $bi dzieli $a(w ten sposób ostatecznie dojdziemy 1).
Więc teraz mamy wszystkie nasze czynniki pierwsze $b. Czas sformułować naszą wartość logiczną. Musimy upewnić się, że $njest -notin $b, bo jeśli jest to znaczy, że $njest pierwsza, a więc nie jest liczbą Smith. Dodatkowo ( -and) musimy upewnić się, że nasze dwa zestawy cyfr są -equal. Wynikowy boolean pozostaje w potoku, a dane wyjściowe są niejawne.
NB - Wymaga od -notinoperatora wersji 3 lub nowszej . Wciąż uruchamiam dane wejściowe dla 4937775(jest to powolne do obliczenia), więc zaktualizuję to, kiedy to się skończy. Po ponad 3 godzinach mam błąd przepełnienia stosu. Więc jest gdzieś górna granica. No cóż.
Działa to dla wejścia ujemnego, zera lub jednego, ponieważ prawa ręka -andeliminuje błąd, gdy próbuje obliczyć sumy cyfr (pokazane poniżej), co spowoduje, że ta połowa przejdzie do $falseoceny. Ponieważ STDERR jest domyślnie ignorowany , a prawidłowe dane wyjściowe są nadal wyświetlane, jest w porządku.
Przypadki testowe
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