Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- let serial = 5719
- let calcPower x y serial =
- let rackId = x + 10;
- let powerLevel = ((rackId * y) + serial) * rackId;
- let strPower = string powerLevel
- if strPower.Length < 3 then 0 else
- strPower
- |> Seq.item (strPower.Length - 3)
- |> fun i -> int (string i) - 5
- let createGrid maxX maxY serial =
- let grid = Array2D.create maxX maxY 0
- for x in [0 .. maxX - 1] do
- for y in [0 .. maxY - 1] do
- grid.[x,y] <- calcPower x y serial
- grid
- let maxX, maxY = 300,300
- let findCell (grid: int[,]) cellSize =
- let mutable biggestPower = 0
- let mutable biggestPowerPos = -1,-1
- for x in [0 .. maxX - cellSize - 1] do
- for y in [0 .. maxY - cellSize - 1] do
- let power =
- grid.[x .. x + cellSize - 1, y .. y + cellSize - 1]
- |> Seq.cast
- |> Seq.reduce (fun acc i -> acc + i)
- if power > biggestPower then
- biggestPower <- power
- biggestPowerPos <- x,y
- biggestPower, biggestPowerPos
- // part 1
- createGrid maxX maxY serial
- |> findCell <| 3
- |> printfn "%A"
- let findBestGridSize grid =
- let mutable lastMaxPower = (-1000, (-1, -1))
- let mutable bestSize = 0
- let mutable currentSize = 1
- let mutable powerIncreasing = true
- // we'll iterate until the power seems to drastically decrease,
- // then we'll know there is no point looking further
- while powerIncreasing do
- let power = grid |> findCell <| currentSize
- // give some stupid buffer as it seems to fluctuate
- if fst power + 20 < (fst lastMaxPower) then powerIncreasing <- false
- if fst power > fst lastMaxPower
- then
- lastMaxPower <- power
- bestSize <- currentSize
- currentSize <- currentSize + 1
- snd lastMaxPower, bestSize
- // part 2
- createGrid maxX maxY serial
- |> findBestGridSize
- |> printfn "%A"
Add Comment
Please, Sign In to add comment