Public
Edited
Nov 10, 2022
1 star
Insert cell
Insert cell
viewof datasetId = Inputs.select(datasets.keys(), {label: "Dataset", value:"test"})
Insert cell
dataset = datasets.get(datasetId)
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
deterministicDice = ({
roll: (turnNb = 1) => {
let values = _.range(1, 101)
return [0, 1, 2].map( v => values[((turnNb - 1) * 3 + v) % values.length])
}
})
Insert cell
playerRolls = {
let player1rolls = []
let player2rolls = []
for (let turn = 1; turn <= turnsPlayedP1; ++turn) {
if (turn % 2 !== 0) {
player1rolls.push(deterministicDice.roll(turn))
} else {
player2rolls.push(deterministicDice.roll(turn))
}
}
return {
p1: player1rolls,
p2: player2rolls
}
}
Insert cell
playerPos = {
let p1 = [player1start]
for (let roll of playerRolls.p1) {
let val = _.sum(roll)
p1.push((p1[p1.length - 1] - 1 + val) % 10 + 1)
}
let p2 = [player2start]
for (let roll of playerRolls.p2) {
let val = _.sum(roll)
p2.push((p2[p2.length - 1] - 1 + val) % 10 + 1)
}

return {
p1: p1,
p2: p2
}
}
Insert cell
playerScores = ({
p1: playerPos.p1.reduce( (acc, curr) => [...acc, (acc[acc.length - 1] ?? -curr) + curr], []),
p2: playerPos.p2.reduce( (acc, curr) => [...acc, (acc[acc.length - 1] ?? -curr) + curr], [])
})
Insert cell
currentScore = ({
p1: playerScores.p1[playerScores.p1.length - 1],
p2: playerScores.p2[playerScores.p2.length - 1]
})
Insert cell
diceRolls = turnsPlayedP1 * 3
Insert cell
answerP1 = diceRolls * currentScore.p2
Insert cell
Insert cell
Insert cell
playedGames = playGames(1, player1start, player2start, 0, 0, 1)
Insert cell
mutable univ = 0
Insert cell
function playGames(turnNb, posP1, posP2, scoreP1, scoreP2, universes, maxTurn=turnsPlayedP2) {
if(turnNb === 1)
mutable univ = 1
if (turnNb > maxTurn) {
// debugger
return {
wonByP1: 0,
wonByP2: 0,
ongoing: universes
}
}
mutable univ += 26*universes // 26 new universes + continuation of the present one
let player = turnNb % 2 === 0 ? 2 : 1
let pos = player === 2 ? posP2 : posP1
let score = player === 2 ? scoreP2 : scoreP1
let newUniverses = generatePossibleUniverses(pos, score, universes)

let universesWithFinishedGames = newUniverses.filter(u => u.done)
let gamesWonThisTurn = _.sum(universesWithFinishedGames.map(u => u.count))

let universesWithOngoingGames = newUniverses.filter(u => !u.done)
// debugger
let futureOutcomes = {
wonByP1: 0,
wonByP2: 0,
ongoing: 0
}
for (let universe of universesWithOngoingGames) {
// debugger
let newPosP1 = (player === 2) ? posP1 : universe.pos
let newPosP2 = (player === 2) ? universe.pos : posP2
let newScoreP1 = (player === 2) ? scoreP1 : universe.score
let newScoreP2 = (player === 2) ? universe.score : scoreP2
let outcome = playGames(turnNb + 1, newPosP1, newPosP2, newScoreP1, newScoreP2, universe.count, maxTurn)
// debugger
futureOutcomes.wonByP1 += outcome.wonByP1
futureOutcomes.wonByP2 += outcome.wonByP2
futureOutcomes.ongoing += outcome.ongoing
// debugger
}
// debugger

let result = {
wonByP1: futureOutcomes.wonByP1 + (player === 2 ? 0 : gamesWonThisTurn),
wonByP2: futureOutcomes.wonByP2 + (player === 2 ? gamesWonThisTurn : 0),
ongoing: futureOutcomes.ongoing
}
return result
}
Insert cell
function generatePossibleUniverses(pos, score, initialUniversesNumber=1) {
let newPos = []
for (const r1 of [1, 2, 3]) {
for (const r2 of [1, 2, 3]) {
for (const r3 of [1, 2, 3]) {
let move = r1 + r2 + r3
newPos.push((pos - 1 + move) % 10 + 1)
}
}
}
return newPos.reduce( (arr, p) => {
let elt = arr.find(v => v.pos === p)
if (elt === undefined)
arr.push({
pos: p,
score: score + p,
done: score + p >= 21,
count: initialUniversesNumber
})
else {
elt.count+= initialUniversesNumber
}
return arr
}, [])
}
Insert cell
Insert cell
Insert cell
datasets = new Map([
["test", test],
["input", input],
])
Insert cell
function readInput(txt) {
return txt.split("\n").map( line => parseInt(line.split(" ").pop()))
}
Insert cell
test = readInput(`Player 1 starting position: 4
Player 2 starting position: 8`)
Insert cell
input = readInput(`Player 1 starting position: 7
Player 2 starting position: 6`)
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more