adventofcode/2022/16/part1.js

67 lines
1.6 KiB
JavaScript

import * as R from "remeda";
import u from "updeep";
import { readFile } from "../05/part1.js";
const parseLine = (line) => {
const {groups} = line.match( /Valve (?<valve>..).*flow rate=(?<flow>\d+).*valves? (?<exits>.*)/ );
return [ groups.valve, {
exits: groups.exits.split(',').map( x => x.trim() ),
flow: groups.flow
} ]
}
const readInput = (...args) =>
R.pipe(
readFile(...args),
(lines) => lines.split("\n"),
R.compact, // remove last line
R.map(parseLine),
Object.fromEntries,
);
export const puzzleInput = readInput(import.meta.url, "input");
export const sample = readInput(import.meta.url, "sample");
function bestMoveFor(tunnels,minutesLeft,opened,location='AA',totalSteam=0,activeSteam=0) {
console.log(minutesLeft, totalSteam);
if(minutesLeft<=0) return totalSteam;
totalSteam += activeSteam;
const possibilities = [];
if(!opened.includes(location)) {
possibilities.push(
bestMoveFor(
tunnels,
minutesLeft-1,
[...opened, location],
location,
totalSteam,
activeSteam + tunnels[location].flow
)
)
}
for( const exit of tunnels[location].exits ) {
possibilities.push(
bestMoveFor(
tunnels,
minutesLeft-1,
opened,
exit,
totalSteam,
activeSteam,
)
)
}
return Math.max( ...possibilities );
}
export default (tunnels) => {
return bestMoveFor(tunnels,30,[]);
};