40 lines
1.1 KiB
Plaintext
40 lines
1.1 KiB
Plaintext
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
|
|
}
|