Skip to content

Instantly share code, notes, and snippets.

@ynonp
Created November 5, 2019 14:48
Show Gist options
  • Save ynonp/701cbadca2ed513b7f39ab0b7e37c934 to your computer and use it in GitHub Desktop.
Save ynonp/701cbadca2ed513b7f39ab0b7e37c934 to your computer and use it in GitHub Desktop.
(ns aoc2018.day4
(:require [clojure.math.combinatorics :as combo]))
(defn add-guard-sleep-time
[guards-map current-guard last-sleep-time line]
(let [
wake-up-time (first (drop 1 (re-find #"\d+-\d+-\d+ \d+:(\d+)" line)))
nwake-up-time (Integer/parseInt wake-up-time)
nsleep-time (Integer/parseInt last-sleep-time)]
(assoc
guards-map
current-guard
(concat (get guards-map current-guard []) (vec (for [x (range nsleep-time nwake-up-time)] x))))))
(defn create-data
[[guards-map current-guard last-sleep-time] line]
(cond
(re-find #"begins shift" line) [guards-map (first (drop 1 (re-find #"Guard #(\d+)" line))) 0]
(re-find #"falls asleep" line) [guards-map current-guard (first (drop 1 (re-find #"\d+-\d+-\d+ \d+:(\d+)" line)))]
(re-find #"wakes up" line) [(add-guard-sleep-time guards-map current-guard last-sleep-time line) current-guard 0]))
(defn most-sleepy-guard
[guardsmap]
(apply max-key #(count (get guardsmap %)) (keys guardsmap)))
(defn most-slept-minute
[guardsmap guard]
(first (last (sort-by val (frequencies (get guardsmap guard))))))
(defn most-slept-minute2
[guardsmap guard]
(last (last (sort-by val (frequencies (get guardsmap guard))))))
(defn part1
[]
(with-open [rdr (clojure.java.io/reader "./inputs/day4.txt")]
(let [lines (line-seq rdr)
data (reduce
create-data
[{} 0 0]
(sort lines))
[guardsmap _ _] data
guard (most-sleepy-guard guardsmap)
minute (most-slept-minute guardsmap guard)]
(println guard)
(println minute)
(println (* (Integer/parseInt guard) minute)))))
(defn most-frequent
[v]
(first (sort-by val (frequencies v))))
(defn part2
[]
(with-open [rdr (clojure.java.io/reader "./inputs/day4.txt")]
(let [lines (line-seq rdr)
data (reduce
create-data
[{} 0 0]
(sort lines))
[guardsmap _ _] data
guard-ids (keys guardsmap)
guard (apply max-key (partial most-slept-minute2 guardsmap) guard-ids)
minute (most-slept-minute guardsmap guard)
]
(println (* minute (Integer/parseInt guard))))))
(part2)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment