Wydrukuj wszystkie możliwe kombinacje liczby „X” znaków z długością ciągu „X” (Brute Force)
Próbuję napisać generator kombinacji słów, mam na myśli wydrukować wszystkie możliwe kombinacje liczby „X” znaków o długości łańcucha „X”,
Przede wszystkim muszę powiedzieć, że widziałem pytanie w StackOverFlow o dokładnie tym problemie, który zawiera wiele odpowiedzi generatorów słów, aby zrobić to dokładnie (w różnych językach), ale proszę, nie zaznaczaj tego jako duplikat lub nie skomentuj moje pytanie tylko po to, by odwołać się do mnie - ten link, ponieważ przetestowałem WSZYSTKIE kody C # i VBNET tego pytania i naprawdę żaden nie działa w 100% zgodnie z oczekiwaniami, zobacz kombinacje, których potrzebuję:
Na przykład, jeśli mam znaki „a”, „b” i „c” i chcę, aby wszystkie kombinacje tych znaków były ciągiem o długości „3”, jest to wynik, którego oczekuję:
' Expected result, 27 combinations:
'
' aaa
' aab
' aac
'
' aba
' abb
' abc
'
' aca
' acb
' acc
'
' baa
' bab
' bac
'
' bba
' bbb
' bbc
'
' bca
' bcb
' bcc
'
' caa
' cab
' cac
'
' cba
' cbb
' cbc
'
' cca
' ccb
' ccc
(Rodzaj nie ma znaczenia, mogę to posortować później.)
... Ale jak dotąd tego oczekiwanego rezultatu mogę uzyskać:
'a
'aa
'aaa
'b
'bb
'bbb
'c
'cc
'ccc
Zrobiłem to teraz w dwóch językach (Ruby i Batch), ale używając zagnieżdżonych Fors (wiele Fors razem dla każdego Do dołączenia tylko jednej litery do drugiej Do wyjścia), oczywiście Jeśli próbuję to zrobić w VBNET, to aby uniknąć pozwu wielu Fors i zrobić to w lepszy sposób.
W poniższym kodzie możesz zobaczyć, jak próbuję przydzielić wszystkie kombinacje w pamięci RAM (tablicę) zamiast zapisywać je na dysku fizycznym, więc chcę napisać ten kod za pomocą metody logicznej iw sposób bardziej wydajny, a następnie Chcę najpierw zapisać wszystkie kombinacje „w pamięci” i dlatego też nie chcę używać wielu forów (wydajność).
To była moja ostatnia próba, wszystko zostało wyjaśnione w komentarzach:
Public Class Form1
Dim characters As Char() ' Default value: {"a","b","c"}
Dim StringLength As Int64 ' Default value: 3
Dim TotalCombinations As Int64 ' Default value: 27
Dim strarray(99999999) As String ' Default size: "99.999.999" million of combinations in memory (I need to confirm this from an expert).
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim index As Int64 = 0
For column As Int64 = 0 To TotalCombinations - 1 ' For 0 to 26
For Each character As Char In characters ' Characters = {"a","b","c"}
If column < index Then
index = 0 ' I reset index value 'cause... just experimenting things.
Try
strarray(index) += characters(index)
RichTextBox1.Text += strarray(index) & ControlChars.NewLine
Catch
End Try
Else
Try
strarray(index) += characters(index)
RichTextBox1.Text += strarray(index) & ControlChars.NewLine
Catch
End Try
End If
Next
index += 1
Next
End Sub
Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
characters = sender.text.ToCharArray ' Result: {"a","b","c"}
Calculate_Combinations() ' Result: 27
End Sub
Private Sub NumericUpDown1_ValueChanged(sender As Object, e As EventArgs) Handles NumericUpDown1.ValueChanged
StringLength = sender.value ' Result: 3
Calculate_Combinations() ' Result: 27
End Sub
Private Sub Calculate_Combinations()
Try
TotalCombinations = ((characters.LongLength * StringLength) * StringLength) ' Result: 27
Label1.Text = ((characters.LongLength * StringLength) * StringLength) & " number of combinations." ' Result: 27
Catch : End Try
End Sub
End Class
Dokładna pomoc.