diff options
| -rw-r--r-- | Common.lean | 1 | ||||
| -rw-r--r-- | Common/String.lean | 4 | ||||
| -rw-r--r-- | Day1.lean | 4 | ||||
| -rw-r--r-- | Day2.lean | 97 | ||||
| -rw-r--r-- | Main.lean | 3 | ||||
| -rw-r--r-- | inputs/day2.input | 100 | ||||
| -rw-r--r-- | lakefile.lean | 2 |
7 files changed, 208 insertions, 3 deletions
diff --git a/Common.lean b/Common.lean index b95bbfd..aa53152 100644 --- a/Common.lean +++ b/Common.lean @@ -1,3 +1,4 @@ import Common.Helpers import Common.Option import Common.DayPart +import Common.String diff --git a/Common/String.lean b/Common/String.lean new file mode 100644 index 0000000..7fe7aee --- /dev/null +++ b/Common/String.lean @@ -0,0 +1,4 @@ +namespace String + +def splitTrim (c : Char → Bool) (s : String) : List String := + String.trim <$> s.split c @@ -1,6 +1,4 @@ -import Common.Helpers -import Common.Option -import Common.DayPart +import Common namespace Day1 diff --git a/Day2.lean b/Day2.lean new file mode 100644 index 0000000..f0eff56 --- /dev/null +++ b/Day2.lean @@ -0,0 +1,97 @@ +import Common + +structure Draw (α : Type) where + red : α + green : α + blue : α + deriving Repr + +structure Game where + id : Nat + draw : List $ Draw Nat + deriving Repr + +def parse (input : String) : Option $ List Game := + let lines := input.splitTrim (. == '\n') + let lines := lines.filter (not ∘ String.isEmpty) + let parse_single_line : (String → Option Game):= λ (l : String) ↦ do + let parse_id := λ (s : String) ↦ do + let rest ← if s.startsWith "Game " then some (s.drop 5) else none + rest.toNat? + let parse_draw := λ (s : String) ↦ do + let s := s.splitTrim (· == ',') + let findAndRemoveTail := λ (s : String) (t : String) ↦ + if s.endsWith t then + some $ String.dropRight s (t.length) + else + none + let update_draw_parse := λ (pd : Option (Draw (Option String))) (c : String) ↦ do + let old ← pd + let red := findAndRemoveTail c " red" + let green := findAndRemoveTail c " green" + let blue := findAndRemoveTail c " blue" + match red, green, blue with + | some red, none, none => match old.red with + | none => some $ {old with red := some red} + | some _ => none + | none, some green, none => match old.green with + | none => some $ {old with green := some green} + | some _ => none + | none, none, some blue => match old.blue with + | none => some $ {old with blue := some blue} + | some _ => none + | _, _, _ => none + let parsed_draw ← s.foldl update_draw_parse (some $ Draw.mk none none none) + let parsed_draw := { + red := String.toNat? <$> parsed_draw.red, + green := String.toNat? <$> parsed_draw.green, + blue := String.toNat? <$> parsed_draw.blue : Draw _} + let extractOrFail := λ (s : Option $ Option Nat) ↦ match s with + | none => some 0 + | some none => none + | some $ some x => some x + let red ← extractOrFail parsed_draw.red + let green ← extractOrFail parsed_draw.green + let blue ← extractOrFail parsed_draw.blue + pure { red := red, blue := blue, green := green : Draw _} + let parse_draws := λ s ↦ List.mapM parse_draw $ s.splitTrim (· == ';') + let (id, draw) ← match l.splitTrim (· == ':') with + | [l, r] => Option.zip (parse_id l) (parse_draws r) + | _ => none + pure { id := id, draw := draw} + lines.mapM parse_single_line + +def part1 (games : List Game) : Nat := + let draw_possible := λ g ↦ g.red ≤ 12 && g.green ≤ 13 && g.blue ≤ 14 + let possible := flip List.all draw_possible + let possible_games := games.filter (possible ∘ Game.draw) + possible_games.map Game.id |> List.foldl Nat.add 0 + +def part2 (games : List Game) : Nat := + let powerOfGame := λ (g : Game) ↦ + let minReq := λ (c : Draw Nat → Nat) ↦ + g.draw.map c |> List.maximum? |> flip Option.getD 0 + minReq Draw.red * minReq Draw.green * minReq Draw.blue + let powers := games.map powerOfGame + powers.foldl Nat.add 0 + +open DayPart +instance : Parse ⟨2, by simp⟩ (ι := List Game) where + parse := parse + +instance : Part ⟨2,_⟩ Parts.One (ι := List Game) (ρ := Nat) where + run := some ∘ part1 + +instance : Part ⟨2,_⟩ Parts.Two (ι := List Game) (ρ := Nat) where + run := some ∘ part2 + +def testInput : String := +"Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green +Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue +Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red +Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red +Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green" + + -- #eval part1 <$> parse testInput + + -- #eval part2 <$> parse testInput @@ -1,5 +1,6 @@ import «Common» import «Day1» +import «Day2» open DayPart @@ -17,6 +18,8 @@ def try_run_day_part (day : Days) (part : Parts) (data : String) : IO String := match day, part with | ⟨1,_⟩, Parts.One => impl ⟨1,_⟩ Parts.One data | ⟨1,_⟩, Parts.Two => impl ⟨1,_⟩ Parts.Two data + | ⟨2,_⟩, Parts.One => impl ⟨2,_⟩ Parts.One data + | ⟨2,_⟩, Parts.Two => impl ⟨2,_⟩ Parts.Two data | _, _ => throw $ IO.userError "The requested combination of day/part has not been implemented yet." def main (parameters : List String): IO Unit := do diff --git a/inputs/day2.input b/inputs/day2.input new file mode 100644 index 0000000..145b929 --- /dev/null +++ b/inputs/day2.input @@ -0,0 +1,100 @@ +Game 1: 1 green, 2 red, 6 blue; 4 red, 1 green, 3 blue; 7 blue, 5 green; 6 blue, 2 red, 1 green +Game 2: 1 green, 17 red; 1 blue, 6 red, 7 green; 2 blue, 4 red, 7 green; 1 green, 6 red, 2 blue +Game 3: 6 red, 15 blue, 15 green; 1 green, 4 red, 12 blue; 14 blue, 9 red, 1 green; 2 red, 15 blue, 12 green +Game 4: 8 green, 10 blue, 6 red; 20 blue, 4 red; 17 blue, 2 green, 3 red; 4 blue, 2 green, 3 red; 10 red, 3 blue, 3 green; 5 green, 14 blue, 6 red +Game 5: 3 green, 8 blue, 2 red; 11 red, 6 green, 11 blue; 8 red, 5 blue, 2 green +Game 6: 2 blue, 12 red, 2 green; 3 green, 2 red; 3 green, 3 blue, 10 red; 7 red, 2 blue, 4 green; 1 red, 2 blue, 5 green +Game 7: 1 red, 8 blue, 2 green; 1 red, 2 blue, 12 green; 1 blue; 3 blue, 3 green +Game 8: 10 green, 4 red, 4 blue; 12 green, 1 blue; 1 red, 13 green, 2 blue; 12 green, 3 blue; 9 green, 7 red +Game 9: 1 green, 1 blue, 3 red; 3 blue, 3 red, 8 green; 6 blue, 4 red, 6 green; 2 red, 7 green; 1 red, 10 green, 13 blue; 5 red, 1 blue, 1 green +Game 10: 9 green, 3 red, 3 blue; 12 green, 2 blue; 18 green, 1 blue; 14 green; 2 blue, 9 green, 2 red +Game 11: 14 green; 2 green, 2 red, 11 blue; 9 blue, 3 green +Game 12: 9 green, 3 blue, 8 red; 1 green, 2 blue, 3 red; 4 blue, 8 red, 10 green; 3 blue, 7 red, 8 green; 3 blue, 5 red, 7 green; 2 blue, 5 green +Game 13: 6 red, 1 blue, 10 green; 7 red, 1 green; 8 red, 2 green, 1 blue +Game 14: 2 red, 4 blue, 2 green; 2 green, 5 red, 1 blue; 1 red, 6 blue +Game 15: 7 blue, 3 red; 13 blue, 8 red, 1 green; 1 green, 5 red, 13 blue; 8 red, 5 blue; 4 red, 3 blue, 1 green; 12 blue, 8 red, 1 green +Game 16: 5 blue, 1 green, 2 red; 2 blue, 20 green; 4 blue, 1 red, 17 green; 10 green, 5 blue, 2 red +Game 17: 6 red, 13 blue, 8 green; 12 blue, 7 green, 9 red; 19 blue, 5 red; 2 green, 8 red, 14 blue +Game 18: 5 red, 2 green, 1 blue; 8 blue, 17 red, 9 green; 2 blue, 1 green; 4 blue, 10 red; 5 blue, 4 red, 6 green +Game 19: 5 red, 12 green; 8 red, 13 green, 1 blue; 1 red, 1 green, 3 blue; 5 green, 5 red +Game 20: 11 red, 8 blue; 9 red, 2 green, 13 blue; 2 red, 1 green, 2 blue; 1 green, 9 blue, 13 red; 3 blue, 5 red, 1 green +Game 21: 1 red, 4 green, 11 blue; 3 green, 15 blue; 6 green, 7 red, 14 blue; 15 blue, 6 green, 10 red; 6 red, 16 blue, 2 green +Game 22: 2 blue, 15 green, 2 red; 3 blue, 6 green, 1 red; 2 blue, 5 green, 1 red; 6 green, 2 red, 2 blue; 4 green, 2 blue; 4 blue, 1 red, 15 green +Game 23: 2 blue, 1 green, 12 red; 5 blue, 11 red, 4 green; 12 red, 4 blue; 12 red, 2 green, 5 blue +Game 24: 4 blue, 7 red; 3 red, 3 blue; 1 red, 4 blue; 2 green, 6 red, 6 blue; 7 red, 1 green, 2 blue; 6 red, 1 blue, 1 green +Game 25: 5 green, 9 blue; 6 green, 7 red, 2 blue; 1 red, 3 blue, 7 green; 9 blue, 3 red; 5 green, 9 blue, 2 red +Game 26: 6 red, 4 blue; 2 blue, 4 green; 3 green, 5 red, 5 blue; 4 green, 6 red, 3 blue; 4 green, 7 red, 4 blue +Game 27: 15 green, 1 blue, 12 red; 12 red, 1 green; 1 red, 1 blue, 5 green; 13 green, 6 red, 1 blue; 5 red, 1 blue, 1 green; 11 red, 14 green +Game 28: 3 blue, 2 green, 10 red; 5 blue, 2 green; 4 green, 3 blue, 11 red +Game 29: 10 blue, 2 red; 17 green, 7 blue, 2 red; 1 blue, 8 green, 1 red; 10 green, 2 red, 3 blue +Game 30: 10 green, 8 red, 1 blue; 4 blue, 7 green, 14 red; 2 blue, 14 red, 11 green; 1 blue, 13 green, 12 red; 5 blue, 2 red, 4 green; 4 green, 5 red +Game 31: 4 green, 11 red, 11 blue; 3 blue, 11 red; 5 blue, 7 red, 3 green; 10 blue, 5 green, 1 red +Game 32: 4 red, 8 blue, 1 green; 14 red, 7 blue, 4 green; 13 red, 3 blue, 9 green; 3 red, 1 green, 8 blue; 8 green, 8 red, 5 blue +Game 33: 6 red, 10 blue, 7 green; 19 blue, 1 red; 6 green, 11 red, 11 blue; 2 green, 2 blue, 12 red; 3 red, 13 blue, 7 green; 6 green, 4 red, 2 blue +Game 34: 3 red, 3 green, 15 blue; 7 green, 15 blue; 3 red, 2 green, 8 blue; 19 green, 18 blue +Game 35: 2 green, 1 blue; 2 green, 2 blue, 1 red; 3 blue, 1 red, 1 green; 4 blue, 1 red +Game 36: 1 red, 11 green; 1 green, 1 blue; 8 blue; 2 green, 3 red; 1 red +Game 37: 4 blue, 3 red; 12 blue, 13 red; 2 red, 2 green, 8 blue +Game 38: 8 red, 2 blue; 1 green, 2 red; 8 red, 2 green, 1 blue; 16 red, 2 green; 7 red, 2 blue, 2 green +Game 39: 6 green, 1 blue, 5 red; 14 green, 8 blue, 6 red; 8 red, 10 blue, 1 green; 14 green, 9 red; 17 blue, 5 red; 1 blue, 7 green, 1 red +Game 40: 4 red, 8 blue, 3 green; 13 blue, 1 red; 3 blue, 7 red, 3 green; 3 green, 8 blue, 10 red; 3 green, 20 blue, 5 red +Game 41: 1 blue, 2 green; 11 green, 2 blue; 5 blue; 15 red, 8 green, 5 blue +Game 42: 1 green, 12 blue, 1 red; 6 blue, 1 green, 5 red; 1 red, 11 blue, 4 green; 3 red, 17 blue, 1 green; 1 red, 11 blue; 9 blue, 6 green, 3 red +Game 43: 16 blue, 13 green, 1 red; 17 blue, 7 red, 10 green; 13 green, 5 red, 7 blue +Game 44: 2 blue, 4 red; 15 green, 7 red; 2 green, 1 blue; 6 red, 13 green +Game 45: 5 green, 1 blue, 8 red; 4 red, 1 blue, 5 green; 1 green, 3 red; 1 green, 2 blue, 6 red; 4 red, 3 green, 2 blue; 2 red, 2 blue, 5 green +Game 46: 1 green, 1 red, 6 blue; 11 blue; 1 red, 1 green, 7 blue; 8 blue; 1 green, 7 blue, 2 red +Game 47: 7 green, 9 blue, 7 red; 11 red, 13 blue, 5 green; 12 green, 12 blue, 5 red; 4 blue, 8 green, 7 red +Game 48: 11 green, 7 red, 2 blue; 2 blue, 10 green, 3 red; 1 blue, 2 red, 1 green; 4 green, 2 red, 7 blue; 7 red, 4 green, 2 blue +Game 49: 1 red, 2 blue, 5 green; 2 green, 4 blue; 5 blue, 2 green, 1 red; 9 blue, 1 green; 7 blue +Game 50: 8 green, 9 blue, 2 red; 2 green, 5 blue; 14 green, 1 red, 8 blue +Game 51: 1 green, 2 blue; 12 blue, 1 red; 2 blue +Game 52: 3 red, 2 blue, 2 green; 4 red, 4 green, 7 blue; 2 blue, 4 red, 1 green; 3 green; 1 red, 9 green, 7 blue +Game 53: 9 blue, 12 red, 7 green; 8 blue, 6 green; 1 green, 8 blue, 9 red; 12 red, 6 green; 9 blue, 14 red, 10 green; 7 red, 3 green, 5 blue +Game 54: 8 green, 5 blue, 5 red; 4 green, 13 blue, 2 red; 2 blue, 5 red, 1 green; 3 red, 3 green, 10 blue +Game 55: 17 red, 15 green, 17 blue; 6 red, 5 green, 7 blue; 17 green, 6 blue, 5 red +Game 56: 7 blue, 6 red, 7 green; 10 green, 3 red; 9 red, 3 blue, 5 green +Game 57: 5 blue, 11 red, 1 green; 13 red, 1 green, 2 blue; 2 blue, 4 red; 1 green, 10 red, 1 blue; 1 green, 8 red +Game 58: 1 red, 2 green, 9 blue; 1 green, 1 blue, 1 red; 2 red, 6 blue, 2 green; 14 blue, 1 green, 1 red; 5 blue, 1 red, 2 green; 14 blue, 2 green +Game 59: 9 green, 2 blue, 5 red; 9 red, 5 green; 10 red, 1 blue, 8 green +Game 60: 8 blue, 6 red, 4 green; 3 red, 12 green, 9 blue; 4 blue, 5 red, 5 green; 4 red, 8 blue; 7 green, 12 blue, 6 red +Game 61: 5 blue, 13 red, 1 green; 5 red, 5 blue; 1 red, 3 blue; 1 green, 9 red; 10 red, 3 blue, 1 green +Game 62: 1 blue, 13 red; 4 blue, 5 red; 11 blue, 8 red, 1 green +Game 63: 14 blue, 5 red; 9 blue, 14 green, 5 red; 3 red, 8 green, 15 blue; 4 blue, 15 green, 6 red +Game 64: 13 red, 6 blue, 11 green; 12 red, 1 blue, 8 green; 1 red, 17 green; 13 red, 12 green, 7 blue +Game 65: 4 red, 17 blue, 3 green; 2 green, 12 blue, 9 red; 2 green, 17 blue, 5 red; 1 red, 1 green, 4 blue; 9 red, 16 blue; 7 blue, 9 red +Game 66: 10 blue, 10 green, 5 red; 10 green, 3 blue, 5 red; 1 red, 1 green, 10 blue; 2 green, 5 red, 20 blue; 8 blue, 11 green, 13 red; 2 green, 18 blue, 2 red +Game 67: 6 red, 1 green; 5 red, 10 blue; 6 blue, 6 red +Game 68: 4 green, 1 red, 5 blue; 5 red, 5 blue; 7 red, 6 green; 8 red, 1 blue +Game 69: 2 blue, 11 red; 4 red, 6 green, 1 blue; 4 red, 1 blue, 14 green +Game 70: 15 red, 8 blue, 5 green; 5 green, 2 red, 8 blue; 8 red, 3 green, 10 blue +Game 71: 4 blue, 2 red; 12 green, 4 blue; 10 green +Game 72: 3 blue, 4 green, 6 red; 6 red, 5 green, 8 blue; 10 red, 6 green, 5 blue; 1 green, 2 blue; 10 red, 5 blue, 4 green +Game 73: 5 blue, 1 red; 1 green, 11 blue; 10 blue; 12 blue, 1 red; 1 red, 9 blue; 7 blue, 1 green, 1 red +Game 74: 7 green, 6 blue, 7 red; 7 blue, 6 green, 15 red; 7 red, 5 blue, 1 green; 1 blue, 6 red, 8 green; 8 green, 14 red, 3 blue +Game 75: 8 green, 3 red, 3 blue; 1 blue, 6 red, 7 green; 9 green, 3 blue; 3 blue, 9 green, 6 red; 4 blue, 1 red, 3 green; 4 green, 1 blue, 16 red +Game 76: 4 blue, 3 green; 2 blue, 1 red, 6 green; 12 blue; 1 green, 14 blue +Game 77: 5 green, 10 red, 11 blue; 3 red; 8 green, 6 red, 9 blue +Game 78: 7 red, 7 green; 8 blue; 6 green, 7 red, 5 blue +Game 79: 11 blue, 2 red, 4 green; 2 green, 3 red, 15 blue; 1 green, 15 blue, 1 red +Game 80: 3 red, 17 green, 8 blue; 8 green, 10 blue; 4 green, 1 red, 14 blue +Game 81: 17 green, 10 red, 10 blue; 9 green, 9 blue, 7 red; 11 red, 11 green, 4 blue; 15 blue, 5 red; 11 blue, 8 green, 15 red; 3 green, 16 red +Game 82: 8 green, 9 blue, 1 red; 1 red, 8 green, 9 blue; 2 green, 12 blue +Game 83: 2 green, 11 red, 20 blue; 20 blue, 1 green, 4 red; 2 green, 6 red, 20 blue; 17 blue, 10 red +Game 84: 1 green, 9 red; 4 blue, 4 green; 1 green, 6 red, 14 blue +Game 85: 5 red, 10 green, 9 blue; 8 blue, 3 green, 2 red; 4 blue, 14 green, 3 red; 5 red, 4 blue +Game 86: 8 blue, 9 green, 5 red; 5 red, 10 green, 1 blue; 15 blue, 1 red, 2 green; 8 red, 8 blue, 10 green +Game 87: 13 green, 2 red, 4 blue; 3 red, 11 green, 9 blue; 6 blue, 3 red, 12 green +Game 88: 2 red, 7 blue, 3 green; 2 blue, 9 red; 9 red, 6 blue, 7 green; 6 green, 13 blue, 9 red; 6 green, 2 red, 15 blue; 1 red, 8 green, 7 blue +Game 89: 11 red, 1 blue, 2 green; 6 blue, 5 green, 4 red; 15 red, 4 green, 5 blue; 11 red, 3 blue, 10 green; 6 blue, 13 green, 12 red +Game 90: 2 red, 2 blue, 4 green; 2 red, 2 blue; 9 green, 1 red, 1 blue; 5 green, 1 red; 7 green, 2 red; 2 green, 1 blue +Game 91: 5 blue, 3 red, 1 green; 1 red, 4 blue, 6 green; 6 blue, 6 green, 5 red +Game 92: 16 green, 1 blue, 12 red; 18 green, 14 red, 1 blue; 16 red, 1 green; 4 blue, 16 red, 18 green +Game 93: 9 red, 8 blue, 14 green; 1 blue, 1 green, 6 red; 4 blue, 4 red, 14 green +Game 94: 11 green, 4 blue, 2 red; 1 red, 1 green, 1 blue; 4 red, 1 blue, 2 green +Game 95: 5 blue, 2 red, 9 green; 5 blue, 8 green; 1 green, 15 blue; 5 red, 9 green, 5 blue; 3 green, 17 blue, 5 red +Game 96: 2 green, 14 blue, 1 red; 3 green, 3 red, 14 blue; 2 red, 2 green, 13 blue +Game 97: 2 green, 2 red; 2 blue, 1 green; 7 blue, 3 red +Game 98: 2 red, 1 blue, 12 green; 2 blue, 10 green, 5 red; 11 green, 9 blue; 6 blue, 17 green; 7 blue, 9 green, 9 red; 1 red, 11 green, 9 blue +Game 99: 2 green, 9 red, 1 blue; 3 green, 1 blue, 14 red; 5 green, 6 blue; 1 blue, 2 green, 3 red; 4 blue, 10 red, 1 green +Game 100: 4 green, 4 blue, 15 red; 3 green, 1 red, 13 blue; 5 green, 5 blue, 10 red diff --git a/lakefile.lean b/lakefile.lean index ae16be8..f09586e 100644 --- a/lakefile.lean +++ b/lakefile.lean @@ -7,6 +7,8 @@ package «aoc-2023» where lean_lib «Day1» where -- add library configuration options here +lean_lib «Day2» where + lean_lib «Common» where @[default_target] |
