login  Naam:   Wachtwoord: 
Registreer je!
 Forum
Zoeken  Regels  Help
Categorieën > VB.NET

Alle mogelijk combinaties van karakters in een array maar geen dubbele. (Opgelost)

Ontani – 11/03/2010 16:06
Ik heb een string array bijvoorbeeld: String('A', 'B', 'C') en wil hier aan de hand van een functie hetvolgende genereren.

  1. A
  2. B
  3. C
  4. AB
  5. BC
  6. AC
  7. ABC



Dus alle mogelijke combinaties tussen de letters behalve dubbele. AC en CA zie ik ook als dubbel of ABC en CAB en BAC en BCA is ook allemaal hetzelfde.

Ik was dus aan het binair tel systeem aan het denken.

  1. B A
  2. 0 0 = Niets
  3. 0 1 = A
  4. 1 0 = B
  5. 1 1 = BA



  1. C B A
  2. 0 0 0 = Niets
  3. 0 0 1 = A
  4. 0 1 0 = B
  5. 0 1 1 = BA
  6. 1 0 0 = C
  7. 1 0 1 = CA
  8. 1 1 0 = CB
  9. 1 1 1 = CBA



Maar het probleem is dat implementeren.

4 antwoorden

Gesponsorde links

titjes – 11/03/2010 16:52 (Laatst gewijzigd op 11/03/2010 16:55)
Ben je daar weer met je onmogelijke opdrachten?!  Mag eenzelfde letter meerdere keren meegegeven worden, cfr. String('A', 'B', 'B', 'C'). Het is maar dat ik niet met een mogelijke oplossing kom en elke keer te horen krijg dat er nog een gaatje in het systeem zit.. 

vinTage schreef:
gezien de topic titel lijkt me dat dubbelen niet mogen 

Ontani – 11/03/2010 17:03
Dat zal nie gebeuren titjes, die A, B en C zijn eigenlijk kolomnamen in SQL dus die kunnen al niet hetzelfde zijn.

vinTage – 11/03/2010 18:11
Ik heb dit gemaakt (in php want ik ken geen .net), een range(a,z) resulteerde in een timeout 

Maar met tot k ging het nog redelijk goed.

  1. <?php
  2. $array = range('a','k');
  3. $temparray = array();
  4.  
  5. foreach($array as $var)
  6. {
  7. //alle letters uit het array al toevoegen
  8. if(!in_array($var, $temparray))
  9. {
  10. array_push($temparray, $var);
  11. }
  12.  
  13. foreach($temparray as $var1)
  14. {
  15. if(!in_array($var.$var1, $temparray) && $var1 != $var)
  16. {
  17. array_push($temparray, $var.$var1);
  18. }
  19. }
  20. }
  21.  
  22. ?>
  23. <pre>
  24. <?php
  25. print_r($temparray);
  26. ?>
  27. </pre>



Is dit ongeveer wat je bedoelde?

Ontani – 11/03/2010 20:19 (Laatst gewijzigd op 12/03/2010 08:33)
Ik heb het probleem zelf al opgelost en was gemakkelijker als ik dacht.

  1. Dim result As New List(Of String)
  2. Dim input As String() = New String() {"A", "B", "C", "D"}
  3.  
  4. For i As Integer = 1 To Math.Pow(2, input.Count) - 1
  5. Dim tmp As String = Convert.ToDouble(Convert.ToString(i, 2)).ToString(StrDup(input.Count, "0"))
  6. Dim rslt As String = ""
  7. For j As Integer = 0 To tmp.Count - 1
  8. If tmp(j).ToString = "1" Then
  9. rslt &= input(j)
  10. End If
  11. Next
  12. result.Add(rslt)
  13. Next
  14.  
  15. MsgBox(String.Join(", ", result.ToArray))



Korte uitleg:
input = String("A", "B", "C", "D")

Een loop van 1 tot 2 tot de macht (lengte van de input array) (16 in dit geval) - 1 = 15

tmp bevat de counter omgezet naar binair dus "0001" tot "1111"

Dan worden alle karakters van de counter doorlopen en waar deze "1" is wordt een string opgebouwd voor naar de resultset te sturen. Bijvoorbeeld :
"0001" = "A" (DCB = 0, A = 1) of "1011" = "DBA" (DBA = 1, C = 0)

edit: script wat uitgebreid, werkt nu zelfs voor 22 parameters, heb niet meer getest wat dat resulteerd al in een array met 4.194.304 keys.

Gesponsorde links

Dit onderwerp is gesloten.
Actieve forumberichten:

© 2002-2012 Sitemasters.be - Regels - Gehost door: Vircon - Laadtijd: 0.147s