Guest User

Untitled

a guest
Dec 11th, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.73 KB | None | 0 0
  1. let serial = 5719
  2. let calcPower x y serial =
  3. let rackId = x + 10;
  4. let powerLevel = ((rackId * y) + serial) * rackId;
  5. let strPower = string powerLevel
  6.  
  7. if strPower.Length < 3 then 0 else
  8.  
  9. strPower
  10. |> Seq.item (strPower.Length - 3)
  11. |> fun i -> int (string i) - 5
  12.  
  13. let createGrid maxX maxY serial =
  14. let grid = Array2D.create maxX maxY 0
  15.  
  16. for x in [0 .. maxX - 1] do
  17. for y in [0 .. maxY - 1] do
  18. grid.[x,y] <- calcPower x y serial
  19.  
  20. grid
  21.  
  22. let maxX, maxY = 300,300
  23.  
  24. let findCell (grid: int[,]) cellSize =
  25. let mutable biggestPower = 0
  26. let mutable biggestPowerPos = -1,-1
  27.  
  28. for x in [0 .. maxX - cellSize - 1] do
  29. for y in [0 .. maxY - cellSize - 1] do
  30. let power =
  31. grid.[x .. x + cellSize - 1, y .. y + cellSize - 1]
  32. |> Seq.cast
  33. |> Seq.reduce (fun acc i -> acc + i)
  34.  
  35. if power > biggestPower then
  36. biggestPower <- power
  37. biggestPowerPos <- x,y
  38.  
  39. biggestPower, biggestPowerPos
  40.  
  41. // part 1
  42. createGrid maxX maxY serial
  43. |> findCell <| 3
  44. |> printfn "%A"
  45.  
  46. let findBestGridSize grid =
  47. let mutable lastMaxPower = (-1000, (-1, -1))
  48. let mutable bestSize = 0
  49.  
  50. let mutable currentSize = 1
  51. let mutable powerIncreasing = true
  52.  
  53. // we'll iterate until the power seems to drastically decrease,
  54. // then we'll know there is no point looking further
  55. while powerIncreasing do
  56. let power = grid |> findCell <| currentSize
  57.  
  58. // give some stupid buffer as it seems to fluctuate
  59. if fst power + 20 < (fst lastMaxPower) then powerIncreasing <- false
  60.  
  61. if fst power > fst lastMaxPower
  62. then
  63. lastMaxPower <- power
  64. bestSize <- currentSize
  65.  
  66. currentSize <- currentSize + 1
  67.  
  68. snd lastMaxPower, bestSize
  69.  
  70. // part 2
  71. createGrid maxX maxY serial
  72. |> findBestGridSize
  73. |> printfn "%A"
Add Comment
Please, Sign In to add comment