ฝึกเขียนโค๊ดตลอดธันวาคมกัน!

Nitipat Lowichakornthikun
I GEAR GEEK
Published in
2 min readDec 6, 2018

วันนี้ผมจะมาแนะนำโครงการแข่งขันเขียนโปรแกรมที่น่าสนใจให้ทุกคนกันครับ
กิจกรรมนี้มีชื่อว่า Advent of Code ครับ ซึ่งกิจกรรมนี้เองผมก็ได้รู้จักจาก Thai Pangsakulyanont ซึ่งกิจกรรมที่ว่าคือกิจกรรมแข่งขันเขียนโปรแกรมที่จัดแค่ในช่วงวันที่ 1–25 ธันวาคม ของทุกปี ถ้านับปีนี้เข้าไปก็นับว่าเป็นการจัดขึ้นปีที่ 4 แล้วครับ

เมื่อเราได้เข้ามาจะพบหน้าตาของเว็บที่ดูแล้ว geek ซ่ะเหลือเกิน อย่างแรกให้ลองหาปุ่ม Login เข้าสู่ระบบก่อนครับ ที่เหลือจะตามมาเอง ฮ่า ๆ

จากหน้าจอด้านบนเราจะเห็นว่ามีเลข 1–25 อยู่ใช่ไหมครับ (วันที่ผมเขียนบทความนี้คือวันที่ 6 ธันวาคม ช่วง 8 โมงเช้า) ลองเดาดูครับว่ามันคืออะไร?

ใช่แล้วครับ… มันคือโจทย์ที่จะปล่อยออกมาในทุกวันเวลาเที่ยงวันครับ (ตามเวลาประเทศไทย)

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

แต่ถ้าคุณสามารถแก้โจทย์ในแต่ละ part ได้ภายใน 100 อันดับแรก คุณก็จะได้รับคะแนนพิเศษอีกด้วย เช่น วันนี้คุณแก้ part 1 ได้อันดับ 10 แล้วล่ะก็​ คะแนนที่คุณจะได้ไปคือ 91 (100 ลบด้วยอันดับที่เราได้ บวกไปอีก 1 คะแนน) ความโหดคือโจทย์แต่ละ part นั่นแก้กันใช้เวลาเฉลี่ยไม่เกิน 10 นาทีจากการปล่อยออกมาครับ ซึ่งผลสายชิลคือตามมาเก็บโจทย์ช่วงเย็น ๆ ค่ำ ๆ เลยไม่ได้เล่นเพื่อหวังคะแนนครับ

เราลองมาดูโจทย์ของวันแรกกันครับ

ซึ่งถ้าเราลองวิเคราะห์โจทย์แล้วล่ะก็จะพบว่ามันคือการนำเอา string ที่ได้มานั้นคำนวณหาผลลัพธ์ออกมาตามค่า +- ที่อยู่ด้านหน้าของตัวเลขนั้น ๆ

+1, -2, +3, +1 ผลลัพธ์เป็น 3

นั่นก็คือการที่ 0+1–2+3+1 = 3 นั่นเอง

เมื่อเราเหลือบไปดู input จะพบว่ามันไม่ได้มาแบบธรรมดาด้วย คือมันมาแบบมีการเว้นบรรทัดด้วยในแต่ละตัวเลข

Input ของโจทย์ที่ได้มาหน้าตาแบบนี้

ผมเลยเลือกใช้ shell command เลยครับ ในการแก้โจทย์ part ที่ 1 ครับ

echo 0$(pbpaste | tr -d "\n") | bc
  • ดึงค่า input มาจากคำสั่ง pbpaste ซึ่งคำสั่งนี้เป็นคำสั่งที่ทำให้เราสามารถนำเอาค่าจาก clipboard ที่เรา copy มาได้ (ตอนก่อนรันผมก็แค่ไป copy input จากโจทย์)
  • เราทำการลบ \n ออกจาก input
  • จากนั้นก็เติม 0 ไปข้างหน้าให้สามารถรันผลการคำนวณจาก bc ได้ เนื่องจากมันเกิดเคสที่ตัวโจทย์เริ่มด้วย operaion + หรือ -

