function* scores(players, marbles) {
const circle = [ 0 ]
const scores = _.range(0, players).map(n => 0)
let current = { value: 0 }
current.next = current.prev = current
for (let i = 1; i <= marbles; i++) {
const player = (i-1) % players
if (i % 23 === 0) {
scores[player] += i
let remove = current
for (let j = 0; j < 7; j++)
remove = remove.prev
scores[player] += remove.value
remove.prev.next = remove.next
remove.next.prev = remove.prev
current = remove.next
yield { i, player, score: scores[player] }
} else {
const place = current.next
place.next = place.next.prev = {
value: i,
next: place.next,
prev: place
}
current = place.next
}
}
}