Dieses Programmierpuzzle ist inspiriert von einer anderen Frage, die gestern hier gestellt wurde, aber vom Autor gelöscht wurde ...
Die Herausforderung:
Erstellen Sie eine ausführbare Binärdatei (Windows .EXE- oder Linux-Binärdatei) mit Visual C # (oder Ihrer bevorzugten C # -IDE), die den folgenden Text in die Standardausgabe druckt:
Main() is the main method of C# programs!
... ohne die 4 aufeinander folgenden Buchstaben MAIN zu verwenden, die in einer Quelldatei erscheinen!
Anmerkungen:
- Wenn Ihr Quellcode den Text enthält
remainder
(zum Beispiel), enthält er die 4 aufeinanderfolgenden Buchstaben MAIN. Wenn er jedochmxain
die 4 Buchstaben enthält, ist dies nicht mehr aufeinanderfolgendmxain
zulässig. Sie dürfen keine Programme außer der C # -IDE ausführen oder die Einstellungen der C # -IDE ändern, um andere Programme auszuführen (aber diejenigen, die normalerweise ausgeführt werden, wie z. B. den C # -Compiler).
Ansonsten könnte man einfach sagen: "Ich schreibe ein Pascal-Programm mit der C # -IDE und rufe den Pascal-Compiler in den 'Pre-Build'-Schritten meines C # -Projekts auf."
Das wäre zu einfach.
Benutzer einer IDE, die mithilfe von "Plug-Ins" (oder ähnlichem) erweitert werden können oder über integrierte Binärdatei-Editoren (Hex-Editoren) verfügen, hätten einen zu großen Vorteil gegenüber Benutzern anderer C # -IDEs.
Daher sollten diese Merkmale auch nicht verwendet werden.
- Die Verwendung der anderen Nicht-ASCII-Editoren (wie des Dialogfenster-Editors) ist ausdrücklich gestattet!
- Der Benutzer, der die ursprüngliche Frage gestellt hat, schlug den Backslash in Funktionsnamen wie
static void M\u0061in()
folgt vor : Da diese Antwort bereits von anderen Benutzern gelesen wurde, wird sie nicht mehr akzeptiert! - Ein Benutzer fragte, ob es erlaubt sei, einfach eine EXE-Datei in den Quellcode-Editor einzugeben und die Datei als ".exe" anstelle von ".cs" zu speichern. Antwort: Ich bezweifle nicht, dass dies möglich ist, da sowohl gültige Windows- als auch Linux-Binärdateien NUL-Bytes enthalten. Wenn Sie jedoch eine gültige Binärdatei finden, die auf diese Weise erstellt werden kann, haben Sie eine gültige Lösung.
Der Name dieser Website lautet "Programming Puzzles & Code Golf" - dies ist ein "Programming Puzzle", nicht "Code Golf": Die Herausforderung besteht darin, vor allen anderen Benutzern eine funktionierende Lösung zu finden und keine kürzere Lösung als alle anderen zu finden Lösungen.
Daher gewinnt der erste Beitrag, der eine funktionierende Lösung beschreibt !
Viel Glück!
Übrigens: Ich habe eine Lösung, die unter Visual C # Express 2010 funktioniert.
quelle
Antworten:
C # Interaktives Fenster
Öffnen Sie das interaktive C # -Fenster (Ansicht> Andere Fenster> C # Interaktiv in Visual Studio 2015). Ich nehme an, dass nicht alle IDEs dies haben werden.
Dieser Ansatz führt C # im interaktiven Fenster aus, um eine C # -Exe zu erstellen, die die gewünschte Zeichenfolge druckt, ohne dass der Autor jemals schreibt
main
. Als Bonus enthält die IL der Exe auch nichtmain
.Führen Sie den folgenden Code im interaktiven Fenster aus
Verwenden Sie
Environmnent.CurrentDirectory
diese Option, um zu sehen, wo die Exe erstellt wurde. Führen Sie es aus, um die gewünschte Ausgabe zu beobachten.Resultierende IL:
quelle
WPF-Anwendung
Erstellen Sie eine neue WPF-Anwendung.
Ersetzen Sie alle Instanzen von
Main
durchMeow
Umbenennen
MainWindow.xaml
inMeowWindow.xaml
. Dies wird automatisch umbenanntMainWindow.xaml.cs
zuMeowWindow.xaml.cs
.Ändern Sie in den Projekteigenschaften den Ausgabetyp in,
Console Application
damit die Konsole erstellt wird.Fügen Sie in Ihrem
MeowWindow
Konstruktor Konsolenschreiben für die gewünschte Ausgabezeichenfolge hinzuStrg + Umschalt + F, um zu bestätigen, dass sich
main
im Quellverzeichnis keine Stelle befindet.F5 / kompilieren und ausführen.
Wie es funktioniert
Für WPF-Anwendungen generiert Visual Studio,
obj\Debug\App.g.cs
das dieMain
Methode enthält . Das generierteMain
erstellt eine Instanz Ihrer WPF-App und startet sie.quelle
Nur als Referenz
Meine Idee ähnelte der zweiten Idee von "Milch":
Finden Sie eine Möglichkeit, die IDE Code ausführen zu lassen und eine ausführbare Datei auf die Festplatte zu schreiben.
Ich habe Windows- und Linux-Binärdateien ausdrücklich erwähnt, weil ich darüber nachgedacht habe, die binäre
System.IO.File.WriteAllBytes()
EXE-Datei mit zu schreiben, damit es sich nicht unbedingt um eine .NET EXE-Datei handelt.Mein Problem war, dass VS Express 2010 keine interaktive Konsole zu haben scheint, daher musste ich einen Ersatz dafür finden - ich fand Folgendes:
Erstellen Sie ein DLL-Projekt mit einem Dialogfenster und einem benutzerdefinierten Steuerelement. Kompilieren Sie das Projekt und fügen Sie das benutzerdefinierte Steuerelement zum Dialogfenster hinzu. Der Dialogfenster-Editor ruft dann den Code des benutzerdefinierten Steuerelements auf - und in diesem Code können Sie die EXE-Datei auf die Festplatte schreiben ...
quelle