2022 - Day 2

This commit is contained in:
2022-12-04 15:25:14 +01:00
parent ed914e3efd
commit 6d3dd7babb
5 changed files with 2621 additions and 0 deletions
+79
View File
@@ -0,0 +1,79 @@
const sample = await Deno.readTextFile("sample.txt");
const input = await Deno.readTextFile("input.txt");
type Object = "rock" | "paper" | "scissor";
type Outcome = "LOST" | "DRAW" | "WIN";
const scores: Record<Outcome, number> = {
LOST: 0,
DRAW: 3,
WIN: 6,
} as const;
const objectValues: Record<Object, number> = {
rock: 1,
paper: 2,
scissor: 3,
} as const;
const objectsWinFrom: Record<Object, Object> = {
rock: "scissor",
paper: "rock",
scissor: "paper",
} as const;
const codesToObjects: Record<string, Object> = {
A: "rock",
B: "paper",
C: "scissor",
X: "rock",
Y: "paper",
Z: "scissor",
} as const;
const codesToOutcome: Record<string, Outcome> = {
X: "LOST",
Y: "DRAW",
Z: "WIN",
} as const;
const solvePart1 = (data: string): number | undefined =>
data
.split("\n")
.filter(Boolean)
.map((line) => line.split(" ").map((code) => codesToObjects[code]))
.map(([object1, object2]) => {
if (object2 === object1) {
return scores.DRAW + objectValues[object2];
}
if (objectsWinFrom[object2] === object1) {
return scores.WIN + objectValues[object2];
}
return scores.LOST + objectValues[object2];
})
.reduce((sum, value) => sum + value, 0);
console.log("Sample:", solvePart1(sample));
console.log("Input", solvePart1(input));
const solvePart2 = (data: string): number | undefined =>
data
.split("\n")
.filter(Boolean)
.map((line): [Object, Outcome] => {
const [objectCode, outcomeCode] = line.split(" ");
return [codesToObjects[objectCode], codesToOutcome[outcomeCode]];
})
.map(([object1, outcome]) => {
if (outcome === "DRAW") {
return scores.DRAW + objectValues[object1];
}
if (outcome === "LOST") {
return scores.LOST + objectValues[objectsWinFrom[object1]];
}
return scores.WIN + objectValues[objectsWinFrom[objectsWinFrom[object1]]];
})
.reduce((sum, value) => sum + value, 0);
console.log("Sample:", solvePart2(sample));
console.log("Input", solvePart2(input));