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
ual บูลีนผลลัพธ์จะถูกทิ้งไว้บนไพพ์ไลน์และเอาต์พุตจะเป็นนัย
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