Add day 13

This commit is contained in:
Natsu Kagami 2023-12-13 15:25:46 +01:00
parent c60ed493d7
commit 9363656ca0
Signed by: nki
GPG key ID: 55A032EB38B49ADB
4 changed files with 1446 additions and 6 deletions

View file

@ -24,3 +24,8 @@ extension [T](ss: Seq[T])
f(head) match f(head) match
case None => tail.findMap(f) case None => tail.findMap(f)
case v @ Some(_) => v case v @ Some(_) => v
def splitBy(cond: T => Boolean): Seq[Seq[T]] =
val splitPos = ss.indexWhere(cond)
if splitPos == -1 then Seq(ss)
else ss.take(splitPos) +: ss.drop(splitPos + 1).splitBy(cond)

54
Day13.scala Normal file
View file

@ -0,0 +1,54 @@
package aoc.day13
import aoc._
type Board = List[Seq[Char]]
val boards: Seq[Board] =
lines.toSeq
.splitBy(_ == "")
.map(_.map(_.toSeq).toList)
extension [T](ss: List[T])
def splits =
def loop(prefix: List[T], cur: List[T]): Seq[(List[T], List[T])] = cur match
case head :: next =>
(prefix, cur) +: loop(head +: prefix, next)
case Nil => Seq((prefix, cur))
loop(List.empty, ss)
def reflections(ok: (Board, Board, Int) => Boolean)(board: Board): Seq[Int] =
board.toList.splits.zipWithIndex
.filter {
case ((Nil, _) | (_, Nil), _) => false
case ((top, bottom), _) =>
val smudges = top.lazyZip(bottom).map(_.lazyZip(_).count(_ != _)).sum
ok(top, bottom, smudges)
}
.map(_._2)
inline def boardReflections(ok: (Board, Board, Int) => Boolean)(board: Board) =
val rowReflections = reflections(ok)(board)
val colReflections = reflections(ok)(board.transpose)
// println(s"$rowReflections $colReflections")
(rowReflections.sum * 100L + colReflections.sum)
// part 1
def part1 =
val res = boards
.map(boardReflections((_, _, s) => s == 0)(_))
.sum
println(res)
// part 2
def part2 =
val res = boards
.map(boardReflections((_, _, s) => s == 1)(_))
.sum
println(res)
@main def Day13(part: Int) = part match
case 1 => part1
case 2 => part2

View file

@ -76,12 +76,6 @@ end Parser
val seeds = Parser.parse(Parser.seeds, lines.next()).get val seeds = Parser.parse(Parser.seeds, lines.next()).get
extension [T](xs: Seq[T])
def splitBy(cond: T => Boolean): Seq[Seq[T]] =
val splitPos = xs.indexWhere(cond)
if splitPos == -1 then Seq(xs)
else xs.take(splitPos) +: xs.drop(splitPos + 1).splitBy(cond)
val maps = lines.toSeq.tail /* remove first empty line */ val maps = lines.toSeq.tail /* remove first empty line */
.splitBy(_ == "") .splitBy(_ == "")
.map { case title :: entries => .map { case title :: entries =>

1387
inputs/day13.input Normal file

File diff suppressed because it is too large Load diff