diff --git a/advent-of-code/Program.fs b/advent-of-code/Program.fs index e8cb781..86f8446 100644 --- a/advent-of-code/Program.fs +++ b/advent-of-code/Program.fs @@ -4,36 +4,40 @@ 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 day7Star1 = day_7.Star1.main - printfn $"%A{day7Star1}" - let day7Star2 = day_7.Star2.main - printfn $"%A{day7Star2}" - let day8Star1 = day_8.Star1.main - printfn $"%A{day8Star1}" - let day8Star2 = day_8.Star2.main - printfn $"%A{day8Star2}" + // 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}" + // let day8Star1 = day_8.Star1.main + // printfn $"%A{day8Star1}" + // let day8Star2 = day_8.Star2.main + // printfn $"%A{day8Star2}" + let day9Star1 = day_9.Star1.main + printfn $"%A{day9Star1}" + let day9Star2 = day_9.Star2.main + printfn $"%A{day9Star2}" 0 diff --git a/advent-of-code/tasks/day-9/Star1.fs b/advent-of-code/tasks/day-9/Star1.fs new file mode 100644 index 0000000..974d694 --- /dev/null +++ b/advent-of-code/tasks/day-9/Star1.fs @@ -0,0 +1,35 @@ +module advent_of_code.tasks.day_9.Star1 + +open System +open System.IO + +let stream = new StreamReader("tasks/day-9/input.txt") + +type Point2D = + struct + val X: int64 + val Y: int64 + new(s: string) = + let splitS = s.Split(',') |> Array.map int64 + let x, y = splitS[0], splitS[1] + { + X = x + Y = y + } + + override this.ToString() = + $"Point2D with x = {this.X} y = {this.Y}" + end + +let getRect(p: Point2D * Point2D) = + let p1, p2 = p.Deconstruct() + abs (p1.X - p2.X + (1 |> int64)) * abs (p1.Y - p2.Y + (1 |> int64)) + +let notSame (p: Point2D * Point2D) = + let p1, p2 = p.Deconstruct() + p1.X <> p2.X && p1.Y <> p2.Y + +let main = + let points = stream.ReadToEnd().Split('\n') |> Array.map Point2D + let allRects = (Array.allPairs points points) |> Array.filter notSame |> Array.map getRect + allRects |> Array.max diff --git a/advent-of-code/tasks/day-9/Star2.fs b/advent-of-code/tasks/day-9/Star2.fs new file mode 100644 index 0000000..070ad62 --- /dev/null +++ b/advent-of-code/tasks/day-9/Star2.fs @@ -0,0 +1,56 @@ +module advent_of_code.tasks.day_9.Star2 + +// UNFINISHED. Submission was found manually. + +open System +open System.IO + +let stream = new StreamReader("tasks/day-9/input.txt") + +type Point2D = + struct + val X: int64 + val Y: int64 + new(s: string) = + let splitS = s.Split(',') |> Array.Parallel.map int64 + let x, y = splitS[0], splitS[1] + { + X = x + Y = y + } + + new(x: int64, y: int64) = + { + X = x + Y = y + } + + override this.ToString() = + $"Point2D with x = {this.X} y = {this.Y}" + end + +let getRect(p: Point2D * Point2D) = + let p1, p2 = p.Deconstruct() + abs (p1.X - p2.X + (1 |> int64)) * abs (p1.Y - p2.Y + (1 |> int64)) + +let notSame (p: Point2D * Point2D) = + let p1, p2 = p.Deconstruct() + p1.X <> p2.X && p1.Y <> p2.Y + +let linesIntersect (l1: Point2D * Point2D) (l2: Point2D * Point2D) = + let (p1, p2) = l1.Deconstruct() + let (q1, q2) = l2.Deconstruct() + if q1.X = q2.X then + q1.X > min p1.X p2.X && q1.X < max p1.X p2.X && min q1.Y q2.Y < max p1.Y p2.Y && max q1.Y q2.Y > min p1.Y p2.Y + else + max q1.X q2.X > min p1.X p2.X && min q1.X q2.X < max p1.X p2.X && q1.Y < max p1.Y p2.Y && q1.Y > min p1.Y p2.Y + +let isInPoly (polygon: Point2D list) (p: Point2D * Point2D) = + let edges = List.pairwise polygon @ [List.last polygon, List.head polygon] |> Array.ofList + edges |> Array.Parallel.forall (linesIntersect p >> not) + +let main = + let points = stream.ReadToEnd().Split('\n') |> Array.Parallel.map Point2D + let pointList = points |> List.ofArray + let allRects = (Array.allPairs points points) |> Array.Parallel.filter notSame |> Array.Parallel.filter (isInPoly pointList) + allRects |> Array.Parallel.maxBy getRect |> getRect