33 lines
1.0 KiB
Forth
33 lines
1.0 KiB
Forth
module advent_of_code.tasks.day_6.Star1
|
|
|
|
open System.IO
|
|
|
|
let stream = new StreamReader("tasks/day-6/input.txt")
|
|
|
|
let splitSpaces (line: string) =
|
|
line.Split() |> Array.toList
|
|
|
|
let isNotNull (s: string) =
|
|
s.Length > 0
|
|
|
|
let convertToInt64 (s: string) =
|
|
s |> int64
|
|
|
|
let rec applyOps (allNumbers: string array list) (ops: string list) =
|
|
if allNumbers.Length <> 0 then
|
|
let currNumbers, numbersTail = allNumbers.Head |> Array.map convertToInt64, allNumbers.Tail
|
|
let currOp, opsTail = ops.Head, ops.Tail
|
|
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") |> Array.toList) |> List.map splitSpaces) |> List.map (List.filter isNotNull)
|
|
let numbers = lines[.. lines.Length - 2] |> List.map List.toArray |> Array.transpose |> Array.toList
|
|
let ops = lines[lines.Length - 1]
|
|
applyOps numbers ops
|