Advertisement
mosredna

AoC 2024 day 4

Dec 3rd, 2024 (edited)
489
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JavaScript 2.04 KB | Source Code | 0 0
  1. const fs = require("fs")
  2.  
  3. const input = fs.readFileSync(__dirname + (process.argv.includes("--test") ? "/test.txt" : "/input.txt"), "utf8")
  4.  
  5. const parseInput = (rawInput) => rawInput.split(/\r?\n/).map((row) => row.split(""))
  6.  
  7. const data = parseInput(input)
  8.  
  9. const rows = data.length
  10. const cols = data[0].length
  11.  
  12. // Directions for part 1
  13. const directions = [
  14.     [0, 1],
  15.     [1, 0],
  16.     [1, 1],
  17.     [1, -1],
  18.     [0, -1],
  19.     [-1, 0],
  20.     [-1, -1],
  21.     [-1, 1]
  22. ]
  23.  
  24. // Check for XMAS in part 1
  25. const checkWord = (x, y, dx, dy, grid, word) => {
  26.     for (let i = 0; i < word.length; i++) {
  27.         const nx = x + i * dx
  28.         const ny = y + i * dy
  29.         if (nx < 0 || ny < 0 || nx >= rows || ny >= cols || grid[ny][nx] !== word[i]) {
  30.             return false
  31.         }
  32.     }
  33.     return true
  34. }
  35.  
  36. // Part 1: Count all occurrences of "XMAS"
  37. const part1 = (grid) => {
  38.     let count = 0
  39.     const word = "XMAS"
  40.  
  41.     for (let x = 0; x < rows; x++) {
  42.         for (let y = 0; y < cols; y++) {
  43.             for (const [dx, dy] of directions) {
  44.                 if (checkWord(x, y, dx, dy, grid, word)) count++
  45.             }
  46.         }
  47.     }
  48.     return count
  49. }
  50.  
  51. // Part 2: Count all "X-MAS" patterns
  52. const part2 = (grid) => {
  53.     let count = 0
  54.     for (let x = 1; x < rows - 1; x++) {
  55.         for (let y = 1; y < cols - 1; y++) {
  56.             if (grid[x][y] === "A") {
  57.                 const tlbr =
  58.                     (grid[x - 1][y - 1] === "M" && grid[x + 1][y + 1] === "S") ||
  59.                     (grid[x - 1][y - 1] === "S" && grid[x + 1][y + 1] === "M")
  60.                 const trbl =
  61.                     (grid[x - 1][y + 1] === "M" && grid[x + 1][y - 1] === "S") ||
  62.                     (grid[x - 1][y + 1] === "S" && grid[x + 1][y - 1] === "M")
  63.                 if (tlbr && trbl) count++
  64.             }
  65.         }
  66.     }
  67.     return count
  68. }
  69.  
  70. console.time("Part 1 Time")
  71. console.log("Part 1:", part1(data))
  72. console.timeEnd("Part 1 Time")
  73.  
  74. console.time("Part 2 Time")
  75. console.log("Part 2:", part2(data))
  76. console.timeEnd("Part 2 Time")
  77.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement