Skip to content

Instantly share code, notes, and snippets.

@PEZ
Last active December 4, 2020 22:13
Show Gist options
  • Save PEZ/42375289c032e43ee6dd8cd40b3c1b42 to your computer and use it in GitHub Desktop.
Save PEZ/42375289c032e43ee6dd8cd40b3c1b42 to your computer and use it in GitHub Desktop.
Day 4, step 2, of Advent of Code 2020, using Clojure and coljure.spec. Not refactored or tidied up πŸ˜€.
(ns pez.aoc2020.day-4
(:require [clojure.string]
[clojure.spec.alpha :as s]
[pez.aoc2020.util :as util]))
(defn parse [card]
(->> (clojure.string/replace card #"\s" " ")
(re-seq #"(\S+):(\S+)")
(map rest)
(reduce
(fn [m [k v]]
(assoc m
(keyword k)
v))
{})))
(s/def :d4/byr #(<= 1920 (Integer/parseInt %) 2002))
(s/def :d4/iyr #(<= 2010 (Integer/parseInt %) 2020))
(s/def :d4/eyr #(<= 2020 (Integer/parseInt %) 2030))
(s/def :hgt/cm (fn [x]
(some->> x
(re-find #"(\d+)cm")
(second)
(Integer/parseInt)
(#(<= 150 % 193)))))
(s/def :hgt/in (fn [x]
(some->> x
(re-find #"(\d+)in")
(second)
(Integer/parseInt)
(#(<= 59 % 76)))))
(s/def :d4/hgt (s/or :cm :hgt/cm :in :hgt/in))
(s/def :d4/hcl #(re-matches #"#[\da-f]{6}" %))
(s/def :d4/ecl #(re-matches #"amb|blu|brn|gry|grn|hzl|oth" %))
(s/def :d4/pid #(re-matches #"\d{9}" %))
(s/def ::card (s/keys :req-un [:d4/byr
:d4/iyr
:d4/eyr
:d4/hgt
:d4/hcl
:d4/ecl
:d4/pid]
:opt-un [:d4/cid]))
(comment
(def input (util/fetch-input 4))
(as-> input $
(clojure.string/split $ #"\n\n")
(map parse $)
(filter #(s/valid? ::card %) $)
(count $)))
(comment
(def invalid-inputs "eyr:1972 cid:100
hcl:#18171d ecl:amb hgt:170 pid:186cm iyr:2018 byr:1926
iyr:2019
hcl:#602927 eyr:1967 hgt:170cm
ecl:grn pid:012533040 byr:1946
hcl:dab227 iyr:2012
ecl:brn hgt:182cm pid:021572410 eyr:2020 byr:1992 cid:277
hgt:59cm ecl:zzz
eyr:2038 hcl:74454a iyr:2023
pid:3556412378 byr:2007")
(def valid-inputs "pid:087499704 hgt:74in ecl:grn iyr:2012 eyr:2030 byr:1980
hcl:#623a2f
eyr:2029 ecl:blu cid:129 byr:1989
iyr:2014 pid:896056539 hcl:#a97842 hgt:165cm
hcl:#888785
hgt:164cm byr:2001 iyr:2015 cid:88
pid:545766238 ecl:hzl
eyr:2022
iyr:2010 hgt:158cm hcl:#b6652a ecl:blu byr:1944 eyr:2021 pid:093154719")
(def input "ecl:gry pid:860033327 eyr:2020 hcl:#fffffd
byr:1937 iyr:2017 cid:147 hgt:183cm
iyr:2013 ecl:amb cid:350 eyr:2023 pid:028048884
hcl:#cfa07d byr:1929
hcl:#ae17e1 iyr:2013
eyr:2024
ecl:brn pid:760753108 byr:1931
hgt:179cm
hcl:#cfa07d eyr:2025 pid:166559648
iyr:2011 ecl:brn hgt:59in"))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment