44 lines
1.5 KiB
Forth
44 lines
1.5 KiB
Forth
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
|