Advertisement
overloop

chorus.pl

Feb 15th, 2014
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 1.22 KB | None | 0 0
  1. #!/usr/bin/perl
  2.  
  3. if (scalar(@ARGV)<1) {
  4.     print "usage: chorus.pl file\n";
  5.     exit 0;
  6. }
  7.  
  8. my ($file) = @ARGV;
  9.  
  10. my @lines = ();
  11.  
  12. open INPUT,"<",$file;
  13. while (my $line = <INPUT>) {
  14.     chomp($line);
  15.     $line =~ s/\r$//g;
  16.     push(@lines,$line);
  17. }
  18. close INPUT;
  19.  
  20. my $n = scalar(@lines);
  21.  
  22. my %matches = ();
  23.  
  24. for ($i=0;$i<$n;$i++) {
  25.     for ($j=$i+1;$j<$n;$j++) {
  26.         if ($lines[$i] eq $lines[$j]) {
  27.             push(@{$matches{$i}},$j);
  28.         }
  29.     }
  30. }
  31.  
  32. sub has_pair {
  33.     my ($a,$b) = @_;
  34.     my %m = map { $_ => 1 } @{$matches{$a}};
  35.     return exists $m{$b};
  36. }
  37.  
  38. sub find_blocks {
  39.     my ($begin) = @_;
  40.     my $end = $begin;
  41.     my $begin2 = $begin;
  42.     my $end2 = $end;
  43.     my @m = @{$matches{$begin}};
  44.     if (scalar(@m)>0) {
  45.         $begin2 = $m[0];
  46.         my $a = $begin+1;
  47.         my $b = $m[0]+1;
  48.         while (has_pair($a,$b)) {
  49.             $a = $a + 1;
  50.             $b = $b + 1;
  51.         }
  52.         $end = $a - 1;
  53.         $end2 = $b - 1;
  54.     }
  55.     return ($begin,$end,$begin2,$end2);
  56. }
  57.  
  58. $i = 0;
  59. while ($i<$n) {
  60.     my ($begin,$end,$begin2,$end2) = find_blocks($i);
  61.     if ($begin != $end) {
  62.         print ">$begin..$end $begin2..$end2\n";
  63.         for ($j=$begin;$j<=$end;$j++) {
  64.             print "| " . $lines[$j] . "\n";
  65.         }
  66.         print "<$begin..$end $begin2..$end2\n";
  67.     } else {
  68.         print $lines[$begin] . "\n";
  69.     }
  70.     $i = $end + 1;
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement