UPC: Difference between revisions
Content added Content deleted
m (→{{header|REXX}}: restore zkl header) |
m (→{{header|zkl}}: restore code) |
||
Line 776: | Line 776: | ||
=={{header|zkl}}== |
=={{header|zkl}}== |
||
<lang zkl> |
<lang zkl>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 |
|||
}</lang> |
|||
Or, if you like way too long regular expressions: |
|||
<lang zkl>var upcRE = RegExp(String("_"*9, "+#_#", |
|||
lhd.keys.concat("|","(",")")*6, "_#_#_", |
|||
rhd.keys.concat("|","(",")")*6, "#_#", "_"*9)), |
|||
digits=lhd.copy().extend(rhd); |
|||
fcn parseBarCode2(barcode){ // --> 12 digits |
|||
if(not (upcRE.search(barcode) or upcRE.search(barcode.reverse()))) return(False); |
|||
upcRE.matched[1,*] // ( (a,b), "_#_####","_##___#", 10 more digit patterns ) |
|||
.apply(digits.get) |
|||
}</lang> |
|||
⚫ | |||
#<<<" |
|||
_________#_#___#_##__#__##_#___##_###_##_###_##_####_#_#_#_##_##__#___#__##__##_###__#_##__##_###_#__#_#_________ |
|||
_________#_#_#___##___##_#_####_#___#_##_#___##_#___##_#_#_#_###__#_###__##__##_###__#_#__###_###__#_#_#_________ |
|||
_________#_#____#_#_#__###__#___#____#_#__#___#____#_#_#_#_##_#___##_#___##_#___##___#_#_####_###_##_#_#_________ |
|||
_________#_#_##__##_##__##___#__#___#__#_###__#_##__##_#_#_#___##_##__#__###_##_##_#___#_####_##_#___#_#_________ |
|||
_________#_#_###_##_#___##_##_###__##__#_##___#___#_##_#_#_###_#__##_##__#____#_###_#__##_##__#______#_#__________ |
|||
__________#_#__#___#_##__##__#___#___#__#_##__##__#___#_#_#_#_####_#__##__#_####_####_#_#__##__#_####_#_#____________ |
|||
_________#_#__#__##__##__#_#___##_##___#_###_##_##___#_#_#_#__#___#___#__#__###_#_#____###__#_#__#___#_#_________ |
|||
_________#_#_#____#_##__##___#__#_##__##__###_#___#__#_#_#_###_##_##_###_##_###_###_##_#__##__###_##_#_#__________ |
|||
_________#_#_###_##___##_#_#_####_#___##_#_####_#_####_#_#_#___#__#_###__#____#_###__#_#____#_###__#_#_#_________ |
|||
_______________#_#_#_####_##___#_####_#_#___##_##_###_####_#_#_#_#__###_#_###__###__#_#_###__#____#_#__###_#_#_________" |
|||
.split("\n"); |
|||
#<<< |
|||
foreach n,barcode in ([1..].zip(barcodes)){ |
|||
bc:=parseBarCode(barcode); |
|||
println("%2d: [%s]".fmt(n,bc and bc.concat(" ") or "Not valid")); |
|||
}</lang> |
|||
{{out}} |
{{out}} |
||
<pre> |
<pre> |
||
1: [9 2 4 7 7 3 2 7 1 0 1 9] |
|||
2: [4 0 3 9 4 4 4 4 1 0 5 0] |
|||
3: [8 3 4 9 9 9 6 7 6 7 0 6] |
|||
4: [9 3 9 8 2 5 1 5 8 8 1 1] |
|||
5: [Not valid] |
|||
6: [3 1 6 3 1 3 7 1 8 7 1 7] |
|||
7: [2 1 4 5 7 5 8 7 5 6 0 8] |
|||
8: [8 1 8 7 7 8 8 4 1 8 1 3] |
|||
9: [7 0 6 4 6 6 7 4 3 0 3 0] |
|||
10: [6 5 3 4 8 3 5 4 0 4 3 5] |
|||
</pre> |
</pre> |