// input let players = 465; let last = 7149800; // part 2 : long but very efficient. class Marble { constructor(data) { this.data = data; this.next = this; this.prev = this; } } // linked list class Circle { constructor() { this.length = 0; this.head = null; } add(data, head) { head = head || this.head; const marble = new Marble(data); if (head) { marble.prev = head; marble.next = head.next; marble.prev.next = marble; marble.next.prev = marble; } this.length++; this.head = marble; return marble; } remove(marble) { marble = marble || this.head; marble.prev.next = marble.next; marble.next.prev = marble.prev; this.length--; this.head = marble.next; return this.length; } moveHead(amt) { for (let i = 0; i < Math.abs(amt); i++) { this.head = amt > 0 ? this.head.next : this.head.prev; } return this.head; } print() { let out = `\x1b[32m${this.head.data.toString()}\x1b[0m, ` for (let i = 1; i < this.length; i++) { out += `${this.moveHead(1).data.toString()}, ` } this.moveHead(1); console.log(out) } } console.time('speed'); circle = new Circle(); circle.add(0); // initialise elves with scores of 0 let elves = []; elves.length = players; elves.fill(0); // do all the marbles for (let i = 1; i <= last; i++) { if (i % 23 == 0) { circle.moveHead(-7); elves[i % players] += circle.head.data + i; circle.remove(); } else { circle.moveHead(1); circle.add(i); } // circle.print(); } console.log(Math.max.apply(null, elves)); console.timeEnd('speed')