Question 2 

my %element = qw(
    Hydrogen      H
    Helium        He
    Lithium       Li
    ...
);

my %nyb = map { $_ => [] } (0..15);
while(my($name, $sym) = each %element) {
    my $i = 1;
    foreach my $char ($sym =~ /(.)/g) {
        my $bits = ord($char) & 15;
        push @{$nyb{$bits}}, "$name-$i";
        $i++;
    }
}
%nyb = (
    '0' => [ 'Neptunium-2', 'Platinum-1', 'Lead-1', ... ],
    '1' => [ 'Actinium-1', 'Silver-1', 'Gold-1', 'Radium-2', ...],
    ...
    '15' => [ 'Oxygen-1', 'Molybdenum-2', 'Cobalt-2', ... ]
);