use strict;
use warnings;
my $zero = shift || 3;
my $one = shift || 2;
my @array = ( (0) x $zero, (1) x $one );
# print "@array\n";
print join ('', @array), "\n";
while (1) {
my $cand = $#array;
while ($cand) {
if ($array[$cand-1] == 0 and $array[$cand] == 1) {
($array[$cand-1], $array[$cand]) = ($array[$cand], $array[$cand-1]);
if ($cand < $#array) {
@array[$cand+1..$#array] = sort @array[$cand+1..$#array];
}
last;
}
--$cand;
}
last unless $cand;
# print "@array\n";
print join ('', @array), "\n";
}
####
sub iter {
my $zero = shift || 3;
my $one = shift || 2;
my $init = 0;
my @array = ( (0) x $zero, (1) x $one );
return sub {
$init++ or return join('', @array);
my $cand = $#array;
while ($cand) {
if ($array[$cand-1] == 0 and $array[$cand] == 1) {
($array[$cand-1], $array[$cand]) = ($array[$cand], $array[$cand-1]);
if ($cand < $#array) {
@array[$cand+1..$#array] = sort @array[$cand+1..$#array];
}
last;
}
--$cand;
}
return $cand ? join( '', @array) : undef;
}
}
my $i = iter(@ARGV);
while (my $str = $i->()) {
print "$str\n";
}
##
##
$cand < $#array - 1 and
@array[$cand+1..$#array] = reverse @array[$cand+1..$#array];