Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 14 additions & 24 deletions 2024/src/main/scala/aoc2024/Day24.scala
Original file line number Diff line number Diff line change
Expand Up @@ -15,30 +15,21 @@ object Day24 extends AoC:
def rhs: Wire
def out: Wire

def isAND: Boolean =
this match
case a: Gate.AND => true
case _ => false
def isAND: Boolean = false
def isOR: Boolean = false
def isXOR: Boolean = false

def isOR: Boolean =
this match
case a: Gate.OR => true
case _ => false
case class AND(lhs: Wire, rhs: Wire, out: Wire) extends Gate:
override def isAND: Boolean = true

def isXOR: Boolean =
this match
case a: Gate.XOR => true
case _ => false
case class OR(lhs: Wire, rhs: Wire, out: Wire) extends Gate:
override def isOR: Boolean = true

object Gate:
case class AND(lhs: Wire, rhs: Wire, out: Wire) extends Gate
case class OR(lhs: Wire, rhs: Wire, out: Wire) extends Gate
case class XOR(lhs: Wire, rhs: Wire, out: Wire) extends Gate

import Gate.*
case class XOR(lhs: Wire, rhs: Wire, out: Wire) extends Gate:
override def isXOR: Boolean = true

@tailrec
def solve(gates: Vector[Gate], wires: Map[Wire,Boolean]): Map[Wire,Boolean] =
def solve(gates: Vector[Gate], wires: Map[Wire, Boolean]): Map[Wire, Boolean] =
if gates.nonEmpty then
val o = gates.head
val r = gates.tail
Expand Down Expand Up @@ -71,7 +62,7 @@ object Day24 extends AoC:
def wire: Wire = result._1
def value: Boolean = result._2

def sort(gates: Vector[Gate], wires: Map[Wire,Boolean]): Vector[Gate] =
def sort(gates: Vector[Gate], wires: Map[Wire, Boolean]): Vector[Gate] =
@tailrec
def loop(todo: Vector[Gate], result: Vector[Gate], resolved: Set[String]): Vector[Gate] =
if todo.nonEmpty then
Expand All @@ -86,7 +77,6 @@ object Day24 extends AoC:
loop(dependencies ++ todo, result, resolved)
else
result

loop(gates, Vector.empty, wires.keySet)

def debugOUT(gates: Vector[Gate]): Set[Wire] =
Expand Down Expand Up @@ -124,9 +114,9 @@ object Day24 extends AoC:

val operations =
lines.collect[Gate]:
case s"$t1 XOR $t2 -> $out" => Gate.XOR(t1, t2, out)
case s"$t1 OR $t2 -> $out" => Gate.OR(t1, t2, out)
case s"$t1 AND $t2 -> $out" => Gate.AND(t1, t2, out)
case s"$t1 XOR $t2 -> $out" => XOR(t1, t2, out)
case s"$t1 OR $t2 -> $out" => OR(t1, t2, out)
case s"$t1 AND $t2 -> $out" => AND(t1, t2, out)

(initial, operations)

Expand Down