adventofcode2022/day06/day06.pl

56 lines
1.6 KiB
Perl

#!/usr/bin/env perl
use strict;
use warnings;
use feature qw/ say /;
use Test::More;
ok( start_of_packet_marker("mjqjpqmgbljsphdztnvjfqwrcgsmlb") == 7 );
ok( start_of_packet_marker("bvwbjplbgvbhsrlpgdmjqwftvncz") == 5 );
ok( start_of_packet_marker("nppdvjthqldpwncqszvftbrmjlhg") == 6 );
ok( start_of_packet_marker("nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg") == 10 );
ok( start_of_packet_marker("zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw") == 11 );
ok( start_of_message_marker("mjqjpqmgbljsphdztnvjfqwrcgsmlb") == 19 );
ok( start_of_message_marker("bvwbjplbgvbhsrlpgdmjqwftvncz") == 23 );
ok( start_of_message_marker("nppdvjthqldpwncqszvftbrmjlhg") == 23 );
ok( start_of_message_marker("nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg") == 29 );
ok( start_of_message_marker("zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw") == 26 );
done_testing();
sub start_of_packet_marker {
my $datastream = shift;
my $marker = 4;
while ( !is_start_packet( substr( $datastream, ( $marker - 4 ), 4 ) ) ) {
$marker++;
}
return $marker;
}
sub is_start_packet {
my $packet = shift;
my %packet = map { $_ => 1 } split( //, $packet );
keys %packet == 4 ? return 1 : return 0;
}
sub start_of_message_marker {
my $datastream = shift;
my $marker = 14;
while ( !is_start_message( substr( $datastream, ( $marker - 14 ), 14 ) ) ) {
$marker++;
}
return $marker;
}
sub is_start_message {
my $packet = shift;
my %packet = map { $_ => 1 } split( //, $packet );
keys %packet == 14 ? return 1 : return 0;
}
open( my $fh, "<", "input" )
or die "Can't open < 'input': $!";
my $line = <$fh>;
say start_of_packet_marker($line);
say start_of_message_marker($line);