Public
Edited
Dec 2, 2022
1 fork
1 star
Insert cell
Insert cell
{
// compute the opponent score for part 1
let opponentScoreP1 = input.map((play) =>
getScorePart1(
play.me === "X" ? "A" : play.me === "Y" ? "B" : "C",
play.opponent === "A" ? "X" : play.opponent === "B" ? "Y" : "Z"
)
);
// compute the cumulative score for part 1
let overtimeScoreP1 = scoresPart1.map((s, i, arr) => ({
score: s,
turn: i,
sum: _.sum(arr.slice(0, i + 1)),
label: "Part 1"
}));
// compute the cumulative opponent score for part 1
let overtimeOpponentScoreP1 = opponentScoreP1.map((s, i, arr) => ({
score: s,
turn: i,
sum: _.sum(arr.slice(0, i + 1)),
label: "Part 1 (opponent)"
}));
// compute the cumulative score for part 2
let overtimeScoreP2 = scoresPart2.map((s, i, arr) => ({
score: s,
turn: i,
sum: _.sum(arr.slice(0, i + 1)),
label: "Part 2"
}));
// compute the cumulative opponent score for part 2
function computeOpponentScorePart2(opponent, outcome) {
let score = 0;
switch (outcome) {
case "X": // lose
score = 6; // score from the required outcome
if (opponent === "A") return score + 1; // play rock
if (opponent === "B") return score + 2; // play paper
return score + 3; // play scissors
break;
case "Y": // draw
score = 3; // score from the required outcome
if (opponent === "B") return score + 2; // play paper
if (opponent === "A") return score + 1; // play rock
return score + 3; // play scissors
break;
case "Z": // win
score = 0; // score from the required outcome
if (opponent === "C") return score + 3; // play scissors
if (opponent === "B") return score + 2; // play paper
return score + 1; // play rock
break;
}
}
let opponentScoreP2 = input.map((play) =>
computeOpponentScorePart2(play.opponent, play.me)
);
let overtimeOpponentScoreP2 = opponentScoreP2.map((s, i, arr) => ({
score: s,
turn: i,
sum: _.sum(arr.slice(0, i + 1)),
label: "Part 2 (opponent)"
}));

let curves = [
...overtimeScoreP1,
...overtimeOpponentScoreP1,
...overtimeScoreP2,
...overtimeOpponentScoreP2
];

return Plot.plot({
style: "overflow: visible;",
width: width - 100,
x: {
label: "turns →"
},
y: {
label: "↑ cumulative score"
},
marks: [
Plot.ruleY([0]),
Plot.lineY(curves, { x: "turn", y: "sum", stroke: "label" }),
Plot.text(
curves,
Plot.selectLast({
x: "turn",
y: "sum",
z: "label",
text: "label",
textAnchor: "start",
dx: 3
})
)
]
});
}
Insert cell
Insert cell
function getScorePart1(opponent, me) {
let score = 0;
switch (me) {
case "X":
score = 1; // score from my play
if (opponent === "A") return score + 3; // draw
if (opponent === "C") return score + 6; // win
return score;
break;
case "Y":
score = 2; // score from my play
if (opponent === "B") return score + 3; // draw
if (opponent === "A") return score + 6; // win
return score;
break;
case "Z":
score = 3; // score from my play
if (opponent === "C") return score + 3; // draw
if (opponent === "B") return score + 6; // win
return score;
break;
}
}
Insert cell
scoresPart1 = input.map((play) => getScorePart1(play.opponent, play.me))
Insert cell
totalScorePart1 = _.sum(scoresPart1)
Insert cell
Insert cell
function getScorePart2(opponent, outcome) {
let score = 0;
switch (outcome) {
case "X": // lose
score = 0; // score from the required outcome
if (opponent === "A") return score + 3; // play scissors
if (opponent === "B") return score + 1; // play rock
return score + 2; // play paper
break;
case "Y": // draw
score = 3; // score from the required outcome
if (opponent === "B") return score + 2; // play paper
if (opponent === "A") return score + 1; // play rock
return score + 3; // play scissors
break;
case "Z": // win
score = 6; // score from the required outcome
if (opponent === "C") return score + 1; // play rock
if (opponent === "B") return score + 3; // play scissors
return score + 2; // play paper
break;
}
}
Insert cell
scoresPart2 = input.map((play) => getScorePart2(play.opponent, play.me))
Insert cell
totalScorePart2 = _.sum(scoresPart2)
Insert cell
Insert cell
input = (await FileAttachment("02.txt").text())
.split("\n")
.filter((txt) => txt.trim().length > 0)
.map((txt) => {
let plays = txt.split(" ");
return {
opponent: plays[0],
me: plays[1]
};
})
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