Dec 14, 2012

9/3(2+1) = ?

เวลามีคนถามว่า

9/3(2+1) = ?

จะตอบโดยไม่ลังเลเลยว่า 1 แถมถ้าใครมาบอกว่าต้องคิดหารทางด้านซ้ายมือ แล้วค่อยมาคูณแบบคอมพิวเตอร์นะ จะตอบกลับไปเลยว่ามัน syntax error โว้ย ภาษาคอมพิวเตอร์ที่ไหนเค้ายอมรับการเขียนเลขติดกันว่าเป็นการคูณเลขบ้าง?

อนึ่ง ถ้ามองว่าการเขียนเลขติดกัน (คั่นด้วยวงเล็บ) เป็นการคูณจริงๆ ตัวที่ติดกับวงเล็บก็ต้องมี precedence สูงกว่า (ทำงานก่อน) เครื่องหมายหารอยู่แล้ว นั่นหมายความว่าต้องคิดส่วน 3(2+1) ให้เสร็จก่อนเอาไปคำนวณต่ออยู่ดี

เจอบ่อยๆ ก็เริ่มขี้เกียจอธิบาย เลยเขียนโปรแกรมที่มันแปลสมการด้านบนนี้ได้ถูกต้องเลยละกัน -> จิ้มโลด

ตัวอย่างผลลัพท์จากโปรแกรม

>>> 9/3(2+1)
1.0
>>> a, b, c, d = 48, 2, 9, 3
>>> a/b(c+d)
2.0
>>> 10(9(8(7(6(5(4(3(2(1)))))))))
3628800
>>> (1+2j)(3-4j)
(11+2j)
>>> 1 + 1/phi
1.618033988749895
>>> phi(43)
42

อันที่จริงก็คิดว่าจะทำมาได้ซักพักละ แต่ด้วยความที่ขี้เกียจวางกฎ grammar ด้วย flex bison ทั้งที่หลายๆ กฎนั้นภาษาส่วนใหญ่ก็ทำไว้ให้แล้ว เลยดองมาเรื่อยๆ จนทำ Infinite List เสร็จ และไปเจอ Python's Magic Methods เลยได้ฤกษ์เริ่มจากตรงนั้น

แนวคิดก็ง่ายนิดเดียว แค่เพิ่มเมธอด __call__ เข้าไปให้ class ของตัวเลข (เป็น Monkey Patching เหมือนใน Ruby) โดย define มันกว่าถ้าเรียก a.__call__(b) แล้วจะมีค่าเท่ากับเอามันมาคูณกันซะ

ปัญหาที่ต้องไล่เก็บก็คือ
  1. Python ไม่อนุญาติให้แก้ไขพวก builtins -- ที่จริงปัญหานี้ก็เหมือนกับคราวที่ทำ Infinite List นั่นแหละ ซึ่งแก้ไม่ยาก แค่ inherit class นั้นๆ ออกมาแล้วไล่ define magic method ซะ
  2. ปัญหาจริงๆ คือ Python parser มันจะแปลตัวเลขไปเป็น class ตัวเลขใน builtins เท่านั้น ดังนั้นก็ต้องแปลง token เองโดยหาว่าตรงไหนคือเลข แล้วก็เอา class ตัวเลขที่ inherit มาแล้วครอบไว้
  3. งานนี้ได้โมดูล tokenize มาช่วยแปลตัวเลขให้ ไม่ต้องเขียน regex เอง เพราะมันจะมีท่าประกาศตัวเลขประหลาดๆ ทำให้ tokenize เองพลาดได้
  4. ที่เหลือก็เอา code ที่แก้ token เรียบร้อยไปทำงาน ตรงนี้ดึงโมดูล code ที่ทำทุกอย่างเตรียมไว้แล้วมาใช้ฟังก์ชันเดียวจบ
  5. แต่ตอนที่เอา tokenize มาใช้ร่วมกับ code จะมีปัญหาที่พิมพ์ได้ทีละบรรทัด เนื่องจาก tokenize มันปรับแต่งอะไรไม่ได้เลย ก็ต้องหลอกมันเอานิดหน่อย
  6. ครบถ้วนกระบวนความแล้วก็ clean up โดยจุดที่เอา code ออกไปได้เยอะมากๆ คือส่วน define magic method อันนี้ใช้ meta-programming บอกแค่ว่าจะเพิ่ม method ไหนบ้างก็พอ แล้วปล่อยให้มัน generate ตัวเองไปซะ
  7. อยู่ๆ ก็เขียน function decorator เป็นเฉยเลย งงตัวเอง 555+
อย่างไรก็ตาม แนวคิดของ callable number นี้ไม่ควรเอาไปใช้เขียนโปรแกรมในโลกจริง เพราะนักคณิตศาสตร์ชอบตังชื่อเดียว แต่ใช้ในคนละบริบท เช่น φ (phi) ที่อาจหมายถึง golden radio หรือ Euler's totient ก็ได้ ซึ่งแม้ว่าทั้ง 2 รูปของ φ นี้จะไม่ overlap กัน (เช่น 1+1/φ จะถูกมองว่าเป็นตัวเลข ในขณะที่ φ(43) คือการใช้ฟังก์ชัน) แต่ด้วยความที่ Python เป็น 1st class function ที่ยอมให้เราส่งผ่านฟังก์ชันเป็นตัวแปรของฟังก์ชันอื่นๆ ได้ ดังนั้นถ้าเราเจออะไรอย่าง δ(φ,ε) เราจะไม่สามารถแน่ใจได้เลยว่า φ ในบริบทนี้คืออะไรครับ

Dec 11, 2012

เซ็นทรัลพิษณุโลก

หยุดยาวที่ผ่านมาต้องไปพิษณุโลก เนื่องจากงานนี้ไปกับครอบครัว (แต่เอารถไปกันเอง) พอได้โอกาสอยู่คนเดียวเลยแวะมาดูเซ็นทรัลที่นี่ซักหน่อย

สรุปเลยว่ามันคือเซ็นทรัลลาดพร้าวแบบเล็กลงมาหน่อย หรือถ้าใครเคยไปเซ็นทรัลเชียงรายคงบอกว่าเป็นฝาแฝดแน่ๆ


  • ตำแหน่งที่ตั้งห้าง (เข้าใจว่า) ตั้งอยู่ชานเมือง (ไม่เหมือน Big C ที่รายล้อมไปด้วยหมู่บ้านร้านค้าต่างๆ)
  • แต่ก็ยังดีที่อยู่บนเส้นหลัก พิษณุโลก-ตาก (AH16) เข้าใจว่าคนสุโขทัยที่ไม่เหลือโรงหนังแล้วต้องมาเที่ยวที่นี่
  • ตัวอาคารเป็นทรงแท่งยาวๆ และมีแต่ลานจอดรถที่สับสนในชีวิตมาก เพราะลานจอดรถให้อารมณ์อยู่บนเกาะแยกออกมาจากตัวห้าง มีสะพานเข้า-ออกแค่ไม่กี่จุด
  • หน้าห้างเป็นลานโล่งสำหรับจัดกิจกรรมเหมือนที่เซ็นทรัลเวิร์ด แต่ก็ไม่ใหญ่เท่าไหร่เพราะแบ่งพื้นที่ไปจัดสวนหย่อม
  • มีชั้นหลัก 3 ชั้นโดยเริ่มที่ชั้น 1 (ไม่มีชั้นใต้ดิน) อันนี้เป็นปัญหาสำหรับคนที่กะเดินเที่ยวให้ครบรอบ เพราะมันจะต้องเดินซ้ำชั้นไป 1 ชั้นเต็มๆ
  • มีชั้น (กึ่ง) ใต้ดินเล็กๆ 1 ชั้น (ร้านเล็กๆ ~5 ร้าน) เปิดประตูออกไปเจอลานจอดรถ (กึ่ง) ใต้ดินขนาดเล็กสำหรับรถ VIP / จอด 30 นาที
  • ลานโล่งๆ ในห้างมีอยู่ 3 ลาน วันที่ไปมีลานนึงจัดงานคริสต์มาส ลานนึงเป็นเลหลังของ B2S ส่วนอีกลานไม่มีงาน
  • ห้องน้ำให้อารมณว่าเป็นอาคารแยกออกมาจากตัวห้าง ตกแต่งสวยไม่แพ้ T21 แค่ไม่มี theme หลากหลายเท่า
  • โรงหนังเป็น Major Cineplex อยู่ชั้น 4 สุดด้านตึก (ชั้นพิเศษสำหรับโรงหนัง) และมีหนังฉาย 5 โรง ราคาบัตรอยู่ที่ 140.-
  • หนังมีให้เลือกน้อยไปหน่อย หนังดังๆ ช่วงนี้อย่าง Cloud Atlas กลับไม่มีให้ดู แถมพนักงานยังปิดเครื่องฉายตอนขึ้นเครดิทหนัง - -"
  • ข้างๆ โรงหนังเป็น Fun Planet มี Jubeat อยู่ 4 ตู้ (ออฟไลน์ไปแล้ว) Pump It Up อีก 2 ตู้ ถือว่าฮายโซวกว่าเชียงใหม่เยอะ
  • ชั้น 3 มีแต่ร้านของกิน -- ไม่มี Sizzler, CoCoIchibanya (ยังดีมี Shabushi) สุดด้านตึกเป็น B2S
  • ชั้น 2 เป็นพวก IT และหนังสือ อันนี้จำไม่ได้ว่าสุดด้านตึกเป็นอะไร
  • ชั้น 1 เป็นเสื้อผ้า สุดด้านจะมี McDonald, KFC, Swensen's เปิดข้างๆ กัน ถัดไปอีกหน่อยก็ Tops
  • ส่วนร้านขายของจากทางห้าง (อยู่สุดด้านตึกอีกทางนึง) เป็น Robinson ก็พวกชุดเครื่องครัว เสื้อผ้า ชุดชั้นใน ของเล่นแพงๆ นั่นแหละ
  • คนไม่ค่อยเยอะเท่าที่คิด อาจเพราะไปตอนเย็นแล้ว หรือว่ายังตี Big C ไม่แตกก็ไม่รู้นะ