60 lines
1.5 KiB
Standard ML
60 lines
1.5 KiB
Standard ML
|
val file = TextIO.openIn "day_2.txt";
|
||
|
val input = TextIO.inputAll file;
|
||
|
TextIO.closeIn file;
|
||
|
|
||
|
fun equals a b = a = b
|
||
|
fun non f x = not (f x)
|
||
|
|
||
|
val maxRed = 12
|
||
|
val maxGreen = 13
|
||
|
val maxBlue = 14
|
||
|
|
||
|
val possibleGames =
|
||
|
let val lines = String.tokens (equals #"\n") input
|
||
|
in
|
||
|
List.filter
|
||
|
(fn line =>
|
||
|
let
|
||
|
val game = List.last (String.tokens (equals #":") line)
|
||
|
val rounds = String.tokens (equals #";") game
|
||
|
val rounds = map
|
||
|
(fn round => String.extract (round, 1, NONE))
|
||
|
rounds
|
||
|
in
|
||
|
List.all
|
||
|
(fn round =>
|
||
|
let
|
||
|
val reveals = String.tokens (non Char.isAlphaNum) round
|
||
|
val revealPairs = ListPair.zip (
|
||
|
(List.filter (fn elem => (Int.fromString elem) = NONE) reveals),
|
||
|
(List.mapPartial Int.fromString reveals)
|
||
|
)
|
||
|
in
|
||
|
List.all
|
||
|
(fn revealPair =>
|
||
|
(#2 revealPair) <= (case #1 revealPair of
|
||
|
"red" => maxRed
|
||
|
| "green" => maxGreen
|
||
|
| "blue" => maxBlue
|
||
|
))
|
||
|
revealPairs
|
||
|
end
|
||
|
)
|
||
|
rounds
|
||
|
end
|
||
|
)
|
||
|
lines
|
||
|
end
|
||
|
|
||
|
val result = List.foldl
|
||
|
(fn (game, acc) =>
|
||
|
let
|
||
|
val title = List.hd (String.tokens (equals #":") game)
|
||
|
val id = Option.valOf (Int.fromString (String.extract (title, 5, NONE)))
|
||
|
in
|
||
|
acc + id
|
||
|
end
|
||
|
)
|
||
|
0
|
||
|
possibleGames
|