robots take over the world

This commit is contained in:
John Shaver 2022-12-21 18:52:35 -08:00
parent b09f37bb7c
commit efacb44254
4 changed files with 256 additions and 0 deletions

2
2022/19/example.txt Normal file
View file

@ -0,0 +1,2 @@
Blueprint 1:Each ore robot costs 4 ore.Each clay robot costs 2 ore.Each obsidian robot costs 3 ore and 14 clay.Each geode robot costs 2 ore and 7 obsidian.
Blueprint 2:Each ore robot costs 2 ore.Each clay robot costs 3 ore.Each obsidian robot costs 3 ore and 8 clay.Each geode robot costs 3 ore and 12 obsidian.

105
2022/19/index.js Normal file
View file

@ -0,0 +1,105 @@
const fs = require('fs/promises');
const sum = (arr) => arr.reduce((total, num) => total+num, 0);
const arrayOfLength = n => Array.from(Array(n).keys()).map(() => {});
//minus
const keypress = async () => {
process.stdin.setRawMode(true)
return new Promise(resolve => process.stdin.once('data', data => {
const byteArray = [...data]
if (byteArray.length > 0 && byteArray[0] === 3) {
console.log('^C')
process.exit(1)
}
process.stdin.setRawMode(false)
resolve()
}))
}
const coords = ([x, y, z]) => `${x},${y},${z}`;
const createPlan = ([id, orO, crO, obrO, obrC, grO, grObs]) => {
return {
id,
botCosts: {
ore: {ore: orO},
clay: {ore: crO},
obs: {
ore: obrO,
clay: obrC
},
geo: {
ore: grO,
obs: grObs
}
},
maxBotNeed: {
ore: Math.max(orO, crO, obrO, grO),
clay: obrC,
obs: grObs,
geo: Infinity
}
}
};
let exhaustedPossibilities = 0;
const runPlan = (
plan,
buildNext,
bots = {ore: 1, clay: 0, obs: 0, geo: 0},
resources = {ore: 0, clay: 0, obs: 0, geo: 0},
time=24
) => {
if(time < 1) {
exhaustedPossibilities++;
if(exhaustedPossibilities % 1000000 === 0) {
console.log("Tried ", exhaustedPossibilities, " possible outcomes");
}
return resources.geo;
}
const {maxBotNeed, botCosts} = plan;
const nextResources = Object.entries(resources).reduce((next, [type, count]) => {
next[type] = count + bots[type];
return next;
}, {});
let nextBots = bots;
const canBuild = buildNext && Object.entries(botCosts[buildNext]).every(([type, needed]) => resources[type] >= needed);
if(canBuild) {
nextBots = {...bots, [buildNext]: bots[buildNext] + 1};
for(const type in botCosts[buildNext]) {
nextResources[type] -= botCosts[buildNext][type];
}
buildNext = undefined;
}
if(buildNext) {
return runPlan(plan, buildNext, nextBots, nextResources, time -1);
}
const outcomes = Object.entries(botCosts).filter(([k]) => k !== "id").map(([type, costs]) => {
for(const key in costs) {
if(!nextBots[key]) {
return 0;
}
}
if(nextBots[type] >= maxBotNeed[type]) {
return 0;
}
return runPlan(plan, type, nextBots, nextResources, time - 1);
});
return Math.max(...outcomes);
};
const main = async () => {
const input = (await fs.readFile("./input.txt", 'utf8')).slice(0, -1).split("\n");
const plans = input.map(p => createPlan(p.match(/\d+/g).map(x => parseInt(x))));
const results = plans.map(plan => plan.id * Math.max(runPlan(plan, "ore"), runPlan(plan, "clay")));
console.log("Answer: ", sum(results));
}
main();

119
2022/19/index2.js Normal file
View file

@ -0,0 +1,119 @@
const fs = require('fs/promises');
const sum = (arr) => arr.reduce((total, num) => total+num);
const arrayOfLength = n => Array.from(Array(n).keys()).map(() => {});
//minus
const keypress = async () => {
process.stdin.setRawMode(true)
return new Promise(resolve => process.stdin.once('data', data => {
const byteArray = [...data]
if (byteArray.length > 0 && byteArray[0] === 3) {
console.log('^C')
process.exit(1)
}
process.stdin.setRawMode(false)
resolve()
}))
}
const coords = ([x, y, z]) => `${x},${y},${z}`;
const createPlan = ([id, orO, crO, obrO, obrC, grO, grObs]) => {
return {
id,
botCosts: {
ore: {ore: orO},
clay: {ore: crO},
obs: {
ore: obrO,
clay: obrC
},
geo: {
ore: grO,
obs: grObs
}
},
maxBotNeed: {
ore: Math.max(orO, crO, obrO, grO),
clay: obrC,
obs: grObs,
geo: Infinity
}
}
};
let exhaustedPossibilities = 0;
const main = async () => {
const input = (await fs.readFile("./input.txt", 'utf8')).slice(0, -1).split("\n").slice(0,3);
const plans = input.map(p => createPlan(p.match(/\d+/g).map(x => parseInt(x))));
const results = plans.map(plan => {
let runningBest = 0;
const runPlan = (
plan,
buildNext,
bots = {ore: 1, clay: 0, obs: 0, geo: 0},
resources = {ore: 0, clay: 0, obs: 0, geo: 0},
time=32
) => {
if(runningBest < resources.geo) {
runningBest = resources.geo;
}
if(time < 1) {
exhaustedPossibilities++;
if(exhaustedPossibilities % 1000000 === 0) {
console.log("Tried ", exhaustedPossibilities, " possible outcomes");
}
return resources.geo;
}
if(time * (time - 1) / 2 + resources.geo + bots.geo * time < runningBest) {
return resources.geo;
}
const {maxBotNeed, botCosts} = plan;
const nextResources = Object.entries(resources).reduce((next, [type, count]) => {
next[type] = count + bots[type];
return next;
}, {});
let nextBots = bots;
const canBuild = buildNext && Object.entries(botCosts[buildNext]).every(([type, needed]) => resources[type] >= needed);
if(canBuild) {
nextBots = {...bots, [buildNext]: bots[buildNext] + 1};
for(const type in botCosts[buildNext]) {
nextResources[type] -= botCosts[buildNext][type];
}
buildNext = undefined;
}
if(buildNext) {
return runPlan(plan, buildNext, nextBots, nextResources, time -1);
}
const outcomes = Object.entries(botCosts).filter(([k]) => k !== "id").map(([type, costs]) => {
for(const key in costs) {
if(!nextBots[key]) {
return 0;
}
}
if(nextBots[type] >= maxBotNeed[type]) {
return 0;
}
return runPlan(plan, type, nextBots, nextResources, time - 1);
});
return Math.max(...outcomes);
};
console.log("Plan: ", plan.id);
const res = Math.max(runPlan(plan, "ore"), runPlan(plan, "clay"));
console.log("Best: ", runningBest);
return res;
});
console.log("Results: ", results);
console.log("Answer: ", results.reduce((prod, n) => prod * n));
}
main();

