Barcode Compression Test

by skibulk

JavaScript

// (C) 2021 skibulk

console.clear();

// Compression Patterns
/*
  {id: 11, cBits: [1,1], offsets:[0,0]},
  {id: 12, cBits: [1,2], offsets:[1,1]},
  {id: 21, cBits: [2,1], offsets:[2,2]},
  {id: 13, cBits: [1,3], offsets:[0,1]},
  {id: 22, cBits: [2,2], offsets:[0,2]},
  {id: 31, cBits: [3,1], offsets:[1,0]},
  {id: 23, cBits: [2,3], offsets:[1,2]},
  {id: 32, cBits: [3,2], offsets:[2,0]},
  {id: 33, cBits: [3,3], offsets:[2,1]},
*/
var patterns = [
  {id: 0,  cBits: [],    offsets:[0]},
  {id: 1,  cBits: [1],   offsets:[0]},
  {id: 2,  cBits: [2],   offsets:[1]},
  {id: 3,  cBits: [3],   offsets:[2]},
];

function generateBarcode(decimal){
  var barcode = [];
  var bars = [];
  
  bars = decimal.toString(3).split('');
  for(var bi=0; bi<bars.length; bi++) bars[bi]++;
  barcode.data = bars.join('');
  // console.log(barcode.data, bars);
  
  // For each compression pattern
  for(var pi=0; pi<patterns.length; pi++){
  
  	var pattern = patterns[pi];
    
    // add compression pattern length
  	var barcodeLength = pattern.cBits.reduce((a, b) => a + b, 0);
    
    // For each bar
	  for(var bi=0; bi<bars.length; bi++){
    	
      // Apply offset to bar
      var offset = pattern.offsets[bi%pattern.cBits.length] | 0;
      var newBar = bars[bi] + offset;
      if(newBar > 3) newBar -= 3;
      // console.log(bars[bi], offset, newBar);
      
      barcodeLength += newBar;
    }
    
    barcode.push([pattern.id, barcodeLength]);
  }
  
  return barcode;
}

function trial(numBars){
  // Generate a set of barcodes to analyze
  var dataset = [];
  
  /*
  dataset = [
  	// Each "barcode" array is a collection of compression variations
    [
      [ 0,  21 ], // first item has no compression bits
      [ 11, 21 ], // pattern id, barcodeLength
      ...
    ]
  ];
  */

	// skip ahead to the correct number of digits
	var start = parseInt("1".padEnd(numBars, "0"), 3);
  for(var i=start; i<Math.pow(3, numBars); i++){
    dataset.push(generateBarcode(i));
  }

 ...