finished day 04 part 2

This commit is contained in:
2025-01-06 13:55:07 +01:00
parent c488eda17c
commit 3d139dfe42
2 changed files with 49 additions and 28 deletions

View File

@ -1,10 +1,10 @@
MMMSXXMASM .M.S......
MSAMXMSMSA ..A..MSMS.
AMXSXMAAMM .M.S.MAA..
MSAMASMSMX ..A.ASMSM.
XMASAMXAMM .M.S.M....
XXAMMXXAMA ..........
SMSMSASXSS S.S.S.S.S.
SAXAMASAAA .A.A.A.A..
MAMMMXMMMM M.M.M.M.M.
MXMXAXMASX ..........

View File

@ -10,10 +10,9 @@ for (let y = 0; y < data.length; y++) {
} }
} }
class Puzzle { class Puzzle {
#directions = [] #directions = []
#diagonals = []
constructor() { constructor() {
this.i = 0 this.i = 0
this.solutions = 0 this.solutions = 0
@ -22,6 +21,9 @@ class Puzzle {
[0, -1], [0, +1], [0, -1], [0, +1],
[+1, -1], [+1, 0,], [+1, +1] [+1, -1], [+1, 0,], [+1, +1]
] ]
this.#diagonals = [
[-1, -1], [-1, +1]
]
} }
shootInDirection(y, x, dy, dx, length) { shootInDirection(y, x, dy, dx, length) {
const positions = [] const positions = []
@ -39,19 +41,6 @@ class Puzzle {
return [...paper.filter(character => character.char === c)] return [...paper.filter(character => character.char === c)]
} }
getDirections(x, y) {
return [...new Set([
[Math.max(0, x - 1), Math.max(0, y - 1)],
[x, Math.max(0, y - 1)],
[Math.min(x + 1), Math.max(0, y - 1)],
[Math.max(0, x - 1), y],
[Math.min(x + 1), y],
[Math.max(x - 1), y + 1],
[x, Math.min(y + 1)],
[Math.min(x + 1), Math.min(y + 1)],
])]
}
isInBoundary(x, y) { isInBoundary(x, y) {
let max_width = data[0].length let max_width = data[0].length
let max_height = data.length let max_height = data.length
@ -68,10 +57,21 @@ class Puzzle {
} }
return true return true
} }
checkForWord2(d1, d2, word) {
const [y1, x1] = d1
const [y2, x2] = d2
if (!this.isInBoundary(x1, y1)) return false
if (!this.isInBoundary(x2, y2)) return false
const tl = this.isCharacterAt([...word][1], x1, y1) && this.isCharacterAt([...word][2], x2, y2) ? true : false
const tr = this.isCharacterAt([...word][2], x1, y1) && this.isCharacterAt([...word][1], x2, y2) ? true : false
return tl || tr
}
opposite(a) {
return -a
}
solve(puzzle) { solve(puzzle) {
console.log("--- solve ".padEnd(50, "-")) console.log("--- solve part 1 ".padEnd(50, "-"))
const needed_length = puzzle.split('').length
const word = puzzle.split('') const word = puzzle.split('')
const letter_positions = word.map(letter => { return { letter: letter, pos: this.findCharacter(letter).map(l => l.pos) } }) const letter_positions = word.map(letter => { return { letter: letter, pos: this.findCharacter(letter).map(l => l.pos) } })
const starting_letter = letter_positions[0] const starting_letter = letter_positions[0]
@ -86,7 +86,28 @@ class Puzzle {
let total_words_possible = starting_letter.pos.length let total_words_possible = starting_letter.pos.length
console.log(sum, "of possible", total_words_possible) console.log(sum, "of possible", total_words_possible)
} }
solve2(puzzle) {
console.log("--- solve part 2 ".padEnd(50, "-"))
const word = puzzle.split('')
const letter_positions = word.map(letter => { return { letter: letter, pos: this.findCharacter(letter).map(l => l.pos) } })
const starting_letter = letter_positions[0]
let sum = 0
for (let i = 0; i < starting_letter.pos.length; i++) {
let letters_in_both_dirs = true
for (let j = 0; j < this.#diagonals.length; j++) {
let [dy, dx] = this.#diagonals[j]
let upper = this.shootInDirection(starting_letter.pos[i].y, starting_letter.pos[i].x, dy, dx, (word.length - 1) / 2)
let lower = this.shootInDirection(starting_letter.pos[i].y, starting_letter.pos[i].x, this.opposite(dy), this.opposite(dx), (word.length - 1) / 2)
if (!this.checkForWord2(upper.flat(), lower.flat(), word)) letters_in_both_dirs = false
}
sum += letters_in_both_dirs ? 1 : 0
}
let total_words_possible = starting_letter.pos.length
console.log(sum, "of possible", total_words_possible)
}
} }
const p = new Puzzle() const p = new Puzzle()
p.solve("XMAS") p.solve("XMAS")
p.solve2("AMS")