diff --git a/2022/11/index.js b/2022/11/index.js new file mode 100644 index 0000000..6893b39 --- /dev/null +++ b/2022/11/index.js @@ -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(); diff --git a/2022/11/index2.js b/2022/11/index2.js new file mode 100644 index 0000000..f14b59d --- /dev/null +++ b/2022/11/index2.js @@ -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(); diff --git a/2022/11/input.txt b/2022/11/input.txt new file mode 100644 index 0000000..54ae24d --- /dev/null +++ b/2022/11/input.txt @@ -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