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 Sub
Tohon 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 Sub
Onnistuuko joku keksimään tehokkaamman toteutustavan?
edit: 97 on pienen a-kirjaimen ASCII-koodi.
Aihe on jo aika vanha, joten et voi enää vastata siihen.