Guest User

2023/24

a guest
Dec 24th, 2023
595
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const { init } = require('z3-solver');
  2. const utils = require('../../utils')
  3. const data = utils.byLine('./input.txt').map(intsS)
  4. const MIN = 200000000000000
  5. const MAX = 400000000000000
  6.  
  7. function intersects(a, b, c, d, p, q, r, s) {
  8.     const det = (c - a) * (s - q) - (r - p) * (d - b);
  9.     if (det === 0) return null  
  10.     return ((s - q) * (r - a) + (p - r) * (s - b)) / det
  11. }
  12.  
  13. let intersections = 0
  14. utils.pairs(data, (a, b) => {
  15.     let delta = intersects(
  16.         a[0], a[1], a[0] + a[3], a[1] + a[4],
  17.         b[0], b[1], b[0] + b[3], b[1] + b[4],
  18.     )
  19.     if (delta === null) {
  20.         return
  21.     }
  22.     let x = a[0] + delta * a[3]
  23.     let y = a[1] + delta * a[4]
  24.  
  25.     if (
  26.         (x < a[0] && a[3] > 0) || (x > a[0] && a[3] < 0)
  27.         ||
  28.         (x < b[0] && b[3] > 0) || (x > b[0] && b[3] < 0)
  29.     ) {
  30.         return
  31.     }
  32.     if (x < MIN || x > MAX || y < MIN || y > MAX) {
  33.         return
  34.     }
  35.     intersections++
  36. })
  37. console.log('Part 1', intersections)
  38.  
  39. async function solveSystem() {
  40.     const { Context } = await init();
  41.     const { Solver, Int } = new Context('main');
  42.     const solver = new Solver();
  43.     const x = Int.const('x');
  44.     const y = Int.const('y');
  45.     const z = Int.const('z');
  46.     const dx = Int.const('dx');
  47.     const dy = Int.const('dy');
  48.     const dz = Int.const('dz');
  49.     const t = data.map((_, i) => Int.const(`t${i}`))
  50.  
  51.     data.forEach((h, i) => {
  52.         solver.add(t[i].mul(h[3]).add(h[0]).sub(x).sub(t[i].mul(dx)).eq(0))
  53.         solver.add(t[i].mul(h[4]).add(h[1]).sub(y).sub(t[i].mul(dy)).eq(0))
  54.         solver.add(t[i].mul(h[5]).add(h[2]).sub(z).sub(t[i].mul(dz)).eq(0))
  55.     })
  56.     await solver.check()
  57.     console.log('Part 2', Number(solver.model().eval(x.add(y).add(z)).value()))
  58. }
  59. solveSystem()
  60.  
Advertisement
Add Comment
Please, Sign In to add comment