isundil 3 年之前
父节点
当前提交
3613b5feac
共有 1 个文件被更改,包括 92 次插入0 次删除
  1. 92 0
      d11/main.js

+ 92 - 0
d11/main.js

@@ -0,0 +1,92 @@
+
+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());
+