diff --git a/2021/README.md b/2021/README.md
index 3ac0c81fbc8ea64f63136a9e43e83d59a4d1599e..3c0617b54f076085cc1dbc0ef6f62a9cd88d72c7 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 8a15b29e198f494fd60f249c7725050f22bf5bd9..27878b604a035d95ed7466e118ecaa1f16ee5170 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 b413c654cd62426284d3d7fdafb4aa0ddb0a330b..329c038f10dea820c85cf8f3d728040f214c2b8c 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 f4f2e826ea84ca7aad46726d7728cbd3eab4c971..1fea967c145a836c0912aea23886f8db8f153011 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 b25fb72c11cbd02a9e2c273c63b2ac1997b73aa5..6ee0f928be2765410338db0e61829d6233ac0b19 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 439ad427979f984f1f40e8e6f0fe3dddf156afda..09cfdff299e30a89dff7dc5cd42f8c8b0b8bb7af 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();
 }