Last active
December 11, 2018 06:51
-
-
Save tariknz/c7032849f0c4f45b6a7e625582909d2c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment