Solve day 4 part 1

This commit is contained in:
Reimar 2024-12-08 15:09:02 +01:00
parent 1e08846076
commit 9d4cbda09a
Signed by: Reimar
GPG Key ID: 93549FA07F0AE268

View File

@ -1,4 +1,4 @@
fun amountInStr (needle : string, haystack : string) : int = fun amountInStr (needle, haystack) : int =
let let
val l = List.tabulate (size haystack, (fn i => val l = List.tabulate (size haystack, (fn i =>
String.isPrefix needle (String.substring (haystack, i, (size haystack - i))) String.isPrefix needle (String.substring (haystack, i, (size haystack - i)))
@ -7,36 +7,65 @@ fun amountInStr (needle : string, haystack : string) : int =
foldl (fn (v, acc) => if v then acc + 1 else acc) 0 l foldl (fn (v, acc) => if v then acc + 1 else acc) 0 l
end end
fun reverseStr (str : string) = (String.implode o List.rev o String.explode) str fun reverseStr str = (String.implode o List.rev o String.explode) str
fun wordsInLine (line : string) = fun wordsInLine line =
amountInStr ("XMAS", line) + amountInStr ("XMAS", reverseStr line) amountInStr ("XMAS", line) + amountInStr ("XMAS", reverseStr line)
fun wordsInLines (lines : string list) = fun wordsInLines (lines : string list) =
foldl (op +) 0 (map wordsInLine lines) foldl (op +) 0 (map wordsInLine lines)
fun columns (lines : string list) = fun lineLength lines i = size (List.nth (lines, i))
let
fun lineLength (i : int) = size (List.nth (lines, i))
fun column (i : int) = fun pos lines (x, y) = String.sub (List.nth (lines, y), x)
fun column lines i =
String.implode (List.tabulate ( String.implode (List.tabulate (
lineLength i, lineLength lines i,
(fn j => String.sub (List.nth (lines, j), i)) (fn j => pos lines (i, j))
)) ))
in
List.tabulate (length lines, column) fun nwDiagonal lines i =
end String.implode (List.tabulate (i + 1, (fn j =>
pos lines (i - j, j)
)))
fun seDiagonal lines i =
String.implode (List.tabulate (i, (fn j =>
pos lines ((lineLength lines i) - (i - j), (lineLength lines i) - j - 1)
)))
fun neDiagonal lines i =
String.implode (List.tabulate (i, (fn j =>
pos lines ((lineLength lines i) - (i - j), j)
)))
fun swDiagonal lines i =
String.implode (List.tabulate (i + 1, (fn j =>
pos lines (i - j, (lineLength lines i) - j - 1)
)))
fun applyToLines f lines =
List.tabulate (length lines, (f lines))
val file = TextIO.openIn "day_4.txt" val file = TextIO.openIn "day_4.txt"
val input = TextIO.inputAll file; val input = TextIO.inputAll file;
TextIO.closeIn file; TextIO.closeIn file;
val lines = String.tokens (fn (char) => char = #"\n") input val lines = String.tokens (fn c => c = #"\n") input
val columns = columns lines val columns = applyToLines column lines
val nwDiagonals = applyToLines nwDiagonal lines
val seDiagonals = applyToLines seDiagonal lines
val neDiagonals = applyToLines neDiagonal lines
val swDiagonals = applyToLines swDiagonal lines
val result = val result =
wordsInLines lines + wordsInLines lines +
wordsInLines columns wordsInLines columns +
wordsInLines nwDiagonals +
wordsInLines seDiagonals +
wordsInLines neDiagonals +
wordsInLines swDiagonals