Ce puzzle de programmation est inspiré d'une autre question qui a été posée ici hier mais qui a été supprimée par l'auteur ...
Le défi:
Créez un binaire exécutable (binaire Windows .EXE ou Linux) en utilisant Visual C # (ou votre IDE C # préféré) qui imprime le texte suivant sur la sortie standard:
Main() is the main method of C# programs!
... sans utiliser les 4 lettres consécutives MAIN apparaissant dans n'importe quel fichier source!
Remarques:
- Si votre code source contient le texte
remainder
(par exemple) il contient les 4 lettres consécutives MAIN, mais s'il contientmxain
les 4 lettres ne seraient plus consécutives doncmxain
serait donc autorisé. Vous n'êtes pas autorisé à exécuter des programmes sauf l'IDE C # ni à modifier les paramètres de l'IDE C # pour exécuter d'autres programmes (mais ceux qu'il exécuterait normalement, comme le compilateur C #).
Sinon, vous pourriez simplement dire: «J'écris un programme Pascal en utilisant l'IDE C # et j'invoque le compilateur Pascal dans les étapes de« pré-construction »de mon projet C #».
Ce serait trop simple.
Les utilisateurs d'un IDE qui peut s'étendre à l'aide de "plug-ins" (ou similaires) ou qui ont des éditeurs de fichiers binaires intégrés (hex-éditeurs) auraient un avantage trop important sur les utilisateurs d'autres IDE C #.
Par conséquent, ces valeurs ne doivent pas non plus être utilisées.
- L'utilisation des autres éditeurs non ASCII (tels que l'éditeur de fenêtre de dialogue) est explicitement autorisée!
- L'utilisateur posant la question d'origine a proposé d'utiliser la barre oblique inverse dans les noms de fonction comme ceci:
static void M\u0061in()
Parce que cette réponse a déjà été lue par d'autres utilisateurs, elle ne sera plus acceptée! - Un utilisateur a demandé s'il serait autorisé à taper simplement un fichier .EXE dans l'éditeur de code source et à enregistrer le fichier en tant que ".exe" au lieu de ".cs". Réponse: Je doute que cela soit possible car les binaires Windows et Linux valides contiennent des octets NUL. Cependant, si vous trouvez un binaire valide qui peut être créé de cette façon, vous avez une solution valide.
Le nom de ce site est "Programming Puzzles & Code Golf" - c'est un "Programming Puzzle", pas "Code Golf": Le défi est de trouver une solution de travail avant tous les autres utilisateurs, pas de trouver une solution plus courte que toutes les autres solutions.
Par conséquent, le premier article décrivant une solution de travail gagne !
Bonne chance!
Au fait: j'ai une solution fonctionnant sous Visual C # Express 2010.
la source
Réponses:
Fenêtre interactive C #
Ouvrez la fenêtre interactive C # (Affichage> Autres fenêtres> C # interactif dans Visual Studio 2015). Je suppose que tous les IDE n'auront pas cela.
Cette approche exécute C # dans la fenêtre interactive afin de créer un exe C # qui imprime la chaîne souhaitée sans que l'auteur ait jamais écrit
main
. En bonus, l'IL de l'exe ne contient pas non plusmain
.Exécutez le code suivant dans la fenêtre interactive
Utilisez
Environmnent.CurrentDirectory
pour voir où l'exe a été créé. Exécutez-le pour observer la sortie souhaitée.IL résultant:
la source
Application WPF
Créez une nouvelle application WPF.
Remplacer toutes les instances de
Main
parMeow
Renommer
MainWindow.xaml
pourMeowWindow.xaml
. Ce sera automatiquement renomméMainWindow.xaml.cs
enMeowWindow.xaml.cs
.Dans les propriétés du projet, changez le type de sortie pour
Console Application
que la console soit créée.Ajouter une écriture de console pour la chaîne de sortie souhaitée dans votre
MeowWindow
constructeurCtrl + Maj + F pour confirmer qu'il n'y a
main
nulle part dans le répertoire source.F5 / compiler et exécuter.
Comment ça fonctionne
Pour les applications WPF, Visual Studio génère
obj\Debug\App.g.cs
qui contient laMain
méthode. Le généréMain
crée une instance de votre application WPF et la démarre.la source
Juste comme référence
Mon idée était similaire à la deuxième idée de "lait":
Trouvez un moyen de laisser l'EDI exécuter du code et d'écrire un exécutable sur le disque.
J'ai mentionné explicitement les binaires Windows et Linux parce que j'ai pensé à écrire le fichier binaire .EXE en utilisant
System.IO.File.WriteAllBytes()
donc ce ne serait pas nécessairement un fichier EXE .NET.Mon problème était que VS Express 2010 ne semble pas avoir de console interactive, j'ai donc dû trouver un remplaçant pour cela - j'ai trouvé ce qui suit:
Créez un projet DLL avec une fenêtre de dialogue et un contrôle personnalisé; compilez le projet et ajoutez le contrôle personnalisé à la fenêtre de dialogue. L'éditeur de fenêtre de dialogue appellera alors le code du contrôle personnalisé - et dans ce code, vous pouvez écrire le fichier .EXE sur le disque ...
la source