2
votes

Combinaison de nombres

Je travaille sur une demande d'examen en ligne, lors de l'examen, la question de connexion s'affiche avec les options 4 ou 6 . Prenons les options 4 abcd , si l'utilisateur sélectionne a alors la valeur est 1 si b code> leur valeur 2 si c puis valeur 4 si d puis valeur 8 si e valeur 16 si f alors valeur 32 :

 a ->  1
 b ->  2
 c ->  4
 d ->  8
 e -> 16
 f -> 32

Utilisateur peut choisir plusieurs options , supposons que l'utilisateur choisisse a et b puis la réponse est 1 + 2 == 3 trois est la bonne réponse ou l'utilisateur choisit annonce puis 1 + 8 == 9 est la bonne réponse.

quelle est la logique strong > pour décomposer 9 en 1, 8 OU 11 en 1, 2, 8 ou 35 en 1, 2, 32 ?


3 commentaires

Cette panne est-elle statique?


Nombres binaires? 9 == 0b1001 == 0b1000 + 0b0001 == 8 + 1


Rupture statique


5 Réponses :


2
votes

Convertissez simplement votre numéro, par exemple 11 en binaire. Pour 11, cela vous donne 1011. Maintenant, chaque chiffre du nombre binaire représente une option de sélection (mais en sens inverse). Comme dans ce cas, la personne a sélectionné la première, la deuxième et la dernière option.

Cela vous aide-t-il?


0 commentaires

3
votes

L'opération au niveau du bit semble également être la solution.
Puisque vous avez tagué Angular, je vais utiliser une solution Javascript:

breakdown(9)
> [1, 8]
breakdown(11)
> [1, 2, 8]
breakdown(35)
> [1, 2, 32]

Cas de test:

function breakdown(input) {
    var values = [1, 2, 4, 8, 16, 32];
    var checked = [];
    for (v of values) {
        if (!!(input & v)) checked.push(v);
    }
    return checked;
}


0 commentaires

1
votes

Il semble que la décomposition soit basée sur nombres binaires :

 9 into a, d
11 into a, b, d
35 into a, b, f

Code:

string result = string.Join(Environment.NewLine, tests
  .Select(test => $"{test,2} into {string.Join(", ", BreakDownChars(test))}"));

Console.WriteLine(result);


0 commentaires

2
votes

Cela fonctionne pour moi.

16,4,2

Sortie

        static void Main()
    {
        List<int> options = new List<int>() { 1, 2, 4, 8, 16, 32 };
        List<int> selectedOptions = new List<int>();
        int aggrigatedAnswer = 22;
        BreakDown(aggrigatedAnswer, options, selectedOptions);

        Console.Write(string.Join(",", selectedOptions));
    }

    public static int BreakDown(int value, List<int> options, List<int> selectedOptions)
    {
        if (value <= 0)
            return 0;
        else
        {
            int option = options.Where(a => a <= value).Max();
            value -= option;

            selectedOptions.Add(option);
            BreakDown(value, options, selectedOptions);

            return value;
        }
    }


0 commentaires

0
votes

Solution 1

Code:

1, 2, 8

Sortie:

enum Dummy { }

static readonly Dummy[] dummies = new[] { 1, 2, 4, 8, 16, 32 }.Select(d => (Dummy)d).ToArray();

public static void Main()
{
    var i = 11;
    var answers = GetCombination(i);
    Console.WriteLine(string.Join(", ", answers));
}

static int[] GetCombination(int i)
{
    var dummy = (Dummy)i;
    return dummies.Where(d => dummy.HasFlag(d)).Cast<int>().ToArray();
}

Solution 2

Code:

Letters: a, b, d
Numbers: 1, 2, 8

Sortie

static readonly Dictionary<char,int> dict = new Dictionary<char,int>
{
    ['a'] = 1,
    ['b'] = 2,
    ['c'] = 4,
    ['d'] = 8,
    ['e'] = 16,
    ['f'] = 32
};

public static void Main()
{
    var i = 11;
    var answers = GetCombination(i);
    Console.WriteLine($"Letters: {string.Join(", ", answers.Keys)}");
    Console.WriteLine($"Numbers: {string.Join(", ", answers.Values)}");
}

static Dictionary<char,int> GetCombination(int i) =>
    dict.Where(p => (p.Value & i) == p.Value).ToDictionary(p => p.Key, p => p.Value);


0 commentaires