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()