richard86
-
PHP,
pasted
on May 16:
|
<?php
function drop_days($string, $atleast = 3) {
$weekdays = 'Mo,Tu,We,Th,Fr,Sa,Su';
$weekdays = explode(',', $weekdays);
$selected = array();
$sequences = array();
foreach ($weekdays as $weekday)
$selected[] = (strpos($string,$weekday)!==false);
$i = 0;
while ($i<count($weekdays)) {
if (!$selected[$i]) {
$i++;
continue;
}
if ($i+$atleast<=count($weekdays)) {
for ($j=$i+1; $j<count($weekdays); $j++) {
if ($selected[$j]) {
if ($j+1<count($weekdays)) continue;
$sequences[] = $weekdays[$i] . '-' . $weekdays[$j];
break 2;
} else {
if ($j-$i>=$atleast)
$sequences[] = $weekdays[$i] . '-' . $weekdays[$j-1];
else
for ($k=$i; $k<$j; $k++) $sequences[] = $weekdays[$k];
$i = $j+1;
break;
}
}
} else {
$sequences[] = $weekdays[$i];
$i++;
}
}
return implode(',', $sequences);
}
function is($result, $expected, $message) {
echo $message . " is " . ( $result==$expected ? 'TRUE' : 'FALSE' ) . " (result was \"$result\", expected was \"$expected\")\n";
}
is(drop_days(""), "", 'Empty');
is(drop_days("Mo"), "Mo", 'One Day');
is(drop_days("Mo,Tu"), "Mo,Tu", 'Two Days');
is(drop_days("Mo,Tu,We"), "Mo-We", 'Three Days');
is(drop_days("Mo,Tu,We,Th,Fr,Sa,Su"), "Mo-Su", 'Seven Days');
is(drop_days("Mo,Tu,Th,Fr"), "Mo,Tu,Th,Fr", 'Four days with gap');
is(drop_days("Mo,Tu,We,Fr"), "Mo-We,Fr", '3 consecutive days, one single day');
is(drop_days("Mo,Tu,We,Fr,Sa,Su"), "Mo-We,Fr-Su", '2 pairs of 3 consecutive days');
is(drop_days("We,Tu,Fr,Th,Su"), "Tu-Fr,Su", '4 consecutive days in different order, one single day');
?>
|
Output:
|
Empty is TRUE (result was "", expected was "")
One Day is TRUE (result was "Mo", expected was "Mo")
Two Days is TRUE (result was "Mo,Tu", expected was "Mo,Tu")
Three Days is TRUE (result was "Mo-We", expected was "Mo-We")
Seven Days is TRUE (result was "Mo-Su", expected was "Mo-Su")
Four days with gap is TRUE (result was "Mo,Tu,Th,Fr", expected was "Mo,Tu,Th,Fr")
3 consecutive days, one single day is TRUE (result was "Mo-We,Fr", expected was "Mo-We,Fr")
2 pairs of 3 consecutive days is TRUE (result was "Mo-We,Fr-Su", expected was "Mo-We,Fr-Su")
4 consecutive days in different order, one single day is TRUE (result was "Tu-Fr,Su", expected was "Tu-Fr,Su")
|
|