From 3efe77de076673d2e0c2a20a0a64a69dd384fd68 Mon Sep 17 00:00:00 2001 From: Malachy Byrne Date: Sun, 7 Dec 2025 20:39:55 +0000 Subject: [PATCH] Add day 7 --- advent-of-code/Program.fs | 52 ++++++++++++++++------------- advent-of-code/tasks/day-7/Star1.fs | 30 +++++++++++++++++ advent-of-code/tasks/day-7/Star2.fs | 37 ++++++++++++++++++++ 3 files changed, 95 insertions(+), 24 deletions(-) create mode 100644 advent-of-code/tasks/day-7/Star1.fs create mode 100644 advent-of-code/tasks/day-7/Star2.fs diff --git a/advent-of-code/Program.fs b/advent-of-code/Program.fs index e7ab7f8..7afa75e 100644 --- a/advent-of-code/Program.fs +++ b/advent-of-code/Program.fs @@ -4,28 +4,32 @@ open advent_of_code.tasks [] let main _ = - let _, day1Star1 = day_1.Star1.main 50 0 - printfn $"{day1Star1}" - 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}" - let day3Star1 = day_3.Star1.main - printfn $"{day3Star1}" - let day3Star2 = day_3.Star2.main - printfn $"{day3Star2}" - let day4Star1 = day_4.Star1.main - printfn $"{day4Star1}" - let day4Star2 = day_4.Star2.main - printfn $"{day4Star2}" - let day5Star1 = day_5.Star1.main - printfn $"%A{day5Star1}" - let day5Star2 = day_5.Star2.main - printfn $"%A{day5Star2}" - let day6Star1 = day_6.Star1.main - printfn $"%A{day6Star1}" - let day6Star2 = day_6.Star2.main - printfn $"%A{day6Star2}" + // let _, day1Star1 = day_1.Star1.main 50 0 + // printfn $"{day1Star1}" + // 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}" + // let day3Star1 = day_3.Star1.main + // printfn $"{day3Star1}" + // let day3Star2 = day_3.Star2.main + // printfn $"{day3Star2}" + // let day4Star1 = day_4.Star1.main + // printfn $"{day4Star1}" + // let day4Star2 = day_4.Star2.main + // printfn $"{day4Star2}" + // let day5Star1 = day_5.Star1.main + // printfn $"%A{day5Star1}" + // let day5Star2 = day_5.Star2.main + // printfn $"%A{day5Star2}" + // let day6Star1 = day_6.Star1.main + // printfn $"%A{day6Star1}" + // let day6Star2 = day_6.Star2.main + // printfn $"%A{day6Star2}" + let day7Star1 = day_7.Star1.main + printfn $"%A{day7Star1}" + let day7Star2 = day_7.Star2.main + printfn $"%A{day7Star2}" 0 diff --git a/advent-of-code/tasks/day-7/Star1.fs b/advent-of-code/tasks/day-7/Star1.fs new file mode 100644 index 0000000..aafa40d --- /dev/null +++ b/advent-of-code/tasks/day-7/Star1.fs @@ -0,0 +1,30 @@ +module advent_of_code.tasks.day_7.Star1 + +open System.IO + +let stream = new StreamReader("tasks/day-7/input.txt") + +let containsSplit (s: string) = + s.Contains("^") + +let split (row: string) (pos: int) = + if row[pos] = '^' then + [|pos-1; pos+1|] |> Set.ofArray, 1 + else + [|pos|] |> Set.ofArray, 0 + +let rec getBeams (manifold: string array) (pos: Set) = + if manifold.Length = 0 then + 0 + else + let row, tail = manifold[0], manifold[1..] + let mapRes = (pos |> Seq.map (split row)) + let newPos = (mapRes |> Seq.map fst) |> Set.ofSeq |> Set.unionMany + let splits = mapRes |> Seq.map snd |> Seq.sum + getBeams tail newPos + splits + +let main = + let allLines = stream.ReadToEnd().Split("\n") + let startLine, manifold = allLines[0], (allLines[1..] |> Array.filter containsSplit) + let startPos = startLine.IndexOf("S") + getBeams manifold ([|startPos|] |> Set.ofArray) diff --git a/advent-of-code/tasks/day-7/Star2.fs b/advent-of-code/tasks/day-7/Star2.fs new file mode 100644 index 0000000..2857313 --- /dev/null +++ b/advent-of-code/tasks/day-7/Star2.fs @@ -0,0 +1,37 @@ +module advent_of_code.tasks.day_7.Star2 + +open System +open System.IO + +let stream = new StreamReader("tasks/day-7/input.txt") + +let containsSplit (s: string) = + s.Contains("^") + +let split (oldTimelines: int64 array) (newTimelines: int64 array) (t: int * char) = + let index, item = t.Deconstruct() + let mutable timelines = newTimelines + if item = '^' then + timelines[index-1] <- oldTimelines[index] + newTimelines[index-1] + timelines[index+1] <- oldTimelines[index] + newTimelines[index+1] + else + timelines[index] <- oldTimelines[index] + newTimelines[index] + timelines + +let rec getTimelines (manifold: string array) (prevTimelines: int64 array) = + if manifold.Length = 0 then + prevTimelines + else + let row, tail = manifold[0], manifold[1..] + let emptyTimeline = [1 .. row.Length] |> Seq.map (fun _ -> 0 |> int64) |> Array.ofSeq + let newTimeline = row |> seq |> Seq.mapi (fun index item -> index, item) |> Seq.fold (split prevTimelines) emptyTimeline + getTimelines tail newTimeline + + +let main = + let allLines = stream.ReadToEnd().Split("\n") + let startLine, manifold = allLines[0], (allLines[1..] |> Array.filter containsSplit) + let startPos = startLine.IndexOf("S") + let initialTimeline = [1..startLine.Length] |> Seq.map (fun _ -> 0 |> int64) |> Array.ofSeq + initialTimeline[startPos] <- 1 + Array.sum (getTimelines manifold initialTimeline) \ No newline at end of file