UPC: Difference between revisions
Content added Content deleted
(Added a Python implementation) |
(Added Wren) |
||
Line 2,150: | Line 2,150: | ||
9: [7, 0, 6, 4, 6, 6, 7, 4, 3, 0, 3, 0] Rightside Up |
9: [7, 0, 6, 4, 6, 6, 7, 4, 3, 0, 3, 0] Rightside Up |
||
10: [6, 5, 3, 4, 8, 3, 5, 4, 0, 4, 3, 5] Rightside Up</pre> |
10: [6, 5, 3, 4, 8, 3, 5, 4, 0, 4, 3, 5] Rightside Up</pre> |
||
=={{header|Wren}}== |
|||
{{trans|Ruby}} |
|||
{{libheader|Wren-fmt}} |
|||
<lang ecmascript>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) |
|||
}</lang> |
|||
{{out}} |
|||
<pre> |
|||
1: [9, 2, 4, 7, 7, 3, 2, 7, 1, 0, 1, 9] Rightside Up |
|||
2: [4, 0, 3, 9, 4, 4, 4, 4, 1, 0, 5, 0] Rightside Up |
|||
3: [8, 3, 4, 9, 9, 9, 6, 7, 6, 7, 0, 6] Upside Down |
|||
4: [9, 3, 9, 8, 2, 5, 1, 5, 8, 8, 1, 1] Upside Down |
|||
5: Invalid digit(s) |
|||
6: [3, 1, 6, 3, 1, 3, 7, 1, 8, 7, 1, 7] Upside Down |
|||
7: [2, 1, 4, 5, 7, 5, 8, 7, 5, 6, 0, 8] Rightside Up |
|||
8: [8, 1, 8, 7, 7, 8, 8, 4, 1, 8, 1, 3] Upside Down |
|||
9: [7, 0, 6, 4, 6, 6, 7, 4, 3, 0, 3, 0] Rightside Up |
|||
10: [6, 5, 3, 4, 8, 3, 5, 4, 0, 4, 3, 5] Rightside Up |
|||
</pre> |
|||
=={{header|zkl}}== |
=={{header|zkl}}== |