Avatar billede dollas Nybegynder
03. september 2004 - 12:04 Der er 31 kommentarer

nemmeste måde at lave en liste på

hvis du jeg har 1234567890abcdef osv... i en variabel og jeg ønsker at få lavet en liste over alle muligheder for kombinationer af dem?

altså
1
2
3
4
5
6
....


Hvordan laver jeg sådan noget kode nemmest...?
Avatar billede arne_v Ekspert
03. september 2004 - 12:15 #1
Teknisk gemmer du nok med:

Dim list As ArrayList = new ArrayList()

og

list.Add(kombination)

men så skal du have fundet de kombinationer.
Avatar billede dollas Nybegynder
03. september 2004 - 12:17 #2
???

Jeg har fundet noget kode på google:

---
Private Function Permutations(ByVal data As String) As String(,)
    Dim i As Int32
    Dim y As Int32
    Dim x As Int32
    Dim tempChar As String
    Dim newString As String
    Dim strings(,) As String
    Dim rowCount As Long

    If data.Length < 2 Then
      Exit Function
    End If

    'use the factorial function to determine the number of rows needed
    'because redim preserve is slow
    ReDim strings(data.Length - 1, Factorial(data.Length - 1) - 1)
    strings(0, 0) = data

    'swap each character(I) from the second postion to the second to last position
    For i = 1 To (data.Length - 2)
        'for each of the already created numbers
        For y = 0 To rowCount
            'do swaps for the character(I) with each of the characters to the right
            For x = data.Length To i + 2 Step -1
                tempChar = strings(0, y).Substring(i, 1)
                newString = strings(0, y)
                Mid(newString, i + 1, 1) = newString.Substring(x - 1, 1)
                Mid(newString, x, 1) = tempChar
                rowCount = rowCount + 1
                strings(0, rowCount) = newString
            Next
        Next
    Next


  'Shift Characters
  'for each empty column
  For i = 1 To data.Length - 1
      'move the shift character over one
      For x = 0 To strings.GetUpperBound(1)
          strings(i, x) = strings(i - 1, x)
          Mid(strings(i, x), i, 1) = strings(i - 1, x).Substring(i, 1)
          Mid(strings(i, x), i + 1, 1) = strings(i - 1, x).Substring(i - 1, 1)
      Next
  Next

  Return strings

End Function
 
Public Function Factorial(ByVal Number As Integer) As String
    Try
        If Number = 0 Then
            Return 1
        Else
            Return Number * Factorial(Number - 1)
        End If
    Catch ex As Exception
        Return ex.Message
    End Try
End Function

---


ser det fornuftigt ud ?

Jeg er ved at teste det...


Iøvrigt Arne... :) Hvad med det der FTP sjov ?
Avatar billede arne_v Ekspert
03. september 2004 - 12:17 #3
To spørgsmål:

1)  er rækkefølgen uden betydning (altså statistisk kombination i modsætning
    til statistisk permutation) ?

2)  er du klar over at der vil være uhyggeligt mange kombinationer ?
Avatar billede dollas Nybegynder
03. september 2004 - 12:19 #4
1. FOrstår ikke det spørgsmål... Det skal være hvis min streng f.eks består af 12ab så skal det give:
1
2
a
b
11
12
1a
1b

osv... forstår du?

svar 2:

Jeps... jeg kunne forestille mig fantastisk mange... :)
Avatar billede arne_v Ekspert
03. september 2004 - 12:20 #5
Jeg kan ikke lige gennemskue den algoritme, men den skal da nok
være rigtig.

Men inden du går videre så prøv lige at udregn hvor meget memory
den her kræver:

ReDim strings(data.Length - 1, Factorial(data.Length - 1) - 1)

for forskellige data.Length'er !
Avatar billede arne_v Ekspert
03. september 2004 - 12:21 #6
re 1)

spørgsmålet er om 12 og 21 er det samme eller forskelligt
Avatar billede dollas Nybegynder
03. september 2004 - 12:23 #7
det er ikke det samme...
Avatar billede arne_v Ekspert
03. september 2004 - 12:25 #8
DataLength    antal elementer
5            4 * (4! - 1) = 92
10            9 * (9! - 1) = 3265911
15            14 * (14! - 1) = 1220496076786

så du løber tøt for memory et sted mellem 10 og 15.
Avatar billede arne_v Ekspert
03. september 2004 - 12:27 #9
12 21 forskellig => permutation

men den funktion du har fundet hedder jo også permutations, så det er jo godt nok.

Hvor stor data længde skal du bruge ?
Avatar billede dollas Nybegynder
03. september 2004 - 12:28 #10
hmmm... Ja...

Det kan jeg jo godt se...

Hvad kan man så gøre ?
Hvis nu man laver det sådan at den først finder alle muligheder af 1 karakter og bag efter 2 osv...???

se her:
listen består af abc

antal: (karakter)        muligheder(, sepereret)
1                        a,b,c
2                        aa,ab,ac,ba,bb,bc,ca,cb,cc

osv ???

Det må da kunne lade sig gøre?
Avatar billede dollas Nybegynder
03. september 2004 - 12:31 #11
datalængde = antal karaktere ???

tjaaa, f.eks: abcdefghijklmnopqrstuvwxyz1234567890

og lidt til?
Avatar billede arne_v Ekspert
03. september 2004 - 12:38 #12
Det er 36.

Har du tænkt på hvordan du vil gemme de muligheder ?

