module advent_of_code.tasks.day_6.Star2 open System.IO let stream = new StreamReader("tasks/day-6/input.txt") let isNotNull (s: string) = s.Length > 0 let convertToInt64 (s: string) = s |> int64 let trimString (s: string) = s.Trim() let rec buildArray (numberArray: string array array) (lineArray: string array) = if lineArray.Length = 0 then numberArray else let head, tail = lineArray[0], lineArray[1..] if lineArray[0] = "" then buildArray (Array.append numberArray [| [||] |]) tail else buildArray (Array.append numberArray[.. numberArray.Length - 2] [|(Array.append numberArray[numberArray.Length - 1] [| head |])|]) tail let rec applyOps (allNumbers: string array array) (ops: string array) = if allNumbers.Length <> 0 then let currNumbers, numbersTail = allNumbers[0] |> Array.map convertToInt64, allNumbers[1..] let currOp, opsTail = ops[0], ops[1..] let result = match currOp with | "*" -> currNumbers |> Array.fold (*) (1 |> int64) | "+" -> Array.sum currNumbers result + applyOps numbersTail opsTail else 0 |> int64 let main = let lines = stream.ReadToEnd().Split("\n") let ops = lines[lines.Length - 1].Split() |> Array.filter isNotNull let numberLines = (Array.transpose (lines[.. lines.Length - 2] |> Array.map Seq.toArray)) |> Array.map System.String |> Array.map trimString let numbers = buildArray [|[||]|] numberLines applyOps numbers ops