> so you need recursion (or fake it).
so here a recursive version with global variables (because I also wanted to provide a solution with two nested loops "faking" recursion, but gave up)
NB: it's optimized for the dual case, where it's easier to set 0s into a string full of 1s.
use 5.12.0;
use strict;
use warnings;
use Data::Dump qw/pp dd/;
use Test::More;
my $ones = 3;
my $len = 5;
my @res;
my ($zero,$one) = ('0','1');
# optimize dual case
if ($ones > $len/2) {
($zero,$one) = ($one,$zero);
$ones = $len-$ones;
}
my $max = $len - 1;
our $str = $zero x $len;
our $level = 0;
rec(0);
pp \@res;
sub rec {
local $level = $level + 1;
my ($start) =@_;
for my $idx ( $start .. $max ) {
local $str = $str;
substr $str, $idx, 1, $one;
if ($level < $ones) {
rec( $idx + 1 );
} else {
push @res, $str;
}
}
}
[
"00111",
"01011",
"01101",
"01110",
10011,
10101,
10110,
11001,
11010,
11100,
]
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.
|