Day 12. Argh.

This commit is contained in:
Chris Hodges 2025-12-12 07:34:52 +01:00
parent 5e031c27cc
commit cda0dccc65

126
src/aoc2025/Day12.kt Normal file
View File

@ -0,0 +1,126 @@
package aoc2025
import CharGrid
import println
import readInput
import splitInts
/*
--- Day 12: Christmas Tree Farm ---
https://adventofcode.com/2025/day/12
*/
fun main() {
val inlineTestInput = """
0:
###
##.
##.
1:
###
##.
.##
2:
.##
###
##.
3:
##.
###
##.
4:
###
#..
###
5:
###
.#.
###
4x4: 0 0 0 0 2 0
12x5: 1 0 1 0 2 2
12x5: 1 0 1 0 3 2
"""
fun fits(grid: LongArray, x: Int, y: Int, present: Long) =
(grid[y] or ((7L and present) shl x) == grid[y]) &&
(grid[y + 1] or ((7L and (present shr 3)) shl x) == grid[y + 1]) &&
(grid[y + 2] or ((7L and (present shr 6)) shl x) == grid[y + 2])
fun part1(input: List<String>): Int {
var lp = 0
val presents = ArrayList<IntArray>()
// nothing of this stuff is needed :-(
while (!input[lp].contains("x")) {
var charGrid = CharGrid(input.subList(lp + 1, lp + 4))
lp += 5
val setRot = HashSet<Int>()
for (r in 0..7) {
val present = charGrid.generateGridPos().foldIndexed(0) { index, acc, pos -> acc + (if (charGrid[pos] == '#') (1 shl index) else 0) }
setRot.add(present)
if (r != 3) {
// rotate
val newGrid = charGrid.copyOf()
newGrid.generateGridPos().forEach { (dc, dr) -> newGrid[2 - dr, dc] = charGrid[dc, dr] }
charGrid = newGrid
} else {
// flip
val newGrid = charGrid.copyOf()
newGrid.generateGridPos().forEach { (dc, dr) -> newGrid[2 - dc, dr] = charGrid[dc, dr] }
charGrid = newGrid
}
}
presents.add(setRot.toIntArray())
}
var fitted = 0
val presentSizes = presents.map { it[0].countOneBits() }.toIntArray()
for (p in lp until input.size) {
val (dim, pl) = input[p].split(": ")
val (width, height) = dim.splitInts("x")
val placements = pl.splitInts().toIntArray()
val totalSize = placements.mapIndexed { i, v -> v * presentSizes[i] }.sum()
if (totalSize > width * height) {
continue
}
val totalPresents = placements.sum()
// just assume it will fit if there is enough area
if (totalPresents * 9 <= width * height) {
fitted++
continue
}
println("Oh no!")
// here the hard part would have started, but except for the example input,
// it never gets here
//val grid = LongArray(height) { (1L shl width) - 1L }
}
return fitted
}
fun part2(input: List<String>): Int {
return 0
}
// test if implementation meets criteria from the description, like:
val testInput = inlineTestInput.trim().reader().readLines()
//val testInput = readInput("aoc2025/Day12_test")
val testInputPart1Result = part1(testInput)
println("Part 1 Test: $testInputPart1Result")
val testInputPart2Result = part2(testInput)
println("Part 2 Test: $testInputPart2Result")
//check(testInputPart1Result == 2)
check(testInputPart2Result == 0)
val input = readInput("aoc2025/Day12")
part1(input).println()
part2(input).println()
}