From 9e96943cdcbf610bbc67f9f7e10070866fcf26a6 Mon Sep 17 00:00:00 2001 From: nmcb Date: Mon, 23 Feb 2026 13:54:57 +0100 Subject: [PATCH 1/2] cleanup --- 2022/src/main/scala/aoc2022/Day24.scala | 2 +- 2022/src/main/scala/aoc2022/Day25.scala | 46 ++++++++++++------------- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/2022/src/main/scala/aoc2022/Day24.scala b/2022/src/main/scala/aoc2022/Day24.scala index 86ba900..6ecad40 100644 --- a/2022/src/main/scala/aoc2022/Day24.scala +++ b/2022/src/main/scala/aoc2022/Day24.scala @@ -49,7 +49,7 @@ object Day24 extends AoC: case class Streams(u: Vector[Stream], d: Vector[Stream], l: Vector[Stream], r: Vector[Stream], bounds: Bounds): import Field.* import bounds.* - + def uAt(x: Int, y: Int): Char = u(x).drop(y).head def dAt(x: Int, y: Int): Char = d(x).drop(max.y - y).head def lAt(x: Int, y: Int): Char = l(y).drop(x).head diff --git a/2022/src/main/scala/aoc2022/Day25.scala b/2022/src/main/scala/aoc2022/Day25.scala index 5b3066a..a3086fd 100644 --- a/2022/src/main/scala/aoc2022/Day25.scala +++ b/2022/src/main/scala/aoc2022/Day25.scala @@ -30,42 +30,40 @@ object Day25 extends AoC: c.runtimeChecked match case '2' | '1' | '0' | '-' | '=' => Digit(c) - case class Number(digits: List[Digit]): + case class Number(digits: Vector[Digit]): def toLong: Long = - digits.reverse.foldLeft((0L,1L)) { case ((a, p), d) => - (a + (p * d.toLong), 5L * p) - }.left - - override def toString: String = - val l = toLong - s"${digits.mkString("")}" + digits + .reverse + .foldLeft((0L, 1L)): + case ((a, p), d) => (a + (p * d.toLong), 5L * p) + .left object Number: - def fromString(s: String): Number = + def fromString(string: String): Number = @tailrec - def loop(s: List[Char], a: List[Digit] = List.empty): Number = - s match - case Nil => Number(a) - case h :: t => loop(t, a :+ Digit.fromChar(h)) - loop(s.toList) + def loop(chars: Vector[Char], result: Vector[Digit] = Vector.empty): Number = + chars.runtimeChecked match + case Vector() => Number(result) + case h +: t => loop(t, result :+ Digit.fromChar(h)) + loop(string.toVector) @tailrec - def fromLong(l: Long, a: List[Digit] = List.empty): Number = - val remainder = l % 5 + def fromLong(long: Long, result: Vector[Digit] = Vector.empty): Number = + val remainder = long % 5 val dividend = remainder match - case 0 | 1 | 2 => l / 5 - case 3 => (l + 2) / 5 - case 4 => (l + 1) / 5 + case 0 | 1 | 2 => long / 5 + case 3 => (long + 2) / 5 + case 4 => (long + 1) / 5 - val acc = remainder match - case 0 | 1 | 2 => Digit.fromChar(remainder.toString.head) :: a - case 3 => Digit.fromChar('=') :: a - case 4 => Digit.fromChar('-') :: a + val next = remainder match + case 0 | 1 | 2 => Digit.fromChar(remainder.toString.head) +: result + case 3 => Digit.fromChar('=') +: result + case 4 => Digit.fromChar('-') +: result - if dividend == 0 then Number(acc) else fromLong(dividend, acc) + if dividend == 0 then Number(next) else fromLong(dividend, next) override lazy val answer1: String = Number.fromLong(snafus.map(_.toLong).sum).toString From 4ee313e3325066b4208372e2dc790776794740b0 Mon Sep 17 00:00:00 2001 From: nmcb Date: Mon, 23 Feb 2026 16:57:05 +0100 Subject: [PATCH 2/2] fix test --- 2022/src/main/scala/aoc2022/Day25.scala | 3 +++ 1 file changed, 3 insertions(+) diff --git a/2022/src/main/scala/aoc2022/Day25.scala b/2022/src/main/scala/aoc2022/Day25.scala index a3086fd..6569dbf 100644 --- a/2022/src/main/scala/aoc2022/Day25.scala +++ b/2022/src/main/scala/aoc2022/Day25.scala @@ -39,6 +39,9 @@ object Day25 extends AoC: case ((a, p), d) => (a + (p * d.toLong), 5L * p) .left + override def toString: String = + s"${digits.mkString("")}" + object Number: def fromString(string: String): Number =