{
let opponentScoreP1 = input.map((play) =>
getScorePart1(
play.me === "X" ? "A" : play.me === "Y" ? "B" : "C",
play.opponent === "A" ? "X" : play.opponent === "B" ? "Y" : "Z"
)
);
let overtimeScoreP1 = scoresPart1.map((s, i, arr) => ({
score: s,
turn: i,
sum: _.sum(arr.slice(0, i + 1)),
label: "Part 1"
}));
let overtimeOpponentScoreP1 = opponentScoreP1.map((s, i, arr) => ({
score: s,
turn: i,
sum: _.sum(arr.slice(0, i + 1)),
label: "Part 1 (opponent)"
}));
let overtimeScoreP2 = scoresPart2.map((s, i, arr) => ({
score: s,
turn: i,
sum: _.sum(arr.slice(0, i + 1)),
label: "Part 2"
}));
function computeOpponentScorePart2(opponent, outcome) {
let score = 0;
switch (outcome) {
case "X":
score = 6;
if (opponent === "A") return score + 1;
if (opponent === "B") return score + 2;
return score + 3;
break;
case "Y":
score = 3;
if (opponent === "B") return score + 2;
if (opponent === "A") return score + 1;
return score + 3;
break;
case "Z":
score = 0;
if (opponent === "C") return score + 3;
if (opponent === "B") return score + 2;
return score + 1;
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
})
)
]
});
}