Add day 9
This commit is contained in:
parent
72c185a588
commit
d460cf7f92
@ -4,36 +4,40 @@ open advent_of_code.tasks
|
|||||||
|
|
||||||
[<EntryPoint>]
|
[<EntryPoint>]
|
||||||
let main _ =
|
let main _ =
|
||||||
let _, day1Star1 = day_1.Star1.main 50 0
|
// let _, day1Star1 = day_1.Star1.main 50 0
|
||||||
printfn $"{day1Star1}"
|
// printfn $"{day1Star1}"
|
||||||
let _, day1Star2 = day_1.Star2.main 50 0
|
// let _, day1Star2 = day_1.Star2.main 50 0
|
||||||
printfn $"{day1Star2}"
|
// printfn $"{day1Star2}"
|
||||||
let day2Star1 = day_2.Star1.main
|
// let day2Star1 = day_2.Star1.main
|
||||||
printfn $"{day2Star1}"
|
// printfn $"{day2Star1}"
|
||||||
let day2Star2 = day_2.Star2.main
|
// let day2Star2 = day_2.Star2.main
|
||||||
printfn $"{day2Star2}"
|
// printfn $"{day2Star2}"
|
||||||
let day3Star1 = day_3.Star1.main
|
// let day3Star1 = day_3.Star1.main
|
||||||
printfn $"{day3Star1}"
|
// printfn $"{day3Star1}"
|
||||||
let day3Star2 = day_3.Star2.main
|
// let day3Star2 = day_3.Star2.main
|
||||||
printfn $"{day3Star2}"
|
// printfn $"{day3Star2}"
|
||||||
let day4Star1 = day_4.Star1.main
|
// let day4Star1 = day_4.Star1.main
|
||||||
printfn $"{day4Star1}"
|
// printfn $"{day4Star1}"
|
||||||
let day4Star2 = day_4.Star2.main
|
// let day4Star2 = day_4.Star2.main
|
||||||
printfn $"{day4Star2}"
|
// printfn $"{day4Star2}"
|
||||||
let day5Star1 = day_5.Star1.main
|
// let day5Star1 = day_5.Star1.main
|
||||||
printfn $"%A{day5Star1}"
|
// printfn $"%A{day5Star1}"
|
||||||
let day5Star2 = day_5.Star2.main
|
// let day5Star2 = day_5.Star2.main
|
||||||
printfn $"%A{day5Star2}"
|
// printfn $"%A{day5Star2}"
|
||||||
let day6Star1 = day_6.Star1.main
|
// let day6Star1 = day_6.Star1.main
|
||||||
printfn $"%A{day6Star1}"
|
// printfn $"%A{day6Star1}"
|
||||||
let day6Star2 = day_6.Star2.main
|
// let day6Star2 = day_6.Star2.main
|
||||||
printfn $"%A{day6Star2}"
|
// printfn $"%A{day6Star2}"
|
||||||
let day7Star1 = day_7.Star1.main
|
// let day7Star1 = day_7.Star1.main
|
||||||
printfn $"%A{day7Star1}"
|
// printfn $"%A{day7Star1}"
|
||||||
let day7Star2 = day_7.Star2.main
|
// let day7Star2 = day_7.Star2.main
|
||||||
printfn $"%A{day7Star2}"
|
// printfn $"%A{day7Star2}"
|
||||||
let day8Star1 = day_8.Star1.main
|
// let day8Star1 = day_8.Star1.main
|
||||||
printfn $"%A{day8Star1}"
|
// printfn $"%A{day8Star1}"
|
||||||
let day8Star2 = day_8.Star2.main
|
// let day8Star2 = day_8.Star2.main
|
||||||
printfn $"%A{day8Star2}"
|
// printfn $"%A{day8Star2}"
|
||||||
|
let day9Star1 = day_9.Star1.main
|
||||||
|
printfn $"%A{day9Star1}"
|
||||||
|
let day9Star2 = day_9.Star2.main
|
||||||
|
printfn $"%A{day9Star2}"
|
||||||
0
|
0
|
||||||
|
|||||||
35
advent-of-code/tasks/day-9/Star1.fs
Normal file
35
advent-of-code/tasks/day-9/Star1.fs
Normal file
@ -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
|
||||||
56
advent-of-code/tasks/day-9/Star2.fs
Normal file
56
advent-of-code/tasks/day-9/Star2.fs
Normal file
@ -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
|
||||||
Loading…
x
Reference in New Issue
Block a user