This commit is contained in:
Christian
2024-12-04 21:22:51 +01:00
parent 35bde42d0a
commit 7f58e71cf0

View File

@@ -1,56 +1,58 @@
package dev.ctsk.aoc.days package dev.ctsk.aoc.days
import dev.ctsk.aoc._ import dev.ctsk.aoc._
import scala.compiletime.ops.double
import scala.reflect.ClassTag
import scala.collection.mutable.ArrayBuffer
import scala.collection.parallel.CollectionConverters._
import scala.collection.parallel.ForkJoinTaskSupport
import java.util.concurrent.ForkJoinPool
object Day04 extends Solver(4): object Day04 extends Solver(4):
private val XMAS = "XMAS".r
private val REV_XMAS = "XMAS".reverse.r
def part1(lines: Array[Array[Char]]): Int = def diagonals[A: ClassTag](m: Vector[Vector[A]]): Vector[Vector[A]] =
def pad(front: Int, line: Array[Char], end: Int): Array[Char] = val diagonals = Vector.fill(m.length + m(0).length - 1)(ArrayBuffer[A]())
Array.fill(front)('.') ++ line ++ Array.fill(end)('.')
def count(line: Array[Char]) = for
(0 until line.length - 3) i <- m.indices
.count(idx => { j <- m(i).indices
(line.slice(idx, idx + 4) sameElements Array('X', 'M', 'A', 'S')) do diagonals(i + j) += m(i)(j)
|| (line.slice(idx, idx + 4) sameElements Array('S', 'A', 'M', 'X'))
})
lines.map(count(_)).sum diagonals.map(_.toVector)
+ lines.transpose.map(count(_)).sum
+ lines.zipWithIndex
.map((line, index) => pad(index, line, lines.length - index))
.transpose
.map(count(_))
.sum
+ lines.zipWithIndex
.map((line, index) => pad(lines.length - index, line, index))
.transpose
.map(count(_))
.sum
def part2(grid: Array[Array[Char]]): Int = def part1(lines: Vector[Vector[Char]]): Int =
def countXMAS(g: Array[Array[Char]]): Int = def count(line: Vector[Char]) =
(for val cs = ArrayCharSequence(line.toArray)
i <- 0 until g.length - 2 XMAS.findAllIn(cs).length + REV_XMAS.findAllIn(cs).length
j <- 0 until g(i).length - 2
if g(i)(j) == 'M' && g(i)(j + 2) == 'M'
&& g(i + 1)(j + 1) == 'A'
&& g(i + 2)(j) == 'S' && g(i + 2)(j + 2) == 'S'
yield 1).sum
List( Vector(
grid, lines,
grid.reverse, lines.transpose,
grid.transpose, diagonals(lines),
grid.transpose.reverse diagonals(lines.reverse)
).map(countXMAS).sum ).flatMap(_.toList).map(count).sum
def part2(grid: Vector[Vector[Char]]): Int =
var count = 0
for
i <- 1 until grid.length - 1
j <- 1 until grid(i).length - 1
if grid(i)(j) == 'A'
& (grid(i - 1)(j - 1) + grid(i + 1)(j + 1) == 'S' + 'M')
& (grid(i - 1)(j + 1) + grid(i + 1)(j - 1) == 'S' + 'M')
do count += 1
count
def run(input: String): (Timings, Solution) = def run(input: String): (Timings, Solution) =
var in = io.Source var in = io.Source
.fromFile(input) .fromFile(input)
.getLines() .getLines()
.map { line => line.toArray } .map { line => line.toVector }
.toArray .toVector
val (p1_time, p1_solution) = timed { part1(in) } val (p1_time, p1_solution) = timed { part1(in) }
val (p2_time, p2_solution) = timed { part2(in) } val (p2_time, p2_solution) = timed { part2(in) }