New Year Resolution

ผ่านไปไม่ถึงครึ่งปีก็ลืมแล้วว่าเขียน New Year Resolution ไว้ว่าอะไร

ทั้งๆ ที่ปีก่อนจำบางอันได้จนจบปี

พบว่า goal ปีนี้เขียนไว้แบบไม่มีวิสัยทัศน์มาก เหมือนเขียนว่าพรุ่งนี้จะทำอะไร และเหมือนจะเป็นแบบนี้มาหลายปี

จริงๆ น่าจะเป็นความกลัวส่วนตัวมากกว่า คือไม่กล้าเขียนอะไรแบบ Mark Zuckerberg เพราะรู้ว่าเขียนไปมันจะลืมและจะเฟลแน่นอน

ดูง่ายๆ ก็ Twitica ที่เขียนว่าจะทำตั้งแต่ 2012-2013 ก็ไม่ได้ทำสักที สุดท้ายก็ไม่กล้าเอาขึ้นเป็น goal แล้ว

หลายสัปดาห์ที่ผ่านมาก็เริ่มมีความรู้สึกว่า อยากตั้ง goal ใหม่ อะไรที่มันน่าสนใจกว่านี้

อยากสตรีมเกม

จริงๆ มีความคิดมาหลายปีแล้วว่าภาษาไทยไม่ค่อยมี content เกมที่อยากดูเท่าไร

  • อยากดูแค่รีวิวเหมือนซีรีส์ WTF is หรือแบบ LGR ก็ดี ไม่ได้อยากดูคนเล่นให้ต้นจนจบ
  • อยากฟังแบบมีสาระ ไม่ใช่โหวกเหวกโวยวาย สมัยนึงก็คิดว่าถ้าชุดนอนทำ content แนวข้อข้างบนนี่คงจะเพอร์เฟกท์มาก แต่สุดท้ายก็ไปนั่งทำ content Dota 2
  • อยากดูเกมที่ไม่ได้ตามกระแส Dota 2, The Walking Dead นี่ช่องไหนก็มีดู แต่ถ้าอยากดู Firewatch ล่ะ? หรือถ้าจะย้อนยุคไปอย่างเกมฟาโรห์จะดูกับใคร
  • game design ก็อยากฟัง บางทีเกมมันรู้สึกว่า “ใช่” แต่บอกไม่ถูกว่าทำไม ต้องมานั่งฟังการออกแบบของเค้านี่แหละว่าทำไมเกมมันถึงใช่ (ถ้าอยากดูผมชอบ Syntax_Error มาก แต่ตอนหลังๆ รู้สึกรำคาญการตัดต่อนิดหน่อย)

พอมาอยู่ MyLive ก็คิดว่าสตรีมมิ่งน่าจะเหมาะกับเรากว่า คือมันไม่ต้องคุยกับตัวเองเท่าไร และก็พบว่าช่องคุณแนทนี่ก็เหมาะตามข้อข้างบนหลายข้ออยู่ คือเค้าพูดเพราะมาก เสียงก็น่าฟัง ^^ ถึงจะใช้คะค่ะไม่เคยถูกก็ตาม

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

อีกวิธีแก้ที่คิดไว้คืออัดเหมือนอัดคลิป YouTube คือมีสคริปต์ไว้ แต่แบบนั้นอยากได้ co-host

ซื้อเกมใน GOG

หลังๆ มารู้สึกว่า Steam เริ่มผูกขาดและน่ารำคาญมากขึ้น sale แต่ละครั้งห่วยลงเรื่อยๆ บางเกมลดก็ลดไม่สุดเหมือนแต่ก่อน

ก็เลยคิดว่าควรจะย้ายไปซื้อร้านอื่นๆ บ้าง แต่ไม่อยากซื้อหลายร้านเพราะจะหาเกมไม่เจอ ก็เลยเลือก GOG

  • GOG มี client ที่จะมีฟีเจอร์แข่งกับ Steam
  • GOG ไม่ใช่แค่ key reseller แต่มีนโยบายของร้านเองคือทุกเกมต้องเป็น DRM-free
  • ข้อเสียที่มารู้ทีหลังคือ เกมบางเกมขายบน GOG แล้วอัพเดตไม่ไวเท่า Steam หรือบางเกมปล่อยเสร็จก็ดองไม่อัพเดตถึง Steam จะอัพเดตไปหลายรุ่นแล้ว คงต้องอ่านรายละเอียดดีๆ ก่อนซื้อ
  • ข้อเสียอีกข้อคือเกมใน GOG หลายเกมตัดฟีเจอร์ multiplayer ออกเพราะมันใช้ Steamworks
  • อีกข้อเสียนึงของการย้ายออกจาก Steam คือ Steam ราคาเป็นบาทถูกมาก เวลาซื้อใน GOG นี่ถึงจะเซลอยู่เท่ากัน แต่ราคาแพงกว่าบางทีเกือบสองเท่า

