robots take over the world
This commit is contained in:
parent
b09f37bb7c
commit
efacb44254
4 changed files with 256 additions and 0 deletions
2
2022/19/example.txt
Normal file
2
2022/19/example.txt
Normal 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
105
2022/19/index.js
Normal 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
119
2022/19/index2.js
Normal 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
30
2022/19/input.txt
Normal 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.
|
Loading…
Reference in a new issue