From 94a68e31d73b3c84db78b86a5b3f979637b8f9b3 Mon Sep 17 00:00:00 2001 From: Matti Lupari Date: Tue, 3 Dec 2024 13:06:10 +0200 Subject: [PATCH] initial commit --- .gitattributes | 1 + .github/workflows/scala.yml | 22 +++++ .gitignore | 6 ++ .scalafmt.conf | 4 + README.md | 7 ++ build.sbt | 11 +++ project/build.properties | 1 + src/main/resources/day01.txt | Bin 0 -> 9026 bytes src/main/resources/day02.txt | Bin 0 -> 7839 bytes src/main/resources/day03.txt | Bin 0 -> 13021 bytes src/main/resources/day04.txt | Bin 0 -> 7911 bytes src/main/resources/day05.txt | Bin 0 -> 9284 bytes src/main/resources/day06.txt | Bin 0 -> 621 bytes src/main/resources/day07.txt | Bin 0 -> 3898 bytes src/main/resources/day08.txt | Bin 0 -> 16648 bytes src/main/resources/day09.txt | Bin 0 -> 10121 bytes src/main/resources/day10.txt | Bin 0 -> 9147 bytes src/main/resources/day11.txt | Bin 0 -> 131 bytes src/main/resources/day12.txt | Bin 0 -> 177 bytes src/main/resources/day13.txt | Bin 0 -> 6958 bytes src/main/resources/day14.txt | Bin 0 -> 843 bytes src/main/resources/day15.txt | Bin 0 -> 10121 bytes src/main/resources/day16.txt | Bin 0 -> 1378 bytes src/main/resources/day17.txt | Bin 0 -> 58 bytes src/main/resources/day18.txt | Bin 0 -> 3373 bytes src/main/resources/day19.txt | Bin 0 -> 13911 bytes src/main/resources/day20.txt | Bin 0 -> 10635 bytes src/main/resources/day21.txt | Bin 0 -> 81 bytes src/main/resources/day22.txt | Bin 0 -> 20826 bytes src/main/resources/day24.txt | Bin 0 -> 2069 bytes src/main/resources/day25.txt | Bin 0 -> 19201 bytes src/main/scala/challenge/Day01.scala | 10 +++ src/main/scala/challenge/Day02.scala | 41 ++++++++++ src/main/scala/challenge/Day03.scala | 31 +++++++ src/main/scala/challenge/Day04.scala | 42 ++++++++++ src/main/scala/challenge/Day05.scala | 21 +++++ src/main/scala/challenge/Day06.scala | 17 ++++ src/main/scala/challenge/Day07.scala | 17 ++++ src/main/scala/challenge/Day08.scala | 50 ++++++++++++ src/main/scala/challenge/Day09.scala | 29 +++++++ src/main/scala/challenge/Day10.scala | 41 ++++++++++ src/main/scala/challenge/Day11.scala | 39 +++++++++ src/main/scala/challenge/Day12.scala | 40 +++++++++ src/main/scala/challenge/Day13.scala | 45 +++++++++++ src/main/scala/challenge/Day14.scala | 38 +++++++++ src/main/scala/challenge/Day15.scala | 30 +++++++ src/main/scala/challenge/Day16.scala | 64 +++++++++++++++ src/main/scala/challenge/Day17.scala | 33 ++++++++ src/main/scala/challenge/Day18.scala | 70 ++++++++++++++++ src/main/scala/challenge/Day19.scala | 103 ++++++++++++++++++++++++ src/main/scala/challenge/Day20.scala | 45 +++++++++++ src/main/scala/challenge/Day21.scala | 62 ++++++++++++++ src/main/scala/challenge/Day22.scala | 97 ++++++++++++++++++++++ src/main/scala/challenge/Day24.scala | 38 +++++++++ src/main/scala/challenge/Day25.scala | 26 ++++++ src/main/scala/lib/Graphs.scala | 67 +++++++++++++++ src/main/scala/lib/GridExtensions.scala | 29 +++++++ src/main/scala/lib/Math.scala | 18 +++++ src/main/scala/lib/Numbers.scala | 10 +++ src/main/scala/lib/Parsers.scala | 80 ++++++++++++++++++ src/main/scala/lib/Points.scala | 71 ++++++++++++++++ src/test/scala/Test01.scala | 9 +++ src/test/scala/Test02.scala | 9 +++ src/test/scala/Test03.scala | 9 +++ src/test/scala/Test04.scala | 9 +++ src/test/scala/Test05.scala | 9 +++ src/test/scala/Test06.scala | 9 +++ src/test/scala/Test07.scala | 9 +++ src/test/scala/Test08.scala | 9 +++ src/test/scala/Test09.scala | 9 +++ src/test/scala/Test10.scala | 9 +++ src/test/scala/Test11.scala | 9 +++ src/test/scala/Test12.scala | 9 +++ src/test/scala/Test13.scala | 15 ++++ src/test/scala/Test14.scala | 9 +++ src/test/scala/Test15.scala | 9 +++ src/test/scala/Test16.scala | 9 +++ src/test/scala/Test17.scala | 9 +++ src/test/scala/Test18.scala | 9 +++ src/test/scala/Test19.scala | 9 +++ src/test/scala/Test20.scala | 9 +++ src/test/scala/Test21.scala | 9 +++ src/test/scala/Test22.scala | 9 +++ src/test/scala/Test24.scala | 9 +++ src/test/scala/Test25.scala | 8 ++ 85 files changed, 1577 insertions(+) create mode 100644 .gitattributes create mode 100644 .github/workflows/scala.yml create mode 100644 .gitignore create mode 100644 .scalafmt.conf create mode 100644 README.md create mode 100644 build.sbt create mode 100644 project/build.properties create mode 100644 src/main/resources/day01.txt create mode 100644 src/main/resources/day02.txt create mode 100644 src/main/resources/day03.txt create mode 100644 src/main/resources/day04.txt create mode 100644 src/main/resources/day05.txt create mode 100644 src/main/resources/day06.txt create mode 100644 src/main/resources/day07.txt create mode 100644 src/main/resources/day08.txt create mode 100644 src/main/resources/day09.txt create mode 100644 src/main/resources/day10.txt create mode 100644 src/main/resources/day11.txt create mode 100644 src/main/resources/day12.txt create mode 100644 src/main/resources/day13.txt create mode 100644 src/main/resources/day14.txt create mode 100644 src/main/resources/day15.txt create mode 100644 src/main/resources/day16.txt create mode 100644 src/main/resources/day17.txt create mode 100644 src/main/resources/day18.txt create mode 100644 src/main/resources/day19.txt create mode 100644 src/main/resources/day20.txt create mode 100644 src/main/resources/day21.txt create mode 100644 src/main/resources/day22.txt create mode 100644 src/main/resources/day24.txt create mode 100644 src/main/resources/day25.txt create mode 100644 src/main/scala/challenge/Day01.scala create mode 100644 src/main/scala/challenge/Day02.scala create mode 100644 src/main/scala/challenge/Day03.scala create mode 100644 src/main/scala/challenge/Day04.scala create mode 100644 src/main/scala/challenge/Day05.scala create mode 100644 src/main/scala/challenge/Day06.scala create mode 100644 src/main/scala/challenge/Day07.scala create mode 100644 src/main/scala/challenge/Day08.scala create mode 100644 src/main/scala/challenge/Day09.scala create mode 100644 src/main/scala/challenge/Day10.scala create mode 100644 src/main/scala/challenge/Day11.scala create mode 100644 src/main/scala/challenge/Day12.scala create mode 100644 src/main/scala/challenge/Day13.scala create mode 100644 src/main/scala/challenge/Day14.scala create mode 100644 src/main/scala/challenge/Day15.scala create mode 100644 src/main/scala/challenge/Day16.scala create mode 100644 src/main/scala/challenge/Day17.scala create mode 100644 src/main/scala/challenge/Day18.scala create mode 100644 src/main/scala/challenge/Day19.scala create mode 100644 src/main/scala/challenge/Day20.scala create mode 100644 src/main/scala/challenge/Day21.scala create mode 100644 src/main/scala/challenge/Day22.scala create mode 100644 src/main/scala/challenge/Day24.scala create mode 100644 src/main/scala/challenge/Day25.scala create mode 100644 src/main/scala/lib/Graphs.scala create mode 100644 src/main/scala/lib/GridExtensions.scala create mode 100644 src/main/scala/lib/Math.scala create mode 100644 src/main/scala/lib/Numbers.scala create mode 100644 src/main/scala/lib/Parsers.scala create mode 100644 src/main/scala/lib/Points.scala create mode 100644 src/test/scala/Test01.scala create mode 100644 src/test/scala/Test02.scala create mode 100644 src/test/scala/Test03.scala create mode 100644 src/test/scala/Test04.scala create mode 100644 src/test/scala/Test05.scala create mode 100644 src/test/scala/Test06.scala create mode 100644 src/test/scala/Test07.scala create mode 100644 src/test/scala/Test08.scala create mode 100644 src/test/scala/Test09.scala create mode 100644 src/test/scala/Test10.scala create mode 100644 src/test/scala/Test11.scala create mode 100644 src/test/scala/Test12.scala create mode 100644 src/test/scala/Test13.scala create mode 100644 src/test/scala/Test14.scala create mode 100644 src/test/scala/Test15.scala create mode 100644 src/test/scala/Test16.scala create mode 100644 src/test/scala/Test17.scala create mode 100644 src/test/scala/Test18.scala create mode 100644 src/test/scala/Test19.scala create mode 100644 src/test/scala/Test20.scala create mode 100644 src/test/scala/Test21.scala create mode 100644 src/test/scala/Test22.scala create mode 100644 src/test/scala/Test24.scala create mode 100644 src/test/scala/Test25.scala diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..527dce1 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +src/main/resources/*.txt filter=git-crypt diff=git-crypt diff --git a/.github/workflows/scala.yml b/.github/workflows/scala.yml new file mode 100644 index 0000000..e2dc28c --- /dev/null +++ b/.github/workflows/scala.yml @@ -0,0 +1,22 @@ +name: Tests + +on: [push] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Set up JDK 21 + uses: actions/setup-java@v3 + with: + java-version: 21 + distribution: temurin + - name: Unlock git-crypt + run: | + sudo apt-get update + sudo apt-get install -y git-crypt + echo ${{ secrets.GIT_CRYPT_KEY }} | base64 -d | git-crypt unlock - + - name: Run tests + run: sbt test diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..59efb1b --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +target +*.sc +project/project +.bloop +.vscode +.metals diff --git a/.scalafmt.conf b/.scalafmt.conf new file mode 100644 index 0000000..6e8673e --- /dev/null +++ b/.scalafmt.conf @@ -0,0 +1,4 @@ +version = "3.0.5" +runner.dialect = scala3 +align.preset = more +maxColumn = 100 diff --git a/README.md b/README.md new file mode 100644 index 0000000..a282877 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# aoc2021 + +[![Scala CI](https://github.com/lupari/aoc2021/actions/workflows/scala.yml/badge.svg)](https://github.com/lupari/aoc2021/actions?query=workflow%3A%22Scala+CI%22) + +Advent of Code 2021 (http://adventofcode.com/2021) personal exercises in Scala + +For running these you need SBT (http://scala-sbt.org) installed. diff --git a/build.sbt b/build.sbt new file mode 100644 index 0000000..c95583f --- /dev/null +++ b/build.sbt @@ -0,0 +1,11 @@ +name := "aoc2024" + +version := "0.1" + +scalaVersion := "3.3.1" + +libraryDependencies += "org.scala-lang.modules" %% "scala-parser-combinators" % "2.3.0" + +libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.17" % "test" + +scalacOptions += "-deprecation" diff --git a/project/build.properties b/project/build.properties new file mode 100644 index 0000000..b19d4e1 --- /dev/null +++ b/project/build.properties @@ -0,0 +1 @@ +sbt.version = 1.9.7 diff --git a/src/main/resources/day01.txt b/src/main/resources/day01.txt new file mode 100644 index 0000000000000000000000000000000000000000..1e83a3732487c1b04bfda83d45deb7f53697d37e GIT binary patch literal 9026 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/day02.txt b/src/main/resources/day02.txt new file mode 100644 index 0000000000000000000000000000000000000000..5252e8ef24ecb60ccb3e9a06a6eefcd137e032a9 GIT binary patch literal 7839 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/day03.txt b/src/main/resources/day03.txt new file mode 100644 index 0000000000000000000000000000000000000000..ea9dcefcffbcc9e57b4384de37ce3c130ab67047 GIT binary patch literal 13021 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 RoafZt?ijoA$e6aE0#(krQ!fAj literal 0 HcmV?d00001 diff --git a/src/main/resources/day05.txt b/src/main/resources/day05.txt new file mode 100644 index 0000000000000000000000000000000000000000..2aae6a3b667ee3992ec32a38d53aa9aa76c7e634 GIT binary patch literal 9284 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 Ixg}I}2*{g%rT_o{ literal 0 HcmV?d00001 diff --git a/src/main/resources/day08.txt b/src/main/resources/day08.txt new file mode 100644 index 0000000000000000000000000000000000000000..74b1a037b40ab8d5c88271204c803598ee2c6329 GIT binary patch literal 16648 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/day10.txt b/src/main/resources/day10.txt new file mode 100644 index 0000000000000000000000000000000000000000..45db1a40bbbc1e7d02ebc2d8f0b3d2c903b6bd44 GIT binary patch literal 9147 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/day12.txt b/src/main/resources/day12.txt new file mode 100644 index 0000000000000000000000000000000000000000..fabf1506369281f871c48fad7a9ec84a8138b398 GIT binary patch literal 177 zcmV;i08ak^M@dveQdv+`0B4=ds7)D!V!Y&@1(oZ%Y62!DECbn6l*R*oz1&e+*#VI( z_zyfRt?m;PKm3-Dx4OR7vE?Da`rA?0a5g@xW8@1R5|6>#s=D*^!yjL;ZHqjvy@wdH zxcL@I`de*K)d&QBAO)GND7Xcyte!qbaiOt#D)>x&uiQjm11E47LmXIgn{%`gBtzde f{gkbn$kV*TRjg(_!%N_6gs=)JD_Rzg6B~_VmLyVE literal 0 HcmV?d00001 diff --git a/src/main/resources/day13.txt b/src/main/resources/day13.txt new file mode 100644 index 0000000000000000000000000000000000000000..a4cc45c941305222f34ee7eb229c2f838891118d GIT binary patch literal 6958 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/day16.txt b/src/main/resources/day16.txt new file mode 100644 index 0000000000000000000000000000000000000000..5ed7edba6ad9d5be217c8534717144404ffde4fb GIT binary patch literal 1378 zcmV-o1)cf;M@dveQdv+`06&hF3fZiyxhPP0ot2P;a|Lcx+NKex*?UlSZK+HBTJoQc z5z^5r`69S2g9zeEuB@X31wNs;Fs<500+D8s{oDLJ{CLE8#>thIHZ*DOwAeVwXy|f# z4u;tq1Krc}@046oc)B*Qaib88)&1?T+K#yiOeHt|5{OdNgi5J%4Fldx|G_~{%5jf7 z!Q2s>*B`&=AQve+OK6bUgAFhhwk^A9#pyF++|oY&!|Q}603w2({dG>Iv?G*Y6VxPt zIn0Sigo{tm3`KS89Qt2Dr719Qj?8^e`-x}G=0ohSpfi5|I3+_qE${G7g>=>yse`=; zjg@xR|KIE&15+@&%Al)qp&Mcw71d>V2HwL@2U!&no6l+?$))BNOQNG+2?boiBvl#3 z(qx_HHZg7$ZBip<4o_-LMDueUN1g}0a(0T3u9854~=QHCywz37|Ox4;z zG{ua)f0W3~(70Ji?2`<*LmX?ip7dQAzl8l;uN*{l;Rx{YFQ?}20h@cuGol*{?k1H? zQ;2!klYO&8Ta!UDn=5?-6i3Nkjmdjniu^+Eecl#57u@)zG_)iqO;jlV zojf8A$eO!X%e9y0e2ef~h_?9f=uow97Y(s<>Ch^%2xa#+ox=PksZA)jl!)t57VGNG zp?J2A(QEx(f6u3GQ-URiiU7A(TANa{OMn@0WfPeZXBx5!V+&KNU^)#jo=`J$isRPb zVQohr<8|>0Fjd8TqcS;@jwKZxJX;eCGHuBG*Vr8egUHBO4iIGfL5olyh94_83wl1M z&tlCvzzbYT<*L;N!>3sN=#fZu1w8wf2FN0Os@T~2|4fR6QwXO7&qKNgbl$=Mu^}(w zzaLyq70_L1;*5nsQ~`?tih`#B%dP7?YrXZWNP+^$Z-lDyY^4eVoCPMK7ZJgDaP2Mw zvXF&*9@*^UvG9rng&je;-R7Lp^&(W89BYjgck?v47v1#nBtAHJYwA+9>_*dTsemx- z83--EGk-j%s`~bY-fM0V;`Hd1Voc(we|>_8yZAwI;Y5&|VQ_%Gh1cJ#VVzYpM09*D zf=UyXAtcS9U=#$hwvRkQ{Y$y0QW2jD zz~{uFhQT#f>-m(8!>Ym4ls8>zIQJcIOFjEntye->9kpm26k!)_TEm8Hp>hBJNe76< z5UMlW%QWu@6X*BYlKpyc2X&3uEmzASL|dv>7A_>6MwFo8bbDik?VQH!<9hgKy5E97 zs}P3T#CgOVUpww8!zID(f5mL%ZGG5>%i%c)8nL?NucqMYIL@Z}?33_o zSj}}m01U~~Mv)@KTiP_r&Ui7L@CPV#S`g>OWGkLel~fy69qlWwUC~b2149hES)dv$ z7YUOmtA034g}ru3mM4;WU>l`rpTUlqev0I!mQ z`yncX=6CIW)~K)KnR^Z#skW(ZDnD;2-x5BqdW>7h;1RiJyex$%_kj-zGxusUIJt*P k{4!>sacnZ*|G}>;+)tzGnJ3sO>} Q#MI^DAzQQO#tzNDL5YBU+ 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 DyX=vL literal 0 HcmV?d00001 diff --git a/src/main/resources/day19.txt b/src/main/resources/day19.txt new file mode 100644 index 0000000000000000000000000000000000000000..110031f3f19b2152279d1152e89d15834f077699 GIT binary patch literal 13911 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/day20.txt b/src/main/resources/day20.txt new file mode 100644 index 0000000000000000000000000000000000000000..9aac69c37769efbf107e0fb71ecebd6e933eab3d GIT binary patch literal 10635 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/day22.txt b/src/main/resources/day22.txt new file mode 100644 index 0000000000000000000000000000000000000000..6dcd55eb42358cda278adf5a2d95b89659e8e744 GIT binary patch literal 20826 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

tk_Ah#z0aQ6vT9yWB^QTfMw1fZz z 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 literal 0 HcmV?d00001 diff --git a/src/main/scala/challenge/Day01.scala b/src/main/scala/challenge/Day01.scala new file mode 100644 index 0000000..61e0b83 --- /dev/null +++ b/src/main/scala/challenge/Day01.scala @@ -0,0 +1,10 @@ +package challenge + +import scala.io.Source + +object Day01: + + val input: List[Int] = Source.fromResource("day01.txt").getLines().map(_.toInt).toList + + def partOne(): Int = input.sliding(2).count(p => p.last > p.head) + def partTwo(): Int = input.sliding(4).count(p => p.last > p.head) diff --git a/src/main/scala/challenge/Day02.scala b/src/main/scala/challenge/Day02.scala new file mode 100644 index 0000000..305f31e --- /dev/null +++ b/src/main/scala/challenge/Day02.scala @@ -0,0 +1,41 @@ +package challenge + +import scala.io.Source +import lib.Points.{Point, Position} + +object Day02: + + trait Cmd + case class MoveHorizontal(amount: Int) extends Cmd + case class MoveVertical(amount: Int) extends Cmd + + trait Pos: + val p: Point + val product: Int = p.x * p.y + def moveHorizontal(n: Int): Pos + def moveVertical(n: Int): Pos + + case class Pos1(p: Point) extends Pos: + override def moveHorizontal(n: Int) = Pos1(p + Point(n, 0)) + override def moveVertical(n: Int) = Pos1(p + Point(0, n)) + + case class Pos2(p: Point, aim: Int = 0) extends Pos: + override def moveHorizontal(n: Int) = copy(p = p + Point(n, aim * n)) + override def moveVertical(n: Int) = copy(aim = aim + n) + + private val regex = """(forward|down|up) (\d+)""".r + def parse(cmd: String): Cmd = cmd match + case regex(name, amount) => + name match + case "forward" => MoveHorizontal(amount.toInt) + case "down" => MoveVertical(amount.toInt) + case "up" => MoveVertical(-amount.toInt) + + def advance(pos: Pos, cmd: Cmd): Pos = cmd match + case MoveHorizontal(n) => pos.moveHorizontal(n) + case MoveVertical(n) => pos.moveVertical(n) + + val input: List[Cmd] = Source.fromResource("day02.txt").getLines().map(parse).toList + + def partOne(): Int = input.foldLeft(Pos1(Position.zero))(advance).product + def partTwo(): Int = input.foldLeft(Pos2(Position.zero))(advance).product diff --git a/src/main/scala/challenge/Day03.scala b/src/main/scala/challenge/Day03.scala new file mode 100644 index 0000000..4325d06 --- /dev/null +++ b/src/main/scala/challenge/Day03.scala @@ -0,0 +1,31 @@ +package challenge + +import scala.io.Source +import scala.annotation.tailrec +import lib.Numbers._ + +object Day03: + + def commonest(xs: List[Char]): Char = if xs.count(_ == '0') > xs.length / 2 then '0' else '1' + def rarest(xs: List[Char]): Char = if commonest(xs) == '0' then '1' else '0' + def findMatch(xs: List[String])(fn: (List[Char]) => Char): String = + @tailrec + def helper(xs: List[String], i: Int): String = xs match + case h :: Nil => h + case _ => + val c = xs.transpose.map(fn)(i) + helper(xs.filter(x => x(i) == c), i + 1) + + helper(xs, 0) + + val input: List[String] = Source.fromResource("day03.txt").getLines().toList + + def partOne(): Long = + val gamma = input.transpose.map(commonest).mkString + val epsilon = input.transpose.map(rarest).mkString + bin2dec(gamma) * bin2dec(epsilon) + + def partTwo(): Long = + val o = findMatch(input)(commonest) + val co2 = findMatch(input)(rarest) + bin2dec(o) * bin2dec(co2) diff --git a/src/main/scala/challenge/Day04.scala b/src/main/scala/challenge/Day04.scala new file mode 100644 index 0000000..dfb6686 --- /dev/null +++ b/src/main/scala/challenge/Day04.scala @@ -0,0 +1,42 @@ +package challenge + +import scala.io.Source +import scala.annotation.tailrec + +object Day04: + + case class Player(board: List[Set[Int]]): + def mark(n: Int): Player = copy(board = board.map(_ - n)) + val score: Int = board.flatten.toSet.sum + val hasBingo: Boolean = board.exists(_.isEmpty) + + def toPlayer(lines: List[List[Int]]): Player = Player((lines ++ lines.transpose).map(_.toSet)) + + def findScore()(fn: (List[Player]) => (Option[Player], List[Player])): Option[Int] = + @tailrec + def helper(xs: List[Int], ps: List[Player]): Option[Int] = xs match + case Nil => None + case h :: t => + fn(ps.map(_.mark(h))) match + case (None, ps2) => helper(t, ps2) + case (Some(p), _) => Option(p.score * h) + + helper(numbers, players) + + val input: List[String] = Source.fromResource("day04.txt").getLines().toList + val numbers: List[Int] = input.head.split(",").map(_.toInt).toList + val players: List[Player] = + input + .drop(2) + .grouped(6) + .map(_.filter(_.nonEmpty)) + .map(ls => toPlayer(ls.map(_.trim.split(" +").toList.map(_.toInt)))) + .toList + + def partOne(): Int = findScore()(ps => (ps.find(_.hasBingo), ps)).get + def partTwo(): Int = + def findLoser = (ps: List[Player]) => + val losers = ps.filterNot(_.hasBingo) + if losers.isEmpty && ps.length == 1 then (Some(ps.head), Nil) else (None, losers) + + findScore()(findLoser).get diff --git a/src/main/scala/challenge/Day05.scala b/src/main/scala/challenge/Day05.scala new file mode 100644 index 0000000..fb24604 --- /dev/null +++ b/src/main/scala/challenge/Day05.scala @@ -0,0 +1,21 @@ +package challenge + +import scala.io.Source +import lib.Points.{Point, Line} + +object Day05: + + private val regex = """(\d+),(\d+) -> (\d+),(\d+)""".r + def parse(s: String): Line = s match + case regex(x1, y1, x2, y2) => Line(Point(x1.toInt, y1.toInt), Point(x2.toInt, y2.toInt)) + + def intersections(lines: List[Line]): Int = + lines + .flatMap(_.points()) + .groupBy(identity) + .values + .count(_.length > 1) + + val input: List[Line] = Source.fromResource("day05.txt").getLines().map(parse).toList + def partOne(): Int = intersections(input.filter(l => l.dx == 0 || l.dy == 0)) + def partTwo(): Int = intersections(input) diff --git a/src/main/scala/challenge/Day06.scala b/src/main/scala/challenge/Day06.scala new file mode 100644 index 0000000..53f3b85 --- /dev/null +++ b/src/main/scala/challenge/Day06.scala @@ -0,0 +1,17 @@ +package challenge + +import scala.io.Source + +object Day06: + + def evolve(population: Map[Int, Long]): Map[Int, Long] = + val population2 = population.filter(_._1 > 0).map(p => p._1 - 1 -> p._2) + val eights = population.get(0).getOrElse(0L) + val sixes = eights + population.get(7).getOrElse(0L) + population2 + (6 -> sixes) + (8 -> eights) + + val input: List[Int] = Source.fromResource("day06.txt").mkString.split(",").map(_.toInt).toList + val population: Map[Int, Long] = input.groupMapReduce(identity)(_ => 1L)(_ + _) + + def partOne(): Long = Iterator.iterate(population)(evolve).drop(80).next.values.sum + def partTwo(): Long = Iterator.iterate(population)(evolve).drop(256).next.values.sum diff --git a/src/main/scala/challenge/Day07.scala b/src/main/scala/challenge/Day07.scala new file mode 100644 index 0000000..15111eb --- /dev/null +++ b/src/main/scala/challenge/Day07.scala @@ -0,0 +1,17 @@ +package challenge + +import scala.io.Source +import lib.Math._ + +object Day07: + + def fuelCost(n: Int)(costFn: (Int, Int) => Int): Int = crabs.map(costFn(n, _)).sum + + val crabs: List[Int] = Source.fromResource("day07.txt").mkString.split(",").map(_.toInt).toList + + def partOne(): Int = fuelCost(median(crabs))((a, b) => (a - b).abs) + def partTwo(): Int = + val avg = mean(crabs) + Seq(avg.floor.toInt, avg.ceil.toInt) + .map(fuelCost(_)((a, b) => arithmeticSeries(a, b, normalized = true))) + .min diff --git a/src/main/scala/challenge/Day08.scala b/src/main/scala/challenge/Day08.scala new file mode 100644 index 0000000..ba450b5 --- /dev/null +++ b/src/main/scala/challenge/Day08.scala @@ -0,0 +1,50 @@ +package challenge + +import scala.io.Source + +object Day08: + + type Digit = Set[Char] + case class Entry(pattern: Seq[Digit], output: Seq[Digit]) + + def find06(s1: Digit, s2: Digit, five: Digit) = + if (five &~ s1).nonEmpty then (s1, s2) else (s2, s1) + + def find25(s1: Digit, s2: Digit, nine: Digit) = + if (s1 &~ nine).nonEmpty then (s1, s2) else (s2, s1) + + def find3(s1: Digit, s2: Digit, s3: Digit) = + s1 &~ (s2 | s3) match + case s if s.isEmpty => (s1, (s2, s3)) + case _ => + if (s2 &~ (s1 | s3)).isEmpty then (s2, (s1, s3)) else (s3, (s1, s2)) + + def find9(s1: Digit, s2: Digit, s3: Digit, three: Digit) = + three &~ s1 match + case s if s.isEmpty => (s1, (s2, s3)) + case _ => + if (three &~ s2).isEmpty then (s2, (s1, s3)) else (s3, (s1, s2)) + + def decode(entry: Entry): Int = + val Seq(f1, f2, f3) = entry.pattern.filter(_.size == 5) + val Seq(s1, s2, s3) = entry.pattern.filter(_.size == 6) + val (three, (f4, f5)) = find3(f1, f2, f3) + val (nine, (s4, s5)) = find9(s1, s2, s3, three) + val (two, five) = find25(f4, f5, nine) + val (zero, six) = find06(s4, s5, five) + val cipher = Map(0 -> zero, 2 -> two, 3 -> three, 5 -> five, 6 -> six, 9 -> nine) + + def num(d: Digit): Option[Int] = predef.get(d.size).orElse(cipher.find(_._2 == d).map(_._1)) + + entry.output.flatMap(num).mkString.toInt + + def parse(s: String): Entry = + def _parse(xs: String) = xs.split(" ").map(_.toSet).toSeq + val (pattern, output) = (s.takeWhile(_ != '|'), s.dropWhile(_ != '|')) + Entry(_parse(pattern), _parse(output)) + + val entries: List[Entry] = Source.fromResource("day08.txt").getLines().map(parse).toList + val predef: Map[Int, Int] = Map(2 -> 1, 3 -> 7, 4 -> 4, 7 -> 8) + + def partOne(): Int = entries.flatMap(_.output).count(o => predef.contains(o.size)) + def partTwo(): Int = entries.map(decode).sum diff --git a/src/main/scala/challenge/Day09.scala b/src/main/scala/challenge/Day09.scala new file mode 100644 index 0000000..f05046f --- /dev/null +++ b/src/main/scala/challenge/Day09.scala @@ -0,0 +1,29 @@ +package challenge + +import scala.io.Source +import scala.annotation.tailrec +import lib.Points.Point +import lib.Graphs + +object Day09: + + import lib.GridExtensions._ + + def isLowPoint(p: Point): Boolean = p.neighbors.forall(n => grid(n) > grid(p)) + + lazy val basins: List[Set[Point]] = + @tailrec + def helper(xs: Set[Point], acc: List[Set[Point]]): List[Set[Point]] = xs match + case s if s.isEmpty => acc + case s => + val basin = Graphs.bfs(s.head)(_.neighbors.filterNot(grid(_) == 9)).keySet + helper(s -- basin, acc :+ basin) + + helper(lowPoints.keySet, Nil) + + val grid: Grid[Int] = + Source.fromResource("day09.txt").mkString.toList.toIntGrid.withDefaultValue(9) + val lowPoints: Grid[Int] = grid.filter(kv => isLowPoint(kv._1)) + + def partOne(): Int = lowPoints.map(_._2 + 1).sum + def partTwo(): Int = basins.map(_.size).sorted.takeRight(3).product diff --git a/src/main/scala/challenge/Day10.scala b/src/main/scala/challenge/Day10.scala new file mode 100644 index 0000000..69745b4 --- /dev/null +++ b/src/main/scala/challenge/Day10.scala @@ -0,0 +1,41 @@ +package challenge + +import scala.io.Source +import scala.annotation.tailrec + +object Day10: + + type Inspection = Either[Char, List[Char]] + case class Chunk(closure: Char, errorScore: Int, completionScore: Int) + val chunks = Map( + '(' -> Chunk(')', 3, 1), + '[' -> Chunk(']', 57, 2), + '{' -> Chunk('}', 1197, 3), + '<' -> Chunk('>', 25137, 4) + ) + + def errorScore(c: Char): Int = chunks.find(_._2.closure == c).get._2.errorScore + def autocomplete(xs: List[Char]): Long = + xs.reverse.foldLeft(0L)((a, b) => a * 5 + chunks(b).completionScore) + + def inspect(s: String): Inspection = + @tailrec + def helper(xs: List[Char], unclosed: List[Char]): Inspection = xs match + case Nil => Right(unclosed) + case h :: t => + chunks.find(_._2.closure == h) match + case None => + helper(t, unclosed :+ h) + case Some(x, _) => + if unclosed.last == x then helper(t, unclosed.init) + else Left(h) + + helper(s.toList.tail, List(s.head)) + + val input: List[String] = Source.fromResource("day10.txt").getLines().toList + val lines: List[Inspection] = input.map(inspect) + + def partOne(): Int = lines.collect({ case Left(e) => errorScore(e) }).sum + def partTwo(): Long = + val scores = lines.collect({ case Right(l) => autocomplete(l) }) + scores.sorted.drop(scores.length / 2).head diff --git a/src/main/scala/challenge/Day11.scala b/src/main/scala/challenge/Day11.scala new file mode 100644 index 0000000..94576da --- /dev/null +++ b/src/main/scala/challenge/Day11.scala @@ -0,0 +1,39 @@ +package challenge + +import scala.io.Source +import scala.annotation.tailrec +import lib.Points.Point + +object Day11 { + import lib.GridExtensions._ + + def evolve(xs: Grid[Int]): Grid[Int] = + @tailrec + def helper(prev: Set[Point], grid: Grid[Int]): Grid[Int] = + val flashed = grid.filter(_._2 > 9).map(_._1).toSet -- prev + if flashed.isEmpty then grid.map(kv => (kv._1, if kv._2 > 9 then 0 else kv._2)) + else + val incOne = flashed.toList.flatMap(_.surroundings).groupMapReduce(identity)(_ => 1)(_ + _) + val g2 = grid.map(kv => (kv._1, kv._2 + incOne.getOrElse(kv._1, 0))).toMap + helper(flashed ++ prev, g2) + + helper(Set.empty, xs.map(kv => (kv._1, kv._2 + 1))) + + val input: Grid[Int] = Source.fromResource("day11.txt").mkString.toList.toIntGrid + + def partOne(): Int = + Iterator + .iterate((input, 0))(x => (evolve(x._1), x._2 + x._1.count(_._2 == 0))) + .drop(101) + .next + ._2 + + def partTwo(): Int = + Iterator + .iterate(input)(evolve) + .zipWithIndex + .dropWhile(x => x._1.count(_._2 == 0) != 100) + .next + ._2 + +} diff --git a/src/main/scala/challenge/Day12.scala b/src/main/scala/challenge/Day12.scala new file mode 100644 index 0000000..fd5cd47 --- /dev/null +++ b/src/main/scala/challenge/Day12.scala @@ -0,0 +1,40 @@ +package challenge + +import scala.io.Source +import lib.Graphs + +object Day12: + + type Caves = Map[String, Set[String]] + case class Node(path: List[String], revisited: Boolean = false) + + def neighbors(node: Node): Set[Node] = + caves(node.path.head) + .filter(n => n.forall(_.isUpper) || !node.path.contains(n)) + .map(n => Node(n :: node.path)) + + def neighbors2(node: Node): Set[Node] = node.path match + case h :: t if h != "end" => + caves(h) + .filter(n => n != "start" && (node.revisited || n.forall(_.isUpper) || !t.contains(n))) + .map(n => + val revisit = + if node.revisited && n.forall(_.isLower) && t.contains(n) then false + else node.revisited + Node(n :: node.path, revisit) + ) + case _ => Set.empty + + def search(start: Node)(nf: (Node) => Set[Node]) = + val nodes = Graphs.bfs(start)(nf) + nodes.count(_._1.path.head == "end") + + def parse(input: List[String]): Caves = + val parts = input.map(_.split('-').toList) + val graph = parts.flatMap(x => Seq((x.head, x.last), (x.last, x.head))) + graph.groupMapReduce(_._1)(kv => Set(kv._2))(_ ++ _) + + val caves: Caves = parse(Source.fromResource("day12.txt").getLines().toList) + + def partOne() = search(Node(List("start")))(neighbors) + def partTwo() = search(Node(List("start"), revisited = true))(neighbors2) diff --git a/src/main/scala/challenge/Day13.scala b/src/main/scala/challenge/Day13.scala new file mode 100644 index 0000000..4c66728 --- /dev/null +++ b/src/main/scala/challenge/Day13.scala @@ -0,0 +1,45 @@ +package challenge + +import scala.io.Source +import lib.Points.Point + +object Day13: + import lib.GridExtensions._ + + trait Fold + case class XFold(i: Int) extends Fold + case class YFold(i: Int) extends Fold + + private val pointRegex = """(\d+),(\d+)""".r + def parsePoint(s: String): (Point, Char) = s match + case pointRegex(a, b) => (Point(a.toInt, b.toInt), '#') + + private val foldRegex = """fold along (x|y)=(\d+)""".r + def parseFold(s: String): Fold = s match + case foldRegex("x", x) => XFold(x.toInt) + case foldRegex("y", y) => YFold(y.toInt) + + def foldY(y: Int, grid: Grid[Char]): Grid[Char] = + val (upper, lower) = grid.partition(_._1.y < y) + val max = grid.maxBy(_._1.y)._1.y + val folded = lower.map(kv => (Point(kv._1.x, max - kv._1.y), kv._2)) + folded ++ upper + + def foldX(x: Int, grid: Grid[Char]): Grid[Char] = + val (left, right) = grid.partition(_._1.x < x) + val max = grid.maxBy(_._1.x)._1.x + val folded = right.map(kv => (Point(max - kv._1.x, kv._1.y), kv._2)) + folded ++ left + + def fold(f: Fold, g: Grid[Char]) = f match + case XFold(x) => foldX(x, g) + case YFold(y) => foldY(y, g) + + val input: List[String] = Source.fromResource("day13.txt").getLines().toList + val grid: Grid[Char] = input.takeWhile(_.nonEmpty).map(parsePoint).toMap + val folds: List[Fold] = input.dropWhile(!_.startsWith("fold")).map(parseFold) + + def partOne(): Int = fold(folds.head, grid).count(_._2 == '#') + def partTwo(): Array[Array[Char]] = + val g = folds.foldLeft(grid)((a, b) => fold(b, a)) + g.canvas(' ')(c => if c == '#' then '█' else c) diff --git a/src/main/scala/challenge/Day14.scala b/src/main/scala/challenge/Day14.scala new file mode 100644 index 0000000..96dd4a4 --- /dev/null +++ b/src/main/scala/challenge/Day14.scala @@ -0,0 +1,38 @@ +package challenge + +import scala.io.Source + +object Day14: + + type Count = Map[String, Long] + + private val regex = """(.+) -> (.+)""".r + def parse(s: String): (String, Char) = s match + case regex(a, b) => (a, b.head) + + def insert(rules: Map[String, Char])(pairs: Count): Count = + pairs.toList + .flatMap((pair, count) => + List( + (pair.head.toString + rules(pair), count), + (rules(pair).toString + pair.last.toString, count) + ) + ) + .groupMapReduce(_._1)(_._2)(_ + _) + + def count(c: Char, pairs: Count): Seq[Long] = + val counts = + pairs.toList.map((pair, count) => (pair.last, count)).groupMapReduce(_._1)(_._2)(_ + _) + (counts + (c -> counts.get(c).map(_ + 1).getOrElse(1L))).values.toSeq + + val input = Source.fromResource("day14.txt").getLines().toList + val rules = input.tail.tail.map(parse).toMap + val counts = input.head.sliding(2).toList.groupMapReduce(_.mkString)(_ => 1L)(_ + _) + + def resolve(n: Int) = + val lastCounts = Iterator.iterate(counts)(insert(rules)).drop(n).next + val c = count(input.head.head, lastCounts) + c.max - c.min + + def partOne(): Long = resolve(10) + def partTwo(): Long = resolve(40) diff --git a/src/main/scala/challenge/Day15.scala b/src/main/scala/challenge/Day15.scala new file mode 100644 index 0000000..8ef38cd --- /dev/null +++ b/src/main/scala/challenge/Day15.scala @@ -0,0 +1,30 @@ +package challenge + +import scala.io.Source +import lib.Points.Point +import lib.Graphs + +object Day15: + import lib.GridExtensions._ + + def expand(g: Grid[Int]): Grid[Int] = + val end = g.keys.maxBy(p => p.x * p.y) + val (w, h) = (end.x + 1, end.y + 1) + List + .tabulate(5, 5)((x, y) => + g.map(kv => Point(x * w + kv._1.x, y * h + kv._1.y) -> (1 + (kv._2 - 1 + x + y) % 9)) + ) + .flatten + .flatten + .toMap + + def solve(g: Grid[Int]) = + val goal: Point = Point(g.maxBy(_._1.x)._1.x, g.maxBy(_._1.y)._1.y) + def nf(p: Point) = p.neighbors.filter(g.contains) + def cf(a: Point, b: Point) = g(b) + Graphs.dijkstra(Point.zero, goal)(nf)(cf)._2.get._2 + + val grid = Source.fromResource("day15.txt").mkString.toList.toIntGrid + + def partOne(): Int = solve(grid) + def partTwo(): Int = solve(expand(grid)) diff --git a/src/main/scala/challenge/Day16.scala b/src/main/scala/challenge/Day16.scala new file mode 100644 index 0000000..8d0f9f9 --- /dev/null +++ b/src/main/scala/challenge/Day16.scala @@ -0,0 +1,64 @@ +package challenge + +import scala.io.Source +import lib.Numbers._ + +object Day16: + + trait Packet + case class Literal(version: Long, value: Long) extends Packet + case class Operator(version: Long, typeId: Long, packets: List[Packet]) extends Packet + + def parseLiteral(xs: String, version: Long) = + val (blocks1, blocks0) = xs.drop(6).grouped(5).toList.span(_.head == '1') + val value = (blocks1 :+ blocks0.head).map(_.tail).mkString + val size = 6 + (blocks1.size + 1) * 5 + (size, Literal(version, bin2dec(value))) + + def parseOperator(xs: String, version: Long, typeId: Long, lengthId: Int): (Int, Packet) = + val (size, packets) = lengthId match + case 1 => + val packetCount = bin2dec(xs.drop(7).take(11)).toInt + Iterator + .iterate((7 + 11, List.empty[Packet]))((sz, p) => parse(xs, sz, p)) + .drop(packetCount) + .next() + case _ => + val packetsSize = bin2dec(xs.drop(7).take(15)) + 7 + 15 + Iterator + .iterate((7 + 15, List.empty[Packet]))((sz, p) => parse(xs, sz, p)) + .dropWhile(_._1 < packetsSize) + .next() + (size, Operator(version, typeId, packets)) + + def parse(xs: String, size: Int = 0, packets: List[Packet] = Nil): (Int, List[Packet]) = + val data = xs.drop(size) + val version = bin2dec(data.take(3)) + val typeId = bin2dec(data.drop(3).take(3)) + val (size2, packet2) = + if typeId == 4 then parseLiteral(data, version) + else parseOperator(data, version, typeId, data(6).asDigit) + (size + size2, packets :+ packet2) + + def versionSum(packet: Packet): Long = packet match + case Literal(version, _) => version + case Operator(version, _, packets) => version + packets.map(versionSum).sum + + def expression(packet: Packet): Option[Long] = packet match + case Literal(_, value) => Some(value) + case Operator(_, typeId, packets) => + (typeId, packets.flatMap(expression)) match + case (0, xs) => Some(xs.sum) + case (1, xs) => Some(xs.product) + case (2, xs) => Some(xs.min) + case (3, xs) => Some(xs.max) + case (5, h :: i :: t) => Some(if h > i then 1 else 0) + case (6, h :: i :: t) => Some(if h < i then 1 else 0) + case (7, h :: i :: t) => Some(if h == i then 1 else 0) + case _ => None + + val input: String = hex2bin(Source.fromResource("day16.txt").mkString) + val packet: Packet = parse(input)._2.head + + def partOne(): Long = versionSum(packet) + def partTwo(): Long = expression(packet).get diff --git a/src/main/scala/challenge/Day17.scala b/src/main/scala/challenge/Day17.scala new file mode 100644 index 0000000..6bd41cf --- /dev/null +++ b/src/main/scala/challenge/Day17.scala @@ -0,0 +1,33 @@ +package challenge + +import scala.io.Source +import lib.Points.Point + +object Day17: + case class Probe(location: Point, velocity: Point): + def move(): Probe = + val vx = if velocity.x < 0 then 1 else if velocity.x > 0 then -1 else 0 + Probe(location + velocity, Point(velocity.x + vx, velocity.y - 1)) + case class Target(tl: Point, br: Point): + def didHit(p: Point) = p.x >= tl.x && p.x <= br.x && p.y <= tl.y && p.y >= br.y + def didMiss(p: Point) = p.x > br.x || p.y < br.y + def awaiting(p: Point) = !didHit(p) && !didMiss(p) + + def shoot(p: Probe): Option[Probe] = + val trajectory = Iterator + .iterate(List(p))(ps => ps :+ ps.last.move()) + .dropWhile(ps => target.awaiting(ps.last.location)) + .next + if target.didHit(trajectory.last.location) then Some(trajectory.maxBy(_.location.y)) else None + + private val regex = """.*x=(\d+)..(\d+), y=(-?\d+)..(-?\d+)""".r + def parseTarget(s: String): Target = s match + case regex(x1, x2, y2, y1) => Target(Point(x1.toInt, y1.toInt), Point(x2.toInt, y2.toInt)) + + val input = Source.fromResource("day17.txt").mkString + val target = parseTarget(input) + val trajectories: Seq[Probe] = + for x <- 1 to target.br.x; y <- target.br.y to -target.br.y yield Probe(Point.zero, Point(x, y)) + + def partOne(): Int = trajectories.flatMap(shoot).maxBy(_.location.y).location.y + def partTwo(): Int = trajectories.flatMap(shoot).size diff --git a/src/main/scala/challenge/Day18.scala b/src/main/scala/challenge/Day18.scala new file mode 100644 index 0000000..3cd99f6 --- /dev/null +++ b/src/main/scala/challenge/Day18.scala @@ -0,0 +1,70 @@ +package challenge + +import scala.annotation.tailrec +import scala.io.Source + +object Day18: + case class Number(n: Int, level: Int) + + def parse(s: String): List[Number] = + @tailrec + def helper(xs: List[Char], level: Int, acc: List[Number]): List[Number] = xs match + case Nil => acc + case h :: t if h.isDigit => helper(t, level, acc :+ Number(h.asDigit, level)) + case '[' :: t => helper(t, level + 1, acc) + case ']' :: t => helper(t, level - 1, acc) + case _ :: t => helper(t, level, acc) + + helper(s.toList, -1, Nil) + + def split(xs: List[Number], i: Int): List[Number] = + val num = xs(i) + val (n1, n2) = ((num.n.toDouble / 2).floor.toInt, (num.n.toDouble / 2).ceil.toInt) + xs.take(i) ++ List(Number(n1, num.level + 1), Number(n2, num.level + 1)) ++ xs.drop(i + 1) + + def explode(xs: List[Number], i: Int): List[Number] = i match + case 0 => + val Seq(n2, n3) = xs.tail.take(2) + List(Number(0, 3), Number(n2.n + n3.n, n3.level)) ++ xs.drop(3) + case x if x < xs.length - 2 => + val Seq(n0, n1, n2, n3) = xs.slice(i - 1, i + 3) + val mid = List(Number(n0.n + n1.n, n0.level), Number(0, 3), Number(n2.n + n3.n, n3.level)) + xs.take(x - 1) ++ mid ++ xs.drop(x + 3) + case _ => + val Seq(n1, n2, n3) = xs.takeRight(3) + xs.take(i - 1) ++ List(Number(n1.n + n2.n, 3), Number(0, 3)) + + def reduce(xs: List[Number]): List[Number] = + Iterator + .iterate((xs, false))((xs, _) => + xs.zipWithIndex.find(_._1.level == 4).map(_._2) match + case Some(i) => (explode(xs, i), false) + case None => + xs.zipWithIndex.find(_._1.n > 9).map(_._2) match + case Some(i) => (split(xs, i), false) + case None => (xs, true) + ) + .dropWhile(_._2 == false) + .next + ._1 + + def join(a: List[Number], b: List[Number]): List[Number] = reduce( + (a ++ b).map(num => Number(num.n, num.level + 1)) + ) + + @tailrec + def magnitude(xs: List[Number]): Int = xs match + case h :: Nil => h.n + case _ => + val maxLevel = xs.maxBy(_.level).level + val (head, tail) = xs.span(_.level != maxLevel) + val (n1, n2) = (tail.head.n, tail.tail.head.n) + magnitude((head :+ Number(3 * n1 + 2 * n2, maxLevel - 1)) ++ tail.drop(2)) + + val input: List[List[Number]] = Source.fromResource("day18.txt").getLines().map(parse).toList + + def partOne(): Int = magnitude(input.reduce(join)) + def partTwo(): Int = input + .combinations(2) + .flatMap(_.permutations.map(p => magnitude(join(p.head, p.last)))) + .max diff --git a/src/main/scala/challenge/Day19.scala b/src/main/scala/challenge/Day19.scala new file mode 100644 index 0000000..21eb5ec --- /dev/null +++ b/src/main/scala/challenge/Day19.scala @@ -0,0 +1,103 @@ +package challenge + +import scala.annotation.tailrec +import scala.io.Source + +object Day19: + + type Scanner = Set[Point3] + type BeaconMap = (Scanner, Map[Int, Point3]) + case class Point3(x: Int, y: Int, z: Int): + def +(that: Point3) = Point3(x + that.x, y + that.y, z + that.z) + def -(that: Point3) = Point3(x - that.x, y - that.y, z - that.z) + def manhattan(that: Point3) = ((x - that.x).abs + (y - that.y).abs + (z - that.z).abs) + object Point3: + //https://www.euclideanspace.com/maths/algebra/matrix/transforms/examples/index.htm + def orientations(p: Point3): Seq[Point3] = + val Point3(x, y, z) = p + Seq( + Point3(x, y, z), + Point3(x, -y, -z), + Point3(-x, y, -z), + Point3(-x, -y, z), + Point3(x, z, -y), + Point3(x, -z, y), + Point3(-x, z, y), + Point3(-x, -z, -y), + Point3(y, z, x), + Point3(y, -z, -x), + Point3(-y, z, -x), + Point3(-y, -z, x), + Point3(y, x, -z), + Point3(y, -x, z), + Point3(-y, x, z), + Point3(-y, -x, -z), + Point3(z, x, y), + Point3(z, -x, -y), + Point3(-z, x, -y), + Point3(-z, -x, y), + Point3(z, y, -x), + Point3(z, -y, x), + Point3(-z, y, x), + Point3(-z, -y, -x) + ) + + def orientations(scanner: Scanner): Seq[Scanner] = + scanner.toSeq.map(Point3.orientations).transpose.map(_.toSet) + + def pair(s1: Scanner, s2: Scanner): Option[(Scanner, Point3)] = + (for + orientated <- orientations(s2) + p1 <- s1 + p2 <- orientated + dist = p1 - p2 + if (orientated.map(_ + dist) & s1).size > 11 + yield (orientated, dist)).headOption + + def findBeacons(scanners: Seq[Scanner]): BeaconMap = + @tailrec + def helper( + xs: Seq[(Scanner, Int)], + acc: Scanner, + points: Map[Int, Point3] + ): (Scanner, Map[Int, Point3]) = xs match + case Nil => (acc, points) + case _ => + val (scanner, i, scanner2, point) = xs + .collect(x => + pair(acc, x._1) match + case Some(pair) => Some(x._1, x._2, pair._1, pair._2) + case _ => None + ) + .flatten + .head + + val beacons = acc ++ scanner2.map(_ + point) + val scanners2 = xs.filterNot(_ == (scanner, i)) + val points2 = points + (i -> point) + helper(scanners2, beacons, points2) + + val indexed = scanners.zipWithIndex + helper(indexed.tail, indexed.head._1, Map(0 -> Point3(0, 0, 0))) + + def parse(lines: List[String]): Scanner = + def parse(line: String): Point3 = + val parts = line.split(",").map(_.toInt).toList + Point3(parts.head, parts.tail.head, parts.last) + lines.map(parse).toSet + + def maxDistance(scanners: Map[Int, Point3]): Int = + scanners.values.toList.combinations(2).map(xs => xs.head.manhattan(xs.last)).max + + val input: List[Scanner] = + Source + .fromResource("day19.txt") + .mkString + .split("\n\n") + .toList + .map(_.split("\n").toList.tail) + .map(parse) + lazy val result: BeaconMap = findBeacons(input) + + def partOne(): Int = result._1.size + def partTwo(): Int = maxDistance(result._2) diff --git a/src/main/scala/challenge/Day20.scala b/src/main/scala/challenge/Day20.scala new file mode 100644 index 0000000..28392d7 --- /dev/null +++ b/src/main/scala/challenge/Day20.scala @@ -0,0 +1,45 @@ +package challenge + +import scala.io.Source + +import lib.Points.Point +import lib.GridExtensions._ +import lib.Numbers.bin2dec + +object Day20: + extension (c: Char) def toDigit: Int = if c == '#' then 1 else 0 + + def neighbours(p: Point): Seq[Point] = + for dy <- -1 to 1; dx <- -1 to 1 yield Point(p.x + dx, p.y + dy) + + case class Image(pixels: Map[Point, Int], min: Int, max: Int): + def at(point: Point, default: Int): Int = + bin2dec(neighbours(point).map(pixels.getOrElse(_, default)).mkString).toInt + + def parse(input: List[String]): (List[Int], Image) = + val algorithm = input.head.map(toDigit).toList + val data = input.drop(2) + val pixels = + for y <- 0 until data.size; x <- 0 until data.size yield Point(x, y) -> data(y)(x).toDigit + (algorithm, Image(pixels.toMap, -1, data.size)) + + def step(algorithm: Seq[Int])(default: Int, img: Image): (Int, Image) = + val pixels = for + x <- img.min to img.max + y <- img.min to img.max + yield + val i = img.at(Point(x, y), default) + Point(x, y) -> algorithm(i) + + val nextDefault = if default == 0 then 1 else 0 + val nextGrid = Image(pixels.toMap, img.min - 1, img.max + 1) + (nextDefault, nextGrid) + + def enhance(n: Int): Int = + Iterator.iterate((0, img))(step(algorithm)).drop(n).next()._2.pixels.values.sum + + val input = Source.fromResource("day20.txt").getLines().toList + val (algorithm, img) = parse(input) + + def partOne(): Int = enhance(n = 2) + def partTwo(): Int = enhance(n = 50) diff --git a/src/main/scala/challenge/Day21.scala b/src/main/scala/challenge/Day21.scala new file mode 100644 index 0000000..2903571 --- /dev/null +++ b/src/main/scala/challenge/Day21.scala @@ -0,0 +1,62 @@ +package challenge + +import scala.collection.mutable +import scala.io.Source +import scala.annotation.tailrec + +object Day21: + case class Player(pos: Int, score: Int): + def move(amount: Int): Player = { + val pos2 = (pos + amount - 1) % 10 + 1 + Player(pos2, score + pos2) + } + + def play(p1: Player, p2: Player): (Player, Player, Int) = + + @tailrec + def helper(p1: Player, p2: Player, die: Int): (Player, Player, Int) = + val movement1 = (1 to 3).map(i => (die + i) % 100).sum + val movement2 = (4 to 6).map(i => (die + i) % 100).sum + val (next1, next2) = (p1.move(movement1), p2.move(movement2)) + if next1.score > 999 then (next1, p2, die + 3) + else if next2.score > 999 then (next2, next1, die + 6) + else helper(next1, next2, die + 6) + + helper(p1, p2, 0) + + def play2(p1: Player, p2: Player): (Long, Long) = + val memo = mutable.Map.empty[(Player, Player), (Long, Long)] + val frequencies = + (for + r1 <- 1 to 3 + r2 <- 1 to 3 + r3 <- 1 to 3 + yield r1 + r2 + r3).groupMapReduce(identity)(_ => 1)(_ + _) + + def helper(p1: Player, p2: Player): (Long, Long) = + memo.getOrElseUpdate( + (p1, p2), + if (p1.score > 20) then (1L, 0L) + else if (p2.score > 20) then (0L, 1L) + else + val rolls = + for + (roll, rollCount) <- frequencies + next1 = p1.move(roll) + (p2Wins, p1Wins) = helper(p2, next1) + yield (rollCount * p1Wins, rollCount * p2Wins) + rolls.reduce({ case ((a, b), (c, d)) => (a + c, b + d) }) + ) + + helper(p1, p2) + + val input = Source.fromResource("day21.txt").getLines().toList + val (pos1, pos2) = (input.head.last.asDigit, input.last.last.asDigit) + + def partOne(): Int = + val (_, loser, rolls) = play(Player(pos1, 0), Player(pos2, 0)) + loser.score * rolls + + def partTwo(): Long = + val (s1, s2) = play2(Player(pos1, 0), Player(pos2, 0)) + s1 max s2 diff --git a/src/main/scala/challenge/Day22.scala b/src/main/scala/challenge/Day22.scala new file mode 100644 index 0000000..8708642 --- /dev/null +++ b/src/main/scala/challenge/Day22.scala @@ -0,0 +1,97 @@ +package challenge + +import scala.io.Source +import scala.annotation.tailrec +import scala.collection.immutable.Range.Inclusive + +object Day22: + + extension (r: Inclusive) + def volume(): Long = 1 + r.last - r.head + def intersection(other: Inclusive): Option[Inclusive] = + val (min, max) = (r.head, r.last) + val (min2, max2) = (other.head, other.last) + if min2 <= min && max <= max2 then Some(r) + else if min < min2 && max2 < max then Some(other) + else if min2 <= min && min <= max2 then Some(min to max2) + else if min <= min2 && min2 <= max then Some(min2 to max) + else None + + def split(other: Inclusive): List[Inclusive] = + val (min, max) = (r.head, r.last) + val (min2, max2) = (other.head, other.last) + if min2 <= min && max <= max2 then List(r) + else if min < min2 && max2 < max then List(min2 to max2, min to min2 - 1, max2 + 1 to max) + else if min <= max2 && max2 < max then List(min to max2, max2 + 1 to max) + else if min < min2 && min2 <= max then List(min2 to max2, min to min2 - 1) + else Nil + + case class Cuboid(x: Inclusive, y: Inclusive, z: Inclusive): + def volume: Long = x.volume() * y.volume() * z.volume() + def intersection(other: Cuboid): Option[Cuboid] = + for + xs <- x.intersection(other.x) + ys <- y.intersection(other.y) + zs <- z.intersection(other.z) + yield (Cuboid(xs, ys, zs)) + + def split(other: Cuboid): List[Cuboid] = + val xs = x.split(other.x) + val ys = y.split(other.y) + val zs = z.split(other.z) + xs.tail.map(Cuboid(_, y, z)) ++ ys.tail.map(Cuboid(xs.head, _, z)) ++ zs.tail.map(Cuboid(xs.head, ys.head, _)) + + trait Instruction: + val cuboid: Cuboid + case class TurnOn(cuboid: Cuboid) extends Instruction + case class TurnOff(cuboid: Cuboid) extends Instruction + + private val regex = """(on|off) x=(-?\d+)..(-?\d+),y=(-?\d+)..(-?\d+),z=(-?\d+)..(-?\d+)""".r + def parse(s: String): Instruction = s match + case regex("on", x1, x2, y1, y2, z1, z2) => + TurnOn(Cuboid(x1.toInt to x2.toInt, y1.toInt to y2.toInt, z1.toInt to z2.toInt)) + case regex("off", x1, x2, y1, y2, z1, z2) => + TurnOff(Cuboid(x1.toInt to x2.toInt, y1.toInt to y2.toInt, z1.toInt to z2.toInt)) + + def process(xs: List[Instruction]): Set[(Int, Int, Int)] = + val bounds = Cuboid(-50 to 50, -50 to 50, -50 to 50) + @tailrec + def helper(xs: List[Instruction], acc: Set[(Int, Int, Int)]): Set[(Int, Int, Int)] = xs match + case Nil => acc + case h :: t => + h.cuboid.intersection(bounds) match + case Some(c) => + val next = for x <- c.x; y <- c.y; z <- c.z yield (x, y, z) + h match + case TurnOn(_) => helper(t, acc ++ next) + case TurnOff(_) => helper(t, acc -- next) + case None => helper(t, acc) + + helper(xs, Set.empty) + + def process2(xs: List[Instruction]): List[Cuboid] = + @tailrec + def helper(xs: List[Instruction], acc: List[Cuboid]): List[Cuboid] = xs match + case Nil => acc + case h :: t => + h match + case TurnOn(c) => + acc.view.flatMap(_.intersection(c)).headOption match + case None => helper(t, c :: acc) + case Some(i) => + val remaining = h.cuboid.split(i).map(TurnOn(_)) + helper(remaining ++ t, acc) + case TurnOff(c) => + val next = acc.flatMap(n => + n.intersection(h.cuboid) match + case None => List(n) + case Some(i) => n.split(i) + ) + helper(t, next) + + helper(xs, Nil) + + val input = Source.fromResource("day22.txt").getLines().map(parse).toList + + def partOne(): Int = process(input).size + def partTwo(): Long = process2(input).map(_.volume).sum diff --git a/src/main/scala/challenge/Day24.scala b/src/main/scala/challenge/Day24.scala new file mode 100644 index 0000000..0d99aea --- /dev/null +++ b/src/main/scala/challenge/Day24.scala @@ -0,0 +1,38 @@ +package challenge + +import scala.io.Source + +object Day24: + + def findModelNumberStartingFrom(num: String, input: List[String]): Long = + val blocks = input.grouped(18).toSeq + def operand(i: Int)(n: Int) = blocks(i).map(_.split(' ').last)(n).toInt + + def step(acc: List[Int], stack: List[(Int, Int)], i: Int): (List[Int], List[(Int, Int)]) = + // indexes 4, 5 and 15 are where things differentiate for each block + val Seq(div, add1, add2) = Seq(4, 5, 15).map(operand(i)) + if div == 1 then (acc, stack :+ (i, add2)) + else + val (j, added) = stack.last + val acc2 = acc.updated(i, acc(j) + add1 + added) + val res = acc2(i) match + case x if x > 9 => acc2.updated(j, acc2(j) - x + 9).updated(i, 9) + case x if x < 1 => acc2.updated(j, acc2(j) - x + 1).updated(i, 1) + case _ => acc2 + (res, stack.init) + + Iterator + .iterate((num.toList.map(_.asDigit), List.empty[(Int, Int)], 0))((res, stack, i) => + val (r2, s2) = step(res, stack, i) + (r2, s2, i + 1) + ) + .drop(14) + .next + ._1 + .mkString + .toLong + + val input = Source.fromResource("day24.txt").getLines().toList + + def partOne(): Long = findModelNumberStartingFrom("99999999999999", input) + def partTwo(): Long = findModelNumberStartingFrom("11111111111111", input) diff --git a/src/main/scala/challenge/Day25.scala b/src/main/scala/challenge/Day25.scala new file mode 100644 index 0000000..26d6bca --- /dev/null +++ b/src/main/scala/challenge/Day25.scala @@ -0,0 +1,26 @@ +package challenge + +import scala.io.Source +import lib.GridExtensions._ +import lib.Points.Point + +object Day25: + + def moved(g: Grid[Char], c: Char)(next: (Point => Point)): Grid[Char] = + val (movable, unmovable) = g.filter(_._2 == c).partition(p => g(next(p._1)) == '.') + g.filterNot(_._2 == c) ++ unmovable ++ movable.map(kv => next(kv._1) -> kv._2) + + def step(g: Grid[Char]): Grid[Char] = + val movedRight = moved(g, '>')(p => Point((p.x + 1) % maxX, p.y)) + moved(movedRight, 'v')(p => Point(p.x, (p.y + 1) % maxY)) + + val grid = Source.fromResource("day25.txt").mkString.toList.toGrid.withDefaultValue('.') + val (maxX, maxY) = (grid.maxBy(_._1.x)._1.x + 1, grid.maxBy(_._1.y)._1.y + 1) + + def partOne(): Int = Iterator + .iterate((grid, 1))((g, i) => (step(g), i + 1)) + .sliding(2) + .dropWhile(x => x.head._1 != x.last._1) + .next + .head + ._2 diff --git a/src/main/scala/lib/Graphs.scala b/src/main/scala/lib/Graphs.scala new file mode 100644 index 0000000..e88f971 --- /dev/null +++ b/src/main/scala/lib/Graphs.scala @@ -0,0 +1,67 @@ +package lib + +import scala.annotation.tailrec +import scala.collection.mutable + +object Graphs: + object dfs: + def apply[A](start: A)(nf: A => Iterable[A]): Iterable[A] = + def _dfs(s: A, seen: Iterable[A]): Iterable[A] = + if seen.iterator.contains(s) then seen + else + val neighbors = nf(s).filterNot(seen.iterator.contains) + neighbors.foldLeft(Iterable(s) ++ seen)((b, a) => _dfs(a, b)) + + _dfs(start, Nil) + + object bfs: + def apply[A](start: A)(nf: A => Iterable[A]): Map[A, Int] = + @tailrec + def _bfs(seen: Map[A, Int], unseen: Map[A, Int]): Map[A, Int] = + val neighbors = for { + (node, cost) <- unseen; newNode <- nf(node) + } yield newNode -> (cost + 1) + val seen2 = seen ++ unseen + val unseen2 = neighbors.filterNot(n => seen.contains(n._1)) + if unseen2.isEmpty then seen2 else _bfs(seen2, unseen2) + + _bfs(Map.empty, Map(start -> 0)) + + object aStar: + def apply[A](start: A, goal: A)(cf: (A, A) => Int)(nf: A => Iterable[A])( + hf: A => Int + ): (Map[A, Int], Option[(A, Int)]) = + val seen: mutable.Map[A, Int] = mutable.Map.empty + val unseen: mutable.PriorityQueue[(Int, Int, A)] = + mutable.PriorityQueue.empty(Ordering.by(-_._1)) + unseen.enqueue((hf(start), 0, start)) + while unseen.nonEmpty do + val (_, dist, node) = unseen.dequeue() + if !seen.contains(node) then + seen(node) = dist + if node == goal then return (seen.toMap, Some(node -> dist)) + else + def visit(n: A, d: Int) = + if !seen.contains(n) then unseen.enqueue((dist + d + hf(n), dist + d, n)) + nf(node).map(n => (n, cf(node, n))).foreach(n => visit(n._1, n._2)) + + (seen.toMap, None) + + object dijkstra: + def apply[A](start: A, goal: A)(nf: A => Iterable[A])( + cf: (A, A) => Int + ): (Map[A, Int], Option[(A, Int)]) = + val seen: mutable.Map[A, Int] = mutable.Map.empty + val unseen: mutable.PriorityQueue[(Int, A)] = mutable.PriorityQueue.empty(Ordering.by(-_._1)) + unseen.enqueue((0, start)) + while unseen.nonEmpty do + val (dist, node) = unseen.dequeue() + if !seen.contains(node) then + seen(node) = dist + if node == goal then return (seen.toMap, Some(node -> dist)) + else + def visit(n: A, d: Int) = + if !seen.contains(n) then unseen.enqueue((dist + d, n)) + nf(node).map(n => (n, cf(node, n))).foreach(n => visit(n._1, n._2)) + + (seen.toMap, None) diff --git a/src/main/scala/lib/GridExtensions.scala b/src/main/scala/lib/GridExtensions.scala new file mode 100644 index 0000000..c01989a --- /dev/null +++ b/src/main/scala/lib/GridExtensions.scala @@ -0,0 +1,29 @@ +package lib + +import lib.Points.Point + +import scala.annotation.tailrec +import scala.reflect.ClassTag + +object GridExtensions: + + type Grid[A] = Map[Point, A] + + extension [A](grid: Grid[A]) + def canvas(default: A)(cf: A => A)(using classTag: ClassTag[A]): Array[Array[A]] = + val (x, y) = (grid.keys.maxBy(_.x).x, grid.keys.maxBy(_.y).y) + val canvas = Array.tabulate(y + 1, x + 1)((_, _) => default) + for p <- grid yield canvas(p._1.y)(p._1.x) = cf(p._2) + canvas + + private def makeGrid[A](input: Seq[Char])(fn: (Char => A)): Grid[A] = + @tailrec + def helper(xs: Seq[Char], acc: Grid[A], current: Point): Grid[A] = + xs match + case h :: t if h == '\n' => helper(t, acc, Point(0, current.y + 1)) + case h :: t => helper(t, acc.updated(current, fn(h)), Point(current.x + 1, current.y)) + case _ => acc + helper(input, Map.empty, Point(0, 0)) + + extension (input: Seq[Char]) def toGrid: Grid[Char] = makeGrid(input)(identity) + extension (input: Seq[Char]) def toIntGrid: Grid[Int] = makeGrid(input)(_.asDigit) diff --git a/src/main/scala/lib/Math.scala b/src/main/scala/lib/Math.scala new file mode 100644 index 0000000..8ec4e7c --- /dev/null +++ b/src/main/scala/lib/Math.scala @@ -0,0 +1,18 @@ +package lib + +object Math: + + def mean(seq: Seq[Int]): Double = seq.sum / seq.length.toDouble + + def median(seq: Seq[Int]): Int = + val sorted = seq.sorted + if seq.size % 2 == 1 then sorted(seq.size / 2) + else + val (up, down) = sorted.splitAt(seq.size / 2) + (up.last + down.head) / 2 + + def arithmeticSeries(a: Int, b: Int, step: Int = 1, normalized: Boolean = false): Int = + val dist = (a - b).abs + val (a1, an) = if normalized then (0, dist) else (a, b) + val n = dist / step + 1 + n * (a1 + an) / 2 diff --git a/src/main/scala/lib/Numbers.scala b/src/main/scala/lib/Numbers.scala new file mode 100644 index 0000000..20700be --- /dev/null +++ b/src/main/scala/lib/Numbers.scala @@ -0,0 +1,10 @@ +package lib + +object Numbers { + def leftPad(l: Int, s: String, c: Char = '0'): String = List.fill(l - s.length)(c).mkString + s + def hex2bin(hex: Char): String = + val bin = Integer.parseInt(hex.toString, 16).toBinaryString + leftPad(4, bin) + def hex2bin(hex: String): String = hex.flatMap(hex2bin(_)) + def bin2dec(bin: String): Long = BigInt(bin, 2).longValue +} diff --git a/src/main/scala/lib/Parsers.scala b/src/main/scala/lib/Parsers.scala new file mode 100644 index 0000000..a4486c9 --- /dev/null +++ b/src/main/scala/lib/Parsers.scala @@ -0,0 +1,80 @@ +package lib + +import scala.annotation.tailrec + +object Parsers: + type Op = Char + + object AST: + trait Node + case class Value(v: Int) extends Node + case class Tree(op: Op, left: Node, right: Node) extends Node + + def eval(node: Node): Long = node match + case Tree(op, l, r) => + op match + case '+' => eval(l) + eval(r) + case '-' => eval(l) - eval(r) + case '*' => eval(l) * eval(r) + case '/' => eval(l) / eval(r) + case Value(op) => op.toLong + + def parse(expr: String)(precedence: (Op, Op) => Boolean): Node = + + def compose(nodes: List[Node], ops: List[Op]): List[Node] = + ops.foldLeft(nodes)((ns, op) => Tree(op, ns.tail.head, ns.head) +: ns.tail.tail) + + @tailrec + def helper(xs: List[Char], ops: List[Op], acc: List[Node]): Node = xs match + case Nil => compose(acc, ops).head + case h :: t => + h match + case n if n.isDigit => helper(t, ops, Value(n.asDigit) +: acc) + case '(' => helper(t, h +: ops, acc) + case ')' => + val (out, ops2) = ops.span(_ != '(') + helper(t, ops2.tail, compose(acc, out)) + case _ => + val (out, ops2) = ops.span(o => o != '(' && precedence(o, h)) + helper(t, h +: ops2, compose(acc, out)) + + helper(expr.filterNot(_ == ' ').toList, Nil, Nil) + + object Postfix: + + def eval(expr: List[Char]): Long = + + @tailrec + def helper(xs: List[Char], stack: List[Long]): Long = xs match + case Nil => stack.head + case h :: t => + h match + case n if n.isDigit => helper(t, n.asDigit.toLong +: stack) + case _ => + val (right, left) = (stack.head, stack.tail.head) + val v = h match + case '+' => left + right + case '-' => left - right + case '*' => left * right + case '/' => left / right + helper(t, v +: stack.drop(2)) + + helper(expr, Nil) + + def parse(expr: String)(precedence: (Op, Op) => Boolean): List[Char] = + + @tailrec + def helper(xs: List[Char], ops: List[Op], acc: List[Char]): List[Char] = xs match + case Nil => acc ++ ops + case h :: t => + h match + case n if n.isDigit => helper(t, ops, acc :+ n) + case '(' => helper(t, h +: ops, acc) + case ')' => + val (out, ops2) = ops.span(_ != '(') + helper(t, ops2.tail, acc ++ out) + case _ => + val (out, ops2) = ops.span(o => o != '(' && precedence(o, h)) + helper(t, h +: ops2, acc ++ out) + + helper(expr.filterNot(_ == ' ').toList, Nil, Nil) diff --git a/src/main/scala/lib/Points.scala b/src/main/scala/lib/Points.scala new file mode 100644 index 0000000..c328b8e --- /dev/null +++ b/src/main/scala/lib/Points.scala @@ -0,0 +1,71 @@ +package lib + +object Points: + + case class Point(x: Int, y: Int): + def +(p: Point): Point = Point(x + p.x, y + p.y) + def -(p: Point): Point = Point(x - p.y, y - p.y) + def *(n: Int): Point = Point(x * n, y * n) + def neighbors: List[Point] = + List(Point(x, y - 1), Point(x + 1, y), Point(x, y + 1), Point(x - 1, y)) + def corners: List[Point] = + List(Point(x - 1, y - 1), Point(x + 1, y - 1), Point(x - 1, y + 1), Point(x + 1, y + 1)) + def surroundings: List[Point] = neighbors ++ corners + def rotate(deg: Int): Point = deg % 360 match + case 90 | -270 => Point(y, -x) + case 180 | -180 => Point(-x, -y) + case -90 | 270 => Point(-y, x) + case _ => this + + def manhattan(p: Point = Position.zero): Int = (p.x - x).abs + (p.y - y).abs + def directionTo(other: Point): Char = other match + case Point(x2, y2) if x2 == x && y2 < y => 'N' + case Point(x2, y2) if x2 == x && y2 > y => 'S' + case Point(x2, y2) if y2 == y && x2 < x => 'W' + case Point(x2, y2) if y2 == y && x2 > x => 'E' + case _ => throw new IllegalArgumentException("Points are equal") + + object Point: + val zero: Point = Point(0, 0) + + case class Line(p1: Point, p2: Point): + val (dx, dy) = ((p2.x - p1.x).sign, (p2.y - p1.y).sign) + def points(): Seq[Point] = + val max = math.max((p2.x - p1.x).abs, (p2.y - p1.y).abs) + (0 to max).map(i => Point(p1.x + dx * i, p1.y + dy * i)) + + object Position: + def zero: Point = Point(0, 0) + def neighbors: List[Point] = List(Point(1, 0), Point(-1, 0), Point(0, 1), Point(0, -1)) + def corners: List[Point] = List(Point(1, 1), Point(-1, 1), Point(1, -1), Point(-1, -1)) + def surroundings: List[Point] = neighbors ++ corners + def directions: Map[Char, Point] = List('E', 'W', 'N', 'S').zip(neighbors).toMap + + case class Dir(p: Point, dir: Char) { + def forward(n: Int = 1): Dir = dir match + case 'U' | 'N' => copy(p = p.copy(y = p.y - n)) + case 'D' | 'S' => copy(p = p.copy(y = p.y + n)) + case 'L' | 'W' => copy(p = p.copy(x = p.x - n)) + case 'R' | 'E' => copy(p = p.copy(x = p.x + n)) + + def rotate(clockwise: Boolean = true, n: Int = 0): Dir = dir match // turn and move + case 'U' => if (clockwise) Dir(Point(p.x + n, p.y), 'R') else Dir(Point(p.x - n, p.y), 'L') + case 'D' => if (clockwise) Dir(Point(p.x - n, p.y), 'L') else Dir(Point(p.x + n, p.y), 'R') + case 'L' => if (clockwise) Dir(Point(p.x, p.y - n), 'U') else Dir(Point(p.x, p.y + n), 'D') + case 'R' => if (clockwise) Dir(Point(p.x, p.y + n), 'D') else Dir(Point(p.x, p.y - n), 'U') + + def turn(d: Char): Dir = copy(dir = d) + def turn(degrees: Int): Dir = + val dirs = Seq('U', 'R', 'D', 'L') + val deg = (degrees.abs / 90) % 360 + val i = dirs.indexOf(dir) + (if (degrees < 0) dirs.length - deg else deg) + copy(dir = dirs(i % dirs.length)) + + } + + case class Box(min: Point, max: Point): + def iterator: Iterator[Point] = + for + x <- (min.x to max.x).iterator + y <- (min.y to max.y).iterator + yield Point(x, y) diff --git a/src/test/scala/Test01.scala b/src/test/scala/Test01.scala new file mode 100644 index 0000000..9754ce6 --- /dev/null +++ b/src/test/scala/Test01.scala @@ -0,0 +1,9 @@ +import org.scalatest._ +import challenge.Day01 + +class Test01 extends flatspec.AnyFlatSpec with matchers.should.Matchers: + + it should "calculate correct result" in { + Day01.partOne() should be(1184) + Day01.partTwo() should be(1158) + } diff --git a/src/test/scala/Test02.scala b/src/test/scala/Test02.scala new file mode 100644 index 0000000..bd19ac5 --- /dev/null +++ b/src/test/scala/Test02.scala @@ -0,0 +1,9 @@ +import org.scalatest._ +import challenge.Day02 + +class Test02 extends flatspec.AnyFlatSpec with matchers.should.Matchers: + + it should "calculate correct result" in { + Day02.partOne() should be(1962940) + Day02.partTwo() should be(1813664422) + } diff --git a/src/test/scala/Test03.scala b/src/test/scala/Test03.scala new file mode 100644 index 0000000..ff9d7a3 --- /dev/null +++ b/src/test/scala/Test03.scala @@ -0,0 +1,9 @@ +import org.scalatest._ +import challenge.Day03 + +class Test03 extends flatspec.AnyFlatSpec with matchers.should.Matchers: + + it should "calculate correct result" in { + Day03.partOne() should be(1997414) + Day03.partTwo() should be(1032597) + } diff --git a/src/test/scala/Test04.scala b/src/test/scala/Test04.scala new file mode 100644 index 0000000..3553d68 --- /dev/null +++ b/src/test/scala/Test04.scala @@ -0,0 +1,9 @@ +import org.scalatest._ +import challenge.Day04 + +class Test04 extends flatspec.AnyFlatSpec with matchers.should.Matchers: + + it should "calculate correct result" in { + Day04.partOne() should be(8580) + Day04.partTwo() should be(9576) + } diff --git a/src/test/scala/Test05.scala b/src/test/scala/Test05.scala new file mode 100644 index 0000000..9ae7e98 --- /dev/null +++ b/src/test/scala/Test05.scala @@ -0,0 +1,9 @@ +import org.scalatest._ +import challenge.Day05 + +class Test05 extends flatspec.AnyFlatSpec with matchers.should.Matchers: + + it should "calculate correct result" in { + Day05.partOne() should be(5442) + Day05.partTwo() should be(19571) + } diff --git a/src/test/scala/Test06.scala b/src/test/scala/Test06.scala new file mode 100644 index 0000000..bf2c2ce --- /dev/null +++ b/src/test/scala/Test06.scala @@ -0,0 +1,9 @@ +import org.scalatest._ +import challenge.Day06 + +class Test06 extends flatspec.AnyFlatSpec with matchers.should.Matchers: + + it should "calculate correct result" in { + Day06.partOne() should be(387413) + Day06.partTwo() should be(1738377086345L) + } diff --git a/src/test/scala/Test07.scala b/src/test/scala/Test07.scala new file mode 100644 index 0000000..0dc5e78 --- /dev/null +++ b/src/test/scala/Test07.scala @@ -0,0 +1,9 @@ +import org.scalatest._ +import challenge.Day07 + +class Test07 extends flatspec.AnyFlatSpec with matchers.should.Matchers: + + it should "calculate correct result" in { + Day07.partOne() should be(329389) + Day07.partTwo() should be(86397080) + } diff --git a/src/test/scala/Test08.scala b/src/test/scala/Test08.scala new file mode 100644 index 0000000..f0781e1 --- /dev/null +++ b/src/test/scala/Test08.scala @@ -0,0 +1,9 @@ +import org.scalatest._ +import challenge.Day08 + +class Test08 extends flatspec.AnyFlatSpec with matchers.should.Matchers: + + it should "calculate correct result" in { + //Day08.partOne() should be(532) + Day08.partTwo() should be(1011284) + } diff --git a/src/test/scala/Test09.scala b/src/test/scala/Test09.scala new file mode 100644 index 0000000..25839a5 --- /dev/null +++ b/src/test/scala/Test09.scala @@ -0,0 +1,9 @@ +import org.scalatest._ +import challenge.Day09 + +class Test09 extends flatspec.AnyFlatSpec with matchers.should.Matchers: + + it should "calculate correct result" in { + Day09.partOne() should be(564) + Day09.partTwo() should be(1038240) + } diff --git a/src/test/scala/Test10.scala b/src/test/scala/Test10.scala new file mode 100644 index 0000000..acc0d78 --- /dev/null +++ b/src/test/scala/Test10.scala @@ -0,0 +1,9 @@ +import org.scalatest._ +import challenge.Day10 + +class Test10 extends flatspec.AnyFlatSpec with matchers.should.Matchers: + + it should "calculate correct result" in { + Day10.partOne() should be(369105) + Day10.partTwo() should be(3999363569L) + } diff --git a/src/test/scala/Test11.scala b/src/test/scala/Test11.scala new file mode 100644 index 0000000..410310e --- /dev/null +++ b/src/test/scala/Test11.scala @@ -0,0 +1,9 @@ +import org.scalatest._ +import challenge.Day11 + +class Test11 extends flatspec.AnyFlatSpec with matchers.should.Matchers: + + it should "calculate correct result" in { + Day11.partOne() should be(1655) + Day11.partTwo() should be(337) + } diff --git a/src/test/scala/Test12.scala b/src/test/scala/Test12.scala new file mode 100644 index 0000000..2327c70 --- /dev/null +++ b/src/test/scala/Test12.scala @@ -0,0 +1,9 @@ +import org.scalatest._ +import challenge.Day12 + +class Test12 extends flatspec.AnyFlatSpec with matchers.should.Matchers: + + it should "calculate correct result" in { + Day12.partOne() should be(4659) + Day12.partTwo() should be(148962) + } diff --git a/src/test/scala/Test13.scala b/src/test/scala/Test13.scala new file mode 100644 index 0000000..dec85ec --- /dev/null +++ b/src/test/scala/Test13.scala @@ -0,0 +1,15 @@ +import org.scalatest._ +import challenge.Day13 + +class Test13 extends flatspec.AnyFlatSpec with matchers.should.Matchers: + + it should "calculate correct result" in { + Day13.partOne() should be(704) + } + + it should "display HGAJBEHC" in { + val canvas = Day13.partTwo() + canvas foreach { row => + row.mkString foreach print; println() + } + } diff --git a/src/test/scala/Test14.scala b/src/test/scala/Test14.scala new file mode 100644 index 0000000..186f50f --- /dev/null +++ b/src/test/scala/Test14.scala @@ -0,0 +1,9 @@ +import org.scalatest._ +import challenge.Day14 + +class Test14 extends flatspec.AnyFlatSpec with matchers.should.Matchers: + + it should "calculate correct result" in { + Day14.partOne() should be(2584) + Day14.partTwo() should be(3816397135460L) + } diff --git a/src/test/scala/Test15.scala b/src/test/scala/Test15.scala new file mode 100644 index 0000000..ef98450 --- /dev/null +++ b/src/test/scala/Test15.scala @@ -0,0 +1,9 @@ +import org.scalatest._ +import challenge.Day15 + +class Test15 extends flatspec.AnyFlatSpec with matchers.should.Matchers: + + it should "calculate correct result" in { + Day15.partOne() should be(790) + Day15.partTwo() should be(2998) + } diff --git a/src/test/scala/Test16.scala b/src/test/scala/Test16.scala new file mode 100644 index 0000000..7bf7a21 --- /dev/null +++ b/src/test/scala/Test16.scala @@ -0,0 +1,9 @@ +import org.scalatest._ +import challenge.Day16 + +class Test16 extends flatspec.AnyFlatSpec with matchers.should.Matchers: + + it should "calculate correct result" in { + Day16.partOne() should be(955) + Day16.partTwo() should be(158135423448L) + } diff --git a/src/test/scala/Test17.scala b/src/test/scala/Test17.scala new file mode 100644 index 0000000..4949269 --- /dev/null +++ b/src/test/scala/Test17.scala @@ -0,0 +1,9 @@ +import org.scalatest._ +import challenge.Day17 + +class Test17 extends flatspec.AnyFlatSpec with matchers.should.Matchers: + + it should "calculate correct result" in { + Day17.partOne() should be(10878) + Day17.partTwo() should be(4716) + } diff --git a/src/test/scala/Test18.scala b/src/test/scala/Test18.scala new file mode 100644 index 0000000..9859de1 --- /dev/null +++ b/src/test/scala/Test18.scala @@ -0,0 +1,9 @@ +import org.scalatest._ +import challenge.Day18 + +class Test18 extends flatspec.AnyFlatSpec with matchers.should.Matchers: + + it should "calculate correct result" in { + Day18.partOne() should be(3524) + Day18.partTwo() should be(4656) + } diff --git a/src/test/scala/Test19.scala b/src/test/scala/Test19.scala new file mode 100644 index 0000000..99045f4 --- /dev/null +++ b/src/test/scala/Test19.scala @@ -0,0 +1,9 @@ +import org.scalatest._ +import challenge.Day19 + +class Test19 extends flatspec.AnyFlatSpec with matchers.should.Matchers: + + it should "calculate correct result" in { + Day19.partOne() should be(491) + Day19.partTwo() should be(13374) + } diff --git a/src/test/scala/Test20.scala b/src/test/scala/Test20.scala new file mode 100644 index 0000000..2dbdb4e --- /dev/null +++ b/src/test/scala/Test20.scala @@ -0,0 +1,9 @@ +import org.scalatest._ +import challenge.Day20 + +class Test20 extends flatspec.AnyFlatSpec with matchers.should.Matchers: + + it should "calculate correct result" in { + Day20.partOne() should be(5354) + Day20.partTwo() should be(18269) + } diff --git a/src/test/scala/Test21.scala b/src/test/scala/Test21.scala new file mode 100644 index 0000000..28f303e --- /dev/null +++ b/src/test/scala/Test21.scala @@ -0,0 +1,9 @@ +import org.scalatest._ +import challenge.Day21 + +class Test21 extends flatspec.AnyFlatSpec with matchers.should.Matchers: + + it should "calculate correct result" in { + Day21.partOne() should be(604998) + Day21.partTwo() should be(157253621231420L) + } diff --git a/src/test/scala/Test22.scala b/src/test/scala/Test22.scala new file mode 100644 index 0000000..eb2223e --- /dev/null +++ b/src/test/scala/Test22.scala @@ -0,0 +1,9 @@ +import org.scalatest._ +import challenge.Day22 + +class Test22 extends flatspec.AnyFlatSpec with matchers.should.Matchers: + + it should "calculate correct result" in { + Day22.partOne() should be(503864) + Day22.partTwo() should be(1255547543528356L) + } diff --git a/src/test/scala/Test24.scala b/src/test/scala/Test24.scala new file mode 100644 index 0000000..d1cca77 --- /dev/null +++ b/src/test/scala/Test24.scala @@ -0,0 +1,9 @@ +import org.scalatest._ +import challenge.Day24 + +class Test24 extends flatspec.AnyFlatSpec with matchers.should.Matchers: + + it should "calculate correct result" in { + Day24.partOne() should be(99394899891971L) + Day24.partTwo() should be(92171126131911L) + } diff --git a/src/test/scala/Test25.scala b/src/test/scala/Test25.scala new file mode 100644 index 0000000..ef80100 --- /dev/null +++ b/src/test/scala/Test25.scala @@ -0,0 +1,8 @@ +import org.scalatest._ +import challenge.Day25 + +class Test25 extends flatspec.AnyFlatSpec with matchers.should.Matchers: + + it should "calculate correct result" in { + Day25.partOne() should be(378) + }