ตอนนี้ก็เริ่มย้ายมาตั้งแต่ Human Resource Machine แล้วและก็พบข้อดีอีกข้อคือมันก๊อปเกมให้เพื่อนได้

ตรงนี้ Steam จริงๆ ก็มีคือ family sharing แต่ค่อนข้างจะยุ่งยากในการเซต ของ GOG นี่ก็ก๊อปไฟล์เกมให้เพื่อนได้เลย จริงๆ ก็เหมือนให้เพื่อนโหลดเถื่อนมานี่แหละ แต่มันจะมีฟีลลิ่งอีกแบบนึงเหมือนสมัยก่อน Steam ที่เวลาซื้อเกมมาแล้ว copy แผ่นให้เพื่อนจะได้คุยกันรู้เรื่อง ซึ่งพอมาเป็น Steam แล้วรู้สึกว่าถ้าล่อให้เพื่อนซื้อเกมไม่ได้ก็คุยกันไม่ได้เลยนะ แล้วเกมบางเกมคือให้ฟรีก็เล่นนะ แต่ให้ซื้อนี่ก็ไม่เอาอะ

“ฟีเจอร์” ตรงนี้เรารู้สึกว่ามันทำให้รู้สึกคุ้มค่ากว่าการจ่ายให้ Steam นะ

เก็บตัง

รู้สึกช่วงนี้ใช้เงินเปลือง คือตั้งแต่ทำบัญชีมาก็เริ่มซื้อของแพงมาเรื่อยๆ ซึ่งก็ไม่ค่อยเป็นปัญหาเท่าไรเพราะส่วนมากก็คือเก็บเงินซื้อ มีแต่คอมใหม่นี่แหละที่เอาเงินเก็บไปซื้อ

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

ก็เลยคิดว่าน่าจะเก็บเงินบ้างนะ ตั้งเป้าสักเท่าไรดีล่ะ… สิ้นปีสักหมื่นห้าดีมั้ย?

(เดายากมากเพราะฝึกงานไม่รู้จะได้เงินเท่าไร เผลอๆ เอาเงินฝึกงานสักสองเดือนใส่เข้าไปก็ครบแล้วมั้ยเนี่ย)

พูดเพราะ

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

New Year Resolution

สุดท้ายแล้วจะเปลี่ยนแผน New Year Resolution กลางปีดีมั้ย?

นั่นสินะ

เอาเป็นว่าสรุป 2016 Resolution ใหม่เลยดีกว่า

  • ประกอบคอม: Done
  • บล็อค: ไว้ดูสิ้นปี
  • เลิกเล่น Guild Wars 2: DONE
  • Server: ไว้ดูสิ้นปี คิดว่าล่ม
  • Twitica Desktop 3: ไว้ดูสิ้นปี คิดว่าไม่น่าเสร็จ แต่ตอนนี้กำลังไปได้สวย
  • ของใหม่:
    • ซื้อเกมใน GOG เป็นหลัก
    • เก็บตังหมื่นห้า

Google Codejam 2016 Qualification Round

ปีนี้ใช้คอมใหม่ (ยังไม่ได้บล็อคเรื่องคอมใหม่สักที) ไม่ได้จัดอุปกรณ์ต่างๆ ที่สะสมไว้ให้เรียบร้อย ก็เลยต้องเริ่มจาก 0 และด้วยคิดว่า cjlib runner มันไม่จำเป็น มันเป็น overhead ก็เลยมีความคิดว่า เออ ลองเขียนเป็น C++ ดูดีกว่า น่าจะสนุก

Counting sheep

โจทย์ข้อนี้คือให้ N มา แล้วให้นับตั้งแต่ N, 2N, 3N, 4N, … โดยแต่ละครั้งให้จดตัวเลขในแต่ละหลักไว้ด้วย ถ้าเลขที่จดมีครบ 0-9 เมื่อไรให้คืนค่า xN ออกมา

