67 lines
1.5 KiB
Perl
Executable File
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";
|