login  Naam:   Wachtwoord: 
Registreer je!
 Forum

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

Offline Ontani - 11/03/2010 16:06
Avatar van OntaniGouden medailleGouden medailleGouden medailleGouden medaille

-1
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
Offline Abbas - 11/03/2010 16:52 (laatste wijziging 11/03/2010 16:55)
Avatar van Abbas Gouden medaille

Crew .NET
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 
Offline Ontani - 11/03/2010 17:03
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
Dat zal nie gebeuren titjes, die A, B en C zijn eigenlijk kolomnamen in SQL dus die kunnen al niet hetzelfde zijn.
Offline vinTage - 11/03/2010 18:11
Avatar van vinTage Nieuw lid 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?
Offline Ontani - 11/03/2010 20:19 (laatste wijziging 12/03/2010 08:33)
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
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.
Bedankt door: marten, Koen
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.218s