#!/usr/bin/perl -w

use strict;

my (@item, $i, $j, $mask, $descanso, $trabajo, @patron, $pat);
# my ($masknext);

if (@ARGV==0){
    print "Ejemplo de patrÃ³n: MMMTTN000\n";
    print "PatrÃ³n:\t";
    $mask = <STDIN>;
    chomp $mask;
    @item = split ('',$mask);
}elsif(@ARGV==1){
    @item = split "", $ARGV[0];
} else {
    @item = split "", (join '',@ARGV);
}

# $mask="";
# for $i (@item){
#    $temp .= $mask x $i;
#    if ($mask eq "M" || $mask == 1) {
#	$trabajo += $i;
#	$masknext="N";
#	$mask="0";
#    }elsif($mask eq "N" || $mask == 3){
#	$trabajo += $i;
#	$masknext = "T";
#	$mask="0";
#    }elsif($mask eq "T" || $mask == 2){
#	$trabajo += $i;
#	$masknext="M";
#	$mask = "0";
#    }else{
#	$descanso += $i;
#	$mask=$masknext;
#    }
# }

my $temp;
for (@item){
    tr/123/MTN/;
    tr/mtn/MTN/;
    $temp.= $_;
}


@patron = split "", $temp;
$pat = scalar(@patron);

my ($y, $z, @tat, $mira, @m, @n, @t); 
my @temp=();
$y=0;
do {
   $temp[$y]=$patron[$y%$pat];
   $y++;
}until ($y%7==0 && $y%$pat==0);
# print @temp;
# exit 0;
$y=$y/$pat;

for (0..6){ $tat[$_]=0; $m[$_]=0; $n[$_]=0; $t[$_]=0; }
for ($i=0;$i<=$#temp;$i++){
    $j=$i%7;
    if ($j==0) { print ++$z,"\t"; }
    print $temp[$i];
    if ($temp[$i] eq "0") { $tat[$j]++; $descanso++;}
    elsif($temp[$i] eq "M"){ $m[$j]++; $trabajo++;}
    elsif($temp[$i] eq "N"){ $n[$j]++; $trabajo++;}
    elsif($temp[$i] eq "T"){ $t[$j]++; $trabajo++;}
#    else { die "Letra desconocida"; }
    
    if ($j==6) {
      print "\n";
      if ($temp[$i] ne "0") { $mira++; }
    }
}
&INVERSE;
print "DES\t", @tat,"\n";
print " M \t", @m,"\n";
print " N \t", @n,"\n";
print " T \t", @t,"\n";

&NORMAL;
print "\t\t\tCiclo completo en ", $z," semanas\n";
die "ERROR DE PATRON INTRODUCIDO." if ($z<2);
print "\t\t\tTrabajo\t\tDescanso\tRatio\n";
print "Domingos\t\t",$mira,"\t\t",$z-$mira,"\t",$mira/($z-$mira),"\n";
print "Total   \t\t",$trabajo,"\t\t",$descanso,"\t",$descanso/$trabajo,"\n";
# &PERM(9);




sub CLS { print "\e[;H\e[2J"; }
sub INVERSE { print "\e[7m"; }
sub NORMAL { print "\e[0m"; }
sub EL { print "\e[K"; }  # erase line
sub CPOS { my($y,$x)=@_; print "\e[$y;$x"; print "H"; }  # position cursor (y,x)



# generating permutations lexicographic order 
# Combinatorial Algorithms. Reingold, Nievergelt, Deo 
sub PERM{
    my $n=$_[0];
    my ($i, $j, $r, $s);
    my (@pi);
    for ($i=0; $i <= $n; $i++) { $pi[$i] = $i; }
    $i = 1;
    while ($i){
        # for ($i=1; $i<=$n; $i++) { printf(" %2d", $pi[$i]); }
        # print "\n";
        $i = $n-1;
        while ($pi[$i] > $pi[$i+1]) { $i--; }
        $j = $n;
        while ($pi[$i] > $pi[$j]) { $j--; }
	($pi[$i],$pi[$j])=($pi[$j],$pi[$i]);

        $r = $n;
        $s = $i+1;
        while ($r>$s){
	     ($pi[$r],$pi[$s])=($pi[$s],$pi[$r]);
             $r--;
	     $s++;
        }
    }
}

__END__

Análisis a la antigüa usanza de patrones de trabajo y descanso. 
  Posteriormente se expande el ciclo básico y se asignan semanas de inicio
  a diferentes trabajadores. Existen formas mejores de hacerlo, pero dudo
  que sean gratis.

/usr/src/SH$ perl patrones 3 1 3 2 3 3
  1       MMM0NNN
  2       00TTT00
  3       0MMM0NN
  4       N00TTT0
  5       00MMM0N
  6       NN00TTT
  7       000MMM0
  8       NNN00TT
  9       T000MMM
  10      0NNN00T
  11      TT000MM
  12      M0NNN00
  13      TTT000M
  14      MM0NNN0
  15      0TTT000
  sum     6666666
   M      3333333
   N      3333333
   T      3333333
                          Ciclo completo en 15 semanas
                  Trabajo         Descanso        Ratio
  Domingos                9               6       1.5
  Total                   63              42      0.666666666666666667

Ejemplo nuevo:
  
Ejemplo de patrÃ³n: MMMTTN000
PatrÃ³n:MMMTTN000
  1  MMMTTN0
  2  00MMMTT
  3  N000MMM
  4  TTN000M
  5  MMTTN00
  6  0MMMTTN
  7  000MMMT
  8  TN000MM
  9  MTTN000
  DES3333333
  M  3333333
  N  1111111
  T  2222222
  Ciclo completo en 9 semanas
  Trabajo  Descanso  Ratio
  Domingos  6  3   2
  Total     42 21  0.5
  

