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