Skeeve: Zeitraum bei Array: Anfang und Ende finden?

Beitrag lesen

Moin!

Ich habe meinen Algorithmus jetzt mal in perl implementiert, allerdings nicht mit Datumswerten sondern mit Integern. Um das Prinzip zu zeigen, sollte das ja reichen.

  
my @array=( 1..5, 9..20, 24..30 ); # stellt Deine Daten dar  
  
for my $gesuchtedatum (1..31) { # Damit teste ich einfach mal alle Daten  
  
 printf "%2d: ", $gesuchtedatum;  
  
 my $pos= undef;  
 my $i=0;  
 foreach my $laufdatum (@array) {  
  if ($gesuchtedatum == $laufdatum) {  
   $pos= $i;  
   last; # <- break;  
  }  
  ++$i;  
 }  
  
 if ( not defined $pos ) {  
  print "keine Daten\n";  
  next; # <- continue;  
 }  
  
 # hier eine kleine Änderung des Original Algorithmus  
 # Ich setze den Start und später das Ende auf  
 # die gefundene Position.  
 my $start= $pos;  
 my $tag= 0;  
 for( my $i= $start-1; $i>=0; --$i) {  
  if( $gesuchtedatum+(--$tag) == $array[$i] ) {  
   $start=$i;  
  }  
  else {  
   last; # <- break;  
  }  
 }  
  
 my $ende= $pos;  
 my $tag= 0;  
 for( my $i= $ende+1; $i<=$#array; ++$i) {  
  if( $gesuchtedatum+(++$tag) == $array[$i] ) {  
   $ende=$i;  
  }  
  else {  
   last; # <- break;  
  }  
 }  
  
 printf "Bereich %2d - %2d\n",$array[$start],$array[$ende];  
}  

Ich muß sagen: Das klappt wunderprächtig. Hier die Ausgabe:

1: Bereich  1 -  5
 2: Bereich  1 -  5
 3: Bereich  1 -  5
 4: Bereich  1 -  5
 5: Bereich  1 -  5
 6: keine Daten
 7: keine Daten
 8: keine Daten
 9: Bereich  9 - 20
10: Bereich  9 - 20
11: Bereich  9 - 20
12: Bereich  9 - 20
13: Bereich  9 - 20
14: Bereich  9 - 20
15: Bereich  9 - 20
16: Bereich  9 - 20
17: Bereich  9 - 20
18: Bereich  9 - 20
19: Bereich  9 - 20
20: Bereich  9 - 20
21: keine Daten
22: keine Daten
23: keine Daten
24: Bereich 24 - 30
25: Bereich 24 - 30
26: Bereich 24 - 30
27: Bereich 24 - 30
28: Bereich 24 - 30
29: Bereich 24 - 30
30: Bereich 24 - 30
31: keine Daten

-- Skeeve