|
Categorieën >
VB.NET
Alle mogelijk combinaties van karakters in een array maar geen dubbele. (Opgelost)
|
|
|
offline
|
   
Grafische Ninja
|
Ik heb een string array bijvoorbeeld: String('A', 'B', 'C') en wil hier aan de hand van een functie hetvolgende genereren.
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.
B A
0 0 = Niets
0 1 = A
1 0 = B
1 1 = BA
B A 0 0 = Niets 0 1 = A 1 0 = B 1 1 = BA
C B A
0 0 0 = Niets
0 0 1 = A
0 1 0 = B
0 1 1 = BA
1 0 0 = C
1 0 1 = CA
1 1 0 = CB
1 1 1 = CBA
C B A 0 0 0 = Niets 0 0 1 = A 0 1 0 = B 0 1 1 = BA 1 0 0 = C 1 0 1 = CA 1 1 0 = CB 1 1 1 = CBA
Maar het probleem is dat implementeren. |
4 antwoorden
titjes – 11/03/2010 16:52 (Laatst gewijzigd op 11/03/2010 16:55)
|
|
offline
|

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
|
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.
<?php
$array = range('a','k');
$temparray = array();
foreach($array as $var)
{
//alle letters uit het array al toevoegen
if(!in_array($var, $temparray))
{
array_push($temparray, $var);
}
foreach($temparray as $var1)
{
if(!in_array($var.$var1, $temparray) && $var1 != $var)
{
array_push($temparray, $var.$var1);
}
}
}
?>
<pre>
<?php
print_r($temparray);
?>
</pre>
<?php foreach($array as $var) { //alle letters uit het array al toevoegen { } foreach($temparray as $var1) { if(!in_array($var.$var1, $temparray) && $var1 != $var) { } } } ?> <pre> <?php ?> </pre>
Is dit ongeveer wat je bedoelde?
|
Ontani – 11/03/2010 20:19 (Laatst gewijzigd op 12/03/2010 08:33)
|
|
offline
|
   
Grafische Ninja
|
Ik heb het probleem zelf al opgelost en was gemakkelijker als ik dacht.
Dim result As New List(Of String)
Dim input As String() = New String() {"A", "B", "C", "D"}
For i As Integer = 1 To Math.Pow(2, input.Count) - 1
Dim tmp As String = Convert.ToDouble(Convert.ToString(i, 2)).ToString(StrDup(input.Count, "0"))
Dim rslt As String = ""
For j As Integer = 0 To tmp.Count - 1
If tmp(j).ToString = "1" Then
rslt &= input(j)
End If
Next
result.Add(rslt)
Next
MsgBox(String.Join(", ", result.ToArray))
Dim result As New List(Of String) Dim input As String() = New String() {"A", "B", "C", "D"} For i As Integer = 1 To Math.Pow(2, input.Count) - 1 Dim tmp As String = Convert.ToDouble(Convert.ToString(i, 2)).ToString(StrDup(input.Count, "0")) Dim rslt As String = "" For j As Integer = 0 To tmp.Count - 1 If tmp(j).ToString = "1" Then rslt &= input(j) End If Next result.Add(rslt) Next 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.
|
Dit onderwerp is gesloten.
|
|
|