diff --git a/aoc/src/main/scala/aoc/package.scala b/aoc/src/main/scala/aoc/package.scala index 22f1f01..594b95d 100644 --- a/aoc/src/main/scala/aoc/package.scala +++ b/aoc/src/main/scala/aoc/package.scala @@ -30,4 +30,12 @@ package object aoc { go(as, Set.empty) } + def levenshtein(a: String, b: String): Int = + ((0 to b.length).toList /: a)( + (prev, x) => + (prev zip prev.tail zip b).scanLeft(prev.head + 1) { + case (h, ((d, v), y)) => Math.min(Math.min(h + 1, v + 1), d + (if (x == y) 0 else 1)) + } + ).last + } diff --git a/aoc/src/main/scala/aoc/y2018/Day02.scala b/aoc/src/main/scala/aoc/y2018/Day02.scala new file mode 100644 index 0000000..573cba8 --- /dev/null +++ b/aoc/src/main/scala/aoc/y2018/Day02.scala @@ -0,0 +1,22 @@ +package aoc.y2018 + +import aoc._ + +object Day02 extends Day { + + override def part1(input: String): String = { + val lines = input.lines.toList + val groups = lines.map(_.groupBy(identity)) + val twos = groups.count(_.values.exists(_.length == 2)) + val threes = groups.count(_.values.exists(_.length == 3)) + (twos * threes).toString + } + + override def part2(input: String): String = { + val lines = input.lines.toList + val distanceMap = lines.flatMap(s => lines.map(c => ((s, c), levenshtein(s, c)))).toMap + val ((s, c), _) = distanceMap.filter {case (_, d) => d > 0 }.minBy { case (_, d) => d } + s.intersect(c).mkString + } + +} diff --git a/aoc/src/main/scala/aoc/y2018/package.scala b/aoc/src/main/scala/aoc/y2018/package.scala index 16ab3ef..f6136fe 100644 --- a/aoc/src/main/scala/aoc/y2018/package.scala +++ b/aoc/src/main/scala/aoc/y2018/package.scala @@ -3,7 +3,8 @@ package aoc package object y2018 extends Year { override def days: Map[String, Day] = Map( - "1" -> Day01 + "1" -> Day01, + "2" -> Day02 ) }