30
2022/19/input.txt Normal file
View file

@ -0,0 +1,30 @@
Blueprint 1: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 8 clay. Each geode robot costs 2 ore and 10 obsidian.
Blueprint 2: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 19 clay. Each geode robot costs 4 ore and 11 obsidian.
Blueprint 3: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 18 clay. Each geode robot costs 4 ore and 9 obsidian.
Blueprint 4: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 14 clay. Each geode robot costs 4 ore and 15 obsidian.
Blueprint 5: Each ore robot costs 4 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 18 clay. Each geode robot costs 4 ore and 8 obsidian.
Blueprint 6: Each ore robot costs 3 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 9 clay. Each geode robot costs 3 ore and 7 obsidian.
Blueprint 7: Each ore robot costs 4 ore. Each clay robot costs 3 ore. Each obsidian robot costs 2 ore and 14 clay. Each geode robot costs 4 ore and 11 obsidian.
Blueprint 8: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 12 clay. Each geode robot costs 3 ore and 15 obsidian.
Blueprint 9: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 12 clay. Each geode robot costs 3 ore and 17 obsidian.
Blueprint 10: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 19 clay. Each geode robot costs 2 ore and 14 obsidian.
Blueprint 11: Each ore robot costs 3 ore. Each clay robot costs 3 ore. Each obsidian robot costs 2 ore and 20 clay. Each geode robot costs 3 ore and 18 obsidian.
Blueprint 12: Each ore robot costs 2 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 15 clay. Each geode robot costs 2 ore and 20 obsidian.
Blueprint 13: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 5 clay. Each geode robot costs 3 ore and 7 obsidian.
Blueprint 14: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 17 clay. Each geode robot costs 2 ore and 13 obsidian.
Blueprint 15: Each ore robot costs 2 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 20 clay. Each geode robot costs 3 ore and 15 obsidian.
Blueprint 16: Each ore robot costs 2 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 19 clay. Each geode robot costs 4 ore and 8 obsidian.
Blueprint 17: Each ore robot costs 2 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 8 clay. Each geode robot costs 3 ore and 20 obsidian.
Blueprint 18: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 16 clay. Each geode robot costs 3 ore and 14 obsidian.
Blueprint 19: Each ore robot costs 2 ore. Each clay robot costs 3 ore. Each obsidian robot costs 2 ore and 14 clay. Each geode robot costs 3 ore and 8 obsidian.
Blueprint 20: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 18 clay. Each geode robot costs 4 ore and 20 obsidian.
Blueprint 21: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 14 clay. Each geode robot costs 4 ore and 15 obsidian.
Blueprint 22: Each ore robot costs 2 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 18 clay. Each geode robot costs 2 ore and 11 obsidian.
Blueprint 23: Each ore robot costs 4 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 11 clay. Each geode robot costs 4 ore and 7 obsidian.
Blueprint 24: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 12 clay. Each geode robot costs 3 ore and 8 obsidian.
Blueprint 25: Each ore robot costs 4 ore. Each clay robot costs 3 ore. Each obsidian robot costs 2 ore and 7 clay. Each geode robot costs 3 ore and 8 obsidian.
Blueprint 26: Each ore robot costs 3 ore. Each clay robot costs 3 ore. Each obsidian robot costs 2 ore and 11 clay. Each geode robot costs 2 ore and 19 obsidian.
Blueprint 27: Each ore robot costs 2 ore. Each clay robot costs 3 ore. Each obsidian robot costs 2 ore and 14 clay. Each geode robot costs 3 ore and 20 obsidian.
Blueprint 28: Each ore robot costs 2 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 16 clay. Each geode robot costs 4 ore and 12 obsidian.
Blueprint 29: Each ore robot costs 3 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 6 clay. Each geode robot costs 2 ore and 16 obsidian.
Blueprint 30: Each ore robot costs 3 ore. Each clay robot costs 3 ore. Each obsidian robot costs 2 ore and 13 clay. Each geode robot costs 3 ore and 12 obsidian.