RosettaCodeData/Task/UPC/FreeBASIC/upc.basic

91 lines
3.6 KiB
Plaintext

Sub decode(bar_code As String)
Dim As String numbers(9) => { _
" ## #", _ '-- 0
" ## #", _ '-- 1
" # ##", _ '-- 2
" #### #", _ '-- 3
" # ##", _ '-- 4
" ## #", _ '-- 5
" # ####", _ '-- 6
" ### ##", _ '-- 7
" ## ###", _ '-- 8
" # ##" } '-- 9
Dim As Integer i, j
Dim As String temp
bar_code = Trim(bar_code)
If Len(bar_code) = 95 And Mid(bar_code, 1, 3) = "# #" And Mid(bar_code, 46, 5) = " # # " And Mid(bar_code, 93, 3) = "# #" Then
For reversed As Integer = 0 To 1
Dim r(11) As Integer
For i = 1 To 12
Dim st As Integer = Iif(i <= 6, i * 7 - 3, i * 7 + 2)
Dim number As String = Mid(bar_code, st, 7)
If i > 6 Then
temp = ""
For j = 1 To Len(number)
Select Case Mid(number, j, 1)
Case " " : temp += "#"
Case "#" : temp += " "
Case Else: temp += Mid(number, j, 1)
End Select
Next
number = temp
End If
r(i - 1) = -1
For j = 0 To 9
If number = numbers(j) Then
r(i - 1) = j
Exit For
End If
Next
Next
Dim valid As Integer = 1
For i = 0 To 11
If r(i) = -1 Then
valid = 0
Exit For
End If
Next
If valid Then
Dim sum As Integer = 0
For i = 0 To 11
sum += r(i) * Iif(i Mod 2 = 0, 3, 1)
Next
If sum Mod 10 = 0 Then
For i = 0 To 11
Print r(i);
Next
Print Iif(reversed, " (upside down)", "")
Else
Print "invalid checksum"
End If
Exit Sub
End If
temp = ""
For i = Len(bar_code) To 1 Step -1
temp += Mid(bar_code, i, 1)
Next
bar_code = temp
Next
End If
Print " invalid"
End Sub
Dim bar_codes(9) As String
bar_codes(0) = " # # # ## # ## # ## ### ## ### ## #### # # # ## ## # # ## ## ### # ## ## ### # # # "
bar_codes(1) = " # # # ## ## # #### # # ## # ## # ## # # # ### # ### ## ## ### # # ### ### # # # "
bar_codes(2) = " # # # # # ### # # # # # # # # # # ## # ## # ## # ## # # #### ### ## # # "
bar_codes(3) = " # # ## ## ## ## # # # # ### # ## ## # # # ## ## # ### ## ## # # #### ## # # # "
bar_codes(4) = " # # ### ## # ## ## ### ## # ## # # ## # # ### # ## ## # # ### # ## ## # # # "
bar_codes(5) = " # # # # ## ## # # # # ## ## # # # # # #### # ## # #### #### # # ## # #### # # "
bar_codes(6) = " # # # ## ## # # ## ## # ### ## ## # # # # # # # # ### # # ### # # # # # "
bar_codes(7) = " # # # # ## ## # # ## ## ### # # # # # ### ## ## ### ## ### ### ## # ## ### ## # # "
bar_codes(8) = " # # ### ## ## # # #### # ## # #### # #### # # # # # ### # # ### # # # ### # # # "
bar_codes(9) = " # # # #### ## # #### # # ## ## ### #### # # # # ### # ### ### # # ### # # # ### # # "
For i As Integer = 0 To 9
decode(bar_codes(i))
Next
Sleep