From 00fd3876c3380adfe5bd0c7b225cabab1842c55a Mon Sep 17 00:00:00 2001
From: Christopher Bohn <bohn@unl.edu>
Date: Thu, 23 Dec 2021 16:41:32 -0600
Subject: [PATCH] Day 16 complete

---
 2021/README.md                                     |  4 +++-
 .../main/java/edu/unl/cse/bohn/year2021/Day16.java | 13 +++++++++++--
 .../unl/cse/bohn/year2021/computer/Computer.java   |  4 ++++
 .../bohn/year2021/computer/LiteralValuePacket.java |  5 +++++
 .../cse/bohn/year2021/computer/OperatorPacket.java | 14 ++++++++++++++
 .../edu/unl/cse/bohn/year2021/computer/Packet.java |  2 ++
 6 files changed, 39 insertions(+), 3 deletions(-)

diff --git a/2021/README.md b/2021/README.md
index 3ac0c81..3c0617b 100644
--- a/2021/README.md
+++ b/2021/README.md
@@ -216,4 +216,6 @@ relationships between the tiles, though.
 ## Day 16
 
 Part 1 looks to be about preparing this year's computer's syntax tree. I think
-I'll try out Java's new "sealed class."
\ No newline at end of file
+I'll try out Java's new "sealed class." Part 2 isn't particularly challenging:
+the hard part was setting up the syntax tree in Part 1. I'll get to use Java's
+new switch expressions, though.
diff --git a/2021/src/main/java/edu/unl/cse/bohn/year2021/Day16.java b/2021/src/main/java/edu/unl/cse/bohn/year2021/Day16.java
index 8a15b29..27878b6 100644
--- a/2021/src/main/java/edu/unl/cse/bohn/year2021/Day16.java
+++ b/2021/src/main/java/edu/unl/cse/bohn/year2021/Day16.java
@@ -28,7 +28,15 @@ public class Day16 extends Puzzle {
 //        sampleData = "8A004A801A8002F478";              // version sum = 16
 //        sampleData = "620080001611562C8802118E34";      // version sum = 12
 //        sampleData = "C0015000016115A2E0802F182340";    // version sum = 23
-        sampleData = "A0016C880162017C3686B18A3D4780";  // version sum = 31
+//        sampleData = "A0016C880162017C3686B18A3D4780";  // version sum = 31
+//        sampleData = "C200B40A82";                      // 1 + 2 = 3
+//        sampleData = "04005AC33890";                    // 6 * 9 = 54
+//        sampleData = "880086C3E88112";                  // min(7,8,9) = 7
+//        sampleData = "CE00C43D881120";                  // max(7,8,9) = 9
+//        sampleData = "D8005AC2A8F0";                    // (5 < 15) = 1
+//        sampleData = "F600BC2D8F";                      // (5 > 15) = 0
+//        sampleData = "9C005AC2F8F0";                    // (5 == 15) = 0
+        sampleData = "9C0141080250320F1802104A08";      // (1+3 == 2*2) = 1
     }
 
     @Override
@@ -39,6 +47,7 @@ public class Day16 extends Puzzle {
 
     @Override
     public long computePart2(List<String> data) {
-        return 0;
+        Computer computer = new Computer(data.get(0));
+        return computer.compute();
     }
 }
diff --git a/2021/src/main/java/edu/unl/cse/bohn/year2021/computer/Computer.java b/2021/src/main/java/edu/unl/cse/bohn/year2021/computer/Computer.java
index b413c65..329c038 100644
--- a/2021/src/main/java/edu/unl/cse/bohn/year2021/computer/Computer.java
+++ b/2021/src/main/java/edu/unl/cse/bohn/year2021/computer/Computer.java
@@ -31,4 +31,8 @@ public class Computer {
     public long addPacketVersionNumbers() {
         return syntaxTree.addPacketVersionNumbers();
     }
+
+    public long compute() {
+        return syntaxTree.compute();
+    }
 }
diff --git a/2021/src/main/java/edu/unl/cse/bohn/year2021/computer/LiteralValuePacket.java b/2021/src/main/java/edu/unl/cse/bohn/year2021/computer/LiteralValuePacket.java
index f4f2e82..1fea967 100644
--- a/2021/src/main/java/edu/unl/cse/bohn/year2021/computer/LiteralValuePacket.java
+++ b/2021/src/main/java/edu/unl/cse/bohn/year2021/computer/LiteralValuePacket.java
@@ -22,4 +22,9 @@ final class LiteralValuePacket extends Packet {
     public long addPacketVersionNumbers() {
         return version;
     }
+
+    @Override
+    public long compute() {
+        return value;
+    }
 }
diff --git a/2021/src/main/java/edu/unl/cse/bohn/year2021/computer/OperatorPacket.java b/2021/src/main/java/edu/unl/cse/bohn/year2021/computer/OperatorPacket.java
index b25fb72..6ee0f92 100644
--- a/2021/src/main/java/edu/unl/cse/bohn/year2021/computer/OperatorPacket.java
+++ b/2021/src/main/java/edu/unl/cse/bohn/year2021/computer/OperatorPacket.java
@@ -30,4 +30,18 @@ public final class OperatorPacket extends Packet {
     public long addPacketVersionNumbers() {
         return version + subPackets.stream().mapToLong(Packet::addPacketVersionNumbers).sum();
     }
+
+    @Override
+    public long compute() {
+        return switch ((int)typeID) {
+            case 0  -> subPackets.stream().mapToLong(Packet::compute).sum();
+            case 1  -> subPackets.stream().mapToLong(Packet::compute).reduce((a, b) -> a * b).orElseThrow();
+            case 2  -> subPackets.stream().mapToLong(Packet::compute).min().orElseThrow();
+            case 3  -> subPackets.stream().mapToLong(Packet::compute).max().orElseThrow();
+            case 5  -> subPackets.get(0).compute() > subPackets.get(1).compute()    ? 1 : 0;
+            case 6  -> subPackets.get(0).compute() < subPackets.get(1).compute()    ? 1 : 0;
+            case 7  -> subPackets.get(0).compute() == subPackets.get(1).compute()   ? 1 : 0;
+            default -> throw new IllegalStateException("Unknown type ID: " + typeID);
+        };
+    }
 }
diff --git a/2021/src/main/java/edu/unl/cse/bohn/year2021/computer/Packet.java b/2021/src/main/java/edu/unl/cse/bohn/year2021/computer/Packet.java
index 439ad42..09cfdff 100644
--- a/2021/src/main/java/edu/unl/cse/bohn/year2021/computer/Packet.java
+++ b/2021/src/main/java/edu/unl/cse/bohn/year2021/computer/Packet.java
@@ -39,4 +39,6 @@ public abstract sealed class Packet permits LiteralValuePacket, OperatorPacket {
     }
 
     public abstract long addPacketVersionNumbers();
+
+    public abstract long compute();
 }
-- 
GitLab