Add tasks for all the new languages
This commit is contained in:
parent
9dc3c2bb62
commit
bba7bfd280
13208 changed files with 134745 additions and 0 deletions
136
Task/Anagrams/FreeBASIC/anagrams.freebasic
Normal file
136
Task/Anagrams/FreeBASIC/anagrams.freebasic
Normal file
|
|
@ -0,0 +1,136 @@
|
|||
' FB 1.05.0 Win64
|
||||
|
||||
Type IndexedWord
|
||||
As String word
|
||||
As Integer index
|
||||
End Type
|
||||
|
||||
' selection sort, quick enough for sorting small number of letters
|
||||
Sub sortWord(s As String)
|
||||
Dim As Integer i, j, m, n = Len(s)
|
||||
For i = 0 To n - 2
|
||||
m = i
|
||||
For j = i + 1 To n - 1
|
||||
If s[j] < s[m] Then m = j
|
||||
Next j
|
||||
If m <> i Then Swap s[i], s[m]
|
||||
Next i
|
||||
End Sub
|
||||
|
||||
' selection sort, quick enough for sorting small array of IndexedWord instances by index
|
||||
Sub sortIndexedWord(iw() As IndexedWord)
|
||||
Dim As Integer i, j, m, n = UBound(iw)
|
||||
For i = 1 To n - 1
|
||||
m = i
|
||||
For j = i + 1 To n
|
||||
If iw(j).index < iw(m).index Then m = j
|
||||
Next j
|
||||
If m <> i Then Swap iw(i), iw(m)
|
||||
Next i
|
||||
End Sub
|
||||
|
||||
' quicksort for sorting whole dictionary of IndexedWord instances by sorted word
|
||||
Sub quicksort(a() As IndexedWord, first As Integer, last As Integer)
|
||||
Dim As Integer length = last - first + 1
|
||||
If length < 2 Then Return
|
||||
Dim pivot As String = a(first + length\ 2).word
|
||||
Dim lft As Integer = first
|
||||
Dim rgt As Integer = last
|
||||
While lft <= rgt
|
||||
While a(lft).word < pivot
|
||||
lft +=1
|
||||
Wend
|
||||
While a(rgt).word > pivot
|
||||
rgt -= 1
|
||||
Wend
|
||||
If lft <= rgt Then
|
||||
Swap a(lft), a(rgt)
|
||||
lft += 1
|
||||
rgt -= 1
|
||||
End If
|
||||
Wend
|
||||
quicksort(a(), first, rgt)
|
||||
quicksort(a(), lft, last)
|
||||
End Sub
|
||||
|
||||
Dim t As Double = timer
|
||||
Dim As String w() '' array to hold actual words
|
||||
Open "undict.txt" For Input As #1
|
||||
Dim count As Integer = 0
|
||||
While Not Eof(1)
|
||||
count +=1
|
||||
Redim Preserve w(1 To count)
|
||||
Line Input #1, w(count)
|
||||
Wend
|
||||
Close #1
|
||||
|
||||
Dim As IndexedWord iw(1 To count) '' array to hold sorted words and their index into w()
|
||||
Dim word As String
|
||||
For i As Integer = 1 To count
|
||||
word = w(i)
|
||||
sortWord(word)
|
||||
iw(i).word = word
|
||||
iw(i).index = i
|
||||
Next
|
||||
quickSort iw(), 1, count '' sort the IndexedWord array by sorted word
|
||||
|
||||
Dim As Integer startIndex = 1, length = 1, maxLength = 1, ub = 1
|
||||
Dim As Integer maxIndex(1 To ub)
|
||||
maxIndex(ub) = 1
|
||||
word = iw(1).word
|
||||
|
||||
For i As Integer = 2 To count
|
||||
If word = iw(i).word Then
|
||||
length += 1
|
||||
Else
|
||||
If length > maxLength Then
|
||||
maxLength = length
|
||||
Erase maxIndex
|
||||
ub = 1
|
||||
Redim maxIndex(1 To ub)
|
||||
maxIndex(ub) = startIndex
|
||||
ElseIf length = maxLength Then
|
||||
ub += 1
|
||||
Redim Preserve maxIndex(1 To ub)
|
||||
maxIndex(ub) = startIndex
|
||||
End If
|
||||
startIndex = i
|
||||
length = 1
|
||||
word = iw(i).word
|
||||
End If
|
||||
Next
|
||||
|
||||
If length > maxLength Then
|
||||
maxLength = length
|
||||
Erase maxIndex
|
||||
Redim maxIndex(1 To 1)
|
||||
maxIndex(1) = startIndex
|
||||
ElseIf length = maxLength Then
|
||||
ub += 1
|
||||
Redim Preserve maxIndex(1 To ub)
|
||||
maxIndex(ub) = startIndex
|
||||
End If
|
||||
|
||||
Print Str(count); " words in the dictionary"
|
||||
Print "The anagram set(s) with the greatest number of words (namely"; maxLength; ") is:"
|
||||
Print
|
||||
Dim iws(1 To maxLength) As IndexedWord '' array to hold each anagram set
|
||||
For i As Integer = 1 To UBound(maxIndex)
|
||||
For j As Integer = maxIndex(i) To maxIndex(i) + maxLength - 1
|
||||
iws(j - maxIndex(i) + 1) = iw(j)
|
||||
Next j
|
||||
sortIndexedWord iws() '' sort anagram set before displaying it
|
||||
For j As Integer = 1 To maxLength
|
||||
Print w(iws(j).index); " ";
|
||||
Next j
|
||||
Print
|
||||
Next i
|
||||
|
||||
Print
|
||||
Print "Took ";
|
||||
Print Using "#.###"; timer - t;
|
||||
Print " seconds on i3 @ 2.13 GHz"
|
||||
|
||||
Print
|
||||
Print "Press any key to quit"
|
||||
Sleep
|
||||
Loading…
Add table
Add a link
Reference in a new issue