Hvis du vil gemme det på disk så vil det være milliarder af 200 GB diske
du skal bruge.
Avatar billede dollas Nybegynder
03. september 2004 - 12:41 #13
Ja, siden jeg kun har 1,5 TB til rådighed, så kan jeg godt se at jeg løber tør...

hmmmm...

Men det må da kunne ladesig gøre... Hvis du de ikke skal gemmes, men bare genereres og så smides ud igen?

Jeg skal bruge det til at kunne finde ud af hvor langtid det tager at f.eks finde frem til ostemad ved at starte fra a og så stoppe på f.eks zzzzzzzzz

forstår du?
Avatar billede arne_v Ekspert
03. september 2004 - 12:46 #14
Hvis du kan reducere det fra 1-36 ud af 36 til 1-9 ud af 36 så hjælper
det meget.
Avatar billede arne_v Ekspert
03. september 2004 - 12:48 #15
Og hvis du ikke skal gemme dem men bare skal se om du har fundet ostemad
så skal du heller ikke bruge plads til at gemme dem.

Så er det ren CPU.
Avatar billede dollas Nybegynder
03. september 2004 - 12:50 #16
yes sir...

det ord der skal findes er MAX 10 karaktere langt, men der er alle bogstaver som mulighed inden for de 10...

hmmm, det forstod jeg ikek lige selv...

Er det noget du kan lave ?
Avatar billede arne_v Ekspert
03. september 2004 - 12:54 #17
Ja
Avatar billede dollas Nybegynder
03. september 2004 - 12:55 #18
Ja, det ville jeg da blive glad for :)
Avatar billede arne_v Ekspert
03. september 2004 - 13:44 #19
Imports System

Class MainClass

    Private Shared Sub FillAndCheck(ByVal s As String, ByVal ix As Integer, ByVal actlen As Integer, ByVal charset As Char(), ByVal used As Boolean(), ByVal target As String)
        If ix = actlen Then
            If s = target Then
                Console.WriteLine(target + " found")
            End If
        Else
            Dim tmp As String
            Dim i As Integer
            For i = 0 To charset.Length-1
                If Not used(i) Then
                    used(i) = True
                    tmp = s + charset(i)
                    FillAndCheck(tmp, ix + 1, actlen, charset, used, target)
                    used(i) = False
                End If
            Next
        End If
    End Sub

    Private Shared Sub FindOneLength(ByVal target As String, ByVal actlen As Integer, ByVal charset As String)
        Dim used(charset.Length - 1) As Boolean
        Dim j As Integer
        For j = 0 To used.length-1
            used(j) = False
        Next
        FillAndCheck("", 0, actlen, charset.ToCharArray, used, target)
    End Sub

    Public Shared Sub Find(ByVal target As String, ByVal maxlength As Integer, ByVal charset As String)
        Dim i As Integer
        For i = 1 To maxlength
            FindOneLength(target, i, charset)
        Next
    End Sub

    Public Shared Sub Main(ByVal args As String())
        Find("bc", 3, "abcd")
        Find("xy", 3, "abcd")
        Find("d", 3, "abcd")
        Find("dcba", 3, "abcd")
    End Sub
End Class
Avatar billede arne_v Ekspert
03. september 2004 - 13:44 #20
Det kan sikkert optimeres lidt og du skal måske have nogle countere eller
noget tidtagning ind, men det giver ihvertfald lidt at arbejde med.
Avatar billede arne_v Ekspert
07. september 2004 - 15:53 #21
Nå har du fået brændt nogle CPU timer af ?
Avatar billede arne_v Ekspert
11. september 2004 - 20:54 #22
Eller kører den stadig ?

:-)
Avatar billede daviddollas Nybegynder
02. oktober 2006 - 15:44 #23
kan du hjælpe arne ?
Avatar billede arne_v Ekspert
02. oktober 2006 - 16:00 #24
maaske

hvad er spoergsmaalet ?
Avatar billede daviddollas Nybegynder
02. oktober 2006 - 16:06 #25
Jeg er igang med at lave så den smider det ud i en fil, men når jeg bruger følgende fatter den ikke at den skal lave en ny linie:

File.WriteAllText(path, s + Environment.NewLine, Encoding.UTF8)


Og smid lige et svar... Jeg skylder jo lidt her :)

Jeg har iøvrigt smidt det hele i en tråd... Kunne man ikke optimere det lidt ?
Avatar billede arne_v Ekspert
03. oktober 2006 - 02:49 #26
lav en StreamWriter og brug WriteLine
Avatar billede arne_v Ekspert
03. oktober 2006 - 02:49 #27
og jeg lagde svar for 2 aar siden
Avatar billede daviddollas Nybegynder
03. oktober 2006 - 14:41 #28
Så er der noget galt for jeg kan ikke gøre noget ved det svar... Kan du ikke prøve at svare igen ?
Avatar billede arne_v Ekspert
03. oktober 2006 - 15:41 #29
gerne

men jeg tror at problemet er at du har skiftet brugernavn !
Avatar billede daviddollas Nybegynder
03. oktober 2006 - 16:44 #30
ahh, ja...

Hvad siger du til at jeg oprettet et spørgsmål til og så får du point der.

Men kunne du ikke lave en kode der gør følgende

1 variabel med hvilke bogstaver/tegn = abcd

Og så sprøjter den det ud i en tekst fil ?
Avatar billede arne_v Ekspert
05. oktober 2006 - 04:05 #31
Altså Console.WriteLine er jo nem at erstatte med sw.WriteLine - hvad skal der laves
om i selve programmet ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester