[ create a new paste ] login | about

Link: http://codepad.org/ulJnW3Iu    [ raw code | output | fork ]

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:
1
2
3
4
5
6
7
8
9
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")


Create a new paste based on this one


Comments: