นี่แหละเสน่ห์ของการเขียนโปรแกรมแก้ปัญหา

จากคำถามที่ http://forums.wolfram.com/student-support/topics/26414

กำหนดให้ b มีค่าระหว่าง  0 < b < 1
a1, a2…,a5  แต่ละตัวมีค่า 0 หรือ  1 เท่านั้น

โดยกำหนดให้ a1, a2…,a5 มีความสัมพันธ์คือ
Total[Table[Subscript[a,n]/(2^n),{n,1,5}]]]

คนถามต้องการให้เขียนfunction f ด้วย Mathematica เพื่อหาค่า

a1, a2…,a5 โดยต้องการตามนี้

f[b_]:= ?????

f[1/2] = {1,0,0,0,0} ; best fit of
f[0.344] = {0,1,0,1,1} ; {a1,a2,a3,a4,a5}

ไอ้เราก็เขียนตาม step วิธีคิดที่เข้าใจ

f[b_] := Module[{ai, tryall, pos},
ai = Tuples[{0, 1}, 5];
tryall = #[[1]]/2. + #[[2]]/4. + #[[3]]/8. + #[[4]]/16 + #[[5]]/ 32. & /@ ai;
pos = Nearest[tryall, b];
ai[[#]] & /@ Flatten[Position[tryall, #] & /@ pos]
];

พอมาเจอของอีกคนที่โพสท์ตอบด้วยถึงกับต้องนั่งหัวเราะเลยเพราะมันสั้นมาก

f[b_ /; 0 < b < 1] := IntegerDigits[Round[31*b], 2, 5]

สุดยอดจริงๆ

นี่แหละเสน่ห์ของการเขียนโปรแกรมแก้ปัญหา อย่าไปยึดติด..คิดนอกกรอบบ้าง 🙂

 

%d bloggers like this: