All pastes #984686 Raw Edit

parens

public text v1 · immutable
·published 2008-04-14 14:17 UTC
rendered paste body
#!/usr/bin/perl
######################################################################
#                   Paren Lister by Ryan Whitehurst                  #
#                                                                    #
# ------------------------------------------------------------------ #
# This work is hereby released into the Public Domain.  This applies #
#   worldwide. If this is not legally possible, the right is granted #
#   for anyone to use this work for any purpose without any          #
#   conditions, unless such conditions are required by law.          #
# ------------------------------------------------------------------ #
#                                                                    #
# This program is used to list all the possible valid combinations   #
#   of a given number of pairs of parentheses.                       #
######################################################################

use strict;
use warnings;

die("Invalid or missing arguments") unless($ARGV[0]>0);

my $n = $ARGV[0];
my $start = time();
(my $min, my $max) = (0, 0);
my @results = ();

sub v_parens {
	my $num = $_[0];
	my @array = ();
	my $count = 0;

	for(my $i=0;$i<2*$n;$i++) {
		if(($num & (2**$i))==(2**$i)) {
			push(@array, 1);
			++$count;
		} else {
			push(@array, 0);
			--$count;
		}
	}
	if($count==0) {
		return @array;
	} else { return (); }
}

# find $min
for(my $i=1;$i<2*$n;$i+=2) {	$min+=2**$i; }
# find $max
for(my $i=2*$n-1;$i>=$n;$i--) { $max+=2**$i; }

for(my $i=$min;$i<=$max;$i++) {
	push(@results, v_parens($i)) unless($i%2);
}

my $numresults = scalar(@results)/(2*$n);

while(scalar(@results)>0) {
	for(my $i=0;$i<2*$n;$i++) {
		if(pop(@results) == 1) {
			print "(";
		} else {
			print ")";
		}
	} print "\n";
}

print "$numresults results\n";
print "Time elapsed: " . (time() - $start) . "\n";