showdown

Benchmark created on


Setup

var _daysInWeek = 7, 
         segments = [
            [0,1,1,0,0,0,0],
            [0,1,1,0,0,0,0],
            [1,0,0,0,0,0,1],
            [1,0,0,0,1,0,1],
            [0,0,0,0,0,1,0],
            [0,1,1,0,0,0,0],
            [1,0,0,0,0,0,1],
            [0,1,1,0,0,0,0],
            [0,1,1,0,0,0,0],
            [1,0,0,0,0,0,1],
            [1,0,0,0,1,0,1],
            [0,0,0,0,0,1,0],
            [0,1,1,0,0,0,0]
        ];

Test runner

Ready to run.

Testing in
TestOps/sec
Richard
function findBlanksOnDay(days, day){
  for(var i = 0; i < days.length; i++){
    if(days[i][day]) return 0;
  }
  return 1;
}

function getBlanks(segs){
  var blankDays = [];
  for(var i = 0; i < _daysInWeek; i++){
    blankDays[i] = findBlanksOnDay(segs, i);
  }
  return blankDays;
}

function generateArrayAndSetStartValues(week,blankDays){
  var convertedWeek = [], pos = week.indexOf(1), disableTheRest = false;

  for(var i = pos; i>=0; i--){
    if(disableTheRest === true){
      convertedWeek[i] = 0;
    }else{
      if(blankDays[i-1] === 0){
        disableTheRest = true;
        convertedWeek[i] = 0;
      }else{
        convertedWeek[i] = 1;
      }
    }
  }
  return convertedWeek;
}

function processWeek(seg, blankDays){
  var convertedWeek = generateArrayAndSetStartValues(seg,blankDays),
   weekLength = _daysInWeek-1;
  for(var i = weekLength; i >= 0; i--){
    if(seg[i] === 1){
      convertedWeek[i] = 1;
    }else if(blankDays[i] === 1){
      var pos = i+1;
      if(pos > weekLength){
        convertedWeek[i] = convertedWeek[0]; //DEFER
      }else if(convertedWeek[pos] === 1){
        convertedWeek[i] = 1;
      }else{
        convertedWeek[i] = 0;
      }
    }else{
      convertedWeek[i] = 0;
    }
  }
  return convertedWeek;
}

function init(segs){
    var converted = [], blankDays = getBlanks(segs);
    for(var i = 0; i < segs.length; i++){
      converted.push(processWeek(segs[i], blankDays));
    }
    //LOCATE DAYS WHERE BOTH ARE BLANK

}

init(segments);
ready
mike
var _totalArrays, _firstTrue, _lastTrue, _lastIDX;
        var _key = [];
    var _segmentResult = [
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
      [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
      [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
      [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0]
    ];

    function encodeSchedule(segment){
        _totalArrays    = segment.length;
        _lastIDX                = segment[0].length - 1;
        generateKey(segment);
        setFirstTrue();
        _lastTrue = _firstTrue;
        encode(segment);
      
    }

    function generateKey(segment){
        for (var i = 0; i <=_lastIDX; i++){
            for (var j = 0; j < _totalArrays; j++){
                _key[i] = _key[i] | segment[j][i];
            }
        }
    }

    function setFirstTrue(){
        _firstTrue = _key.indexOf(1);
    }

    function writeValues(idx, array){
        var i = idx;
        do{
            _segmentResult[array][i] = 1;
            i--;
        }while(i>_lastTrue);
    }

    function writeWrappingValues(){
        for (var i = 0; i<_totalArrays; i++){
                if (segments[i][_firstTrue]){
                        var j = _firstTrue;

                        // Write ones from first true to the start of the array
                        do{
                            _segmentResult[i][j] = 1;
                            j--;
                        }while(j>=0);

                        // Write ones from end of array back to lastTrue if there were weren't any trues at end of array
                        if(_key[_lastIDX]===0){
                                var k = _lastIDX;
                                do{
                                    _segmentResult[i][k] = 1;
                                    k--;
                                }while(k>_lastTrue);
                        }
                }
        }
    }

    function findKeyMatch(idx){
        for (var i=0; i<_totalArrays; i++){
                segments[i][idx] && writeValues(idx,i);
        }
    }

    function encode(){
        for(var i=0; i<=_lastIDX; i++){
            if(_key[i]===1){
                findKeyMatch(i);
                _lastTrue=i;
            }
            if(i==(_lastIDX)){
                writeWrappingValues();
            }
        }
    }

        encodeSchedule(segments);
        
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.