110 lines
3.3 KiB
Text
110 lines
3.3 KiB
Text
import "./fmt" for Fmt
|
|
|
|
var digitL = {
|
|
" ## #": 0,
|
|
" ## #": 1,
|
|
" # ##": 2,
|
|
" #### #": 3,
|
|
" # ##": 4,
|
|
" ## #": 5,
|
|
" # ####": 6,
|
|
" ### ##": 7,
|
|
" ## ###": 8,
|
|
" # ##": 9
|
|
}
|
|
|
|
var digitR = {
|
|
"### # ": 0,
|
|
"## ## ": 1,
|
|
"## ## ": 2,
|
|
"# # ": 3,
|
|
"# ### ": 4,
|
|
"# ### ": 5,
|
|
"# # ": 6,
|
|
"# # ": 7,
|
|
"# # ": 8,
|
|
"### # ": 9
|
|
}
|
|
|
|
var endSentinel = "# #" // also at start
|
|
var midSentinel = " # # "
|
|
|
|
var decodeUpc = Fn.new { |s|
|
|
var decodeUpcImpl = Fn.new { |input|
|
|
var upc = input.trim()
|
|
if (upc.count != 95) return false
|
|
var pos = 0
|
|
var digits = []
|
|
var sum = 0
|
|
var oneThree = [1, 3]
|
|
|
|
// end sentinel
|
|
if (upc[pos..pos+2] == endSentinel) {
|
|
pos = pos + 3
|
|
} else {
|
|
return false
|
|
}
|
|
|
|
// 6 left hand digits
|
|
for (i in 0..5) {
|
|
var digit = digitL[upc[pos..pos+6]]
|
|
if (!digit) return false
|
|
digits.add(digit)
|
|
sum = sum + digit * oneThree[digits.count % 2]
|
|
pos = pos + 7
|
|
}
|
|
|
|
// mid sentinel
|
|
if (upc[pos..pos+4] == midSentinel) {
|
|
pos = pos + 5
|
|
} else {
|
|
return false
|
|
}
|
|
|
|
// 6 right hand digits
|
|
for (i in 0..5) {
|
|
var digit = digitR[upc[pos..pos+6]]
|
|
if (!digit) return false
|
|
digits.add(digit)
|
|
sum = sum + digit * oneThree[digits.count % 2]
|
|
pos = pos + 7
|
|
}
|
|
|
|
// end sentinel
|
|
if (upc[pos..pos+2] != endSentinel) return false
|
|
|
|
if (sum%10 == 0) {
|
|
System.write("%(digits) ")
|
|
return true
|
|
}
|
|
System.write("Failed Checksum ")
|
|
return false
|
|
}
|
|
|
|
if (decodeUpcImpl.call(s)) {
|
|
System.print("Rightside Up")
|
|
} else if (decodeUpcImpl.call(s[-1..0])) {
|
|
System.print("Upside Down")
|
|
} else {
|
|
System.print("Invalid digit(s)")
|
|
}
|
|
}
|
|
|
|
var barcodes = [
|
|
" # # # ## # ## # ## ### ## ### ## #### # # # ## ## # # ## ## ### # ## ## ### # # # ",
|
|
" # # # ## ## # #### # # ## # ## # ## # # # ### # ### ## ## ### # # ### ### # # # ",
|
|
" # # # # # ### # # # # # # # # # # ## # ## # ## # ## # # #### ### ## # # ",
|
|
" # # ## ## ## ## # # # # ### # ## ## # # # ## ## # ### ## ## # # #### ## # # # ",
|
|
" # # ### ## # ## ## ### ## # ## # # ## # # ### # ## ## # # ### # ## ## # # # ",
|
|
" # # # # ## ## # # # # ## ## # # # # # #### # ## # #### #### # # ## # #### # # ",
|
|
" # # # ## ## # # ## ## # ### ## ## # # # # # # # # ### # # ### # # # # # ",
|
|
" # # # # ## ## # # ## ## ### # # # # # ### ## ## ### ## ### ### ## # ## ### ## # # ",
|
|
" # # ### ## ## # # #### # ## # #### # #### # # # # # ### # # ### # # # ### # # # ",
|
|
" # # # #### ## # #### # # ## ## ### #### # # # # ### # ### ### # # ### # # # ### # # "
|
|
]
|
|
var n = 0
|
|
for (barcode in barcodes) {
|
|
n = n + 1
|
|
Fmt.write("$2d: ", n)
|
|
decodeUpc.call(barcode)
|
|
}
|