[สปอยล์นิดนึง อ่านได้ไม่เซง] เมื่อเอาโปรแกรมเมอร์ไปดูฉลาดเกมส์โกง


จะพยายามไม่สปอยล์มากนะครับ จะไม่เอ่ยถึงใครโดยไม่จำเป็น

ดูจบ แฟนผมถามว่าให้กี่คะแนน ผมบอกถ้าไม่คิดอะไรมากก็สนุกจริงๆ ให้คะแนน 9/10 หัก 1 คะแนนเพราะลินทำหน้าเหมือนเป้อารักษ์ทั้งเรื่อง ดูแล้วรักไม่ลง 555

แต่ถ้าถามจริงๆ เลย ให้คะแนนเรื่องนี้ไปน้อยมาก เพราะมันยังไม่ฉลาดพอ
เนื้อเรื่องมันจะเปลี่ยนแปลงไปเป็นคนละเรื่องเลยถ้าลินรู้จัก “บีบอัดข้อมูล”

[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้

มาถึงตรงนี้หลายๆ คนอาจแย้งว่าแค่เด็กมอปลาย บีบอ่งบีบอัดข้อมูลอะไร คาดหวังมากไปแล้ว มันทำไม่ได้หรอก

ไม่จริงครับ

คำว่าบีบอัดข้อมูลนั้นฟังดูซับซ้อน แต่อันที่จริงเป็นการประยุกต์ใช้เลขฐานอย่างง่ายๆ ซึ่งถ้าอัจฉริยะคณิตศาสตร์เหรียญทองจริง ต้องทำได้อยู่แล้ว เพราะสมัยผมอายุเท่านั้น ผมก็มีความรู้เรื่องเลขฐานโดยที่ไม่ต้องมีเหรียญทองคณิตศาสตร์แต่อย่างใด (กราบขอบพระคุณนิตยสาร My Maths ที่บ่มเพาะผมมาด้วย)

ผมนึกถึงเมะญี่ปุ่น เวลาที่ตัวเอกฉลาดล้ำ มันคือฉลาดจริงๆ อัลกอริทึมในการแก้ปัญหาเมพขิง สามารถทำตามได้จริง แต่นี่ไม่ใช่ ยัดเยียดคนดูว่าลินคือโคตรเมพมาทั้งเรื่อง แต่วิธีการ compact ข้อมูลง่ายๆ นั้นกลับทำไม่ได้ ไม่เห็นจะฉลาดอย่างที่เคลมเลย โถ่ววว

ด้วยความรู้ด้านเลขฐานง่ายๆ เคสนี้เราสามารถบีบอัดให้ข้อมูลเล็กลง ได้เป็นจำนวนเท่ากับ log4(เลขฐานปลายทาง) เท่า

หรือในกรณีของฐาน 16 คือ log4(16) เท่ากับว่าข้อมูลจะเล็กลงราว 2 เท่า

ตัวอย่าง
ถ้าโจทย์ 100 ข้อ
จำคำตอบแบบฐาน 16 จะต้องจำไป 50 ตัวอักษร
ถ้าแบบฐาน 32 จำไป 40 ตัวอักษร
ถ้าแบบฐาน 64 จำไปเพียงแค่ 34 ตัวอักษร

ยิ่งเลขฐานสูง ยิ่งจำน้อย แต่ก็บีบอัดลำบากมากขึ้นเช่นกัน

ผมว่าเลขฐาน 16 นี่แหละดูเป็นไปได้ที่สุด เพราะแปลงในใจได้ทันที เหมาะกับการใช้ในห้องสอบที่มีเวลาจำกัดมากๆ

พอพูดเรื่องเลขฐาน 16 ผมว่าหลายๆ คนอ๋อแล้วล่ะว่าทำยังไง

ไอเดียคืองี้ คำตอบ ABCD เนี่ย ความจริงคือเลขฐาน 4 ชัดๆ เราก็แค่แปลงคำตอบที่อยู่ในฐาน 4 ให้กลายเป็นฐาน 16 เพื่อให้ข้อมูลสั้นลง

คนที่เคยแปลงเลขฐานจะรู้ดีว่าถ้าแปลงไปกลับระหว่างเลขฐานที่เป็น factor ของกันและกัน จะแปลงง่ายมาก

การแปลงฐาน 4 ไปเป็นฐาน 16 จึงแทบจะทำได้ในใจเลยทีเดียวเพราะ 16 หาร 4 ลงตัว
คำตอบปรนัยตอบได้ 4 แบบ A B C D
เราสามารถแปลงเป็นตัวเลขกันได้ในหัวอย่างง่ายดายถูกมะ

A = 0
B = 1
C = 2
D = 3

หลายคนอาจจะถนัดแปลงเป็น A=1, B=2, C=3, D=4 ก็ได้ไม่เป็นไร ค่อยไป -1 ทีหลังก็ได้

สาเหตุที่ต้องเป็น 0,1,2,3 ก็เพราะว่านี่คือเลขฐาน 4 นั่นเอง ใช่ คุณเจอเลขฐานอื่นที่ไม่ใช่เลขฐาน 10 แล้ว ไม่รู้ตัวเลยใช่ป่ะ 55

สมมุติว่าเฉลยคำตอบของ 10 ข้อแรกคือ
A B C D D C D A B D

สามารถแทนค่าด้วยเลขได้ดังนี้
0 1 2 3 3 2 3 0 1 3

ให้จับคู่มัดมันไว้เป็นคู่ๆ ครับ
01 23 32 30 13

โอเค ต่อไปมาแปลงเป็นฐาน 16 กัน วิธีนั้นง่ายมาก จำตารางนี้ เข้าห้องสอบไปแล้วก็วาดลงกระดาษทดเลยนะ (ก็ไม่มีไรมากเรียงสับเปลี่ยน 0,1,2,3 ลงไปในเลข 2 หลัก ได้ออกมา 16 รูปแบบ จำไม่ยากหรอก)

ตารางเลขฐาน 4 ไปฐาน 16

00 = 0
01 = 1
02 = 2
03 = 3
10 = 4
11 = 5
12 = 6
13 = 7
20 = 8
21 = 9
22 = a
23 = b
30 = c
31 = d
32 = e
33 = f

จากนั้นแปลงคำตอบที่เรามีเป็นฐาน 16 โดยการเทียบเลขทีละคู่ไปเลย
สรุปว่า 01 23 32 30 13 จึงได้ออกมาเป็น 1 b e c 7

เห็นไหม แค่นี้เอง

ครับ สรุปแล้วสิ่งที่ต้องจำออกห้องสอบไปนั้นมีเพียง 1bec7 เท่านั้นเอง

จาก 10 ตำแหน่ง เหลือเพียง 5 ตำแหน่ง
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้

สำหรับโปรแกรมเมอร์ท่านใดที่งง เห็นโค้ดนี้น่าจะเข้าใจครับว่าจาก 01 23 32 30 13 กลายเป็น1 b e c 7 ได้อย่างไร


##########################################


ฝั่งคนรับ

เอาล่ะมาถึงฝั่งคนรับสานส์บ้าง จะแกะ 1bec7 ออกมาเป็นคำตอบอย่างไร

สิ่งที่ต้องทำก็คือ ทำย้อนกลับ แปลงเลขฐาน 16 กลับไปเป็นฐาน 4 แล้วก็แทนค่า 0,1,2,3 เป็น A,B,C,D

แต่เนื่องจากสามารถเข้าถึงโทรศัพท์มือถือได้ เราจะแปลงเองทำไมถูกไหม? เขียนโปรแกรมแปลงให้สิ!

อันนี้เป็นตัวอย่างภาษา javascript ครับ ซึ่งมีเพียงมือถือก็รันได้
เช่น เปิดเว็บที่ผมทำเอาไว้นี้ ด้วยมือถือ https://jsfiddle.net/452smumL/ แล้วใส่คำตอบที่ได้จากลินลงไป

กระบวนการทั้งหมดฟังดูยากครับ แต่ถ้าเข้าใจแล้วจะรู้ว่าจริงๆ มันง่ายมาก รับประกัน ทำได้จริง เวลาที่ใช้แปลงเลขฐานเมื่อฝึกฝนเพียง 1–2 ชั่วโมงจะสามารถแปลงได้ในหัวเลยด้วยซ้ำ คุ้มค่ามากกว่าการเสี่ยงจำไปแบบตรงๆ ทั้งดุ้น

สรุป อย่าพาโปรแกรมเมอร์ไปดูหนังแนวนี้ครับ มันบ้า!
แก้ไขข้อความเมื่อ
แสดงความคิดเห็น
โปรดศึกษาและยอมรับนโยบายข้อมูลส่วนบุคคลก่อนเริ่มใช้งาน อ่านเพิ่มเติมได้ที่นี่