56 lines
1.6 KiB
Perl
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); |