28 votes

Un puzzle OOPS intéressant

Récemment, j'ai été confronté à la question suivante lors d'un entretien. Au départ, je pensais que la question était fausse, mais l'interviewer a mentionné qu'il y avait une solution pour cela. Étant donné cette classe :

public class BaseHome
{
    public static void Main()
    {
        Console.WriteLine("A");
    }
}

Écrivez ce qui suit dans la console :

B
A
C

Règles :

  1. Ne modifiez pas la fonction principale.
  2. Ne créez pas de classes supplémentaires.

Comment cela peut-il être fait ?

46voto

ken2k Points 24640

En supposant que vous vouliez dire B A C sur trois lignes (plus aucune faute de frappe sur main nom de la méthode) :

namespace ConsoleApplication1
{
    public class BaseHome
    {
        static BaseHome()
        {
            Console.WriteLine("B");

            AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnProcessExit);
        }

        public static void Main()
        {
            Console.WriteLine("A");
        }

        private static void OnProcessExit(object sender, EventArgs e)
        {
            Console.WriteLine("C");
            Console.Read();
        }
    }
}

23voto

Dennis_E Points 3168

Hahaha, j'ai trouvé la solution. Créer une propriété statique !

public class BaseHome
{
    public static void Main()
    {
       Console.WriteLine("A");
    }

    public static BaseHome Console
    {
        get{ return new BaseHome(); }
    }

    public void WriteLine(string s) {
        System.Console.WriteLine("BCA"); //Or multiple lines if you like
    }

}

Edit : Ou, duh, juste un champ

public class BaseHome
{
    static BaseHome Console = new BaseHome();

    public static void Main()
    {
       Console.WriteLine("A");
    }

    public void WriteLine(string s) {
        System.Console.WriteLine("BCA"); //Or multiple lines if you like
    }

}

16voto

user2864740 Points 18869

Pas de nouveaux types. Aucun objet explicitement créé. Fonctionne dans une application Console réelle.

public class BaseHome
{
    static System.IO.TextWriter Console
    {
        get
        {
            System.Console.Write("  C\rB");
            return System.Console.Out;
        }
    }
    public static void Main()
    {
        Console.WriteLine("A");
        // System.Console.ReadLine();
    }
}

Le résultat est BAC - sur la même ligne, pas moins !

(Ceci peut être adapté à une sortie sur plusieurs lignes, selon le post edit, avec l'utilisation de CurstorGauche/Haut ou des séquences d'échappement directes).


Explication :

La propriété statique ( Console ) est résolu à la place du type dans Console.WriteLine("A") comme la propriété ombres le type ici ; c'est pourquoi System.Console est utilisé pour faire référence à la classe Console elle-même.

La propriété get de la console provoque un effet secondaire d'écriture dans la console - elle écrit "__C" puis utilise CR (Carriage Return) pour "revenir au début de la ligne" et écrit "B" de sorte que la ligne est "B_C", laissant le curseur après le "B".

La propriété renvoie alors le TextWriter associé à la console qui a WriteLine. Le site WriteLine de TextWriter et non la fonction statique WriteLine de Console, est alors invoquée et le caractère "A" est écrit (après "B"), de sorte que le résultat est "BAC".

Ceci utilise un comportement spécifique au contexte car c'est la console qui comprend comment déplacer le curseur (par exemple, avec " \r " ou autre positionnement du curseur).

12voto

mike z Points 14365

Un seul constructeur statique est nécessaire :

public class BaseHome
{
    static BaseHome()
    {
        Console.WriteLine("B\nA\nC");
        Console.SetOut(System.IO.TextWriter.Null);
    }

    public static void Main()
    {
        Console.WriteLine("A");
    }
}

Au lieu de rediriger le flux de sortie, d'autres options consistent à appeler Environment.Exit le lancement d'une exception non gérée, ou simplement le fait de tourner en boucle. Il n'est pas clair si le programme doit se terminer normalement (ou pas du tout).

5voto

AndreySarafanov Points 368
struct ConsoleStruct
{
    private string _text;
    public ConsoleStruct(string text)
    {
        _text = text;
    }

    public void WriteLine(string txt)
    {
        Console.WriteLine(_text);
    }
}
class Program
{
    private static ConsoleStruct Console = new ConsoleStruct("B A C");
    static void Main(string[] args)
    {
        Console.WriteLine("A");
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X