use strict; use warnings; my ($bits, @nums); while (<>) { chomp; $bits = length($_); push @nums, oct("0b".$_); } sub countOnes { my $i = shift; my $ones = 0; foreach (@_) { $ones++ if $_ & (1 << $i); } $ones; } my $gamma = 0; for (my $i = 0; $i < $bits; $i++) { $gamma |= 1 << $i if countOnes($i, @nums) > @nums / 2; } my $epsilon = ~$gamma & ((1 << $bits) - 1); print $gamma * $epsilon, "\n"; my @o2 = @nums; my $i = $bits - 1; while (@o2 > 1) { my $most = (countOnes($i, @o2) >= @o2 / 2) << $i; @o2 = grep { ($_ & (1 << $i)) == $most } @o2; $i--; } my @co2 = @nums; $i = $bits - 1; while (@co2 > 1) { my $least = !(countOnes($i, @co2) >= @co2 / 2) << $i; @co2 = grep { ($_ & (1 << $i)) == $least } @co2; $i--; } print $o2[0] * $co2[0], "\n";