88 lines
1.5 KiB
Nim
88 lines
1.5 KiB
Nim
import std/[strutils, tables]
|
|
|
|
type Shape {.pure.} = enum
|
|
Rock = 1,
|
|
Paper = 2,
|
|
Scissor = 3
|
|
|
|
let shapeTable = {
|
|
"A": Rock,
|
|
"B": Paper,
|
|
"C": Scissor,
|
|
"X": Rock,
|
|
"Y": Paper,
|
|
"Z": Scissor
|
|
}.toTable
|
|
|
|
let scoringTable = {
|
|
Rock: {
|
|
Rock: 3,
|
|
Paper: 0,
|
|
Scissor: 6
|
|
}.toTable,
|
|
Paper: {
|
|
Rock: 6,
|
|
Paper: 3,
|
|
Scissor: 0
|
|
}.toTable,
|
|
Scissor: {
|
|
Rock: 0,
|
|
Paper: 6,
|
|
Scissor: 3
|
|
}.toTable
|
|
}.toTable
|
|
|
|
type Response {.pure.} = enum
|
|
Lose = 0,
|
|
Draw = 3,
|
|
Win = 6
|
|
|
|
let resultTable = {
|
|
"X": Lose,
|
|
"Y": Draw,
|
|
"Z": Win
|
|
}.toTable
|
|
|
|
let responseShape = {
|
|
Lose: {
|
|
Rock: Scissor,
|
|
Paper: Rock,
|
|
Scissor: Paper
|
|
}.toTable,
|
|
Draw: {
|
|
Rock: Rock,
|
|
Paper: Paper,
|
|
Scissor: Scissor
|
|
}.toTable,
|
|
Win: {
|
|
Rock: Paper,
|
|
Paper: Scissor,
|
|
Scissor: Rock
|
|
}.toTable
|
|
}.toTable
|
|
|
|
const strategyGuide: seq[string] = readFile("day_02/input.txt").splitLines
|
|
|
|
proc solveTotalScore() =
|
|
var score = 0
|
|
for step in strategyGuide:
|
|
let opponent = shapeTable[step.substr(0, 0)]
|
|
let response = shapeTable[step.substr(2, 2)]
|
|
score += response.int
|
|
score += scoringTable[response][opponent]
|
|
echo "Total socre: " & $score
|
|
|
|
proc solveDecryptedScore() =
|
|
var score = 0
|
|
for step in strategyGuide:
|
|
let opponent = shapeTable[step.substr(0, 0)]
|
|
let desiredResult = resultTable[step.substr(2, 2)]
|
|
let response = responseShape[desiredResult][opponent]
|
|
score += response.int
|
|
score += desiredResult.int
|
|
echo "Descrypted score: " & $score
|
|
|
|
|
|
if isMainModule:
|
|
solveTotalScore()
|
|
solveDecryptedScore() |