diff --git a/advent-of-code/Program.fs b/advent-of-code/Program.fs index 37c95f2..e7ab7f8 100644 --- a/advent-of-code/Program.fs +++ b/advent-of-code/Program.fs @@ -24,4 +24,8 @@ let main _ = printfn $"%A{day5Star1}" let day5Star2 = day_5.Star2.main printfn $"%A{day5Star2}" + let day6Star1 = day_6.Star1.main + printfn $"%A{day6Star1}" + let day6Star2 = day_6.Star2.main + printfn $"%A{day6Star2}" 0 diff --git a/advent-of-code/tasks/day-6/Star1.fs b/advent-of-code/tasks/day-6/Star1.fs new file mode 100644 index 0000000..4d1a2fd --- /dev/null +++ b/advent-of-code/tasks/day-6/Star1.fs @@ -0,0 +1,32 @@ +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 diff --git a/advent-of-code/tasks/day-6/Star2.fs b/advent-of-code/tasks/day-6/Star2.fs new file mode 100644 index 0000000..f15bceb --- /dev/null +++ b/advent-of-code/tasks/day-6/Star2.fs @@ -0,0 +1,43 @@ +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