public static (long version, long value) ProcessOperatorPacket(ref BitPacket packet, PacketType type) { var lengthTypeId = packet.ReadNextInt(1); var data = new List <(long version, long value)>(); switch (lengthTypeId) { case 0: var totalLengthAsBits = packet.ReadNextInt(15); var target = packet.GetOffset() + totalLengthAsBits; while (packet.GetOffset() < target) { data.Add(ProcessPacket(ref packet)); } break; case 1: var numberOfSubPackets = packet.ReadNextInt(11); for (int i = 0; i < numberOfSubPackets; i++) { data.Add(ProcessPacket(ref packet)); } break; } var version = data.Aggregate(0L, (acc, next) => acc + next.version); var value = CalculateOperator(data.Select(x => x.value).ToList(), type); return(version, value); }
public override long Part2(string input) { var span = Parse(input); var packet = new BitPacket(span); var(_, value) = ProcessPacket(ref packet); return(value); }
public override long Part1(string input) { var span = Parse(input); var packet = new BitPacket(span); var(version, _) = ProcessPacket(ref packet); return(version); }
public byte[] GetBytes() { var result = new BitPacket(); result.WriteByte(this.Tag); result.WriteByte(Length); result.WriteBlock(this.Data.ToByteArray(), this.Length * 8); return(result.ToByteArray()); }
public CADescriptor(BitPacket packet) { this.Tag = packet.ReadByte(); this.Length = packet.ReadByte(); //this.CASystemID = packet.ReadInt(16); //packet.SkipBit(3); //this.CAPID = packet.ReadInt(13); //this.PrivateDataBytes = packet.ReadBlock((this.Length - 4) * 8); }
public static (long version, long value) ProcessPacket(ref BitPacket packet) { var version = packet.ReadNextInt(3); var typeId = packet.ReadNextEnum <PacketType>(3); (long version, long value)data = typeId switch { PacketType.Literal => ProcessLiteralPacket(ref packet), _ => ProcessOperatorPacket(ref packet, typeId), }; return(data with { version = data.version + version }); }
public Descriptor(BitPacket packet) { this.Tag = packet.ReadByte(); this.Length = packet.ReadByte(); this.Data = new BitPacket(packet.ReadBlock(this.Length * 8)); }
public CADescriptor(Descriptor descriptor) { this.Tag = descriptor.Tag; this.Length = descriptor.Tag; this.Data = descriptor.Data; }