RosettaCodeData/Task/Cistercian-numerals/FreeBASIC/cistercian-numerals.basic
2025-06-11 20:16:52 -04:00

95 lines
2.9 KiB
Text

Dim Shared As Byte dgs(0 To 9, 1 To 9, 0 To 2)
Dim As String c
Dim As Integer i, d
Restore SegmentData
For d = 0 To 9
For i = 1 To 9
Read dgs(d, i, 0), dgs(d, i, 1), c
If c <> "" Then dgs(d, i, 2) = Asc(c)
Next
Next
SegmentData:
Data 0,0,"", 0,0,"", 0,0,"", 0,0,"", 0,0,"", 0,0,"", 0,0,"", 0,0,"", 0,0,"" ' 0
Data 0,0,"+", 0,1,"-", 0,2,"-", 0,0,"", 0,0,"", 0,0,"", 0,0,"", 0,0,"", 0,0,"" ' 1
Data 2,0,"+", 2,1,"-", 2,2,"-", 0,0,"", 0,0,"", 0,0,"", 0,0,"", 0,0,"", 0,0,"" ' 2
Data 0,0,"+", 1,1,"\", 2,2,"\", 0,0,"", 0,0,"", 0,0,"", 0,0,"", 0,0,"", 0,0,"" ' 3
Data 2,0,"+", 1,1,"/", 0,2,"/", 0,0,"", 0,0,"", 0,0,"", 0,0,"", 0,0,"", 0,0,"" ' 4
Data 2,0,"+", 1,1,"/", 0,2,"+", 0,0,"+", 0,1,"-", 0,0,"", 0,0,"", 0,0,"", 0,0,"" ' 5
Data 0,2,"|", 1,2,"|", 2,2,"|", 0,0,"", 0,0,"", 0,0,"", 0,0,"", 0,0,"", 0,0,"" ' 6
Data 0,0,"+", 0,1,"-", 0,2,"+", 1,2,"|", 2,2,"|", 0,0,"", 0,0,"", 0,0,"", 0,0,"" ' 7
Data 2,0,"+", 2,1,"-", 2,2,"+", 1,2,"|", 0,2,"|", 0,0,"", 0,0,"", 0,0,"", 0,0,"" ' 8
Data 2,0,"+", 2,1,"-", 2,2,"+", 1,2,"|", 0,2,"+", 0,1,"-", 0,0,"+", 0,0,"", 0,0,"" ' 9
Sub DrawDigit(canvas() As String, digit As Integer, position As Integer)
If digit < 0 Or digit > 9 Then Exit Sub
Dim As Integer ud, lr, l, i
Select Case position
Case 1: ud = 1 : lr = 1 : l = 1
Case 2: ud = 1 : lr = -1 : l = 1
Case 3: ud = -1 : lr = 1 : l = 7
Case 4: ud = -1 : lr = -1 : l = 7
Case Else: Exit Sub
End Select
For i = 1 To 9
If dgs(digit, i, 0) = 0 And dgs(digit, i, 1) = 0 And dgs(digit, i, 2) = 0 Then Exit For
Dim As Integer row = l + ud * dgs(digit, i, 0)
Dim As Integer col = 3 + lr * dgs(digit, i, 1)
Dim As String ch = Chr(dgs(digit, i, 2))
If Instr("/\", ch) Then
If ud <> lr Then
If ch = "/" Then
ch = "\"
Elseif ch = "\" Then
ch = "/"
End If
End If
End If
If row >= 1 And row <= 7 And col >= 1 And col <= 5 Then Mid(canvas(row-1), col, 1) = Left(ch, 1)
Next
End Sub
Sub ShowCistercianNumber(n As Integer)
Dim As Byte i
Dim As String recanvas(0 To 7)
recanvas(0) = Right(" " & Str(n), 5) & ":"
Dim As String canvas(0 To 6)
For i = 0 To 6
canvas(i) = " "
Mid(canvas(i), 3, 1) = "|"
Next
Dim As Integer position = 1
Dim As Integer tmp = n
While tmp > 0 And position <= 4
DrawDigit(canvas(), tmp Mod 10, position)
position += 1
tmp \= 10
Wend
For i = 0 To 6
recanvas(i+1) = canvas(i)
Next
For i = 0 To 7
Print recanvas(i)
Next
End Sub
' Show example numbers
Dim As Integer nums(0 To 17) = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 20, 300, 4000, 5555, 6789, 9394, 7922, 9999}
For i = 0 To Ubound(nums)
ShowCistercianNumber(nums(i))
Print
Next
Sleep