DEV Community

Phondanai
Phondanai

Posted on

Advent of Code 2022 - Day 1 ด้วย Clojure

มาอีกครั้งแล้วสำหรับ Advent of Code 2022, มาครั้งนี้ก็คงเหมือนเดิม จะมาลองทำ Day 1 เหมือนกับของ ปีที่แล้ว

Part 1

1000
2000
3000

4000

5000
6000

7000
8000
9000

10000
Enter fullscreen mode Exit fullscreen mode

โจทย์ให้คำนวณหาจำนวน Calories ของ Elf ที่มี Calories รวมมากสุด เช่นในตัวอย่าง คำตอบคือ 24000 เพราะ Elf ตัวที่ 4 ขน Calories มามากสุด และผลรวมคือ 7000+8000+9000 = 24000

จาก input ตัวอย่าง สามารถใช้ partition-by ในการแบ่งส่วนของข้อมูลที่เป็นกลุ่มกันโดยอาศัยบรรทัดที่ไม่มีข้อมูล และ filter เพื่อเอาส่วนนี้ออก

(def input "1000
2000
3000

4000

5000
6000

7000
8000
9000

10000")

(def not-blank? (complement clojure.string/blank?))

(def input-groups 
  (->> input
       (clojure.string/split-lines)       ; 1
       (partition-by #(= % ""))           ; 2
       (filter #(not-blank? (first %))))) ; 3
Enter fullscreen mode Exit fullscreen mode

อธิบายได้ดังนี้
1 แบ่งข้อมูล input เป็นทีละบรรทัด
2 จัดกลุ่มข้อมูลด้วยบรรทัดที่ไม่มีข้อมูล
3 เอาข้อมูลที่เป็นค่าว่างออก เนื่องจากใน 2 จะติดข้อมูล ("") มาด้วย

ข้อมูลใน input-groups จะได้ลักษณะดังนี้

user=> input-groups
(("1000" "2000" "3000") ("4000") ("5000" "6000") ("7000" "8000" "9000") ("10000"))
Enter fullscreen mode Exit fullscreen mode

จากนั้นนำไปคำนวณต่อ

(def summing 
  (for [i input-groups]
    (reduce + (map #(Integer/parseInt %) i))))

user=> summing
(6000 4000 11000 24000 10000)
Enter fullscreen mode Exit fullscreen mode

หาค่า max (คำตอบใน part 1)

user=> (apply max summing)
24000
Enter fullscreen mode Exit fullscreen mode

Part 2

ในส่วนที่ 2 โจทย์ต้องการหา top 3 ที่มากที่สุด แล้วนำมารวมกัน
จากตรงนี้สามารถนำ summing มาคำนวณต่อด้วยการจัดเรียงด้วย sort แล้วค่อยนำมารวมกันเฉพาะ top 3

=> (->> summing
     (sort >)
     (take 3)
     (reduce +))
45000
Enter fullscreen mode Exit fullscreen mode

Top comments (0)