Advertisement
PotatoInBrackets

AoC Day 8

Dec 9th, 2022
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. RawData := FileOpen(A_ScriptDir "\aoc8.txt", "r").Read(), RawData.Close()
  2.  
  3. temp := StrSplit(RawData, "`n", "`r"), Data := []
  4. for k, v in temp
  5.     Data[k] := StrSplit(v)
  6.  
  7. maxRow := Data.MaxIndex()
  8. maxCol := Data[maxRow].MaxIndex()
  9. trace := []
  10.  
  11. Loop % maxRow
  12. {
  13.     ; max left, max right, max top, max bot, current row
  14.     l := r := t := b := 0, k := A_Index
  15.     Loop % maxCol
  16.     {
  17.         ; reversed index for bot & right side approach
  18.         i := MaxCol - A_Index + 1
  19.         ; left
  20.         if ((d := Data[k, A_Index]) > l)
  21.             trace[k, A_Index] := l := d
  22.         ; right
  23.         if ((d := Data[k, i]) > r)
  24.             trace[k, i] := r := d
  25.  
  26.         if ((d := Data[A_Index][k]) > t)
  27.             trace[A_Index, k] := t := d
  28.        
  29.         if ((d := Data[i][k]) > b)
  30.             trace[i, k] := b := d
  31.     }
  32. }
  33.  
  34. ; delete bordering trees
  35. trace.Delete(1), trace.Delete(maxRow)
  36. for k, v in trace
  37.     trace[k].delete(1), trace[k].delete(MaxCol)
  38.  
  39. for k, v in trace
  40.     for i in v
  41.         inside += 1
  42.  
  43. msgbox % total := (2 * maxCol + 2 * maxRow) - 4 + inside
  44.  
  45. score := 0
  46. for k, v in Data
  47.     for i, j in v
  48.         score := (score < (s := Score(k, i, j))) ? s : score
  49.        
  50. msgbox % score
  51.  
  52. ; func
  53. ; Row, Col, Treesize
  54. Score(k, i, size)
  55. {
  56.     global Data
  57.     left := right := top := bot := 0
  58.     Loop
  59.     {
  60.         if !Data.HasKey(i - A_index)
  61.             break
  62.         left += 1
  63.         if (Data[k][i - A_Index] >= size)
  64.             break
  65.     }
  66.     Loop
  67.     {
  68.         if !Data[k].HasKey(i + A_index)
  69.             break
  70.             right += 1
  71.         if (Data[k][i + A_Index] >= size)
  72.             break
  73.     }
  74.     Loop
  75.     {
  76.         if !Data.HasKey(k - A_index)
  77.             break
  78.         top += 1
  79.         if (Data[k - A_Index][i] >= size)
  80.             break
  81.     }
  82.     Loop
  83.     {
  84.         if !Data.HasKey(k + A_index)
  85.             break
  86.         bot += 1
  87.         if (Data[k + A_Index][i] >= size)
  88.             break
  89.     }
  90.     score := left * right * top * bot
  91.     return score
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement