PowerShell v3 +, 183 byte
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)
Tidak ada pemeriksaan prima bawaan. Tidak ada anjak bawaan. Tidak ada jumlah digit bawaan. Tangan semuanya dibuat. : D
Mengambil input $n
sebagai integer, set $b
sama dengan array kosong. Sini,$b
adalah kumpulan faktor-faktor utama kami.
Berikutnya adalah for
loop. Kami pertama-tama menyetel $a
sama dengan nomor input kami, dan kondisinya adalah sampai$a
kurang dari atau sama dengan 1. Loop ini akan menemukan faktor utama kami.
Kami 2
beralih dari hingga $a
, menggunakan Where-Object
( |?{...}
) untuk mengeluarkan bilangan prima yang juga merupakan faktor !($a%$_)
. Mereka dimasukkan ke dalam loop-dalam |%{...}
yang menempatkan faktor ke dalam $b
dan membelah $a
(dengan demikian kita akhirnya akan sampai1
).
Jadi, sekarang kita memiliki semua faktor utama kita $b
. Saatnya merumuskan output Boolean kami. Kita perlu untuk memverifikasi bahwa $n
ini -notin
$b
, karena jika itu adalah bahwa cara yang $n
prima, dan bukan nomor Smith. Selain itu, ( -and
) kita perlu memastikan bahwa dua set jumlah digit kita adalah -eq
ual. Boolean yang dihasilkan ditinggalkan di jalur pipa dan outputnya implisit.
NB - Membutuhkan v3 atau yang lebih baru untuk -notin
operator. Saya masih menjalankan input untuk 4937775
(ini lambat untuk menghitung), jadi saya akan memperbarui ini ketika selesai. Setelah 3+ jam, saya mendapat kesalahan stackoverflow. Jadi, ada beberapa batas atas di suatu tempat. Baiklah.
Ini akan bekerja untuk input negatif, nol, atau satu, karena tangan kanan -and
akan menghilangkan kesalahan saat mencoba menghitung jumlah digit (ditunjukkan di bawah), yang akan menyebabkan setengahnya pergi $false
ketika dievaluasi. Karena STDERR diabaikan secara default , dan output yang benar masih ditampilkan, ini baik-baik saja.
Uji kasus
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