มาอีกครั้งแล้วสำหรับ Advent of Code 2022, มาครั้งนี้ก็คงเหมือนเดิม จะมาลองทำ Day 1 เหมือนกับของ ปีที่แล้ว
Part 1
1000
2000
3000
4000
5000
6000
7000
8000
9000
10000
โจทย์ให้คำนวณหาจำนวน 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
อธิบายได้ดังนี้
1
แบ่งข้อมูล input เป็นทีละบรรทัด
2
จัดกลุ่มข้อมูลด้วยบรรทัดที่ไม่มีข้อมูล
3
เอาข้อมูลที่เป็นค่าว่างออก เนื่องจากใน 2
จะติดข้อมูล ("")
มาด้วย
ข้อมูลใน input-groups
จะได้ลักษณะดังนี้
user=> input-groups
(("1000" "2000" "3000") ("4000") ("5000" "6000") ("7000" "8000" "9000") ("10000"))
จากนั้นนำไปคำนวณต่อ
(def summing
(for [i input-groups]
(reduce + (map #(Integer/parseInt %) i))))
user=> summing
(6000 4000 11000 24000 10000)
หาค่า max (คำตอบใน part 1)
user=> (apply max summing)
24000
Part 2
ในส่วนที่ 2 โจทย์ต้องการหา top 3 ที่มากที่สุด แล้วนำมารวมกัน
จากตรงนี้สามารถนำ summing
มาคำนวณต่อด้วยการจัดเรียงด้วย sort
แล้วค่อยนำมารวมกันเฉพาะ top 3
=> (->> summing
(sort >)
(take 3)
(reduce +))
45000
Top comments (0)