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 $n
jako liczbę całkowitą, ustawia wartość $b
równą pustej tablicy. Oto $b
nasza kolekcja czynników głównych.
Dalej jest for
pętla. Najpierw ustawiamy wartość $a
równą naszej liczbie wejściowej, a warunek jest do momentu, gdy $a
będzie mniejsza lub równa 1. Ta pętla znajdzie nasze czynniki pierwsze.
Pętlujemy od 2
do $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 $b
i 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 $n
jest -notin
$b
, bo jeśli jest to znaczy, że $n
jest pierwsza, a więc nie jest liczbą Smith. Dodatkowo ( -and
) musimy upewnić się, że nasze dwa zestawy cyfr są -eq
ual. Wynikowy boolean pozostaje w potoku, a dane wyjściowe są niejawne.
NB - Wymaga od -notin
operatora 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 -and
eliminuje błąd, gdy próbuje obliczyć sumy cyfr (pokazane poniżej), co spowoduje, że ta połowa przejdzie do $false
oceny. 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