From 470eeacbf2bd30cf6901f8d6ed0b79151cf1fd41 Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Mon, 11 Dec 2023 07:39:19 +0100 Subject: [PATCH] day 11 puzzle 1 --- README.md | 4 +- src/day11/Puzzle1.scala | 82 +++++++++++++++++++++++++++++++++++ tests/day11/Puzzle1Test.scala | 9 ++++ tests_res/day11/input1.txt | 10 +++++ 4 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 src/day11/Puzzle1.scala create mode 100644 tests/day11/Puzzle1Test.scala create mode 100644 tests_res/day11/input1.txt diff --git a/README.md b/README.md index 4eb9bf8..27055c2 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: 20 / 50 +#### Stars: 21 / 50 | Mon | Tue | Wed | Thu | Fri | Sat | Sun | |:-----------------:|:-----------------:|:-----------------:|:-----------------:|:-----------------:|:-----------------:|:------------------:| | | | | | 1
:star::star: | 2
:star::star: | 3
:star::star: | | 4
:star::star: | 5
:star::star: | 6
:star::star: | 7
:star::star: | 8
:star::star: | 9
:star::star: | 10
:star::star: | -| 11 | 12 | 13 | 14 | 15 | 16 | 17 | +| 11
:star: | 12 | 13 | 14 | 15 | 16 | 17 | | 18 | 19 | 20 | 21 | 22 | 23 | 24 | | 25 | | | | | | | \ No newline at end of file diff --git a/src/day11/Puzzle1.scala b/src/day11/Puzzle1.scala new file mode 100644 index 0000000..b283af9 --- /dev/null +++ b/src/day11/Puzzle1.scala @@ -0,0 +1,82 @@ +package day11 + +import scala.collection.mutable.ArrayBuffer +import scala.io.{BufferedSource, Source} + +object Puzzle1 { + var ogUniverse: Array[Array[Boolean]] = Array.empty + var ogHeight: Int = 0 + var ogWidth: Int = 0 + var colCounts: Array[Int] = Array.empty + var rowCounts: Array[Int] = Array.empty + var galaxies: ArrayBuffer[(Int, Int)] = new ArrayBuffer() + def loadInput(path: String): Unit = { + val source: BufferedSource = Source.fromFile(path) + val lines: Array[String] = source.getLines().toArray + + ogHeight = lines.length + ogWidth = if (ogHeight == 0) 0 else lines(0).length + ogUniverse = Array.ofDim(ogHeight, ogWidth) + + colCounts = new Array(ogWidth) + rowCounts = new Array(ogHeight) + + for ((line: String, y: Int) <- lines.zipWithIndex) { + for ((c: Char, x: Int) <- line.zipWithIndex) { + if (c == '#') { + ogUniverse(y)(x) = true + colCounts(x) += 1 + rowCounts(y) += 1 + } + } + } + + source.close() + } + + def findGalaxiesRealPos(): Unit = { + galaxies = new ArrayBuffer() + + var realX: Int = 0 + var realY: Int = 0 + + for (ogY: Int <- 0 until ogHeight) { + realX = 0 + for (ogX: Int <- 0 until ogWidth) { + if (ogUniverse(ogY)(ogX)) { + galaxies.addOne((realX, realY)) + } + if (colCounts(ogX) == 0) realX += 1 + realX += 1 + } + if (rowCounts(ogY) == 0) realY += 1 + realY += 1 + } + } + + def distance(g1: (Int, Int), g2: (Int, Int)): Int = { + return Math.abs(g2._1 - g1._1) + Math.abs(g2._2 - g1._2) + } + + def solve(path: String): Int = { + loadInput(path) + findGalaxiesRealPos() + + var solution: Int = 0 + + for (i: Int <- galaxies.indices) { + val g1: (Int, Int) = galaxies(i) + for (j: Int <- i+1 until galaxies.length) { + val g2: (Int, Int) = galaxies(j) + solution += distance(g1, g2) + } + } + + return solution + } + + def main(args: Array[String]): Unit = { + val solution: Int = solve("./res/day11/input1.txt") + println(solution) + } +} diff --git a/tests/day11/Puzzle1Test.scala b/tests/day11/Puzzle1Test.scala new file mode 100644 index 0000000..41b200b --- /dev/null +++ b/tests/day11/Puzzle1Test.scala @@ -0,0 +1,9 @@ +package day11 + +import org.scalatest.funsuite.AnyFunSuite + +class Puzzle1Test extends AnyFunSuite { + test("Puzzle1.solve") { + assert(Puzzle1.solve("tests_res/day11/input1.txt") == 374) + } +} diff --git a/tests_res/day11/input1.txt b/tests_res/day11/input1.txt new file mode 100644 index 0000000..a0bda53 --- /dev/null +++ b/tests_res/day11/input1.txt @@ -0,0 +1,10 @@ +...#...... +.......#.. +#......... +.......... +......#... +.#........ +.........# +.......... +.......#.. +#...#..... \ No newline at end of file