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) เราต้องตรวจสอบให้แน่ใจว่าผลรวมหลักสองชุดของเราเป็น-equal บูลีนผลลัพธ์จะถูกทิ้งไว้บนไพพ์ไลน์และเอาต์พุตจะเป็นนัย
NB - ต้องการ 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