var lhd=Dictionary(), rhd=Dictionary(); [0..].zip(List( "0 0 0 1 1 0 1", //--> "___##_#":0 "###__#_":0 "0 0 1 1 0 0 1", "0 0 1 0 0 1 1", "0 1 1 1 1 0 1", "0 1 0 0 0 1 1", "0 1 1 0 0 0 1", "0 1 0 1 1 1 1", "0 1 1 1 0 1 1", "0 1 1 0 1 1 1", "0 0 0 1 0 1 1") //--> "___#_##":9 "###_#__":9 ).pump(Void,fcn([(n,bs)]){ bs-=" "; lhd[bs.translate("01","_#")]=n; rhd[bs.translate("10","_#")]=n; }); fcn parseBarCode(barcode, one=True){ // --> 12 digits upsideDown:='wrap{ // was I looking at this bar code upside down? if(one and (r:=parseBarCode(barcode.reverse(),False))) return(r); return(False); }; var [const] start=RegExp(String("_"*9, "+#_#")), tail="_"*7; if(not start.search(barcode)) return(upsideDown()); r,idx,d,mark := List(), start.matched[0][1], lhd, "_#_#_"; do(2){ do(6){ if(Void==(z:=d.find(barcode[idx,7]))) return(upsideDown()); r.append(z); idx+=7; } if(barcode[idx,5] != mark) return(Void); d,idx,mark = rhd, idx+5, "#_#__"; } if(tail!=barcode[idx,7]) return(Void); // 9 trailing blanks? two checked above r }