diff --git a/day 13/day_13_mark.js b/day 13/day_13_mark.js new file mode 100644 index 0000000000000000000000000000000000000000..86e68bf6fdd2f307cb0405115f0eec9e4b57241f --- /dev/null +++ b/day 13/day_13_mark.js @@ -0,0 +1,81 @@ +machines = input.split('\n\n').map(machine => machine.match(/Button A: X\+(\d+), Y\+(\d+)\nButton B: X\+(\d+), Y\+(\d+)\nPrize: X=(\d+), Y=(\d+)/).slice(1).map(Number)) + +score = (A_presses, B_presses) => 3 * A_presses + B_presses + +solved = (machine, A_presses, B_presses) => { + X = A_presses * machine[0] + B_presses * machine[2] + Y = A_presses * machine[1] + B_presses * machine[3] + + Xdiff = X - machine[4] + Ydiff = Y - machine[5] + + if(Xdiff < 0 && Ydiff < 0){ + return -1 + } + if(Xdiff == 0 && Ydiff == 0){ + return 0 + } + + return 1 +} + +solve = machine => { + max_B_presses = 0 + while(solved(machine, 0, max_B_presses) <= 0){ + max_B_presses++ + } + + B_presses = max_B_presses + A_presses = 0 + + do { + B_presses-- + A_presses = 0 + do { + A_presses++ + } while(solved(machine, A_presses, B_presses) < 0) + } while(B_presses >= 0 && solved(machine, A_presses, B_presses) > 0) + + return solved(machine, A_presses, B_presses) ? 0 : score(A_presses, B_presses) +} + +output1 = machines.reduce((total, machine) => total + solve(machine), 0) + +//// + +machines.map(machine => {machine[4] += 10000000000000; machine[5] += 10000000000000}) + +solved = (machine, A_presses, B_presses) => { + X = A_presses * machine[0] + B_presses * machine[2] + Y = A_presses * machine[1] + B_presses * machine[3] + + Xdiff = X - machine[4] + Ydiff = Y - machine[5] + + if(Xdiff < 0 && Ydiff < 0){ + return -1 + } + if(Xdiff == 0 && Ydiff == 0){ + return 0 + } + + return 1 +} + +solve = machine => { + A_X = machine[0] + A_Y = machine[1] + B_X = machine[2] + B_Y = machine[3] + X = machine[4] + Y = machine[5] + + det = A_X * B_Y - A_Y * B_X + A_presses = Math.round((B_Y * X - B_X * Y)/det) + B_presses = Math.round((A_X * Y - A_Y * X)/det) + + return solved(machine, A_presses, B_presses) ? 0 : score(A_presses, B_presses) +} + +output2 = machines.reduce((total, machine) => total + solve(machine), 0) +