จะเห็นว่าการแก้โจทย์ปัญหาไม่ได้ใช้การเขียนโปรแกรมเลยในข้อนี้ ซึ่งโดยร่วมผมมองว่าโจทย์อยู่ในระดับง่ายไปจนถึงปานกลางครับ ถ้าเทียบกันกับ Facebook hacker cup หรือ Google codejam ก็คงเป็น small input ครับ

สำหรับการแข่งขันเขียนโปรแกรม โจทย์ส่วนใหญ่จะมาด้วย input 2 แบบ คือ small และ large ครับ ถ้า small ก็นึกภาพว่าคือ input ที่มีขนาดไม่ใหญ่มาก หรือ เลขที่ใส่เข้ามาไม่ได้ใหญ่เกิน memory ของการเขียนโปรแกรมแก้โจทย์ทั่วไปใช้ แต่หากเจอ large ก็ความยากบังเกิดครับ เราต้อง optimize โปรแกรมของเรากันทีเดียว เช่น การแก้โจทย์บางครั้งเราเลือกใช้ Array แต่มันก็ไม่ไหวถ้าเจอชุดข้อมูลขนาดใหญ่ เราก็ต้องปรับว่าจะใช้ Data structure แบบใด

เราได้อะไรจากการฝึกฝนแบบนี้

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

แน่นอนว่าในส่วนของตัวผมเองก็ไม่ได้สนใจว่าจะอยู่ที่เท่าไรใน scoreboard ครับ ผมก็เอาเวลาว่างวันละ 15–30 นาที (บางวันซัดไป 1 ชั่วโมง พอเจอทางตัน ฮ่า ๆ) ซึ่งเวลาที่ไม่มากนี้ของเราเอามาใช้ในการแก้โจทย์ของแต่ละวัน

  1. ผมใช้โจทย์นี้ในการทดลองเขียนภาษาใหม่ ๆ ทั้งที่ตัวเองถนัด และ ไม่ถนัด ตอนนี้ 5 ข้อที่ทำไปก็ใช้ตั้งแต่ shell command ในตัวอย่างข้างต้น, PHP และ Python ผมก็มีแพลนว่าจะลองเอาภาษาที่ตัวเองไม่ค่อยได้ใช้บ่อย ๆ มาแก้ปัญหาด้วย รวมถึงอาจจะลองศึกษาภาษาใหม่ ๆ มาแก้ดู ดังนั้นการแข่งครั้งนี้ไม่ได้สนใจเวลาที่ทำเสร็จ ฮ่า ๆ
  2. ได้รู้ข้อจำกัดในแต่ละ Data structure ในการเลือกใช้งาน อันนี้ก็ตามโจทย์เลย บางข้อผมใช้ Array แก้ได้ แต่พอมาบางข้อก็ต้องหลบไปใช้ Set ของ python ที่สามารถค้นหาค่าได้เร็วกว่า
  3. ทบทวนตนเองว่ายังตกหล่นหรือลืมเรื่องไหนไปไหม เอาจริง ๆ ในการทำงานทั่วไปน้อยโอกาสครับที่เราจะได้เจอโจทย์ให้เราได้ฝึกแบบนี้
  4. เป็นการลับคมของตัวเอง มันเหมาะมาก ๆ กับคนที่ต้องการเตรียมพร้อมเสมอ ยิ่งเราทำงานสายนี้แล้ว ถ้าเราไม่มีการลับคมของอาวุธที่เรามีล่ะก็ไม่น่าว่าหากวันนึงมีโอกาสเข้ามาหาเราก็ไม่สามารถคว้าได้
  • ลองติดตาม live การแก้ไขโจทย์ปัญหาด้วย Ruby แบบเทพ ๆ ได้จากเพจของไทครับ

มาลับคมของเราในเดือนสุดท้ายของปีกัน

นำเอาสิ่งที่คุณได้เรียนรู้มาสนุกไปกับโจทย์

ทดลองทำสิ่งใหม่ ๆ เพราะนี่คือโอกาสสุดท้ายของปีแล้ว

ท้ายสุดแล้ว เราจะได้เรียนรู้ว่ายังมีเรื่องอะไรที่เราต้องเสริมในปีถัด ๆ ไป

--

--