advent-of-code/2021/day-03/part_two.pl

67 lines
1.5 KiB
Perl
Executable File

#!/usr/bin/env perl
# use warnings;
use strict;
use lib "./";
use common;
use Data::Dumper;
sub tally_digit_column {
my $numbers = $_[0];
my $digit = $_[1];
my @ones;
my @zeroes;
for my $num (@$numbers) {
if ($num->[$digit] eq "1") {
push(@ones, $num);
} else {
push(@zeroes, $num);
}
}
return (\@ones, \@zeroes);
}
sub part_two {
my $numbers = $_[0];
my $digits = @{$numbers->[0]};
my $highest = $numbers;
my $lowest = $numbers;
for my $idx (0..$digits) {
if (scalar(@$highest) != 1) {
my @results = tally_digit_column($highest, $idx);
my $ones = @results[0];
my $zeroes = @results[1];
if (scalar(@$ones) >= scalar(@$zeroes)) {
$highest = $ones;
} else {
$highest = $zeroes;
}
}
if (scalar(@$lowest) != 1) {
my @results = tally_digit_column($lowest, $idx);
my $ones = @results[0];
my $zeroes = @results[1];
if (scalar(@$zeroes) <= scalar(@$ones)) {
$lowest = $zeroes;
} else {
$lowest = $ones;
}
}
}
my $oxygen_rating = oct("0b" . join("", @{$highest->[0]}));
my $scrubber_rating = oct("0b" . join("", @{$lowest->[0]}));
return $oxygen_rating * $scrubber_rating;
}
my @numbers = common::read_file($ARGV[0]);
my $result = part_two(\@numbers);
print $result, "\n";