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

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

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

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

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

ความท้าทายช่วงท้ายของเรื่องคือต้องจำคำตอบออกไปให้หมด
มันกลายคอขวดของแผนนี้ จึงต้องหาคนช่วยแบ่งจำ

คนยิ่งเยอะ ยิ่งมีความเสี่ยง

ตัวละครในเรื่องก็รู้ดีจึงได้ซ้อมกันหลายรอบขนาดนั้น

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

นี่เป็นเหตุผลที่ผมให้คะแนนน้อย เพราะเนื้อเรื่องช่วงท้ายดำเนินไปโดยตั้งอยู่บนความไม่สมเหตุสมผล เลยไม่อิน

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

ไม่จริงครับ

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

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


สิ่งที่คุณกำลังจะอ่านต่อไปนี้ ผมไม่ได้บอกว่าหนังต้องอธิบายกลไกลทั้งหมดให้คนดูเข้าใจ ไม่ใช่ครับ เพียงแค่บอกว่า “เราจะต้องย่อข้อมูลให้มันสั้นลง ด้วยวิธีทางคณิตศาสตร์ เพราะฉันจำทั้งหมดไม่ได้” ก็พอ

จากนั้นก็มีฉากที่พัฒน์ได้รับข้อมูลมา แล้วนำไปเข้าโปรแกรมถอดรหัส (ที่ลินทิ้งไว้ให้) แค่นี้ก็พอล้าวววว คนดูไม่ต้องเข้าใจหรอกว่าเข้ารหัสถอดรหัสอย่างไร ถามว่า The Imitation Game ได้สอนวิธีการทำงานของเครื่อง ENIAC หรือไม่ ถามว่า The Avatar ได้อธิบายหรือไม่ว่าวิทยาการการสวมร่างอวตารทำอย่างไร เค้าก็ไม่ได้อธิบายนะ แต่ถ้าสงสัยมันก็มีหลักวิทยาศาสตร์ที่อธิบายได้ไม่มากก็น้อย


ด้วยความรู้ด้านเลขฐานง่ายๆ เคสนี้เราสามารถบีบอัดให้ข้อมูลเล็กลง ได้เป็นจำนวนเท่ากับ 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 ตำแหน่ง เพียงพอที่จะให้ลินจำคนเดียวได้หมด (เพราะลินบอกเองว่า จำได้แค่ครึ่งเดียว)

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

ฝั่งคนรับ

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

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

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

โค้ดแปลงคำตอบง่ายๆ เขียนด้วยภาษา javascript

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

ผมมีตัวอย่างเป็น Excel มาเพิ่มให้ด้วย สมมุติว่า 1bec7 อยู่ในช่อง A1
ใส่โค้ดนี้ลงไปในช่อง A2 ได้เลยครับ

=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(BASE(HEX2DEC(A1),4,LEN(A1)*2),0,"A "),1,"B "),2,"C "),3,"D ")

ลองดูครับ
https://docs.google.com/spreadsheets/d/1rvQ-2J4ZYGTCtzI8R470GWwbZWNPGEAlIm4aP7iqh9w/edit?usp=sharing

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


สรุป อย่าพาโปรแกรมเมอร์ไปดูหนังแนวนี้ครับ มันบ้า!

จบ.

Edit: มีสุดยอดความเห็นมาครับ ขอเชิญพี่น้องไปอ่านโดยพลัน https://medium.com/@dtinth/10366515440a