Google Treasure Hunt ปริศนาข้อสองกับเรื่องของ File System

ตอนนี้ปริศนา Google Treasure Hunt ข้อสองถูกเปิดเผยมาแล้ว แต่ก่อนจะเข้าเรื่องปริศนานี้ ขอเฉลยวิธีถอดรหัสคำใบ้ของวันเวลาที่ปริศนาข้อนี้จะถูกเปิดออกมาที่ผมได้ทิ้งท้ายไว้ในบทความที่แล้วก่อน

จากคำใบ้ที่ว่า 936266827 seconds before Y2K38 จุดสำคัญอยู่ที่ Y2K38 ครับ รหัสตัวนี้ไม่ได้หมายถึงเวลาเที่ยงคืนเป๊ะของวันที่ 1 มกราคม 2038 แต่อย่างใด

แต่มันหมายถึง 19 มกราคม 2038 เวลา 03:14:07 UTC (ตัวเลขเวลาเกือบจะเป็นค่า pi เชียว)

วันและเวลานี้มีความสำคัญอย่างไร?

มันคือวันและเวลาที่ระบบคอมพิวเตอร์จะเกิดปัญหาขึ้นอีกครั้งคล้ายๆ กับที่เคยเกิด Y2K มาแล้ว ซึ่งปัญหานี้มีชื่อเรียกอีกอย่างหนึ่งว่า Unix Millennium Bug เนื่องจากซอฟต์แวร์จำนวนมากที่เขียนขึ้นด้วยภาษา C บนระบบ 32 บิต จะใช้ชนิดข้อมูลแบบ time_t ในการเก็บข้อมูลเวลา ซึ่ง time_t นี้คือเลขจำนวนเต็มขนาด 32 บิตที่เป็นได้ทั้งบวกและลบ (signed 32-bit integer) โดยมีการกำหนดว่าตัวแปรแบบ time_t เริ่มมีค่าเป็น 1 ตั้งแต่วันที่ 1 มกราคม 1970 เวลา 00:00:01 และจะมีค่าเพิ่มขึ้นทีละ 1 เมื่อเวลาผ่านไป 1 วินาที

แต่พอเวลาผ่านไปจนถึงวันที่ 19 มกราคม 2038 เวลา 03:14:07 ค่าของตัวแปรแบบ time_t จะมีค่าเท่ากับ 2147483647 ซึ่งเป็นค่าที่มากที่สุดของตัวเลขจำนวนเต็มบวกขนาด 32 บิต พอเวลาผ่านไป 1 วินาที ตัวแปรนี้บวกเพิ่มอีก 1 ค่าที่ถูกเก็บจะตีกลับมาเป็น -2147483648 พอถอดออกมาเป็นวันเวลาก็จะได้เป็นวันที่ 13 ธันวาคม 1901 เวลา 20:45:52 ไปซะ ลองดูรูปภาพนี้ประกอบครับ

ปัญหาปี 2038

นี่จึงเป็นคำตอบว่า Y2K38 ไม่ใช่วันที่ 1 มกราคม 2038 เวลา 00:00:00 แต่เป็นวันที่ 19 มกราคม 2038 เวลา 03:14:07 แล้วต้องนำไปลบด้วย 936266827 ตามคำใบ้เพื่อหาเวลาที่แท้จริงที่ปริศนาชุดที่สองจะถูกเปิดเผย

echo date(“Y-m-d H:i:s”, mktime(3, 14, 7, 1, 19, 2038) – 936266827);

คำตอบที่ได้ก็คือ 2008-05-19 18:07:00 นั่นเอง ซึ่งนี่เป็นเวลามาตรฐาน ถ้าแปลงเป็นเวลาไทยที่มี Time Zone คือ GMT+07:00 ก็จะต้องบวกเพิ่มไปอีก 7 ชั่วโมง นั่นคือ Google Treasure Hunt จะเปิดเผยปริศนาชุดที่สองในวันที่ 20 พฤษภาคม 2008 เวลา 01:07:00

ผมตั้ง Google Calendar ไว้ให้ส่ง SMS มาเตือนก่อนถึงเวลา 5 นาที เพื่อที่ผมจะได้เตรียมเข้าไปดูปริศนาใหม่ จะได้มีโอกาสไขปริศนาได้เป็นคนแรกของโลก ซึ่งจะได้รับรางวัล (อะไรก็ไม่รู้) พอได้รับ SMS ผมก็เปิดไปที่เว็บ http://treasurehunt.appspot.com/ ทันที แล้วผมก็ต้องผิดหวังเมื่อพบว่าปริศนาชุดที่สองถูกเปิดเผยขึ้นก่อนเวลาที่ผมคำนวณได้

