studying steves string addition, i came up with a way to crack peteCode2
i generalized steves string add function called bind$ that works for string arrays not shared
so using bind$() i modified anacode3$
i honestly thought it wouldn't work but it did.
i generalized steves string add function called bind$ that works for string arrays not shared
Code: (Select All)
' Function bind$ (arr$()) is my mod of steves code
Const limit = 200000
Dim Shared NumStr(limit) As String
MakeNumsStrings
t# = Timer(0.001)
o$ = AddStrings 'time how long it takes to add those strings together
t1# = Timer(0.001)
o1$ = bind$(NumStr()) 'and time how long it takes to just mid$ those strings, if you know the size
t2# = Timer(0.001)
o2$ = MidStrings$(Len(o$))
t3# = Timer(0.001)
Print "Results:"
Print "First 50: "; Left$(o$, 50)
Print "First 50: "; Left$(o1$, 50)
Print "First 50: "; Left$(o2$, 50)
Print "Last 50: "; Right$(o$, 50)
Print "Last 50: "; Right$(o1$, 50)
Print "Last 50: "; Right$(o2$, 50)
Print
Print
Print Using "It took ###.### seconds to AddStrings"; t1# - t#
Print Using "It took ###.### seconds to testbind$"; t2# - t1#
Print Using "It took ###.### seconds to midstrings"; t3# - t2#
Sub MakeNumsStrings
For i = 1 To limit
NumStr(i) = _Trim$(Str$(i))
Next
End Sub
Function AddStrings$
For i = 1 To limit
temp$ = temp$ + NumStr(i)
Next
AddStrings = temp$
End Function
Function MidStrings$ (size)
temp$ = Space$(size)
p = 1 'position in full string
For i = 1 To limit
Mid$(temp$, p) = NumStr(i)
p = p + Len(NumStr(i))
Next
MidStrings = temp$
End Function
Function bind$ (arr$())
Dim As Long lb, ub, i, size, p
Dim rtn$
lb = LBound(arr$)
ub = UBound(arr$)
For i = lb To ub
size = size + Len(arr$(i))
Next
rtn$ = Space$(size)
p = 1
For i = lb To ub
Mid$(rtn$, p) = arr$(i)
p = p + Len(arr$(i))
Next
bind$ = rtn$
End Function
so using bind$() i modified anacode3$
Code: (Select All)
Option _Explicit
_Title "anaCode3$ versus peteCode2$ with WORDS.txt" ' b+ 2024-04-26 speed test
' anaCode$ returned to original format of len = 26 letter counts but improved?
' this is most useful to use with games using letters from words
' anacode3$ is to compare apples to apples in the function return format
' aha, i cracked petecode2() time!
Dim a$(25000), p$(25000)
'''' check i made modifications correctly
'Dim test$(9)
'Dim As Integer i
'test$(0) = "grmaana"
'test$(1) = "angiogram"
'test$(2) = "naagrma"
'test$(3) = "telgram"
'test$(4) = "gramana"
'test$(5) = "gram"
'test$(6) = "nag"
'test$(7) = "tag"
'test$(8) = "am"
'test$(9) = "grip"
'For i = 0 To 9
' Print test$(i), AnaCode2$(test$(i)), petecode2$(test$(i))
'Next
'End
'''' ok looks right
Dim i As Integer, j As Integer
Dim start#, w$, ana2Time#, peteTime#, anatime#
start# = Timer(.01)
For i = 1 To 5
j = 0
Open "WORDS.txt" For Input As #1
While Not EOF(1)
Input #1, w$
j = j + 1
p$(j) = petecode2$(w$)
Wend
Close
Next
peteTime# = Timer(.01) - start#
start# = Timer(.01)
For i = 1 To 5
j = 0
Open "WORDS.txt" For Input As #1
While Not EOF(1)
Input #1, w$
j = j + 1
a$(j) = AnaCode$(w$)
Wend
Close
Next
anatime# = Timer(.01) - start#
start# = Timer(.01)
For i = 1 To 5
j = 0
Open "WORDS.txt" For Input As #1
While Not EOF(1)
Input #1, w$
j = j + 1
a$(j) = AnaCode3$(w$)
Wend
Close
Next
ana2Time# = Timer(.01) - start#
Print "Anacode3 Time ="; ana2Time#, "PeteCode2 Time ="; peteTime#
Print "Original anaCode$ time ="; anatime#
Print "DIFF CHECK anaCcode3 versus PeteCode2"
For i = 1 To j ' checking for differences between array values
If a$(i) <> p$(i) Then Print a$(i), p$(i)
Next
Print "END OF DIFF CHECK"
Print: Print " Check tail end of arrays:"
For i = j - 15 To j
Print a$(i), p$(i)
Next
' back to original form of anacode using counts of each letter 1 to 26
' this limits numbers of repeated letters to 9 max
' this code also assumes all letters but need not be assumed capitals
Function AnaCode$ (wrd$) ' anaCode$ converts word to an Anagram pattern
' are assuming wrd$ is all letters
Dim s$, w$
Dim As Integer i, p
s$ = String$(26, "0") ' number of A's in first, number of B's in 2nd, number of C's in third
w$ = UCase$(wrd$) ' don't assume all caps as expected
For i = 1 To Len(wrd$)
p = Asc(w$, i) - 64 ' A=1, B=2...
Mid$(s$, p, 1) = _Trim$(Str$(Asc(s$, p) - 47)) ' finally!! better
Next
AnaCode$ = s$
End Function
' return sorted anagram code string for any word, call ucase$(wrd$) for all caps
Function AnaCode2$ (wrd$) ' anaCode$ converts word to an Anagram pattern
' wrd$ is assumed to be in all capitals!!!
' number of A's in first, number of B's in 2nd, number of C's in third
Dim As Integer L(65 To 90), i, p
Dim rtn$, w$
w$ = UCase$(wrd$) ' don't assume all caps as expected
For i = 1 To Len(w$)
p = Asc(w$, i) ' A=1, B=2...
L(p) = L(p) + 1
Next
For i = 65 To 90
If L(i) Then rtn$ = rtn$ + String$(L(i), i)
Next
AnaCode2$ = rtn$
End Function
Function AnaCode3$ (wrd$) ' anaCode$ converts word to an Anagram pattern
' wrd$ is assumed to be in all capitals!!!
' number of A's in first, number of B's in 2nd, number of C's in third
Dim As Integer L(65 To 90), i, p
Dim rtn$, w$
w$ = UCase$(wrd$) ' don't assume all caps as expected
For i = 1 To Len(w$)
p = Asc(w$, i) ' A=1, B=2...
L(p) = L(p) + 1
Next
Dim t$(65 To 90)
For i = 65 To 90
If L(i) Then t$(i) = String$(L(i), i)
Next
AnaCode3$ = bind$(t$())
End Function
Function petecode2$ (la$)
Dim rtn$, i%, seed%, j%, a$
a$ = UCase$(la$)
rtn$ = Space$(Len(a$))
For i% = 65 To 90
seed% = InStr(a$, Chr$(i%))
While seed%
j% = j% + 1
Mid$(rtn$, j%) = Chr$(i%)
seed% = InStr(seed% + 1, a$, Chr$(i%))
Wend
Next
petecode2$ = _Trim$(rtn$)
End Function
Function bind$ (arr$())
Dim As Long lb, ub, i, size, p
Dim rtn$
lb = LBound(arr$)
ub = UBound(arr$)
For i = lb To ub
size = size + Len(arr$(i))
Next
rtn$ = Space$(size)
p = 1
For i = lb To ub
Mid$(rtn$, p) = arr$(i)
p = p + Len(arr$(i))
Next
bind$ = rtn$
End Function
i honestly thought it wouldn't work but it did.
b = b + ...