English English (ps.gz)
Romana Romana (ps.gz)
Reference
Download
You're visitor no.
#!/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