Kralizek
03-09-2010, 10:34
Salve a tutti, causa anche sbornia della sera prima :ciapet: , mi sto perdendo in un bicchiere d'acqua.
Praticamente, dato un array di qualsiasi tipo (per l'esempio diremo string) di lunghezza non nota a priori,
var strings = new string[] { "a", "b", "c", "d" };
devo calcolare tutte le partizioni ordinate possibili composte da almeno 2 elementi.
a,b
a,c
a,d
b,c
b,d
c,d
a,b,c
a,b,d
a,c,d
b,c,d
a,b,c,d
Al momento ho scritto la versione per un array fatto da 4 elementi, peró l'algoritmo é generalizzabile, solo che non ci riesco -.-
void Main()
{
var strings = new string[] { "a", "b", "c", "d" };
List<string[]> result = new List<string[]>();
//2
for (int i = 0; i < strings.Length; i++)
{
string a1 = strings[i];
for (int y = i+1; y < strings.Length; y ++)
{
result.Add( new string[]{a1, strings[y]});
}
}
//3
for (int i = 0; i < strings.Length; i++)
{
string a1 = strings[i];
for (int y = i + 1; y < strings.Length; y ++)
{
string a2 = strings[y];
for (int z = y + 1; z < strings.Length; z ++)
{
result.Add(new string[]{a1, a2, strings[z]});
}
}
}
//4
for (int i = 0; i < strings.Length; i++)
{
string a1 = strings[i];
for (int y = i + 1; y < strings.Length; y++)
{
string a2 = strings[y];
for (int z = y + 1; z < strings.Length; z++)
{
string a3 = strings[z];
for (int w = z + 1; w < strings.Length; w++)
{
result.Add(new string[]{a1, a2, a3, strings[w]});
}
}
}
}
result.Dump();
}
Il codice puó essere agevolmente eseguito su LinqPad (http://www.linqpad.net/) (lo conoscete vero?)
Perché dico che l'algoritmo dovrebbe essere generalizzabile? non ho fatto alcuno studio di fattibilitá a riguardo, ma ad occhio non mi sembra impossibile da risolvere...
La possibilitá di usare LINQ, ed eventualmente parallelizzare il tutto (con PLINQ o anche solo con i task) sarebbe un plus non invidiabile....
Grazie a tutti =)
Praticamente, dato un array di qualsiasi tipo (per l'esempio diremo string) di lunghezza non nota a priori,
var strings = new string[] { "a", "b", "c", "d" };
devo calcolare tutte le partizioni ordinate possibili composte da almeno 2 elementi.
a,b
a,c
a,d
b,c
b,d
c,d
a,b,c
a,b,d
a,c,d
b,c,d
a,b,c,d
Al momento ho scritto la versione per un array fatto da 4 elementi, peró l'algoritmo é generalizzabile, solo che non ci riesco -.-
void Main()
{
var strings = new string[] { "a", "b", "c", "d" };
List<string[]> result = new List<string[]>();
//2
for (int i = 0; i < strings.Length; i++)
{
string a1 = strings[i];
for (int y = i+1; y < strings.Length; y ++)
{
result.Add( new string[]{a1, strings[y]});
}
}
//3
for (int i = 0; i < strings.Length; i++)
{
string a1 = strings[i];
for (int y = i + 1; y < strings.Length; y ++)
{
string a2 = strings[y];
for (int z = y + 1; z < strings.Length; z ++)
{
result.Add(new string[]{a1, a2, strings[z]});
}
}
}
//4
for (int i = 0; i < strings.Length; i++)
{
string a1 = strings[i];
for (int y = i + 1; y < strings.Length; y++)
{
string a2 = strings[y];
for (int z = y + 1; z < strings.Length; z++)
{
string a3 = strings[z];
for (int w = z + 1; w < strings.Length; w++)
{
result.Add(new string[]{a1, a2, a3, strings[w]});
}
}
}
}
result.Dump();
}
Il codice puó essere agevolmente eseguito su LinqPad (http://www.linqpad.net/) (lo conoscete vero?)
Perché dico che l'algoritmo dovrebbe essere generalizzabile? non ho fatto alcuno studio di fattibilitá a riguardo, ma ad occhio non mi sembra impossibile da risolvere...
La possibilitá di usare LINQ, ed eventualmente parallelizzare il tutto (con PLINQ o anche solo con i task) sarebbe un plus non invidiabile....
Grazie a tutti =)