with javascript_semantics constant numbers = {" ## #", -- 0 " ## #", -- 1 " # ##", -- 2 " #### #", -- 3 " # ##", -- 4 " ## #", -- 5 " # ####", -- 6 " ### ##", -- 7 " ## ###", -- 8 " # ##"} -- 9 function flip(string s) for i,ch in s do s[i] = iff(ch='#'?' ':'#') end for return s end function constant numberf = apply(numbers,flip) procedure decode(string bar_code) bar_code = trim(bar_code) if length(bar_code)=95 and bar_code[1..3]="# #" and bar_code[46..50]=" # # " and bar_code[93..95]="# #" then for reversed=false to true do sequence r = {}, nums = numbers integer st = 4, checksum = 0, k for i=1 to 12 do k = find(bar_code[st..st+6],nums)-1 if k=-1 then exit end if r &= k checksum += iff(odd(i)?k*3:k) st += 7 if i=6 then st += 5 nums = numberf end if end for if k!=-1 then if remainder(checksum,10) then printf(1,"invalid checksum\n") else printf(1,"%v%s\n",{r,iff(reversed?" (upside down)","")}) end if return end if bar_code = reverse(bar_code) end for end if printf(1,"invalid\n") end procedure constant bar_codes = split(""" # # # ## # ## # ## ### ## ### ## #### # # # ## ## # # ## ## ### # ## ## ### # # # # # # ## ## # #### # # ## # ## # ## # # # ### # ### ## ## ### # # ### ### # # # # # # # # ### # # # # # # # # # # ## # ## # ## # ## # # #### ### ## # # # # ## ## ## ## # # # # ### # ## ## # # # ## ## # ### ## ## # # #### ## # # # # # ### ## # ## ## ### ## # ## # # ## # # ### # ## ## # # ### # ## ## # # # # # # # ## ## # # # # ## ## # # # # # #### # ## # #### #### # # ## # #### # # # # # ## ## # # ## ## # ### ## ## # # # # # # # # ### # # ### # # # # # # # # # ## ## # # ## ## ### # # # # # ### ## ## ### ## ### ### ## # ## ### ## # # # # ### ## ## # # #### # ## # #### # #### # # # # # ### # # ### # # # ### # # # # # # #### ## # #### # # ## ## ### #### # # # # ### # ### ### # # ### # # # ### # # ""","\n",true) for t in bar_codes do decode(t) end for