| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- const fs = require('fs');
- const readline = require('readline');
- const SCREEN_WIDTH = 40;
- //const RELIEF = BigInt(3); // part 1
- const RELIEF = BigInt(1); // part 2
- function Monkey(monkeyPool, id) {
- this.pool = monkeyPool;
- this.id = id;
- this.items = [];
- this.operation = i => i;
- this.testValue = 0;
- this.ifTrue = null;
- this.ifFalse = null;
- this.inspect = 0;
- }
- Monkey.prototype.setOperation = function(line) {
- this.operator = line.substring(0, 1);
- let other = line.substring(2);
- this.operation = i => {
- let _other = other === 'old' ? i : BigInt(parseInt(other));
- switch (this.operator) {
- case '+':
- i = i + _other; break;
- case '*':
- i = i * _other; break;
- }
- return RELIEF == 1 ? (i % this.pool.maxDiv): Math.floor(Number(i / RELIEF));
- };
- }
- Monkey.prototype.run = function() {
- this.inspect += this.items.length;
- while (this.items.length) {
- let i = this.items.shift();
- i = this.operation(i);
- this.pool.monkeys[(i % this.testValue == 0) ? this.ifTrue : this.ifFalse].items.push(i);
- }
- }
- function MonkeyPool() {
- this.monkeys = [];
- this.maxDiv = 0;
- }
- MonkeyPool.prototype.push = function(i) {
- let m = new Monkey(this, i);
- this.monkeys[i] = m;
- return i;
- }
- MonkeyPool.prototype.round = function() {
- for (let i of this.monkeys)
- i.run();
- }
- MonkeyPool.prototype.debug = function() {
- for (let i of this.monkeys) console.log(i.id, i.inspect, i.items);
- }
- async function main() {
- let monkeys = new MonkeyPool();
- let currentMonkey = null;
- for await (let line of readline.createInterface({ input: process.stdin })) {
- line = line.trim();
- if (!line || !line.length)
- currentMonkey = null;
- else if (line.startsWith('Monkey '))
- currentMonkey = monkeys.push(parseInt(line.substr(7)));
- else if (line.startsWith('Starting items: '))
- monkeys.monkeys[currentMonkey].items = line.substring('Starting items: '.length).split(',').map(i => BigInt(parseInt(i.trim())));
- else if (line.startsWith('Operation: new = old '))
- monkeys.monkeys[currentMonkey].setOperation(line.substring('Operation: new = old '.length));
- else if (line.startsWith('Test: divisible by '))
- monkeys.monkeys[currentMonkey].testValue = BigInt(parseInt(line.substring('Test: divisible by'.length)));
- else if (line.startsWith('If true: throw to monkey '))
- monkeys.monkeys[currentMonkey].ifTrue = parseInt(line.substring('If true: throw to monkey '.length));
- else if (line.startsWith('If false: throw to monkey '))
- monkeys.monkeys[currentMonkey].ifFalse = parseInt(line.substring('If false: throw to monkey '.length));
- }
- monkeys.maxDiv = monkeys.monkeys.map(i => i.testValue).reduce((a, b) => a ? (a * b) : b);
- for (let i =0; i < 10000; ++i)
- monkeys.round();
- console.log(monkeys.monkeys.map(i => i.inspect).sort((a, b) => b -a).slice(0, 2).reduce((a, b) => a ? a*b : b));
- console.log(monkeys.monkeys.map(i => i.inspect));
- };
- (main());
|