From 39551c066cba5c4fae8c9131568a6b6db45cdcba Mon Sep 17 00:00:00 2001 From: Malachy Byrne Date: Tue, 2 Dec 2025 20:10:20 +0000 Subject: [PATCH] Add day 2 --- advent-of-code/Program.fs | 10 ++++--- advent-of-code/tasks/day-2/Star1.fs | 24 +++++++++++++++++ advent-of-code/tasks/day-2/Star2.fs | 41 +++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 advent-of-code/tasks/day-2/Star1.fs create mode 100644 advent-of-code/tasks/day-2/Star2.fs diff --git a/advent-of-code/Program.fs b/advent-of-code/Program.fs index a77ede8..6f3350e 100644 --- a/advent-of-code/Program.fs +++ b/advent-of-code/Program.fs @@ -1,11 +1,15 @@ module advent_of_code.Program -open advent_of_code.tasks.day_1 +open advent_of_code.tasks [] let main _ = - let _, day1Star1 = Star1.main 50 0 + let _, day1Star1 = day_1.Star1.main 50 0 printfn $"{day1Star1}" - let _, day1Star2 = Star2.main 50 0 + let _, day1Star2 = day_1.Star2.main 50 0 printfn $"{day1Star2}" + let day2Star1 = day_2.Star1.main + printfn $"{day2Star1}" + let day2Star2 = day_2.Star2.main + printfn $"{day2Star2}" 0 diff --git a/advent-of-code/tasks/day-2/Star1.fs b/advent-of-code/tasks/day-2/Star1.fs new file mode 100644 index 0000000..b4638dd --- /dev/null +++ b/advent-of-code/tasks/day-2/Star1.fs @@ -0,0 +1,24 @@ +module advent_of_code.tasks.day_2.Star1 + +open System.IO + +let stream = new StreamReader("tasks/day-2/input.txt") + +let convertToString (i: int64) = i |> string + +let isInvalid (id: string) = + let individualCount = id.Length / 2 + let firstHalf, secondHalf = id[0..individualCount - 1], id[individualCount..] + if firstHalf = secondHalf then id |> int64 else 0 + +let rec getInvalid (lines: string list) = + let line, tail = lines.Head, lines.Tail + let els = line.Split("-") + let low, high = els[0] |> int64, els[1] |> int64 + let invalids = [low .. high] |> List.map convertToString |> List.map isInvalid + + List.sum invalids + if tail.IsEmpty then 0 |> int64 else getInvalid tail + +let main = + let lines = stream.ReadLine().Split(",") |> Array.toList + getInvalid lines diff --git a/advent-of-code/tasks/day-2/Star2.fs b/advent-of-code/tasks/day-2/Star2.fs new file mode 100644 index 0000000..cb1a893 --- /dev/null +++ b/advent-of-code/tasks/day-2/Star2.fs @@ -0,0 +1,41 @@ +module advent_of_code.tasks.day_2.Star2 + +open System.IO + +let stream = new StreamReader("tasks/day-2/input.txt") + +let convertToString (i: int64) = i |> string + +let divideString (str: string) (n: int) = + let count = str.Length / n + let mutable parts = Set.empty + for i in 0 .. count - 1 do + let start = i * n + parts <- parts.Add(str.Substring(start, n)) + parts + +let rec isInvalid (id: string) (chars: int) = + let biggerSlices = if chars = id.Length then 0 |> int64 else isInvalid id (chars + 1) + if (chars = id.Length) then + 0 + else if (biggerSlices <> 0) then + biggerSlices + else if (id.Length % chars <> 0) then + 0 + else + let parts = divideString id chars + if parts.Count = 1 then id |> int64 else 0 + +let checkValid (id: string) = isInvalid id 1 + +let rec getInvalid (lines: string list) = + let line, tail = lines.Head, lines.Tail + let els = line.Split("-") + let low, high = els[0] |> int64, els[1] |> int64 + let invalids = [low .. high] |> List.map convertToString |> List.map checkValid + + List.sum invalids + if tail.IsEmpty then 0 |> int64 else getInvalid tail + +let main = + let lines = stream.ReadLine().Split(",") |> Array.toList + getInvalid lines