summaryrefslogtreecommitdiff
path: root/Day6.lean
diff options
context:
space:
mode:
authorAndreas Grois <andi@grois.info>2023-12-07 20:26:51 +0100
committerAndreas Grois <andi@grois.info>2023-12-07 20:26:51 +0100
commit8d6efb1c1fdddc1fbad167510ce25e56be684130 (patch)
treef35cf0d4943ccb397f3d0a91ad8a1cb1116eccdd /Day6.lean
parent9fb83b22220c825943549bc97bdab457bfad7f5b (diff)
Allow error messages in parsing (for debugging)
And fix an off-by-one in day 5
Diffstat (limited to 'Day6.lean')
-rw-r--r--Day6.lean27
1 files changed, 27 insertions, 0 deletions
diff --git a/Day6.lean b/Day6.lean
new file mode 100644
index 0000000..54464ea
--- /dev/null
+++ b/Day6.lean
@@ -0,0 +1,27 @@
+import Common.Option
+import Common.Helpers
+
+structure Race where
+ timeLimit : Nat
+ recordDistance : Nat
+
+private def parseLine (header : String) (input : String) : Option (List Nat) := do
+ if not $ input.startsWith header then
+ failure
+ let input := input.drop header.length |> String.trim
+ let numbers := input.split Char.isWhitespace
+ |> List.map String.trim
+ |> List.filter String.isEmpty
+ numbers.mapM String.toNat?
+
+def parse (input : String) : Option (List Race) := do
+ let lines := input.splitOn "\n"
+ |> List.map String.trim
+ |> List.filter String.isEmpty
+ let (times, distances) ← match lines with
+ | [times, distances] => Option.zip (parseLine "Time:" times) (parseLine "Distance:" distances)
+ | _ => none
+ if times.length != distances.length then
+ failure
+ let pairs := times.zip distances
+ return pairs.map $ uncurry Race.mk