Olisko mahdollista/miten sais laitettua tietyt merkit kaikkiin mahdollisiin järjestyksiin (esim. a, b ja c menis järjestyksiin: abc, cba, bac, cab, cba ja bca)?
Joo kyllä sen saa, kun vähän käyttelee LEFT$:ia RIGHT$:ia ja MID$:ia. Olen tehnyt tuollaisen tapaisen QB:llä mutta se on vähän vaikea soveltaa VB:lle.
Tai tuohonhan saattaa olla jokin funktiokin valmiina kuten Reverse, joka kääntää tekstin päinvastoin.
Tee yksiulotteinen taulukko(3)as string johon laitat arvoiksi "a", "b" ja "c".
Tee kolme sisäkkäistä For luuppia
Jos luupin laskuri on sama kuin ulomman (toisen tai molempien) niin ohita ko. kierros, jotta ei tule samaa kirjainta kahdesti.
Sitten vaan Text1=text1 + Taulukko(i) + taulukko(j) + taulukko(k)+","
Jopas pulman lykkäsit! kyllä tuohon löytyy systemaattinen ratkaisu, mutta inhottava koodattava. Ehkä helpoin ratkaisu on poimia kirjaimet satunnaisessa järjestyksessä ja tallettaa aina uusi järjestys merkkijonoon. tarkistetaan, etei sama kombinatio toistu. jatketaan kunnes N! vaihtoehtoa on löytynyt. (N on merkien määrä)
Tämä näyttäis toimivankin. Formilla textbox Text1 ja Listbox List1, jonka Sorted=True
Dim i As Integer, s() As Integer, j As Integer
Dim lista As String, k As Integer, L As Integer
Dim N As Integer 'vaihtoehtojen määrä
Dim m As String 'kombinaatio
Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
List1.Clear
L = Len(Text1): k = L: N = 1
For i = 2 To L
N = N * i 'lasketaan L-kertoma
Next
ReDim s(k)
Do Until List1.ListCount = N
For i = 1 To L
s(i) = i
Next
m = ""
For i = 1 To k - 1
j = Int(1 + k * Rnd)
m = m + Mid(Text1, s(j), 1)
If j <> k Then s(j) = s(k)
k = k - 1
Next
m = m + Mid(Text1, s(1), 1)
If InStr(lista, m) = 0 Then
lista = lista + "#" + m
List1.AddItem m
End If
k = L
Loop
End If
End SubTohon ReDim s(k):n perään vielä : lista = ""
Tollein sai qbasic:ssa käymään kanssa kaikki läpi,
siinä tulee myös aaaa,aaab,aaac,aaad,aaba,aabb.....
CLS
n1 = 1: n2 = 1: n3 = 1: n4 = 1
alku:
texti$ = "abcd"
uus$ = (MID$(texti$, n4, 1))
uus$ = uus$ + (MID$(texti$, n3, 1))
uus$ = uus$ + (MID$(texti$, n2, 1))
uus$ = uus$ + (MID$(texti$, n1, 1))
n1 = n1 + 1
IF n1 > 4 THEN n1 = 1: n2 = n2 + 1
IF n2 > 4 THEN n2 = 1: n3 = n3 + 1
IF n3 > 4 THEN n3 = 1: n4 = n4 + 1
IF n4 > 4 THEN END
PRINT uus$; " ";
GOTO alku
Tässä on oma ohjelmani, joka hyödyntää itseään kutsuvaa aliohjelmaa. Merkkimuodostelmat näytetään listassa formista painettaessa, aliohjelman keskimmäisten parametrien täytyy olla muodostettavien merkkijonojen pituus.
Private Sub Form_Click()
'tulostetaan listaan neljän merkin yhdistelmät
List1.Clear
SeuraavaTaso "", 4, 4, List1
End Sub
Sub SeuraavaTaso(alku As String, maara As Integer, taso As Integer, lista As ListBox)
Dim i As Integer
If taso = 0 Then
List1.AddItem alku
Else
For i = 97 To 96 + maara
If InStr(alku, Chr(i)) = 0 Then
SeuraavaTaso alku & Chr(i), maara, taso - 1, lista
End If
Next
End If
End SubOnnistuuko joku keksimään tehokkaamman toteutustavan?
edit: 97 on pienen a-kirjaimen ASCII-koodi.
Aihe on jo aika vanha, joten et voi enää vastata siihen.