35 lines
1.1 KiB
Scala
35 lines
1.1 KiB
Scala
package aoc.day11
|
|
|
|
import aoc._
|
|
import scala.annotation.tailrec
|
|
|
|
val board = lines.toSeq
|
|
|
|
// part 1
|
|
|
|
val countByRow = board.map(_.count(_ == '#')).toList
|
|
val countByCol = (0 until board(0).length()).map(col => board.count(row => row(col) == '#')).toList
|
|
|
|
@tailrec def totalDist(expandBy: Int)(count: Long, leftDist: Long, accum: Long)(counts: List[Int]): Long =
|
|
counts match
|
|
case Nil => accum
|
|
case 0 :: next => totalDist(expandBy)(count, leftDist + expandBy * count /* expanded case */, accum)(next)
|
|
case cur :: next =>
|
|
totalDist(expandBy)(count + cur, leftDist + count + cur, accum + cur * leftDist)(next)
|
|
|
|
def totalDist(expandBy: Int)(counts: List[Int]): Long = totalDist(expandBy)(0, 0, 0)(counts)
|
|
|
|
def part1 =
|
|
inline def count(r: List[Int]): Long = totalDist(2)(r)
|
|
val res = count(countByRow) + count(countByCol)
|
|
println(res)
|
|
|
|
def part2 =
|
|
inline def count(r: List[Int]): Long = totalDist(1_000_000)(r)
|
|
val res = count(countByRow) + count(countByCol)
|
|
println(res)
|
|
|
|
@main def Day11(part: Int) = part match
|
|
case 1 => part1
|
|
case 2 => part2
|