ข้อนี้พบว่าพอเป็น C++ แล้วมันก็บังคับวิธีคิดเราอีกแบบ คือในลูปบรรทัดที่ 19 ถ้าเป็น Python เราจะ cast เป็น string แล้ววน ซึ่งมันเข้าใจง่ายกว่าการใช้ int (ที่ต้องมีบรรทัด 20 + 23 ให้อ่านแล้วต้องตีความ)

พบว่า cin ก็อ่าน input ง่ายดีนะ

Revenge of the Pancakes

โจทย์ข้อนี้ให้ string --+- มา แล้วให้ทำให้เป็น ++++ ทั้งหมด โดยใช้วิธีกลับเครื่องหมายทุกตัวตั้งแต่ตัวที่ 0 – n ได้ เช่น n = 2 ก็จะกลายเป็น ++-+

ที่สงสัยคือวิธีคิดเราง่ายมาก แต่ content analysis กลับคิดอะไรยากมากจนเรางงว่าวิธีเรามันผิดในทางคณิตศาสตร์หรือยังไง runtime ที่ใช้รันข้อ large เราก็แค่ 0.003s ด้วย

วิธีที่ใช้คือแบบนี้ครับ นับจากขวามือ เจอตัว - ตัวแรกเมื่อไรให้หยุดแล้วกลับทุกตัวด้านหน้ารวมถึงตัวนั้น ฉะนั้นจากข้อตัวอย่างก็จะเป็น

ครั้งที่ n (0-index) Output
เริ่ม --+-
1 3 ++-+
2 2 --++
3 1 ++++

ข้อนี้พบปัญหากับ cin นิดหน่อย คือมันไม่อ่าน \n เข้ามา ทำให้ต้องมาอ่านทิ้งอีกในบรรทัดที่ 49

Coin Jam

ข้อนี้จะใช้ C++ แล้วก็พบว่าใช้ itertools น่าจะไวกว่า ก็เลยจัด itertools + mathapi ตามสไตล์เดิมมา

ข้อนี้ผมก็ใช้วิธีตรงๆ โง่ๆ นี่แหละครับ

  1. Generate ตัวเลขมาก่อน โดยใช้ itertools.product('01', repeat=n-2) สร้างตรงกลางมา แล้วเอา 1 ประกบหน้าหลังตามที่โจทย์กำหนดว่าต้องขึ้นต้นและลงท้ายด้วย 1 ตรงนี้ดีที่ itertools สร้างเป็น tuple ออกมาทำให้มัน generate กรณีที่มี 0 นำได้ไม่มีปัญหา
  2. Cast และ cache เป็นเลขฐานต่างๆ ตั้งแต่ 2-10
  3. เช็คว่าเลขแต่ละตัวเป็น prime number ไหม ตรงนี้ใช้ mathapi เลย ง่ายและไวดี
  4. ถ้าใช่ก็ให้ mathapi หา factor แล้วตอบ

โค้ดที่เห็นนี่ optimize ไปนิดหน่อยละครับ แต่ก็ไม่ต่างกับเดิมมากนัก

ปัญหาของข้อยากคือ ผมก็ไม่เอะใจว่ามันให้ข้อยากมากแล้ว คือโจทย์ก็เขียนนะว่าไฟล์รับเข้าให้มาหมดแล้ว แต่ผมก็เห็นแค่ของ small ไม่เห็น large เลยนึกว่าไม่มี ปรากฏว่ามันให้เป็นตัวเลขมาแล้วไปเขียนไฟล์เอง ก็เลยไม่ได้ลองรันดู พอรันดูจริงๆ ก็พบว่าตัวเลขมันใหญ่มาก prime รันไม่ทัน ก็เลยเปลี่ยนแผนกลางอากาศขณะที่ timer วิ่งอยู่ (ตอนนั้นไม่รู้ว่า large หมดเวลาแล้วขอใหม่ไม่ได้)

แผนแรกก็คือไปใช้ C++ เผื่อจะรันไวขึ้น แต่ก็พบว่าเลขรับเข้าใหญ่กว่า 64 bit int เก็บไม่พอ library หา prime ที่ได้มาก็หา prime ได้สูงสุดแค่ uint64_t

อีกแผนคือ generate prime database ไว้ก่อนเลย ก็นั่ง generate ไปจนปาเข้าไป 40GB แล้ว ตอนนั้นเวลา countdown ใกล้หมดแล้วเลยกดหยุด และผมเชื่อว่าโปรแกรมที่ generate นั่นเหมือนจะออกมาแค่ uint64_t อีกแน่ๆ เพราะเป็น frontend ของ library เดียวกัน