From 6a9dfc8ef1c16a81fb2673a989f96cb2c7742934 Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Mon, 4 Dec 2023 07:30:50 +0100 Subject: [PATCH] day 4 puzzle 1 --- README.md | 16 ++++++------- src/day4/Puzzle1.scala | 44 ++++++++++++++++++++++++++++++++++++ tests/day4/Puzzle1Test.scala | 9 ++++++++ tests_res/day4/input1.txt | 6 +++++ 4 files changed, 67 insertions(+), 8 deletions(-) create mode 100644 src/day4/Puzzle1.scala create mode 100644 tests/day4/Puzzle1Test.scala create mode 100644 tests_res/day4/input1.txt diff --git a/README.md b/README.md index ff27c94..d2b2633 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,11 @@ This repo contains my attempt at this year's Advent of Code (2023) I will try and do some problems (probably not all of them) in Scala ## Progress: -#### Stars: 6 / 50 -| Mon | Tue | Wed | Thu | Fri | Sat | Sun | -|:---:|:---:|:---:|:---:|:-----------------:|:-----------------:|:-----------------:| -| | | | | 1
:star::star: | 2
:star::star: | 3
:star::star: | -| 4 | 5 | 6 | 7 | 8 | 9 | 10 | -| 11 | 12 | 13 | 14 | 15 | 16 | 17 | -| 18 | 19 | 20 | 21 | 22 | 23 | 24 | -| 25 | | | | | | | \ No newline at end of file +#### Stars: 7 / 50 +| Mon | Tue | Wed | Thu | Fri | Sat | Sun | +|:-----------:|:---:|:---:|:---:|:-----------------:|:-----------------:|:-----------------:| +| | | | | 1
:star::star: | 2
:star::star: | 3
:star::star: | +| 4
:star: | 5 | 6 | 7 | 8 | 9 | 10 | +| 11 | 12 | 13 | 14 | 15 | 16 | 17 | +| 18 | 19 | 20 | 21 | 22 | 23 | 24 | +| 25 | | | | | | | \ No newline at end of file diff --git a/src/day4/Puzzle1.scala b/src/day4/Puzzle1.scala new file mode 100644 index 0000000..e831552 --- /dev/null +++ b/src/day4/Puzzle1.scala @@ -0,0 +1,44 @@ +package day4 + +import scala.io.{BufferedSource, Source} + +object Puzzle1 { + case class Card(validNumbers: Array[Int], myNumbers: Array[Int]) + + var cards: Array[Card] = Array.empty + + def loadInput(path: String): Unit = { + val source: BufferedSource = Source.fromFile(path) + + val lines: Array[String] = source.getLines().toArray + cards = new Array(lines.length) + + for ((line: String, i: Int) <- lines.zipWithIndex) { + val parts: Array[String] = line.split(": +")(1).split(" +\\| +") + val validNumbers: Array[Int] = parts(0).split(" +").map(n => n.toInt) + val myNumbers: Array[Int] = parts(1).split(" +").map(n => n.toInt) + cards(i) = Card(validNumbers, myNumbers) + } + + source.close() + } + + def computeGain(): Int = { + var gain: Int = 0 + for (card: Card <- cards) { + val validCount: Int = card.validNumbers.intersect(card.myNumbers).length + if (validCount >= 1) { + gain += Math.pow(2, validCount-1).toInt + } + } + return gain + } + def solve(path: String): Int = { + loadInput(path) + return computeGain() + } + def main(args: Array[String]): Unit = { + val solution: Int = solve("res/day4/input1.txt") + println(solution) + } +} diff --git a/tests/day4/Puzzle1Test.scala b/tests/day4/Puzzle1Test.scala new file mode 100644 index 0000000..bf91e03 --- /dev/null +++ b/tests/day4/Puzzle1Test.scala @@ -0,0 +1,9 @@ +package day4 + +import org.scalatest.funsuite.AnyFunSuite + +class Puzzle1Test extends AnyFunSuite { + test("Puzzle1.solve") { + assert(Puzzle1.solve("tests_res/day4/input1.txt") == 13) + } +} diff --git a/tests_res/day4/input1.txt b/tests_res/day4/input1.txt new file mode 100644 index 0000000..71f208a --- /dev/null +++ b/tests_res/day4/input1.txt @@ -0,0 +1,6 @@ +Card 1: 41 48 83 86 17 | 83 86 6 31 17 9 48 53 +Card 2: 13 32 20 16 61 | 61 30 68 82 17 32 24 19 +Card 3: 1 21 53 59 44 | 69 82 63 72 16 21 14 1 +Card 4: 41 92 73 84 69 | 59 84 76 51 58 5 54 83 +Card 5: 87 83 26 28 32 | 88 30 70 12 93 22 82 36 +Card 6: 31 18 13 56 72 | 74 77 10 23 35 67 36 11 \ No newline at end of file