示例#1
0
        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);
        }
示例#2
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);
        }
示例#5
0
        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));
 }