This commit is contained in:
Christian
2024-12-01 16:53:10 +01:00
commit e6f9daa020
9 changed files with 1117 additions and 0 deletions

32
.gitignore vendored Normal file
View File

@@ -0,0 +1,32 @@
# macOS
.DS_Store
# sbt specific
dist/*
target/
lib_managed/
src_managed/
project/boot/
project/plugins/project/
project/local-plugins.sbt
.history
.ensime
.ensime_cache/
.sbt-scripted/
local.sbt
# Bloop
.bsp
# VS Code
.vscode/
# Metals
.bloop/
.metals/
metals.sbt
# IDEA
.idea
.idea_modules
/.worksheet/

2
.scalafmt.conf Normal file
View File

@@ -0,0 +1,2 @@
version = "3.7.15"
runner.dialect = scala3

10
build.sbt Normal file
View File

@@ -0,0 +1,10 @@
val scala3Version = "3.5.2"
lazy val root = project
.in(file("."))
.settings(
name := "aoc-2024",
version := "0.1.0-SNAPSHOT",
scalaVersion := scala3Version,
libraryDependencies += "org.scalameta" %% "munit" % "1.0.0" % Test
)

1000
data/01.in Normal file

File diff suppressed because it is too large Load Diff

1
project/build.properties Normal file
View File

@@ -0,0 +1 @@
sbt.version=1.10.5

18
src/main/scala/Main.scala Normal file
View File

@@ -0,0 +1,18 @@
package dev.ctsk.aoc
import dev.ctsk.aoc.days._
val solvers = Map[Int, Solver](
1 -> Day01
)
@main def main(day: String, input: String): Unit =
solvers.get(day.toInt) match
case Some(solver) =>
val (timings, solution) = solver.run(input)
println(f"Preprocessing: ${timings.prep}%24s μs")
println(f"Part 1: ${solution.p1}%15s ${timings.p1}%15s μs")
println(f"Part 2: ${solution.p2}%15s ${timings.p2}%15s μs")
case None =>
println(s"Day $day not solved")

View File

@@ -0,0 +1,15 @@
package dev.ctsk.aoc
case class Timings(prep: Long, p1: Long, p2: Long)
case class Solution(p1: String, p2: String)
abstract class Solver(day: Int):
def run(input: String): (Timings, Solution)
def timed[A](solution: => A): (Long, A) =
val start = System.nanoTime()
val result = solution
val end = System.nanoTime()
((end - start) / 1000, result)

View File

@@ -0,0 +1,30 @@
package dev.ctsk.aoc.days
import dev.ctsk.aoc._
object Day01 extends Solver(1):
type Input = (Array[Int], Array[Int])
def pre(input: String): Input =
io.Source
.fromFile(input)
.getLines()
.map { case s"$i $j" => (i.toInt, j.toInt) }
.toArray
.unzip match { case (left, right) => (left.sorted, right.sorted) }
def part1(input: Input): String =
input match
case (left, right) => left.zip(right).map(_ - _).map(_.abs).sum.toString
def part2(input: Input): String =
val (left, right) = input;
val counts = right.groupBy(identity).mapValues(_.length).toMap
left.map(n => n * counts.getOrElse(n, 0)).sum.toString
def run(input: String): (Timings, Solution) =
val (pre_time, pre_input) = timed { pre(input) }
val (p1_time, p1_solution) = timed { part1(pre_input) }
val (p2_time, p2_solution) = timed { part2(pre_input) }
(Timings(pre_time, p1_time, p2_time), Solution(p1_solution, p2_solution))

View File

@@ -0,0 +1,9 @@
// For more information on writing tests, see
// https://scalameta.org/munit/docs/getting-started.html
class MySuite extends munit.FunSuite {
test("example test that succeeds") {
val obtained = 42
val expected = 42
assertEquals(obtained, expected)
}
}