มันเป็นความผิดพลาดของผมเอง เพราะผมลืมไปว่าช่วงนี้เป็นช่วง Daylight Saving Time ของซีกโลกตอนบน ซึ่งจะมีการปรับเวลาให้เร็วขึ้น 1 ชั่วโมง แปลว่าเวลาประเทศไทยจะเร็วกว่าเวลามาตรฐานเพียง 6 ชั่วโมง คำตอบที่ถูกจริงๆ ควรจะเป็นวันที่ 20 พฤษภาคม 2008 เวลา 00:07:00

ไม่เป็นไรครับ เริ่มไขปริศนาช้ากว่าคนอื่นแค่หนึ่งชั่วโมง แต่ถ้าเรามีวิธีไขที่รวดเร็วก็อาจจะแซงคนอื่นได้ก็ได้ แต่พอเห็นปริศนาเข้าก็เซ็งเลย เพราะมันง่ายกว่าที่คิดครับ ผมเชื่อว่าคนที่ตอบเป็นคนแรกของโลก อาจจะใช้เวลาเพียงแค่ 5 นาทีก็ได้ ถ้าเขาเป็นเซียนในการใช้ command line ในระบบ Unix

โจทย์ที่ว่านี้จะให้คุณดาวน์โหลดไฟล์ zip ที่แตกต่างกับคนอื่น เมื่อแตกไฟล์ zip ออกมาก็จะพบไฟล์เล็กๆ จำนวนสองร้อยกว่าไฟล์ ซึ่งถูกเก็บไว้ในไดเรคทอรีย่อยกระจัดกระจายกันไป

ไฟล์ zip ที่มาพร้อมกับปริศนา

คุณจะต้องเปิดไฟล์ตามเงื่อนไขที่กำหนดเพื่อนำตัวเลขที่อยู่ในไฟล์นั้นในบรรทัดที่กำหนดออกมา นำตัวเลขที่ได้มาบวกกัน เช่น หาผลบวกของเลขที่อยู่ในบรรทัดที่ 5 โดยที่ไฟล์จะต้องมีชื่อไฟล์หรืออยู่ภายใต้ไดเรคทอรีที่มีคำว่า foo และต้องมีนามสกุลเป็น .rtf

โจทย์จะให้คุณหาผลรวมออกมาสองจำนวน แล้วนำผลรวมสองจำนวนนี้คูณกันกลายเป็นคำตอบ

ปริศนาที่สอง

ไม่มีอะไรซับซ้อนเลยใช่มั้ยครับ? ไม่ต้องคิดอัลกอริธึมพิสดารแบบโจทย์หุ่นยนต์ ขอแค่คุณรู้วิธีการสามอย่าง อย่างแรกคือรู้ว่าจะแสดงรายชื่อไฟล์และไดเรคทอรีทั้งหมดออกมาอย่างไร อย่างที่สองคือรู้ว่าจะเลือกเฉพาะไฟล์ที่มีรูปแบบตามที่โจทย์กำหนดได้อย่างไร และอย่างที่สามคือจะนำตัวเลขในไฟล์ตามบรรทัดที่โจทย์บอกออกมาได้อย่างไร

ใครเป็นเซียน Unix คงใช้เวลาไม่นานในการเรียบเรียงคำสั่งต่างๆ ต่อกันผ่าน command line เพื่อหาคำตอบ แต่ผมลืมเรื่องพวกนี้ไปหมดแล้ว ก็เลยใช้ PHP เขียนโปรแกรมแบบที่คุ้นเคย

สิ่งแรกที่ต้องทำก็คือการแสดงรายชื่อไฟล์และไดเรคทอรีทั้งหมดออกมา ซึ่งต้องเขียน Recursive เพื่อควานลงไปในไดเรคทอรีต่างๆ เรื่องนี้ไม่ยากเลย ถามพี่ Google ได้ มีคนทำ function พวกนี้ให้ดาวน์โหลดฟรีเพียบ

อย่างที่สองต้องเลือกว่าไฟล์ไหนเข้าเงื่อนไขของโจทย์บ้าง อันนี้ก็ไม่ยากสำหรับคนที่คุ้นเคยกับ Regular Expression เพียงแค่เขียน pattern แบบง่ายๆ

อย่างสุดท้ายก็คือการอ่านไฟล์เพื่อเอาตัวเลขในบรรทัดที่ต้องการออกมา ซึ่งก็ไม่ใช่ปัญหาอะไรอีก

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

แต่ด้วยความแสบเซี้ยวของ Googler การส่งคำตอบในวันแรกที่ปริศนาถูกเผยออกมา จะรู้ว่าตอบถูกหรือเปล่าก็ต้องรอตอน 2008-05-20 17:07:00 UTC นั่นแปลว่าถึงแม้จะเป็นคนแรกที่ส่งคำตอบ แต่ถ้าตอบไม่ถูกก็แห้วได้เหมือนกัน เพราะกว่าจะรู้ว่าตัวเองตอบถูกหรือผิดก็ต้องรออีกหนึ่งวัน

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

ถ้าอ่านแล้วชอบ ฝากแชร์ด้วยนะครับ
  •  
  •  
  •  
  •  
  •  
  •  
  •