2017-09-28 7 views
1

J'ai besoin d'un peu d'aide dans la bonne direction pour démarrer mon projet. Permettez-moi d'expliquer la situation en donnant un petit exemple:Générer une matrice de chemins différents à partir de questions ?, Permutations ?, Combinaisons?

Par exemple, j'ai 3 questions auxquelles on peut répondre par vrai ou faux. Je veux avoir un aperçu de toutes les combinaisons de réponses possibles.
Par exemple:

Question 1   Question 2   Question 3 
True    True    True 
True    False    True 
False    True    False 

Et ainsi de suite ...
Quelqu'un at-il une idée comment je peux programmer un outil de préférence en C# qui génère une matrice comme ci-dessus avec tous les résultats possibles?

Merci beaucoup pour vos commentaires ou idées que vous pourriez avoir!
Salutations Tim

+2

Remarque: Pour des questions N, ceci est le même un ayant un nombre binaire à N bits, ce qui donne une valeur maximale de (2^N) -1. Vous pouvez donc utiliser un int pour compter de 0 à (2^N) -1 et regarder les N bits inférieurs. Chaque bit 1 correspond à 'True' et chaque bit 0 correspond à' False'. –

Répondre

0

Totalement entièrement réécrit. Imaginez que vous avez des questions N (3 dans la démo):

string[][] questionsAndAnswers = new string[][] { 
    // Two times Two is Four? 
    new string[] { "true", "false"}, 
    // What is the capital of Russia? 
    new string[] { "Berlin", "Moscow", "London"}, 
    // Sqrt(3 * 3 + 4 * 4) = ? 
    new string[] { "1", "2", "3", "5"}, 
    }; 

premier peut répondre comme true/false, deuxième - l'une des trois villes, etc. Ensuite, vous vous pouvez énumérer toutes les réponses possibles avec une routine simple:

private static IEnumerable<string> Generator(string[][] answers) { 
    int[] indexes = new int[answers.Length]; 

    while (true) { 
    yield return string.Join("\t", answers 
     .Select((answer, idx) => answer[indexes[idx]])); 

    for (int i = 0; i < indexes.Length; ++i) { 
     if (indexes[i] < answers[i].Length - 1) { 
     indexes[i] += 1; 

     break; 
     } 
     else { 
     if (i == indexes.Length - 1) 
      yield break; 

     indexes[i] = 0; 
     } 
    } 
    } 
} 

Par exemple:

string caption = string.Join("\t", Enumerable 
    .Range(1, questionsAndAnswers.Length) 
    .Select(i => $"Question {i}")); 

    // Or loop - foreach - instead of Join 
    string body = string.Join(Environment.NewLine, Generator(questionsAndAnswers)); 

    string report = string.Join(Environment.NewLine, caption, body); 

    Console.WriteLine(report); 

Résultat:

Question 1 Question 2 Question 3 
true Berlin 1 
false Berlin 1 
true Moscow 1 
false Moscow 1 
true London 1 
false London 1 
true Berlin 2 
false Berlin 2 
true Moscow 2 
false Moscow 2 
true London 2 
false London 2 
true Berlin 3 
false Berlin 3 
true Moscow 3 
false Moscow 3 
true London 3 
false London 3 
true Berlin 5 
false Berlin 5 
true Moscow 5 // <- The right answer 
false Moscow 5 
true London 5 
false London 5 
+0

Merci pour l'entrée! Mais je me demandais s'il y avait un moyen d'obtenir le même résultat à partir d'une boucle? La description du problème est très basique. La situation est que j'ai un questionnaire où certaines questions peuvent être résolues avec vrai ou faux, certaines sont des questions ouvertes, et certaines questions ont des réponses multiples. Est-il possible de créer quelque chose comme la matrice ci-dessus mais avec les autres types de questions à l'esprit? Merci pour toute aide que vous pouvez offrir! –

+0

@Tim Occhipinti: bien sûr, vous pouvez transformer le 'Join' en boucle, voir mon edit. –

+0

@Tim Occhipinti: si vous avez * différents types * de questions, s'il vous plaît, * spécifiez-les *, avec une aide, par exemple * sur mesure * QuestionKind'. –

0

Si vous aimez vraiment lambdas laid, cela peut le faire dans une déclaration LINQ:

var q1 = new string[] { "true", "false" }; 
var q2 = new string[] { "Berlin", "Moscow", "London" }; 
var q3 = new string[] { "1", "2", "3", "5" }; 

var combos = q1.Join(q2, _q1 => true, _q2 => true, (q11, q22) => new { q11, q22 }).Join(q3, _q3 => true, _q2 => true, (q11, q33) => new {q11.q11, q11.q22,q33}); 
combos.Dump(); 

Il ne 2 LINQ (croix) se joint à combiner les listes à une liste définitive de toutes les combinaisons possibles.

sortie:

Question1 Question2 Question3  
true Berlin 1 
true Berlin 2 
true Berlin 3 
true Berlin 5 
true Moscow 1 
true Moscow 2 
true Moscow 3 
true Moscow 5 
true London 1 
true London 2 
true London 3 
true London 5 
false Berlin 1 
false Berlin 2 
false Berlin 3 
false Berlin 5 
false Moscow 1 
false Moscow 2 
false Moscow 3 
false Moscow 5 
false London 1 
false London 2 
false London 3 
false London 5