const NB_PLAYERS= 418, LAST_MARBLE= 70769 * 100; function Node(val, next) { this.prev = next ? next.prev : this; this.next = next || this; this.prev.next = this; this.next.prev = this; this.val = val; } Node.prototype.print = function() { var i = this, arr = []; do { arr.push(i.val); i = i.next; } while (i !== this); console.log(arr); } Node.prototype.removeNext = function() { var val = this.next; this.next = this.next.next; this.next.prev = this; return val; } Node.prototype.removePrev = function() { var val = this.prev; this.prev = this.prev.prev; this.prev.next = this; return val; } function Board() { this.scores = []; this.currentPos = new Node(0); this.turn = 0; for (var i =0; i < NB_PLAYERS; ++i) this.scores.push(0); } Board.prototype.nextTurn = function() { var currentPlayer = this.turn %NB_PLAYERS, currentMarple = ++this.turn; if (currentMarple % 23) { this.currentPos = new Node(currentMarple, this.currentPos.next.next); } else { this.currentPos = this.currentPos.prev.prev.prev.prev.prev.prev; this.scores[currentPlayer] += this.currentPos.removePrev().val; this.scores[currentPlayer] += currentMarple; } } Board.prototype.find = function(val) { var i = this.currentPos; do { if (i.val === val) return i; i = i.next; } while (i !== this); } Board.prototype.maxScore = function() { return Array.from(this.scores).sort()[this.scores.length -1]; } function run() { var board = new Board(); while (board.turn < LAST_MARBLE) board.nextTurn(); console.log(board.maxScore()); } run();