คำถามหนึ่งที่เรามักพบเสมอคือ หากจะแก้ปัญหาหนึ่ง ๆ จะใช้วิธีแก้แบบไปเรื่อย ๆ หรือแก้แบบให้ลุล่วงสายฟ้าแลบ

แก้แบบไปเรื่อย ๆ ทำง่ายกว่า เพราะไม่ต้องใช้ความฉลาดมาก

แต่จะว่าไม่ดี ก็ไม่ใช่ ขึ้นกับสถานการณ์ ไม่ควรฝังหัวตายตัว

แก้แบบไปเรื่อย ๆ เป็นการแก้แบบคนขี้เกียจ เช่น เวลาเขียนโปรแกรม ก็ใช้วิธีเขียนให้โปรแกรมทำงานแบบหักโหม (ิbrute force)

แก้แบบลุล่วงสายฟ้าแลบ มักต้องหาลูกเล่นแปลก ๆ มาช่วยมาก แบบนี้ ต้องใช้ความคิดมาก

 

ทั้งสองแบบ มีจุดแข็งจุดอ่อนของตัวเอง ต้องเลือกใช้ให้ถูกกาละเทศะ

 

เพื่อให้เห็นภาพ ผมขอยกเอาโจทย์ข้อหนึ่งมาเป็นตัวอย่าง  โจทย์นี้ ภาควิทยาการคอมพ์ฯ มอ. เคยใช้หัดทดสอบเด็กหัดเขียนโปรแกรม ผมเห็นเป็นโจทย์ที่งดงามมาก ขอยกมาเป็นตัวอย่าง

โจทย์ดั้งเดิมคือ

หากจะสร้างเลขพาลินโดรมที่มีค่ามากที่สุดจากเลขไม่เกินสามหลักจำนวนสองชุดคูณกัน เลขดังกล่าว จะมีค่าเท่าไหร่ เกิดจากอะไรคูณกัน

ผมขอปรับเป็น

หากจะสร้างเลขพาลินโดรมที่มีค่ามากที่สุดจากเลขไม่เกินสี่หลักจำนวนสองชุดคูณกัน จะมี algorithm แบบไหน ที่คูณกันน้อยครั้งที่สุด

พาลินโดรม เป็นเลขที่มีสมมาตรซ้ายขวา คืออ่านจากหน้าไปหลัง เหมือนอ่านจากหลังไปหน้า เช่น 152585251 จะเป็นพาลินโดรม

และในที่นี้ คำว่า algorithm แบบไหน หมายถึงกฎย่อย ๆ ที่นำมาใช้เสริมในการกลั่นกรองทิ้งคู่ที่ไม่ต้องคูณกัน โดยกฎย่อย ๆ จะมีกี่สิบข้อก็ได้

โจทย์ข้อนี้ เป็นโจทย์ลับสมองครับ

ถ้าทำแบบขี้เกียจ ก็ต้องไล่คูณแบบพบกันทุกความเป็นไปได้ คือประมาณ 100 ล้านครั้ง (9999 ยกกำลังสองรูปแบบ)

ความท้าทายคือ ลดลงมาให้น้อย ๆ ที่สุด จะลดได้แค่ไหน ?

ขอยกตัวอย่างโง่ ๆ มาสักรายการ ให้นึกภาพออก เป็นตัวอย่างของกฎที่ไม่ได้ความ เพราะเกิดประโยชน์น้อย

ตัวอย่างเช่น คู่คูณต้องไม่ลงท้ายด้วยศูนย์สามตัวทั้งคู่

เพราะจะเกิดการลงท้ายด้วยศูนย์หกตัว คูณกันแล้ว ไม่น่าเกิด palindrome 

เพราะเรารู้ว่า เลข 4 หลัก  คูณเลข 4 หลัก ได้ไม่เกิน 8 หลัก

ถ้าเกิด palindrome จริง ลงท้ายศูนย์หกตัว ก็ต้องนำหน้าด้วยศูนย์หกตัวด้วย เกิน 8 หลัก ซึ่งเป็นไปไม่ได้

กฎดังตัวอย่างนี้ ทำให้ลดครั้งการคูณไปนิดหน่อย คือ ตั้งแต่ 1 ถึง 9999 มีข้อยกเว้นแบบนี้อยู่ 9 ครั้ง ทำให้รูปแบบที่เป็นไปได้ทั้งหมด คือ [9990 ยกกำลังสองรูปแบบ]

พูดง่าย ๆ ... แทบไม่ได้ลดลงจากเดิมเลย

เพื่อให้ดูง่ายขึ้น ใส่ log ฐาน 10 จำนวนรูปแบบที่เป็นไปได้ เรียกตัวเลขนี้ว่าความอืด น่าจะสื่อสารได้ดีกว่าเดิม

เช่น ถ้าใช้วิธีลุยจับคู่ทุกความเป็นไปได้ ค่าความอืด จะเป็นประมาณ 7.99991

ถ้าผมใช้กฎย่อยแบบที่ว่ามา ความอืดลดลงนิดหน่อย เหลือ 7.99913

คำถามคือ เป็นไปได้หรือไม่ ที่จะทำให้ความอืด ลดลงได้สุด ๆ สะใจ ? ถ้าได้ จะต้องตั้งกฎอย่างไร ?

เป็นตัวอยา่งในการคิดวิเคราะห์ที่เด็กหรือผู้ใหญ่ ก็ร่วมสนุกได้ครับ