use strict; my $change = 16; my @coins = sort { $b <=> $a } qw(2 5); my $q='1'x$change; my $solution = join "", map { qr[((?:.{$_})*)] } @coins; $q =~ /^$solution$/ or die "Error in regex construction"; { # This should maybe be done via @-, but I'm lazy: no strict; print(length(${$_})/$coins[$_-1], '*', $coins[$_-1]) for (1..@coins); }; __END__