#!/usr/bin/perl -w use strict; my (@item, $i, $j, $mask, $descanso, $trabajo, @patron, $patron); my ($masknext, $temp); if (@ARGV==0){ print "Patron:\t"; @item = split (' ',); }elsif(@ARGV==1){ @item = split "", $ARGV[0]; } else { @item = @ARGV; } $mask="M"; for $i (@item){ $temp .= $mask x $i; if ($mask eq "M") { $trabajo += $i; $masknext="N"; $mask="0"; }elsif($mask eq "N"){ $trabajo += $i; $masknext = "T"; $mask="0"; }elsif($mask eq "T"){ $trabajo += $i; $masknext="M"; $mask = "0"; }else{ $descanso += $i; $mask=$masknext; } } @patron = split "", $temp; $patron = @patron; my (@temp, $y, $z, @tat, $mira, @m, @n, @t); $y=0; do { $temp[$y]=$patron[$y%$patron]; $y++; }until ($y%7==0 && $y%$patron==0); $y=$y/$patron; 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]++; } elsif($temp[$i] eq "M"){ $m[$j]++; } elsif($temp[$i] eq "N"){ $n[$j]++; } elsif($temp[$i] eq "T"){ $t[$j]++; } if ($j==6) { print "\n"; if ($temp[$i] ne "0") { $mira++; } } } &INVERSE; print "sum\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"; print "\t\tTrabajo\t\tDescanso\tRatio\n"; print "Domingos\t\t",$mira,"\t\t",$z-$mira,"\t",$mira/($z-$mira),"\n"; print "Total \t\t",$y*$trabajo,"\t\t",$y*$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