<?xml version="1.0" encoding="windows-1252"?>
<node id="495658" title="Re: generate combinations of lists" created="2005-09-28 03:27:23" updated="2005-09-27 23:27:23">
<type id="11">
note</type>
<author id="483671">
gargle</author>
<data>
<field name="doctext">
&lt;p&gt;Hi,&lt;/p&gt;

&lt;b&gt;update: &lt;a href="http://www.catb.org/~esr/jargon/html/B/bogo-sort.html"&gt;clarification &lt;/a&gt;&lt;/b&gt;

&lt;p&gt;disclaimer: &lt;b&gt;bogoperm&lt;/b&gt;, but it does fit your description of the problem!&lt;/p&gt;

&lt;code&gt;
#!/usr/bin/perl

use strict;
use warnings;

#############
# bogoperm! #
#############

my @array = qw(a b c);
my $length = @array;

# faculty
my $fac = 1;
foreach my $f (1..$length) {
    $fac *= $f;
}

# my results
my %hash = ();

# internals
my $check; # if equals control then we found a number
my $control; # has to contain something like 123...
my $index; # the number itself, it's an index!
my $count = 0; # 'till this equals $fac
OUTER: do {
  INNER: while (1) {
      do {
	  $check = 0;
	  $control = 0;
	  $index = 0;
	  foreach my $i (1..$length) {
	      my $number = 1+int(rand()*$length);
	      $index += $number * 10**($i-1);
	      $check += 10**$number;
	      $control += 10**$i;
	  }
	  $check /= 10; $control /= 10;
      } while ($check != $control);
      last INNER if defined $hash{$index};
      $hash{$index}++;
      $count++;
  }
} while $count != $fac;

# print out the results
foreach my $i (keys %hash) {
    my $j;
    do {
	$j = $i % 10; 
	print $array[$j-1];
	$i = ($i - $j) / 10;
    } while ($i &gt; 0);
    print "\n";
}
&lt;/code&gt;

&lt;p&gt;output:&lt;/p&gt;

&lt;code&gt;
bash-3.00$ ./perm.pl
cba
acb
bac
cab
abc
bca
&lt;/code&gt;

&lt;p&gt;I'll leave it as an exercise to put the output in real lists.&lt;/p&gt;

&lt;p&gt;Well, at least I used strict and warnings :o&lt;/p&gt;
&lt;!-- Node text goes above. Div tags should contain sig only --&gt;
&lt;div class="pmsig"&gt;&lt;div class="pmsig-483671"&gt;
-- &lt;br/&gt;
if ( 1 ) { $postman-&gt;ring() for (1..2); }
&lt;/div&gt;&lt;/div&gt;</field>
<field name="root_node">
495627</field>
<field name="parent_node">
495627</field>
</data>
</node>
