11.1 and 11.2... ridiculous monkeys
This commit is contained in:
parent
cd6e5dc535
commit
65bfc6a988
3 changed files with 176 additions and 0 deletions
50
2022/11/index.js
Normal file
50
2022/11/index.js
Normal file
|
@ -0,0 +1,50 @@
|
|||
const fs = require('fs/promises');
|
||||
|
||||
const sum = (arr) => arr.reduce((total, num) => total+num, 0);
|
||||
|
||||
|
||||
const main = async () => {
|
||||
const input = (await fs.readFile("./input.txt", 'utf8')).split("\n\n");
|
||||
|
||||
const getMonkey = (str) => {
|
||||
const rows = str.split("\n").slice(1).map(r => r.split(": ")[1]);
|
||||
|
||||
const testItem = (item) => !(item % rows[2].split(" ")[2]);
|
||||
const items = rows[0].split(", ").map(x => parseFloat(x));
|
||||
const inspectItem = (old) => Math.floor(eval(`const old = ${old}; const item${rows[1]}; itemnew;`)/3);
|
||||
|
||||
const trueTarget = rows[3][rows[3].length - 1];
|
||||
const falseTarget = rows[4][rows[4].length - 1];
|
||||
|
||||
let inspectCount = 0;
|
||||
|
||||
const takeTurn = () => {
|
||||
while(items.length) {
|
||||
inspectCount++;
|
||||
const item = items.shift();
|
||||
const inspectedItem = inspectItem(item);
|
||||
|
||||
monkeyData[testItem(inspectedItem) ? trueTarget : falseTarget].addItem(inspectedItem);
|
||||
}
|
||||
}
|
||||
|
||||
const addItem = (item) => items.push(item);
|
||||
|
||||
return {
|
||||
takeTurn,
|
||||
addItem,
|
||||
getCount: () => inspectCount
|
||||
};
|
||||
};
|
||||
|
||||
const monkeyData = input.map(getMonkey);
|
||||
|
||||
for (let i = 0; i < 20; ++i) {
|
||||
monkeyData.forEach(m => m.takeTurn());
|
||||
}
|
||||
|
||||
const counts = monkeyData.map(m => m.getCount()).sort((a, b) => b - a);
|
||||
console.log(counts[0] * counts[1]);
|
||||
}
|
||||
|
||||
main();
|
71
2022/11/index2.js
Normal file
71
2022/11/index2.js
Normal file
|
@ -0,0 +1,71 @@
|
|||
const fs = require('fs/promises');
|
||||
|
||||
const main = async () => {
|
||||
const input = (await fs.readFile("./input.txt", 'utf8')).split("\n\n");
|
||||
|
||||
const getItem = (itemStr) => {
|
||||
|
||||
const val = parseFloat(itemStr);
|
||||
|
||||
const remainders = Array.from(Array(19).keys()).map((_, i) => val % (i + 1));
|
||||
|
||||
const isDivisibleBy = (n) => remainders[n - 1] === 0;
|
||||
|
||||
const inspect = str => {
|
||||
remainders.forEach((rem, i) => {
|
||||
const div = i + 1;
|
||||
remainders[i] = eval(`const old = ${rem}; const _${str}; _new;`) % div;
|
||||
});
|
||||
};
|
||||
|
||||
return {
|
||||
isDivisibleBy,
|
||||
inspect
|
||||
};
|
||||
};
|
||||
|
||||
const getMonkey = (str) => {
|
||||
const rows = str.split("\n").slice(1).map(r => r.split(": ")[1]);
|
||||
|
||||
const items = rows[0].split(", ").map(getItem);
|
||||
|
||||
const inspectOp = rows[1];
|
||||
|
||||
const testDiv = parseFloat(rows[2].split(" ")[2]);
|
||||
|
||||
const trueTarget = rows[3][rows[3].length - 1];
|
||||
const falseTarget = rows[4][rows[4].length - 1];
|
||||
|
||||
let inspectCount = 0;
|
||||
|
||||
const takeTurn = () => {
|
||||
while(items.length) {
|
||||
inspectCount++;
|
||||
const item = items.shift();
|
||||
item.inspect(inspectOp);
|
||||
|
||||
|
||||
monkeyData[item.isDivisibleBy(testDiv) ? trueTarget : falseTarget].addItem(item);
|
||||
}
|
||||
}
|
||||
|
||||
const addItem = (item) => items.push(item);
|
||||
|
||||
return {
|
||||
takeTurn,
|
||||
addItem,
|
||||
getCount: () => inspectCount
|
||||
};
|
||||
};
|
||||
|
||||
const monkeyData = input.map(getMonkey);
|
||||
|
||||
for (let i = 0; i < 10000; ++i) {
|
||||
monkeyData.forEach(m => m.takeTurn());
|
||||
}
|
||||
|
||||
const counts = monkeyData.map(m => m.getCount()).sort((a, b) => b - a);
|
||||
console.log(counts[0] * counts[1]);
|
||||
}
|
||||
|
||||
main();
|
55
2022/11/input.txt
Normal file
55
2022/11/input.txt
Normal file
|
@ -0,0 +1,55 @@
|
|||
Monkey 0:
|
||||
Starting items: 97, 81, 57, 57, 91, 61
|
||||
Operation: new = old * 7
|
||||
Test: divisible by 11
|
||||
If true: throw to monkey 5
|
||||
If false: throw to monkey 6
|
||||
|
||||
Monkey 1:
|
||||
Starting items: 88, 62, 68, 90
|
||||
Operation: new = old * 17
|
||||
Test: divisible by 19
|
||||
If true: throw to monkey 4
|
||||
If false: throw to monkey 2
|
||||
|
||||
Monkey 2:
|
||||
Starting items: 74, 87
|
||||
Operation: new = old + 2
|
||||
Test: divisible by 5
|
||||
If true: throw to monkey 7
|
||||
If false: throw to monkey 4
|
||||
|
||||
Monkey 3:
|
||||
Starting items: 53, 81, 60, 87, 90, 99, 75
|
||||
Operation: new = old + 1
|
||||
Test: divisible by 2
|
||||
If true: throw to monkey 2
|
||||
If false: throw to monkey 1
|
||||
|
||||
Monkey 4:
|
||||
Starting items: 57
|
||||
Operation: new = old + 6
|
||||
Test: divisible by 13
|
||||
If true: throw to monkey 7
|
||||
If false: throw to monkey 0
|
||||
|
||||
Monkey 5:
|
||||
Starting items: 54, 84, 91, 55, 59, 72, 75, 70
|
||||
Operation: new = old * old
|
||||
Test: divisible by 7
|
||||
If true: throw to monkey 6
|
||||
If false: throw to monkey 3
|
||||
|
||||
Monkey 6:
|
||||
Starting items: 95, 79, 79, 68, 78
|
||||
Operation: new = old + 3
|
||||
Test: divisible by 3
|
||||
If true: throw to monkey 1
|
||||
If false: throw to monkey 3
|
||||
|
||||
Monkey 7:
|
||||
Starting items: 61, 97, 67
|
||||
Operation: new = old + 4
|
||||
Test: divisible by 17
|
||||
If true: throw to monkey 0
|
||||
If false: throw to monkey 5
|
Loading…
Reference in a new issue