162 lines
5.1 KiB
Text
162 lines
5.1 KiB
Text
Option Explicit
|
|
|
|
Public Sub Main_Anagram()
|
|
Dim varReturn
|
|
Dim temp
|
|
Dim strContent As String
|
|
Dim strFile As String
|
|
Dim Num As Long
|
|
Dim i As Long
|
|
Dim countTime As Single
|
|
|
|
'Open & read txt file
|
|
Num = FreeFile
|
|
strFile = "C:\Users\" & Environ("Username") & "\Desktop\unixdict.txt"
|
|
Open strFile For Input As #Num
|
|
strContent = Input(LOF(1), #Num)
|
|
Close #Num
|
|
Debug.Print UBound(Split(strContent, vbCrLf)) + 1 & " words, in the dictionary"
|
|
countTime = Timer
|
|
'Compute
|
|
varReturn = Anagrams(strContent)
|
|
'Return
|
|
Debug.Print "The anagram set(s) with the greatest number of words (namely " & UBound(varReturn, 2) & ") is : "
|
|
Debug.Print ""
|
|
For i = LBound(varReturn, 1) To UBound(varReturn, 1)
|
|
ReDim temp(LBound(varReturn, 2) To UBound(varReturn, 2))
|
|
For Num = LBound(varReturn, 2) To UBound(varReturn, 2)
|
|
temp(Num) = varReturn(i, Num)
|
|
Next
|
|
SortOneDimArray temp, LBound(temp), UBound(temp)
|
|
Debug.Print Mid(Join(temp, ", "), 3)
|
|
Next i
|
|
Debug.Print ""
|
|
Debug.Print "Time to go : " & Timer - countTime & " seconds."
|
|
End Sub
|
|
|
|
Private Function Anagrams(strContent As String) As Variant
|
|
Dim arrList
|
|
Dim arrTemp() As String
|
|
Dim arrReturn() As String
|
|
Dim Num As Long
|
|
Dim lngCountTemp As Long
|
|
Dim lngCount As Long
|
|
Dim i As Long
|
|
|
|
'Put the content of txt file in an One Dim Array
|
|
arrList = Split(strContent, vbCrLf)
|
|
ReDim arrTemp(0 To UBound(arrList, 1), 0 To 2)
|
|
'Transfer Datas in a 2nd Array Multi-Dim
|
|
'Col 0 = words with letters sorted
|
|
'Col 1 = words
|
|
'Col 2 = Number of same words with letters sorted in the list
|
|
For Num = LBound(arrList) To UBound(arrList)
|
|
arrTemp(Num, 0) = SortLetters(CStr(arrList(Num)), Chr(0))
|
|
arrTemp(Num, 1) = CStr(arrList(Num))
|
|
Next
|
|
SortTwoDimArray arrTemp, LBound(arrTemp, 1), UBound(arrTemp, 1), 0
|
|
For Num = LBound(arrTemp, 1) To UBound(arrTemp, 1)
|
|
arrTemp(Num, 2) = NbIf(arrTemp(Num, 0), arrTemp, Num, 0)
|
|
If arrTemp(Num, 2) > lngCountTemp Then lngCountTemp = arrTemp(Num, 2)
|
|
Next
|
|
'return
|
|
ReDim arrReturn(0 To lngCountTemp, 0)
|
|
For Num = LBound(arrTemp, 1) To UBound(arrTemp, 1)
|
|
If lngCountTemp = arrTemp(Num, 2) Then
|
|
ReDim Preserve arrReturn(0 To lngCountTemp, 0 To lngCount)
|
|
For i = 0 To lngCountTemp - 1
|
|
arrReturn(i, lngCount) = arrTemp(Num + i, 1)
|
|
Next i
|
|
lngCount = lngCount + 1
|
|
End If
|
|
Next Num
|
|
Anagrams = Transposition(arrReturn)
|
|
End Function
|
|
|
|
Private Function SortLetters(s As String, sep As String) As String
|
|
Dim temp
|
|
|
|
temp = Split(StrConv(s, vbUnicode), sep)
|
|
SortOneDimArray temp, LBound(temp), UBound(temp)
|
|
SortLetters = Join(temp, sep)
|
|
End Function
|
|
|
|
Private Function NbIf(strValue As String, arr As Variant, lngInd As Long, Optional lngColumn As Long) As Long
|
|
Dim i As Long
|
|
Dim lngCount As Long
|
|
|
|
For i = lngInd To UBound(arr, 1)
|
|
If arr(i, lngColumn) = strValue Then
|
|
lngCount = lngCount + 1
|
|
Else
|
|
Exit For
|
|
End If
|
|
Next i
|
|
NbIf = lngCount
|
|
End Function
|
|
|
|
Private Function Transposition(ByRef myArr As Variant) As Variant
|
|
Dim tabl
|
|
Dim i As Long
|
|
Dim j As Long
|
|
|
|
ReDim tabl(LBound(myArr, 2) To UBound(myArr, 2), LBound(myArr, 1) To UBound(myArr, 1))
|
|
For i = LBound(myArr, 1) To UBound(myArr, 1)
|
|
For j = LBound(myArr, 2) To UBound(myArr, 2)
|
|
tabl(j, i) = myArr(i, j)
|
|
Next j
|
|
Next i
|
|
Transposition = tabl
|
|
Erase tabl
|
|
End Function
|
|
|
|
Private Sub SortOneDimArray(ByRef myArr As Variant, mini As Long, Maxi As Long)
|
|
Dim i As Long
|
|
Dim j As Long
|
|
Dim Pivot As Variant
|
|
Dim temp As Variant
|
|
|
|
On Error Resume Next
|
|
i = mini: j = Maxi
|
|
Pivot = myArr((mini + Maxi) \ 2)
|
|
While i <= j
|
|
While myArr(i) < Pivot And i < Maxi: i = i + 1: Wend
|
|
While Pivot < myArr(j) And j > mini: j = j - 1: Wend
|
|
If i <= j Then
|
|
temp = myArr(i)
|
|
myArr(i) = myArr(j)
|
|
myArr(j) = temp
|
|
i = i + 1: j = j - 1
|
|
End If
|
|
Wend
|
|
If (mini < j) Then Call SortOneDimArray(myArr, mini, j)
|
|
If (i < Maxi) Then Call SortOneDimArray(myArr, i, Maxi)
|
|
End Sub
|
|
|
|
Private Sub SortTwoDimArray(ByRef myArr As Variant, mini As Long, Maxi As Long, Optional Colonne As Long = 0)
|
|
Dim i As Long
|
|
Dim j As Long
|
|
Dim Pivot As Variant
|
|
Dim myArrTemp As Variant
|
|
Dim ColTemp As Long
|
|
|
|
On Error Resume Next
|
|
i = mini: j = Maxi
|
|
Pivot = myArr((mini + Maxi) \ 2, Colonne)
|
|
While i <= j
|
|
While myArr(i, Colonne) < Pivot And i < Maxi: i = i + 1: Wend
|
|
While Pivot < myArr(j, Colonne) And j > mini: j = j - 1: Wend
|
|
If i <= j Then
|
|
ReDim myArrTemp(LBound(myArr, 2) To UBound(myArr, 2))
|
|
For ColTemp = LBound(myArr, 2) To UBound(myArr, 2)
|
|
myArrTemp(ColTemp) = myArr(i, ColTemp)
|
|
myArr(i, ColTemp) = myArr(j, ColTemp)
|
|
myArr(j, ColTemp) = myArrTemp(ColTemp)
|
|
Next ColTemp
|
|
Erase myArrTemp
|
|
i = i + 1: j = j - 1
|
|
End If
|
|
Wend
|
|
If (mini < j) Then Call SortTwoDimArray(myArr, mini, j, Colonne)
|
|
If (i < Maxi) Then Call SortTwoDimArray(myArr, i, Maxi, Colonne)
|
|
End Sub
|