Merge branch 'master' of https://github.com/Fizzizist/rosalind-solutions
This commit is contained in:
commit
96c59030ff
60
PERM.pl
Normal file
60
PERM.pl
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
=pod
|
||||||
|
Solution to PERM Rosalind problem
|
||||||
|
Generates permutations from 1 to n and totals them
|
||||||
|
Author: Peter Vlasveld
|
||||||
|
=cut
|
||||||
|
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
#Get number from file
|
||||||
|
open(IN, "rosalind_perm.txt") or die "Couldn't open the file";
|
||||||
|
my $number = <IN>;
|
||||||
|
close IN;
|
||||||
|
|
||||||
|
#create number array
|
||||||
|
my @array = (1..$number);
|
||||||
|
|
||||||
|
#create global variable for return array
|
||||||
|
my @finalArr = ();
|
||||||
|
|
||||||
|
#open output file for writing
|
||||||
|
open(OUT, ">output.txt") or die "Couldn't open output file";
|
||||||
|
|
||||||
|
#print result of perm subroutine
|
||||||
|
print OUT perm(\@array, 0), "\n";
|
||||||
|
|
||||||
|
#print array of permutations
|
||||||
|
for (@finalArr){
|
||||||
|
print OUT "@{$_}\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
#close output file
|
||||||
|
close OUT;
|
||||||
|
|
||||||
|
#Recursive permutation subroutine
|
||||||
|
sub perm{
|
||||||
|
#declare sub variables
|
||||||
|
my ($arr_ref, $num) = @_;
|
||||||
|
my $count = 0;
|
||||||
|
#dereference input array
|
||||||
|
my @arr = @{$arr_ref};
|
||||||
|
|
||||||
|
#base case - when num = length of array
|
||||||
|
if ($num == $#arr) {
|
||||||
|
push @finalArr, \@arr;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#perform a swap of num and each other number in the array, and then call the next instance of the sub
|
||||||
|
for ($num..$#arr){
|
||||||
|
($arr[$num], $arr[$_]) = ($arr[$_], $arr[$num]);
|
||||||
|
$count += perm(\@arr, $num+1);
|
||||||
|
}
|
||||||
|
#eventually returns number of permutations
|
||||||
|
return $count;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user