private long EvaluatePacket(Packet packet) { if (packet is LiteralPacket) { return((packet as LiteralPacket).Value); } OperatorPacket opPacket = packet as OperatorPacket; if (opPacket.Type == 0) { return(SumUpAllValues(opPacket.SubPackets)); } if (opPacket.Type == 1) { return(MultiplyAllValues(opPacket.SubPackets)); } if (opPacket.Type == 2) { return(MinValue(opPacket.SubPackets)); } if (opPacket.Type == 3) { return(MaxValue(opPacket.SubPackets)); } if (opPacket.Type == 5) { return(GreaterThan(opPacket.SubPackets)); } if (opPacket.Type == 6) { return(LessThan(opPacket.SubPackets)); } if (opPacket.Type == 7) { return(EqualTo(opPacket.SubPackets)); } return(0); }
private int AddAllVersions(Packet packet) { if (packet is LiteralPacket) { return(packet.Version); } int versions = packet.Version; OperatorPacket opPacket = packet as OperatorPacket; foreach (Packet subpacket in opPacket.SubPackets) { versions += AddAllVersions(subpacket); } return(versions); }
public void Day16_TestDecoder_GetOperatorPaket1_OK() { string hexInput = "EE00D40C823060"; var sut = new PaketDecoder(hexInput); var paket = sut.ParsePaket(); OperatorPacket op = paket as OperatorPacket; Assert.NotNull(op); Assert.Equal(7, op.Version); Assert.Equal(3, op.TypeID); Assert.True(op.Iflag); OperatorSubPackets olb = paket as OperatorSubPackets; Assert.NotNull(olb); Assert.Equal(3, olb.SubPackets); Assert.Equal(3, olb.Packets.Count); }
public void Day16_TestDecoder_GetOperatorPaket0_OK() { string hexInput = "38006F45291200"; var sut = new PaketDecoder(hexInput); var paket = sut.ParsePaket(); OperatorPacket op = paket as OperatorPacket; Assert.NotNull(op); Assert.Equal(1, op.Version); Assert.Equal(6, op.TypeID); Assert.False(op.Iflag); OperatorLenBits olb = paket as OperatorLenBits; Assert.NotNull(olb); Assert.Equal(27, olb.LenBits); Assert.Equal(2, olb.Packets.Count); }
private OperatorPacket ParseOperatorPacket(char[] bits, ref int pos, int version, int type) { OperatorPacket packet = new OperatorPacket() { Version = version, Type = type, Id = bits[pos] - '0', SubPackets = new List <Packet>() }; packet.Length = ParseOperatorLength(bits, ref pos); if (packet.Id == 1) { for (int i = 0; i < packet.Length; i++) { Packet subpacket = ParsePacket(bits, ref pos); packet.SubPackets.Add(subpacket); } } else { char[] subPackagesBits = new char[packet.Length]; Array.Copy(bits, pos, subPackagesBits, 0, packet.Length); int subPacketPos = 0; while (subPacketPos < packet.Length) { Packet subpacket = ParsePacket(subPackagesBits, ref subPacketPos); packet.SubPackets.Add(subpacket); } pos += packet.Length; } return(packet); }
public void Visit(OperatorPacket operatorPacket) { Sum += operatorPacket.Version; operatorPacket.SubPackets.ForEach(p => p.Accept(this)); }