lundi 18 mai 2015

Suite de nombres

Bonjour,

Je viens vers vous avec un petit challenge (qui est en fait également une question).
Je m'explique :

J'ai pris part à un concours de programmation dont l'énoncé était le suivant :
Soit X un nombre fixé par l'utilisateur, vous devez trouver le chemin le plus court démarrant 2 et allant vers ce nombre donné. Les opérations permises sont les suivantes : +2, -2, /2, *2.

J'ai fait ma propre méthode de résolution, mais je me demandais si, d'après vous, cette méthode est celle donnant le chemin (le nombre d'opérations à effectuer) le plus court.

La voici (pour ceux qui veulent tenter de résoudre le challenge évitez de lire ma résolution :rolleyes:) en C# :

Code:

static void Main(string[] args)
        {
            int x = 37;

            List<string> liste = new List<string>();

            if (x % 2 == 1)
            {
                x *= 2;
                liste.Add("*");
            }

            int y = 0;
            while (Math.Pow(2, y) < x) y++;

            int dist1 = (int)Math.Pow(2, y) - x;
            int dist2 = x - (int)Math.Pow(2, (y - 1));

            if (dist1 < dist2)
            {
                while (x < Math.Pow(2, y))
                {
                    x = x + 2;
                    liste.Add("+");
                }
            }
            else
            {
                while (x > Math.Pow(2, (y-1)))
                {
                    x = x - 2;
                    liste.Add("-");
                }
            }

            while (x != 2)
            {
                x /= 2;
                liste.Add("/");
            }

            for (int i = (liste.Count - 1); i >= 0; i--)
            {
                switch (liste[i])
                {
                    case "-":
                        Console.WriteLine("+");
                        break;
                    case "+":
                        Console.WriteLine("-");
                        break;
                    case "*":
                        Console.WriteLine("/");
                        break;
                    case "/":
                        Console.WriteLine("*");
                        break;
                }
            }
            Console.ReadLine();
        }

Veuillez m'excuser si le code n'est pas optimal, je l'ai écrit rapidement.
Dans cet exemple, le chiffre à atteindre (désigné par la variable x) n'est par exemple pas demandé à l'utilisateur mais bien fixé dans le code.

Pensez vous que cette méthode de résolution donne le résultat le plus court ?
Quelle est votre méthode pour ce problème ?

Merci beaucoup pour vos réactions.


from Hackademics : Forum de hacking – hackers white hat – cours de securite informatique, apprendre langage python, tutoriels de reverse engineering http://ift.tt/1S1MxCP
via IFTTT

Aucun commentaire:

Enregistrer un commentaire