diff --git a/2021/src/day16.rs b/2021/src/day16.rs
index c855678..6aadc8a 100644
--- a/2021/src/day16.rs
+++ b/2021/src/day16.rs
@@ -98,46 +98,32 @@ fn parse_operator_len(input: Input) -> IResult> {
fn parse_operator_count(input: Input) -> IResult> {
const SIZE_LEN: usize = 11;
- let (input, to_read) = take::<_, usize, _, _>(SIZE_LEN)(input)?;
+ let (input, to_read) = take(SIZE_LEN)(input)?;
count(parse_packet, to_read)(input)
}
fn parse_packet(input: Input) -> IResult {
- let parse_literal_packet = map(
- tuple((take(3usize), preceded(tag(4u8, 3usize), parse_literal))),
+ let parse_literal_packet = preceded(tag(4u8, 3usize), parse_literal);
+
+ let parse_operator_packet = map(
+ tuple((
+ take(3usize),
+ alt((
+ preceded(tag(0u8, 1usize), parse_operator_len),
+ preceded(tag(1u8, 1usize), parse_operator_count),
+ )),
+ )),
+ |(operator, contents)| Contents::Operator(operator, contents),
+ );
+
+ map(
+ tuple((
+ take(3usize),
+ alt((parse_literal_packet, parse_operator_packet)),
+ )),
|(version, contents)| Packet { version, contents },
- );
-
- let parse_operator_len_packet = map(
- tuple((
- take(3usize),
- take(3usize),
- preceded(tag(0u8, 1usize), parse_operator_len),
- )),
- |(version, operator, contents)| Packet {
- version,
- contents: Contents::Operator(operator, contents),
- },
- );
-
- let parse_operator_count_packet = map(
- tuple((
- take(3usize),
- take(3usize),
- preceded(tag(1u8, 1usize), parse_operator_count),
- )),
- |(version, operator, contents)| Packet {
- version,
- contents: Contents::Operator(operator, contents),
- },
- );
-
- alt((
- parse_literal_packet,
- parse_operator_len_packet,
- parse_operator_count_packet,
- ))(input)
+ )(input)
}
fn convert_hex(hex: &[u8]) -> Vec {