From 59c8685ff9223ca88dc4364ecfa3c0e3dd2f45f3 Mon Sep 17 00:00:00 2001 From: Paul-Henri Froidmont Date: Fri, 2 Dec 2022 17:54:03 +0100 Subject: [PATCH] Day 2 --- .scalafmt.conf | 24 +- aoc/resources/day2Input.txt | 2500 +++++++++++++++++++++++++++++++++++ aoc/src/Day2.scala | 91 ++ 3 files changed, 2614 insertions(+), 1 deletion(-) create mode 100644 aoc/resources/day2Input.txt create mode 100644 aoc/src/Day2.scala diff --git a/.scalafmt.conf b/.scalafmt.conf index 9def825..fddf772 100644 --- a/.scalafmt.conf +++ b/.scalafmt.conf @@ -1,2 +1,24 @@ -version = "3.0.5" +version = "3.5.8" + +preset=defaultWithAlign + +assumeStandardLibraryStripMargin = true +maxColumn = 100 +continuationIndent.callSite = 2 +continuationIndent.defnSite = 2 +align.arrowEnumeratorGenerator = true +align.openParenDefnSite = false +align.stripMargin = true +rewrite.rules = [RedundantBraces, Imports, RedundantParens, SortModifiers, PreferCurlyFors] +rewrite.redundantBraces.ifElseExpressions = true +rewrite.redundantBraces.stringInterpolation = true +verticalMultiline.atDefnSite = true +verticalMultiline.newlineAfterOpenParen = true +optIn.breaksInsideChains = true +lineEndings = unix + runner.dialect = scala3 +rewrite.scala3.convertToNewSyntax = true +rewrite.scala3.removeOptionalBraces = yes +rewrite.scala3.insertEndMarkerMinLines = 30 +rewrite.scala3.removeEndMarkerMaxLines = 29 \ No newline at end of file diff --git a/aoc/resources/day2Input.txt b/aoc/resources/day2Input.txt new file mode 100644 index 0000000..7b6fba3 --- /dev/null +++ b/aoc/resources/day2Input.txt @@ -0,0 +1,2500 @@ +B Z +C Z +B X +A Y +B X +B X +A X +B Z +C Z +B Y +A Z +C X +B X +C X +B Z +B Z +C Y +B Z +B Z +C Z +B Z +B Y +B X +B Y +C Z +C Y +C Z +A X +C Z +B X +C Z +B Y +B X +A Y +A X +A Y +B Y +B X +B X +A Z +B Z +B Y +C Z +B X +C Y +B Z +B Y +C Y +A X +A Y +C Y +C Z +B Z +B X +C Z +A X +B X +A Y +B Z +C Y +A Y +C Z +C Z +A X +B X +C Z +A Z +A Z +B X +B X +B X +A Y +B X +B X +C Y +B X +C Z +C Y +B Z +A X +B X +B X +A X +C Y +C Y +A X +A X +B Z +B X +C Z +B X +B Z +A Z +B Z +A X +A X +B Z +A X +B X +B X +B X +A Y +A Y +A Y +B X +C Y +B Z +A Y +B X +A Z +C X +A Z +B Y +B Z +C Z +B Z +A Y +B X +B Z +B Z +B Z +C Y +B X +A Y +B Z +B Y +B Z +B X +A X +A X +B Y +B X +C Y +A Y +A Z +B Z +B Z +B Y +B X +B Z +B X +B Z +B Z +B X +B Z +B Z +B Z +B X +A Y +B X +B Z +A X +B Z +B Z +B X +C Y +A Z +B Z +C Z +B X +A Z +B X +A Z +C Y +C Y +A Y +A Y +B Z +A Y +A Y +C Z +A X +B X +B X +C Y +A Z +B Y +C Y +B Z +B Y +B Z +A X +B Z +C Z +B X +B Y +A X +C Z +B Y +B Z +B Z +A Z +B X +A Y +C Y +C Y +B Z +B Z +B X +B Z +B Z +B Y +B Z +B Z +B Z +B X +B X +B Z +B Y +B Z +C Y +A Z +A Y +B X +A X +B Z +B Z +A Z +B Z +B Z +B X +A Y +C Z +C Y +B Z +B Z +C Z +A X +B Z +B Z +B X +A Y +A Z +B Z +C Y +C Z +A Y +B Z +B X +C Z +A X +C Z +B Z +C Z +B X +C Y +B X +B Z +B X +A Y +A Z +B Z +B X +B Z +C Z +C Z +C Y +B X +B Y +B Z +C Z +C Z +B Z +B X +B Z +C Y +A Y +C Y +B X +C Y +B Y +C X +B X +A Y +C Z +B X +B Z +B Y +B X +B X +A Z +B Z +C Z +B X +B X +A X +B X +B X +C X +C Y +A X +B X +B Z +B X +A Y +B X +B Y +B X +B X +B Y +B X +A Z +B X +B Z +B X +C Z +A Z +C X +B Z +A Y +B X +B X +A Z +A Y +B Z +B Z +A Y +C Z +B X +B X +C Z +B Z +B Z +B Z +A Y +A Y +A X +B X +C X +B X +B Z +B X +A X +B X +B Z +B X +A Y +B X +C Y +B X +B Z +B Z +C Z +C Z +C Y +B Z +B X +B Z +A Y +C Y +B X +C Y +C Z +A X +B Z +A X +B X +C Y +A X +A Y +B X +A Y +A Z +C X +B X +B Y +B Z +B X +A Y +B Z +B X +A X +B X +B X +B Y +B Z +B Z +B X +B X +A X +B Z +B Z +B Z +A Y +C Z +A X +A Y +B Z +B X +C Y +A X +B X +B Z +B Y +A Y +B Z +B Z +B X +A Y +A Y +A Y +C Y +B X +B X +B Z +B Z +A Z +A Y +B Z +B X +B X +B X +A X +B X +C Y +B Z +A Y +B X +A Y +A X +C Y +B Z +C Z +B Z +B X +B Z +A Y +B Z +C Z +B Z +B Z +A X +B Z +B Z +B X +B Z +B Z +B Z +C X +B X +B X +A Y +A Y +B X +B X +C Z +B X +B X +C Y +C Y +C Z +B X +B Z +B Z +B Z +A Y +A Y +A X +C Z +A Z +A X +B Z +C Z +A X +B X +B Y +C Z +B Y +B Z +C Y +C Y +C Y +B Z +B Z +B X +B Z +B Y +B X +B Z +A X +B X +A Y +A X +B Z +A Y +C Z +C X +B X +B X +C Y +B Z +A Y +B Z +B X +C X +B Z +A X +A Y +A Y +C Y +C Z +C Z +B X +A X +B X +B X +B Z +C Y +B X +C Z +C Y +B X +B Z +B X +B X +C Z +A Y +B Z +B X +A X +B Z +B Z +B X +B X +C Z +C Z +B Y +C Z +B Z +C Y +B X +B X +C Y +B X +B X +A Z +B X +B X +A Y +B X +B X +B X +B Z +B Z +C Z +A Y +B X +B Z +B X +B Z +B Z +B X +B Y +C Z +A Z +A Y +C Y +B X +A X +B Y +A X +B Y +A Y +C X +B X +A Y +B Z +B Z +B X +B Z +B Z +B X +B X +A Y +B Z +A Y +B Y +B Y +B Y +B X +B Z +B Z +A Y +A X +C Y +B X +B X +A Y +B X +A Y +B Z +B Z +B Y +B Z +C Z +C Z +C Y +B Z +C Y +A X +B X +C Y +C Z +B X +C Y +A Y +B Z +B Z +A X +C Y +B X +A Y +C Z +B Z +B X +A Y +C Z +A X +A Y +C X +C Y +A Y +B Z +B X +A Z +B Z +B Z +B X +C Z +B X +B Z +B X +B X +B Z +B X +A X +A Y +B Y +A Y +A Y +B Z +C Z +B X +B Z +A Y +A Y +A Z +B X +A Y +A Y +B X +A X +B Y +B Z +B Y +A Z +C Y +B Z +A X +A Z +C Z +B X +B Z +B X +C Y +A X +B Z +A Y +B X +B Z +B X +C Y +B Z +B X +A Y +B X +C Y +C X +A X +B Z +B X +A X +A Z +B X +B Y +A Z +B Z +C Y +A Y +C X +B Z +A Y +C Y +C Z +B Y +C Y +A Z +B Z +B Z +A Y +B X +C X +A Y +A Y +A Z +B X +B X +B Y +A X +B X +B Z +B Z +B X +B Y +C Z +C Y +A Y +A Y +C X +C Z +C Y +C Y +A Y +A Y +B Z +C Y +C Y +A Y +A Y +C Z +B Z +A X +B Y +B Z +B Z +B Z +B Z +B X +A Y +A Y +B Z +A Y +C X +A X +C Z +B Z +B Z +A X +C Y +B Z +B X +B X +B X +B Z +C Y +B Z +B X +B X +B Z +C Y +B X +A Z +B X +B Z +A X +C X +A X +B Z +B Z +B Z +B Z +A Y +B Z +B Y +B Z +B Z +B X +B Z +B Z +A Y +A X +B X +A Z +B Z +A Z +B X +B X +B Z +A Y +B Y +A X +B X +B X +A Y +B X +B X +B Z +B Y +B Z +C Z +B X +C Y +B Z +B Z +C Y +B Z +B Z +B Z +B Z +B Z +C Y +A Y +A X +B Z +C Y +B Y +C Z +B Z +B Z +C Z +B Z +B Z +B X +A Y +B Z +B Z +C Y +A Y +B Z +A Y +B Z +C Z +C Y +A Y +A Z +B X +A X +B Z +B Y +A X +A X +A Y +B X +C Y +B X +B Z +A Y +B X +B X +A Y +A Z +C Z +C Y +A Y +B X +B Z +B X +C Z +A Y +B X +A Y +B Z +B X +C Y +A Y +B Z +C Y +B Y +B X +C Y +A Y +B Z +C Y +B X +A X +B Z +B Z +C Y +A Y +B Z +C Y +B X +A X +A Z +C X +B Z +B Z +C Y +B Y +C Z +C Y +A X +A Y +A X +A Y +C Z +C Y +C Z +C Z +C Y +A X +C Z +B X +C X +B X +A Z +B X +C Z +A Y +A X +A Z +C Z +B X +C Y +A Y +C Y +C Z +C Y +C Y +C X +B Z +B X +B Y +A X +B Z +B Y +C Y +C Y +C Z +A Z +A X +A Y +C Z +B Z +B X +B Z +B Z +B X +B Z +C Y +A X +B X +A Z +B X +C Y +B Z +B X +B Z +C Z +C Z +A X +B Z +B X +A Y +B Z +A Y +B Y +C Z +C Y +A X +A Y +C Y +C Z +B X +C Y +B Z +B Z +B Z +C Z +B X +C Y +B Z +C Z +B X +A Y +A X +B Z +B Z +C Y +B X +B Z +C Y +A Y +C Y +A Y +B X +C Z +A X +A Y +C Y +C Z +B Z +B Z +B Z +A Y +A Y +C Z +A Z +B X +A X +B Z +C Z +B X +C Y +B Z +B X +B Z +B Z +B X +C Z +B X +B Z +B X +A X +B X +A X +B Z +B Z +A Y +B X +B Z +B Z +C Z +C Y +B X +B X +B Y +C Z +C Y +A X +B Z +C Y +A Y +B X +B X +A X +A Y +C X +B Z +B Z +A Y +A X +C Y +B Z +B Z +C X +C Y +A Y +B Z +C Y +B Z +B X +B Z +C Y +B X +B Z +B X +B X +B X +B Z +B Z +C Y +B X +B Z +A Z +A Y +A Z +A Y +B X +C Z +A Y +B X +B X +C Z +B Z +A X +B X +C Y +A Y +A X +B Z +A X +A Y +B Z +B X +B Z +C Y +A X +A X +B X +B Y +C X +A X +B X +B X +A Y +C Y +B Z +B Z +C Z +B X +B Z +B X +B Y +B Z +B Z +B X +B Z +A X +B X +A Y +A Z +B Z +B X +A Y +A X +B Z +B X +C Z +A Y +A Y +C Z +B X +A X +C Y +B X +B Z +B X +B Z +B X +C Y +B Z +C Y +C Z +A Z +C Z +A X +C Z +B Y +B X +B Z +C Z +A Y +A Z +A X +B Z +A X +B Z +B X +A Z +C Z +C Y +B Z +C X +A X +A X +B X +A Y +A X +B Z +B Z +B Z +B Z +A X +A X +A Y +B Z +B Y +B Z +A Y +B Y +A X +A Z +B Z +A Y +B X +A X +A X +B Z +A Z +B Y +B Z +C Z +C Y +B X +B Y +A X +A Z +B Z +A Z +B Z +A X +B Z +A Z +B Y +A Z +C Y +B Z +C Z +B Z +B X +B Z +C X +A X +B X +C Z +B X +B Y +A X +B X +B X +A Z +B X +B Z +C Z +B X +B X +B X +A Y +A Z +C Y +A Y +B X +A Z +A Z +B Y +B Y +C Z +C Z +B Z +C Z +B Z +A Y +A X +C Y +B X +B Z +B Z +B Z +B X +B Z +B Z +A X +A Y +B X +B X +B X +C X +C Y +C X +B X +B Z +B Y +C X +A Y +A Y +B Z +C Y +C Z +C Z +C Z +A Y +B Y +B Z +B X +B Z +B Y +A X +C Y +C Z +A Y +B Z +A X +A X +A X +B Z +B X +C Y +B Y +C Z +B Z +B Z +C Y +B Z +C Z +B X +B Y +A Y +C Z +A Y +B Z +B Z +B X +B X +B Z +B Z +B X +B X +C Z +B Y +B Z +B X +C Y +C Z +A Y +C Z +B Z +C Y +B X +C Z +A X +B Z +B X +C X +C Z +B Z +C Z +A X +B Z +C X +B Z +C Z +A Y +B Z +B Z +C Z +B Y +B Z +B X +B X +A X +A Y +A Y +C Y +C Y +C Y +B Z +B Z +A Y +B X +A Z +C Y +C Z +B X +A Y +A Y +C Z +C Z +C Y +A Z +B Z +B Z +B Z +A Y +A Y +C Z +B Z +B X +C Z +B Z +C Y +A Z +B X +B Z +A Z +B X +A X +B X +A X +B X +B Z +B Z +B Z +C Y +C Z +A Y +B X +A X +C Z +C Y +C Z +B Z +B X +A Y +A X +C Z +B X +C Z +C Y +A X +B X +C Z +B X +B Z +C Y +B X +A X +A Y +A X +B Z +B Z +C Z +B X +A Y +B X +B X +A Z +B Y +B Z +B X +B Z +B X +B Y +B X +B X +A Y +A Y +A X +C Y +A Y +B X +C Y +B Z +B Z +A Y +B X +C Y +C Z +C Y +B Z +C Z +C Y +A Y +A Y +B Z +B X +A X +A Y +B X +B Z +B X +C Z +C Z +A Y +B X +B Z +B Y +C X +C Y +B Z +A X +B Z +A Y +A X +A Y +B X +B Z +B Z +B X +B Z +C Z +B Z +A Y +B Z +C Z +B X +B X +B X +B X +B X +B X +B Y +B Z +B X +B Z +A Z +B Z +C Y +A X +B Z +B Z +C Z +B X +A Z +C Y +B Z +B X +A X +A Y +C Y +B Y +A X +B Y +B X +B Z +C Y +B Z +C Y +A Z +B Z +C Y +C Z +A Y +C X +C Y +B Z +B X +B Z +B X +B X +A Y +B Y +B X +B X +C Y +B X +C X +B Y +A Y +C Y +B X +B X +A X +B X +A X +A X +B X +B X +A Z +C Z +C Y +B X +B X +C Z +B X +C Y +C Z +A Y +B Z +C Y +B X +B Y +B X +B X +C X +A X +B X +B Z +B Z +C Y +C Y +B Y +A Y +B Z +B X +B X +A Z +B Z +B X +B X +A Y +B X +B X +B X +A X +B X +B X +B X +B Z +B X +A Z +B Y +B X +B Z +B Z +B Z +A X +B Z +B Z +B X +B Z +C Z +C Y +A Z +C X +C Y +A Y +B X +B Z +C Z +B X +C Z +B Z +A Z +A Y +B Y +B Z +B X +A X +B Z +C Z +C Y +B Z +A X +A Y +A Z +B Z +C Y +A Y +B X +C Z +A Y +B X +B Z +B X +C Y +B X +B X +B X +A Z +B Z +C Z +B Z +C Y +B Z +C Z +B Z +B X +C Y +C Z +A X +C Z +C Y +C Y +B X +A Y +A Z +B X +B Z +B Z +B Z +A X +A Z +B Z +A Z +A Y +C Z +B Y +B Z +B X +B X +C Z +B Z +B Z +B Z +B Z +B X +B X +A X +A X +A Z +B Z +B X +B Z +B Z +C X +A Y +B Y +B X +B X +B Z +B X +B X +B X +C Y +B Z +B X +C Y +B Z +A Y +B Y +B Z +A Y +A X +B X +B X +B Z +A X +B Z +A Y +B Z +B X +A X +A X +A X +A Y +B Z +A Y +A X +B X +B Z +A Y +B Z +B X +B X +A Z +B Z +B Z +B Z +B Z +A X +B Z +B Z +B X +B Z +C Y +B Z +B X +B Z +B X +C Y +B X +B Y +B Z +B X +A X +C Y +B Z +B Z +B X +A Y +B X +B Z +C X +C Y +A Y +B X +B X +A Y +B Z +C Y +B Z +A Y +C Y +B Z +A X +A X +A Y +C Y +C Z +B Z +C Z +B X +A X +B X +A Y +A Y +C Z +C Y +A Z +B Z +A Y +B X +B X +B Z +C Z +B X +B X +B Y +C Y +C Z +A Y +A Z +A X +A Y +A Y +A Z +B Z +B Z +C Z +B Z +B X +C Y +A Y +B X +C Z +A X +B Z +B Y +A Y +B X +B X +A X +C Z +C Z +C Y +C Y +A X +B X +B X +B Y +A Z +C Z +A Y +C Z +C Y +B X +C Y +B Z +A Z +B Y +B X +C Y +B Y +B Z +A Z +A X +B X +C Z +C Z +B Z +B Z +C Z +B X +B X +C Y +A Y +C Y +C Z +B Z +B X +A Y +B Y +B Z +C X +B X +B Z +B Z +B X +B Z +B Z +C Y +A Y +B Z +B X +A Y +A Y +B Z +B Y +C Y +B Z +B Y +B Z +A Y +B X +C Z +A X +B X +C Y +B Z +B Y +B Y +B Z +A X +A X +B Z +B X +A X +B Z +B Z +A Y +B X +A X +B X +B X +A Y +C Z +C Y +B Z +B X +B X +B X +A X +B X +B Z +B Z +B Z +B X +B Z +B Z +A Z +C Y +B X +B X +B X +A X +C Z +A Y +A Y +B Z +B X +C Z +B Y +C Z +B X +A Y +C X +B Z +B X +B X +C Y +B X +B X +B Z +A X +B X +A Z +B X +B X +B Z +B X +B X +B Z +A Y +B X +B Z +B X +B X +C Y +B X +B Z +B Z +B X +B Z +C Z +B Y +A Y +B Z +B X +B X +A X +B Z +B X +B X +B Z +C Z +B Z +B X +C Y +B Z +B Y +B Z +B Z +A Z +B X +B X +B X +B X +C Y +A Y +B X +B Z +B X +B X +C Z +C X +B Z +B Z +B X +B Z +A Y +A Z +C Z +A X +A X +A Y +A Y +A Y +C Z +B Z +A Y +C Z +B X +A Z +C Y +A X +A X +A Y +B Z +A X +B X +B X +C Z +B Z +C Z +B Z +A X +C Y +C Z +A X +A Z +B X +C Y +A X +B X +B Z +B X +A Y +A Z +C Z +B Z +A X +B X +C Y +B X +B X +C Y +B X +A Z +A X +C X +B Z +B Y +C Z +C Z +A Y +A Y +A Y +B X +A Z +B X +A X +C Y +B X +A X +B X +B X +B Z +B Z +B Y +A Y +C Z +C Z +B X +B Z +C Z +B X +C Z +B Z +A Y +A X +B X +C Z +C Y +A Y +B Z +C Y +B X +C X +A X +B Z +C Z +B Z +B X +A Y +B Z +A Y +A Y +A Y +C Y +C Y +C Z +A Y +C Y +C Y +B Z +B X +C Y +C Y +B X +B Z +B X +C Z +C Y +C Y +B X +B X +A Y +B Z +B Z +B X +B X +C Z +A X +B Y +B X +A Z +B Z +B X +B Z +C Y +B Z +C Y +B Z +A Z +C Y +A Z +C Z +B X +B X +C Y +B X +C Y +A Z +B X +B Z +B Z +B X +B Z +B Y +A Y +B Z +B X +B Z +A Y +A Y +C Z +A Y +C X +B Z +A Y +A Y +B X +B Z +A Y +C Z +B Z +B Z +C Y +A X +B Z +C Z +B X +B X +B Z +A Y +B Y +C Z +A Y +B X +C Z +B X +B Z +B Z +B Z +B X +B Z +B X +A Z +B X +B X +B X +B Z +A Z +A Y +B Z +B X +B X +C X +A Y +A X +C Y +A Z +A X +C Y +A Y +C Y +A Z +B X +B Z +B Z +C Y +A Y +B X +B X +A Y +C Z +B Z +B Z +A X +A Y +B Z +A Z +A Y +C Z +B X +B Z +B Z +C Y +A Y +C Z +B Z +A Y +C Y +C Y +B Z +B Z +B Z +A Y +B Y +A Y +B Z +C Z +A Y +B X +C Y +A Z +A X +B X +A Z +B Z +A Z +C Z +B Z +A Y +A X +A X +C Y +A Y +B Z +A Y +B Z +B X +A Y +A X +A Y +A X +C Z +A Y +B X +C Z +B X +B Z +B Z +C Y +B Z +B X +A X +B Y +A Y +B X +C Z +A Y +B Z +B X +A Y +C Z +C Y +B Z +B Z +B Z +A X +B X +A Y +B Z +C Y +A X +A Z +B Y +B X +C Y +B Z +C Y +A Z +B X +A Y +A Y +C Y +A Z +B X +A Z +B X +B X +A X +B X +B Z +B X +B Y +B Z +B Y +B X +A Y +A X +C Z +B Y +C Y +B X +C Y +B X +B Z +B X +B X +B Z +B Z +B Z +C Z +B Z +B Z +A X +A Y +B X +B X +B X +C Z +B X +B Z +C Y +A X +A Z +B X +C Z +A X +A X +B Z +A Y +B Z +A X +C X +C Z +B X +B X +C Y +A X +B X +A X +C Y +C Y +A X +A X +B X +B Y +B Z +A X +B X +B X +B X +B Y +A Z +B Z +C Z +B X +B X +B Z +A Y +C Y +B X +B X +A X +C Y +C X +C Z +B X +B Y +A Z +C Z +A X +C Y +B Z +B X +A X +B X +B X +B Z +C Y +A Y +A X +C Z +B Z +A Y +B X +B X +B X +A Y +B X +C Y +B Y +A X +A X +B Y +B X +B X +B Z +B Z +A X +C Z +C Z +A X +C Y +B X +C Z +B X +B Z +B X +B Z +A Y +C Y +B X +B X +B X +B X +B Y +C Y +B Y +B Y +A Y +B Z +C Y +A X +C Z +B X +B Z +C Y +A Y +B X +C Z +B Z +A Z +A Z +A Z +A Y +C Z +A Z +B X +C Z +B Z +B X +C X +A Z +B Y +A Y +B Y +C Y +B X +A X +A X +A Y +A Y +A X +B Y +B Z +B X +A X +C Y +B X +B Y +A Y +C Y +A Y +B Z +B X +B Z +B Z +B X +B X +B Z +B Z +C Z +C Y +A Z +B X +B X +A Y +C Y +B X +B Z +B X +C Z +A Z +B X +C Z +B X +B X +B X +B Z +C Z +C Z +B X +C Y +B Z +C Z +B Z +C Z +B Y +B X +C Z +A X +B X +B X +C Y +B Z \ No newline at end of file diff --git a/aoc/src/Day2.scala b/aoc/src/Day2.scala new file mode 100644 index 0000000..7c97fba --- /dev/null +++ b/aoc/src/Day2.scala @@ -0,0 +1,91 @@ +import scala.io.Source + +object Day2 extends App: + + val input = Source + .fromURL(getClass.getResource("day2Input.txt")) + .mkString + .split('\n') + .toList + + enum Move: + case Rock, Paper, Scissors + + object Move: + val parse: Char => Move = + case 'A' => Rock + case 'X' => Rock + case 'B' => Paper + case 'Y' => Paper + case 'C' => Scissors + case 'Z' => Scissors + + val loosingCounterpart: Move => Move = + case Rock => Scissors + case Paper => Rock + case Scissors => Paper + + val winningCounterpart: Move => Move = + case Rock => Paper + case Paper => Scissors + case Scissors => Rock + + val points: Move => Int = + case Rock => 1 + case Paper => 2 + case Scissors => 3 + + enum MatchResult: + case Win, Loss, Draw + + object MatchResult: + val parse: Char => MatchResult = + case 'X' => Loss + case 'Y' => Draw + case 'Z' => Win + + object Part1: + val guide = input + .map(game => Game(Move.parse(game.head), Move.parse(game.last))) + + import Move.* + import MatchResult.* + + final case class Game(opponent: Move, self: Move): + val result = + if self == opponent then Draw + else if Move.loosingCounterpart(self) == opponent then Win + else Loss + + val points = result match + case Win => 6 + Move.points(self) + case Loss => Move.points(self) + case Draw => 3 + Move.points(self) + + val totalScore = guide.map(_.points).sum + + println(s"Part 1: ${Part1.totalScore}") + + object Part2: + val guide = input + .map(game => Game(Move.parse(game.head), MatchResult.parse(game.last))) + + import Move.* + import MatchResult.* + + final case class Game(opponent: Move, targetResult: MatchResult): + + val self = + if targetResult == Draw then opponent + else if targetResult == Win then Move.winningCounterpart(opponent) + else Move.loosingCounterpart(opponent) + + val points = targetResult match + case Win => 6 + Move.points(self) + case Loss => Move.points(self) + case Draw => 3 + Move.points(self) + + val totalScore = guide.map(_.points).sum + + println(s"Part 2: ${Part2.totalScore}") +end Day2