diff --git a/src/main/scala/days/Day02.scala b/src/main/scala/days/Day02.scala index 9d21e88..fe1c546 100644 --- a/src/main/scala/days/Day02.scala +++ b/src/main/scala/days/Day02.scala @@ -10,21 +10,22 @@ object Day02 extends Solver(2): .map(line => line.split(" ").map(_.toInt).toList) .toList - def valid(list: List[Int]): Boolean = - val isSorted = (list.sorted == list || list.sorted.reverse == list) - val notTooLarge = list.sliding(2).map(x => (x(1) - x(0)).abs).forall(_ <= 3) - val notTooSmall = list.sliding(2).map(x => (x(1) - x(0)).abs).forall(_ >= 1) - isSorted && notTooLarge && notTooSmall + def safe(list: List[Int]): Boolean = + list.length < 2 || list + .sliding(2) + .collect { case List(a, b) => b - a } + .forall(1 to 3 contains _) - def part1(lists: List[List[Int]]): Int = lists.count(valid) + def safeWithGap(list: List[Int]): Boolean = + list.indices.exists(i => safe(list.take(i) ++ list.drop(i + 1))) + + def part1(lists: List[List[Int]]): Int = + lists.count(list => safe(list) || safe(list.reverse)) def part2(lists: List[List[Int]]): Int = - lists.count(list => - list.indices.exists(i => valid(list.take(i) ++ list.drop(i + 1))) - ) + lists.count(list => safeWithGap(list) || safeWithGap(list.reverse)) def run(input: String): (Timings, Solution) = - val (pre_time, pre_input) = timed { pre(input) } val (p1_time, p1_solution) = timed { part1(pre_input) } val (p2_time, p2_solution) = timed { part2(pre_input) }