English English (ps.gz)

Romana Romana (ps.gz)

Reference

Download

You're visitor no.


SourceForge Logo


#!/usr/bin/plint -n

plint 'permutations'
{

    include 'sg'
    format string = '', '';



    /***************************
	    Inversions
    ****************************/
    class Inv
    {
	new operator : Inv_new;
	operator ()  : Inv_;
	data
	    i,
	    j;
    }
    
    method Inv_new(i, j)
    {
	self.i = <type integer>i;
	self.j = <type integer>j;

	_ = 'inversion indexes are';
	if ($self.i < 0 ||
	    $self.j < 0) {
	    throw "1_ + ' less than zero';
	} else if ($self.i == $self.j) {
	    throw "1_ + 'equal';
	} else if ($self.i > $self.j) {
	    _ = $self.i;
	    self.i = $self.j;
	    self.j = $_;
	}
	this = self;
    }
    
    method Inv_(p)
    {
	if ($self.i > len(p) || $self.j > len(p)) {
	    throw 'inversion indexes less than ' + "({ len(p) });
	}
	_ = $p[$self.i];
	p[$self.i] = $p[$self.j];
	p[$self.j] = $_;
	this = self;
    }



    /***************************
	    Solutions
    ****************************/
    class Sol
    {
	new operator  : Sol_new;
	echo operator : Sol_echo;
	operator +=   : Sol_inc;
	operator -=   : Sol_dec;

	data
	    p,
	    a = ![];
    }
    
    method Sol_new(p)
    {
	if (class(p) =|= 'Perm') {
	    throw class(self) + ' must be associated with Perm';
	}
	self.p = p;
	this = self;
    }
    
    method Sol_inc(ij)
    {
	try {
	    ++self.a;
	    self.a[len(self.a)] = new Inv(ij[1], ij[2]);
	} catch {
	    else { throw _; }
	}
    }

    method Sol_dec(ij)
    {
	--self.a;
    }
    
    method Sol_echo()
    {
	new integer p[$self.p.n];
	foreach (p) { p[$_[1]] = $_[1]; }
	foreach (self.a) { _[2]`(p); }
	foreach (p) { echo $_[2], ' '; }
	this = self;
    }

    

    /***************************
	    Permutations
    ****************************/
    class Perm
    {
	new operator : Perm_new;
	operator ()  : Perm_;
	data
	    n,
	    s;
    }
    
    method Perm_new(n)
    {
	n = abs(n);
	n = <type integer>n;
	if ($n < 1) {
	    throw 'number of permutation objects is less than one';
	}
	self.n = $n;
	try {
	    self.s = new Sol(self);
	} catch {
	    else { throw _; }
	}
	this = self;
    }
    
    method Perm_(i)
    {
	if ($i == $self.n) {
	    echo self.s,;
	} else {
	    new j;
	    self`($i+1);
	    for (j = $i+1 : $j <= $self.n : ++j) {
		self.s += ![ i, j ];
		self`($i+1);
		self.s -= ![ i, j ];
	    }
	}
	this = self;
    }
    
    method Perm_()
    {
	this = self`(1);
    }



    /***************************
		Main
    ****************************/
    try {
	if (len(argv) == 0) {
	    throw 'Syntax is: perm N1 N2 ...';
	}
	foreach (argv) {
	    _ = new Perm($_[2]);
	    _`();
	}
	sg();
    } catch {
	else {
	    echo 'Error : ', _, '!',;
	}
    }
}


syntax highlighted by Code2HTML, v. 0.9