Alien number

Google codejam ก็จะเริ่มแล้วอีก 20 กว่าวัน ตอนนี้ก็มีแบบฝึกหัดให้ลองทำเล่นๆ ไปก่อนอยู่ประมาณ 8 ข้อวันอังคารหลังจากเห็นข่าวก็ลองสมัครแล้วเข้าไปเล่นซะหน่อยแล้วก็โชว์ความโง่ซะเลยฮะๆๆ เนื่องจากเป็นคนที่มองอะไรแค่ผิวเผินอ่านโจทย์เสร็จก็ลุยทันที ทำให้แค่ข้อแรกกว่าจะทำเสร็จก็ปาไปหลายชั่วโมง – -” อ๊ะลองมาดูโจทย์ดีกว่า อันนี้เป็นแบบฝึกหัดข้อแรก (หลังจากทำวันอังคารในเวลางานแล้วก็หยุดไม่ทำอีกเลย เพราะทำให้รู้ว่า สมาธิในการทำงานจะลดลงอย่างฮวบฮาบ) เล่าประมาณว่า
เลขฐานสิบประกอบด้วยสัญลักษณ์ทั้งหมดสิบตัวคือ 0-9 แล้ววันนึงคุณก็ไปเจอเลขมนุษย์ต่างดาวเข้า ซึ่งมีสัญลักษณ์แปลกประหลาดต่างออกไปจากตัวเลขของมนุษย์และเรียงลำดับไม่เหมือนกันด้วย เช่น oF8 โดยหากเอาสัญลักษณ์เหล่านี้มาเขียนเป็นเลข 1 – 10 เหมือนของมนุษย์โลกในเลขฐานสิบแล้วจะได้เป็น F, 8, Fo, FF, F8, 8o, 8F, 88, Foo, FoF, … ไปเรื่อยๆ โดยเราต้องการที่จะอ่านตัวเลขเหล่านี้ให้ออกและแปลงเป็นตัวเลขของมนุษย์ต่างดาวในสัญลักษณ์อื่นได้ด้วย
แล้วก็บอกลักษณะตัวอย่างของ input มาให้คือ

ตัวเลขต่างดาว สัญลักษณ์เลขของมนุษย์ต่างดาวที่ใช้อ่านตัวเลขด้านหน้า สัญลักษณ์ของมนุษย์ต่างดาวเป้าหมายที่ต้องแปลงมา

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

คืออ่านมาเนี๊ยะก็คิดในหัวและว่าแปลงตัวเลขเป็นเลขฐานสิบก่อน แล้วแปลงเป็นภาษามนุษย์ต่างดาวเป้าหมาย ตอนทำก็เลยเขียนวิธีหาสัญลักษณ์ของมนุษย์ต่างดาวที่เทียบเท่ากับค่าด้านหน้าให้ได้เร็วที่สุด แรกสุดครึ่งชั่วโมงแรกก็ลองกับข้อมูลชุดเล็กก่อนปรากฏว่า โอ้วจอร์จ แม่งโคตรเร็วเลยแป๊บเดียวเสร็จ เลยลองกับชุดใหญ่บ้าง ปรากฏว่า โปรแกรมตายสนิท ก็คิดแล้วดิว่าเราคงทำให้มันใช้หน่วยความจำมากเกินไป หรือไม่ก็มันคำนวนซับซ้อนเกินไป อ๊ะ ลองมาดูข้อแตกต่างระหว่างชุดข้อมูลเล็กกับใหญ่ซักหน่อยดีกว่า
ชุดเล็ก
1 ≤ เลขที่ให้แปล ≤ 4,
2 ≤ จำนวนสัญลักษณ์ของภาษาต้นฉบับ ≤ 10,
2 ≤ จำนวนสัญลักษณ์ของภาษาเป้าหมาย ≤ 10.

ข้อมูลชุดใหญ่
1 ≤ เลขที่ให้แปล(เป็นเลขฐานสิบ) ≤ 1000000000,
2 ≤ จำนวนสัญลักษณ์ของภาษาต้นฉบับ ≤ 94,
2 ≤ จำนวนสัญลักษณ์ของภาษาเป้าหมาย ≤ 94.

โอ้วพระเจ้าขนาดต่างกันลิบเลยครับ ก็ไม่ต้องแปลกใจว่าทำไมโปรแกรมจะตาย เพราะถ้าทำตามวิธีที่ผมคิดตอนแรกเนี๊ยะ แปลงไปแปลงกลับ ถ้าตัวเลขเป็น 1000000000 ต้องแปลงกลับมาก่อน 1000000000 รอบ แล้วค่อยแปลงไปอีก 1000000000 โอ่ว แลัวสัญลักษณ์ก็นะมีซะน้อยเชียว – -” มันก็ควรเดี้ยง แต่ถ้าคิดดีๆ มองไปไกลๆ อีกนิด นี่มันคือการแปลงเลขฐานนี่ฝ่า หลังจากนั่งอู้งานมาซะนาน มัวแต่นั่งโง่หาวิธีแปลงไปแปลงกลับให้เร็วที่สุดอยู่ตั้งนาน พอเปลี่ยนเป็นแปลงเลขฐานโดยเทียบว่าสัญลักษณ์แต่ละหลักคือจำนวน เช่นสัญลักษณ์ตัวที่ 20 ก็คือเลข 20 ในฐานนั้น หลังจากนั้นก็รื้อฟื้นการแปลงเลขฐานอีกนิดหน่อย แล้วเอามาทดสอบกับข้อมูลชุดใหญ่ใหม่ ผลปรากฏว่าเสร็จภายในเวลาอันรวดเร็ว โอ่ย นี่แหละน๊า มัวแต่ถึงเอาเขาไถนานตั้งนาน T T”

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

เพิ่มเติม. เห็น Google codejam เปิดให้แก้ไขข้อมูลของผู้สมัครได้และ วันแรกที่สมัครเสร็จปรากฏว่าใส่เวลาผิด เพราะไม่ได้ดูเดือน นึกว่าเดือนนี้ – -” แทนที่จะได้ทำวันเสาร์เลยกลายเป็นวันจันทร์ พอเข้ามาจะแก้ หาที่แก้ไม่เจอ นึกว่าจะได้ทำวันทำงานแล้วซะอีก

About llun

Just a programmer

,

  • nk

    อืม..เล่นเอากินข้าวไม่ลงไปเลยทีเดียว..ยากจิงๆๆ
    โจทย์ บ้าบอดี..แต่ก็ฮาสุดๆๆ..
    ขอบคุณสำหรับโจทย์นะคะ
    ไปทานข้าวก่อน
    หิวๆๆๆๆๆๆสุด…