Public
Edited
Dec 4, 2022
1 fork
1 star
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
testPlays = parsePlays(test)
Insert cell
scorePlays(testPlays)
Insert cell
function parsePlays(text) {
return text.split("\n").map(line => line.split(/\s+/).map(normalizePlay)).map(([opponent, player]) => {
return {opponent, player};
});
}
Insert cell
function normalizePlay(play) {
switch (play) {
case "A": case "X": return "rock";
case "B": case "Y": return "paper";
case "C": case "Z": return "scissors";
}
throw new Error(`unknown play: ${play}`);
}
Insert cell
function scorePlays(plays) {
let score = 0;
for (const {player, opponent} of plays) {
score += scoreOutcome(outcome(player, opponent)) + scorePlay(player);
}
return score;
}
Insert cell
input = FileAttachment("input.txt").text()
Insert cell
plays = parsePlays(input)
Insert cell
scorePlays(plays)
Insert cell
function outcome(player, opponent) {
if (player === opponent) return "draw";
switch (player) {
case "rock": return opponent === "scissors" ? "win" : "lose";
case "paper": return opponent === "rock" ? "win" : "lose";
case "scissors": return opponent === "paper" ? "win" : "lose";
}
throw new Error(`unknown play: ${player} vs. ${opponent}`);
}
Insert cell
function scorePlay(play) {
switch (play) {
case "rock": return 1;
case "paper": return 2;
case "scissors": return 3;
}
throw new Error(`unknown play: ${play}`);
}
Insert cell
function scoreOutcome(outcome) {
switch (outcome) {
case "lose": return 0;
case "draw": return 3;
case "win": return 6;
}
throw new Error(`unknown outcome: ${outcome}`);
}
Insert cell
Insert cell
plays2 = parsePlays2(input)
Insert cell
scorePlays(plays2)
Insert cell
function parsePlays2(text) {
return text.split("\n").map(line => line.split(/\s+/)).map(([opponent, player]) => {
player = normalizeOutcome(player);
opponent = normalizePlay(opponent);
return {
opponent,
player: determinePlay(opponent, player),
outcome: player
};
});
}
Insert cell
function normalizeOutcome(outcome) {
switch (outcome) {
case "X": return "lose";
case "Y": return "draw";
case "Z": return "win";
}
throw new Error(`unknown outcome: ${outcome}`);
}
Insert cell
function determinePlay(opponent, outcome) {
if (outcome === "draw") return opponent;
switch (opponent) {
case "rock": return outcome === "win" ? "paper" : "scissors";
case "paper": return outcome === "win" ? "scissors" : "rock";
case "scissors": return outcome === "win" ? "rock" : "paper";
}
throw new Error(`unknown play: ${opponent}`);
}
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