loading...
Cover image for Advent of Code 2019 - Day 1

Advent of Code 2019 - Day 1

bretthancox profile image bretthancox Updated on ・2 min read

Introduction

My Clojure skills are rarely used, but it is a fun language for thinking outside the box. I'll jump at a chance to apply it. So I jumped at Advent of Code 2019!

Advent of Code

Day 1.1

The first test was nice and simple for Clojure. Iterating over collections and then summing the result is a breeze.
As I suspected the calculation for the amount of fuel would need to be reused, I broke it into its own function. I was glad I did.

This is the code that produces the correct answer to Day 1.1. I moved the inputs into their own inputs.clj file to avoid cluttering my code. day1_masses is the input provided by Advent of Code. I packaged it into a vector for index access.

(ns advent.core
  (:gen-class)
  (:require [advent.inputs :refer [day1_masses]]))

(defn day1_fuel_calc
  "I do the fuel calculation as defined for day 1"
  [mass]
  (- (int (Math/floor (/ mass 3))) 2))

(defn day1_1
  "I take the mass vector and produce a single fuel requirement"
  [mass_vec]
  (reduce + (map day1_fuel_calc mass_vec)))

(defn -main
  "I call the functions for the Advent of Code"
  []
  (println "Day 1.1 - Module masses only:" (day1_1 day1_masses)))

Day 1.2

Once again, the second part of the day utilized some nice Clojure features. In this case, loop/recur. I used the day1_2 function with map to produce a collection of individual fuel calculations. The additional fuel is calculated per individual mass, not total mass, so having the map/reduce in the day1_2 function would have been too complicated. For cleanliness, I should really have another function perform the map/reduce and call that function from main, but it's not overly messy.

The following code produces the correct result.

(ns advent.core
  (:gen-class)
  (:require [advent.inputs :refer [day1_masses]]))


(defn day1_fuel_calc
  "I do the fuel calculation as defined for day 1"
  [mass]
  (- (int (Math/floor (/ mass 3))) 2))


(defn day1_2
  "I take the individual masses for each item, work out the fuel requirement for each item, and then recursively calculate the fuel requirement for the fuel"
  [mass]
  (loop [fuel_needed (day1_fuel_calc mass)
         total_fuel 0]
    (if (< fuel_needed 0)
      total_fuel
      (recur (day1_fuel_calc fuel_needed) (+ total_fuel fuel_needed)))))


(defn -main
  "I call the functions for the Advent of Code"
  []
  (println "Day 1.2 - Fuel for the fuel:" (reduce + (map day1_2 day1_masses))))

Discussion

pic
Editor guide