Tag Archives: Facebook

ขี้เกียจเขียน For loop ภาค 3 – ของจริง!

อารมณ์ยังค้างไม่หายจากภาค 2 ที่เขียนไปเมื่อวานนี้ วันนี้ขอเขียนอย่างต่อเนื่องอีกซักบล๊อกนึง เช่นเคยใครยังไม่ได้อ่านตอนที่แล้ว เชิญติดตามได้ที่ ขี้เกียจเขียน For loop ภาค 2 ครับ

วันนี้ยังคงอยู่กันที่โจทย์การแข่งขันเขียนโปรแกรม คราวนี้จะเจาะจงลงไปที่โจทย์แข่งจริงๆ เลย โดยโจทย์นี้เอามาจากการแข่งขัน Facebook Hacker Cup 2013 รอบคัดเลือก ที่พึ่งจะจบไปหมาดๆ เมื่อสุดสัปดาห์ที่ผ่านมา โดยผมทำได้เพียงข้อเดียวคือข้อแรก ที่แทบจะเรียกได้ว่า สำหรับคนที่มีอาชีพเป็นโปรแกรมเมอร์แล้วควรจะทำข้อนี้ได้ เพราะความยากอยู่ในระดับที่เราพบเจอได้ในโจทย์เขียนโปรแกรมในการทำงานประจำวันบ่อยครั้ง

แต่โดยส่วนตัวมีความประทับใจกับการแก้โจทย์ข้อนี้ได้เป็นอย่างมาก เพราะเป็นครั้งแรกที่สามารถแก้ปัญหาแข่งขัน โดยไม่มีการ mutate ค่าของตัวแปร ได้สำเร็จเป็นครั้งแรก ถือเป็นหนึ่งใน achievement จากการที่นั่งขุดนั่งเล่น functional programming concept มาซักพัก

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

โจทย์โดยสรุปมีอยู่ว่า เค้าให้ string ที่มีตัวอักษร a-z ปนตัวใหญ่ตัวเล็กแก่เรามา ให้ assign เลข 1 – 26 ให้แก่ตัวอักษรแต่ละตัว แบบไม่สนใจตัวใหญ่ตัวเล็ก ให้ได้ผลรวมเยอะที่สุด

เช่น ABbCcc => c*26 + b*25 + a*24 = 152

อย่าลืม ตามสไตล์พวกเรา ห้ามใช้ loop และห้าม reassign ค่าให้กับตัวแปรครับ

ผมแก้ปัญหาข้อนี้ได้ด้วย code ชุดนี้

s = 'ABbCcc'
s.split('').map(&:downcase).select { |c| c =~ /[a-z]/ }
 .group_by(&:to_s).map { |_,v| v.count }.sort { |x,y| y <=> x }
 .zip((1..26).to_a.reverse).inject(0) { |a, (n,e)| a + n*e }

เห็น code ต่อกันยาวพรึดแบบนี้ อาจจะดูน่ากลัวไปซักหน่อย แต่ถ้ามาเจาะดูแต่ละขั้นตอนแล้ว ทุกอย่างเข้าใจได้ง่ายมาก

s.split('') #=> ["A", "B", "b", "C", "c", "c"]
.map(&:downcase) #=> ["a", "b", "b", "c", "c", "c"]
.select { |c| c =~ /[a-z]/ } #=> ["a", "b", "b", "c", "c", "c"]
.group_by(&:to_s) #=> {"a"=>["a"], "b"=>["b", "b"], "c"=>["c", "c", "c"]}
.map { |_,v| v.count } #=> [1, 2, 3]
.sort { |x,y| y <=> x } #=> [3, 2, 1]
.zip((1..26).to_a.reverse) #=> [[3, 26], [2, 25], [1, 24]]
.inject(0) { |a, (n,e)| a + n*e } #=> 152

มาลองดูด้วย Clojure กันบ้าง

(->> "ABbCcc"
     (re-seq #"[a-zA-Z]")
     (map clojure.string/lower-case)
     (group-by identity)
     (map #(count (last %)))
     (sort >)
     (zipmap (range 26 1 -1))
     (map #(* (key %) (val %)))
     (reduce +))

ปล. แอบไปดูเฉลยจากทาง Facebook มา พบว่าเค้าใช้วิธีเดียวกับเราเป๊ะ แต่เขียนด้วย Python

กำจัดคอมเมนต์ ขอแชร์, ขอบคุณ บน Facebook ที่เปิดด้วย Google Chrome

ลองเล่นดูได้นะครับ

http://dl.dropbox.com/u/865556/clear-pollution.crx

ไม่ได้อัพโหลดขึ้น Google Web Store มันคิดตังแรกเข้า

การใช้งาน 

Screen_shot_2011-11-07_at_3

เมื่อติดตั้งแล้ว และเข้าไปที่ Facebook ของเรา จะพบว่ามีรูปตัว P ถูกกากบาทอยู่ในกล่อง url bar ของเรา (Chrome เรียกว่า Omnibar) เมื่อทำการกดปุ่มนั้น ทุกคอมเมนต์ที่ถูกขยายออกมาแล้ว ที่มีคำว่า “แชร์” และ “ขอบคุณ” อยู่จะถูกลบออกไป

ไม่รับผิดชอบความผิดพลาดและความเสียหายใดๆ ที่เกิดจากการใช้นะครับ

ใครไม่มั่นใจหรืออยากลองแงะเล่น เชิญยำได้ตามความพอใจครับจาก

https://github.com/visibletrap/chrome-ext-clear-pollution

ด้วยความที่ noob Javascript มาก รบกวนแนะนำด้วยนะครับ หากพบวิธีที่ง่ายกว่า ดีกว่าที่ผมเขียน