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(); }