diff options
| author | Andreas Grois <andi@grois.info> | 2023-12-07 20:26:51 +0100 |
|---|---|---|
| committer | Andreas Grois <andi@grois.info> | 2023-12-07 20:26:51 +0100 |
| commit | 8d6efb1c1fdddc1fbad167510ce25e56be684130 (patch) | |
| tree | f35cf0d4943ccb397f3d0a91ad8a1cb1116eccdd /Day6.lean | |
| parent | 9fb83b22220c825943549bc97bdab457bfad7f5b (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.lean | 27 |
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 |
