Skip to content

Instantly share code, notes, and snippets.

@tariknz
Last active December 11, 2018 06:51
Show Gist options
  • Select an option

  • Save tariknz/c7032849f0c4f45b6a7e625582909d2c to your computer and use it in GitHub Desktop.

Select an option

Save tariknz/c7032849f0c4f45b6a7e625582909d2c to your computer and use it in GitHub Desktop.
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