คำถามหนึ่งที่เรามักพบเสมอคือ หากจะแก้ปัญหาหนึ่ง ๆ จะใช้วิธีแก้แบบไปเรื่อย ๆ หรือแก้แบบให้ลุล่วงสายฟ้าแลบ
แก้แบบไปเรื่อย ๆ ทำง่ายกว่า เพราะไม่ต้องใช้ความฉลาดมาก
แต่จะว่าไม่ดี ก็ไม่ใช่ ขึ้นกับสถานการณ์ ไม่ควรฝังหัวตายตัว
แก้แบบไปเรื่อย ๆ เป็นการแก้แบบคนขี้เกียจ เช่น เวลาเขียนโปรแกรม ก็ใช้วิธีเขียนให้โปรแกรมทำงานแบบหักโหม (ิbrute force)
แก้แบบลุล่วงสายฟ้าแลบ มักต้องหาลูกเล่นแปลก ๆ มาช่วยมาก แบบนี้ ต้องใช้ความคิดมาก
ทั้งสองแบบ มีจุดแข็งจุดอ่อนของตัวเอง ต้องเลือกใช้ให้ถูกกาละเทศะ
เพื่อให้เห็นภาพ ผมขอยกเอาโจทย์ข้อหนึ่งมาเป็นตัวอย่าง โจทย์นี้ ภาควิทยาการคอมพ์ฯ มอ. เคยใช้หัดทดสอบเด็กหัดเขียนโปรแกรม ผมเห็นเป็นโจทย์ที่งดงามมาก ขอยกมาเป็นตัวอย่าง
โจทย์ดั้งเดิมคือ
หากจะสร้างเลขพาลินโดรมที่มีค่ามากที่สุดจากเลขไม่เกินสามหลักจำนวนสองชุดคูณกัน เลขดังกล่าว จะมีค่าเท่าไหร่ เกิดจากอะไรคูณกัน
ผมขอปรับเป็น
หากจะสร้างเลขพาลินโดรมที่มีค่ามากที่สุดจากเลขไม่เกินสี่หลักจำนวนสองชุดคูณกัน จะมี algorithm แบบไหน ที่คูณกันน้อยครั้งที่สุด
พาลินโดรม เป็นเลขที่มีสมมาตรซ้ายขวา คืออ่านจากหน้าไปหลัง เหมือนอ่านจากหลังไปหน้า เช่น 152585251 จะเป็นพาลินโดรม
และในที่นี้ คำว่า algorithm แบบไหน หมายถึงกฎย่อย ๆ ที่นำมาใช้เสริมในการกลั่นกรองทิ้งคู่ที่ไม่ต้องคูณกัน โดยกฎย่อย ๆ จะมีกี่สิบข้อก็ได้
โจทย์ข้อนี้ เป็นโจทย์ลับสมองครับ
ถ้าทำแบบขี้เกียจ ก็ต้องไล่คูณแบบพบกันทุกความเป็นไปได้ คือประมาณ 100 ล้านครั้ง (9999 ยกกำลังสองรูปแบบ)
ความท้าทายคือ ลดลงมาให้น้อย ๆ ที่สุด จะลดได้แค่ไหน ?
ขอยกตัวอย่างโง่ ๆ มาสักรายการ ให้นึกภาพออก เป็นตัวอย่างของกฎที่ไม่ได้ความ เพราะเกิดประโยชน์น้อย
ตัวอย่างเช่น คู่คูณต้องไม่ลงท้ายด้วยศูนย์สามตัวทั้งคู่
เพราะจะเกิดการลงท้ายด้วยศูนย์หกตัว คูณกันแล้ว ไม่น่าเกิด palindrome
เพราะเรารู้ว่า เลข 4 หลัก คูณเลข 4 หลัก ได้ไม่เกิน 8 หลัก
ถ้าเกิด palindrome จริง ลงท้ายศูนย์หกตัว ก็ต้องนำหน้าด้วยศูนย์หกตัวด้วย เกิน 8 หลัก ซึ่งเป็นไปไม่ได้
กฎดังตัวอย่างนี้ ทำให้ลดครั้งการคูณไปนิดหน่อย คือ ตั้งแต่ 1 ถึง 9999 มีข้อยกเว้นแบบนี้อยู่ 9 ครั้ง ทำให้รูปแบบที่เป็นไปได้ทั้งหมด คือ [9990 ยกกำลังสองรูปแบบ]
พูดง่าย ๆ ... แทบไม่ได้ลดลงจากเดิมเลย
เพื่อให้ดูง่ายขึ้น ใส่ log ฐาน 10 จำนวนรูปแบบที่เป็นไปได้ เรียกตัวเลขนี้ว่าความอืด น่าจะสื่อสารได้ดีกว่าเดิม
เช่น ถ้าใช้วิธีลุยจับคู่ทุกความเป็นไปได้ ค่าความอืด จะเป็นประมาณ 7.99991
ถ้าผมใช้กฎย่อยแบบที่ว่ามา ความอืดลดลงนิดหน่อย เหลือ 7.99913
คำถามคือ เป็นไปได้หรือไม่ ที่จะทำให้ความอืด ลดลงได้สุด ๆ สะใจ ? ถ้าได้ จะต้องตั้งกฎอย่างไร ?
เป็นตัวอยา่งในการคิดวิเคราะห์ที่เด็กหรือผู้ใหญ่ ก็ร่วมสนุกได้ครับ