#!/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";