C # adalah masalah utama

10

Teka-teki pemrograman ini terinspirasi oleh pertanyaan lain yang telah ditanyakan di sini kemarin tetapi yang telah dihapus oleh penulis ...

Tantangan:

Buat biner yang dapat dieksekusi (Windows .EXE atau Linux binary) menggunakan Visual C # (atau IDE C # favorit Anda) yang mencetak teks berikut ke output standar:

Main() is the main method of C# programs!

... tanpa menggunakan 4 huruf berturut-turut MAIN muncul di file sumber apa pun!

Catatan:

  • Jika kode sumber Anda berisi teks remainder(misalnya) berisi 4 huruf berturut-turut MAIN, namun jika mengandung mxain4 huruf tidak akan berturut-turut lagi maka mxainakan diizinkan.
  • Anda tidak diperbolehkan menjalankan program apa pun kecuali C # IDE atau mengubah pengaturan C # IDE untuk menjalankan program lain (tetapi yang biasanya dijalankan seperti kompiler C #).

    Kalau tidak, Anda bisa mengatakan: "Saya menulis program Pascal menggunakan C # IDE dan memanggil kompilator Pascal dalam langkah-langkah 'pra-bangun' proyek C # saya".

    Ini terlalu sederhana.

  • Pengguna IDE yang dapat memperluas menggunakan "plug-in" (atau serupa) atau yang memiliki editor file biner (hex-editor) akan memiliki keuntungan terlalu besar dibandingkan pengguna C # IDE lainnya.

    Oleh karena itu fitur ini juga tidak boleh digunakan.

  • Menggunakan Editor non-ASCII lainnya (seperti editor jendela dialog) diizinkan secara eksplisit!
  • Pengguna yang mengajukan pertanyaan asli yang diajukan menggunakan backslash dalam nama fungsi seperti ini: static void M\u0061in()Karena jawaban ini telah dibaca oleh pengguna lain, maka tidak akan diterima lagi!
  • Seorang pengguna bertanya apakah itu akan diizinkan untuk cukup ketik file .EXE ke dalam editor kode sumber dan untuk menyimpan file sebagai ".exe" bukan ".cs". Jawaban: Saya ragu ini mungkin karena binari Windows dan Linux yang valid mengandung byte NUL. Namun jika Anda menemukan biner yang valid yang dapat dibuat dengan cara ini, Anda memiliki solusi yang valid.

Nama situs ini adalah "Programming Puzzles & Code Golf" - ini adalah "Programming Puzzle", bukan "Code Golf": Tantangannya adalah untuk menemukan solusi yang berfungsi sebelum semua pengguna lain, bukan untuk menemukan solusi yang lebih pendek daripada yang lainnya solusi.

Karenanya posting pertama yang menggambarkan solusi yang berfungsi akan menang !

Semoga berhasil!

Omong-omong: Saya punya solusi yang bekerja di bawah Visual C # Express 2010.

Martin Rosenau
sumber
2
Apa yang menghentikan saya dari menggunakan C # IDE saya sebagai editor teks (atau biner) untuk langsung mengetik executable?
feersum
2
Jawaban mana yang memenangkan tantangan? Jawaban pertama yang valid? Anda harus menentukan kondisi kemenangan
James
Jika IDE berisi beberapa editor heksadesimal atau serupa, ini TIDAK akan diizinkan. Jika Anda berhasil menggunakan editor teks ASCII untuk mengetikkan file biner yang valid, ini akan diizinkan. Perhatikan bahwa file biner yang valid berisi byte dalam kisaran 0x00 hingga 0x1F!
Martin Rosenau
2
Saya pikir ini secara keseluruhan merupakan tantangan yang menarik. + Msgstr "Tulis program C # tanpa main". Namun, sebagian besar aturan adalah tentang alat / IDE mana yang harus digunakan dan melarang pendekatan tertentu. Saya ingin melihat lebih banyak teka-teki pemrograman, (sebagai lawan dari kode-golf) tetapi yang ini tidak ditentukan. Saya akan merekomendasikan menggunakan kotak pasir waktu berikutnya.
James
4
... Pertimbangkan kotak pasir lain kali.
kucing

Jawaban:

5

C # Jendela Interaktif

Buka C # Interactive Window (Lihat> Windows Lainnya> C # Interactive di Visual Studio 2015). Saya kira tidak semua IDE memiliki ini.

Pendekatan ini mengeksekusi C # di Window Interaktif untuk membuat exe C # yang mencetak string yang diinginkan tanpa penulis pernah menulis main. Sebagai bonus, IL exe juga tidak mengandung main.

Jalankan kode berikut di Jendela Interaktif

using System.Reflection;
using System.Reflection.Emit;
var appMeow = (dynamic)System.Type.GetType("System.AppDom" + "ain").GetProperty("CurrentDom" + "ain", BindingFlags.GetProperty | BindingFlags.Static | BindingFlags.Public).GetValue(null);
var asmName = new AssemblyName("MEOW");
var asmBuilder = appMeow.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.RunAndSave);
var module = asmBuilder.DefineDynamicModule("MEOW", "MEOW.exe");
var typeBuilder = module.DefineType("Meow", TypeAttributes.Public);
var entryPoint = typeBuilder.DefineMethod("EntryPoint", MethodAttributes.Static | MethodAttributes.Public);
var il = entryPoint.GetILGenerator();
il.Emit(OpCodes.Ldstr, "Meow() is the meow method of C# programs!");
il.Emit(OpCodes.Ldstr, "eow");
il.Emit(OpCodes.Ldstr, "ain");
il.EmitCall(OpCodes.Call, typeof(string).GetMethod("Replace", new[] { typeof(string), typeof(string) }), null);
il.EmitCall(OpCodes.Call, typeof(Console).GetMethod("Write", new[] { typeof(string) }), null);
il.Emit(OpCodes.Ret);
var type = typeBuilder.CreateType();
asmBuilder.SetEntryPoint(type.GetMethods()[0]);
asmBuilder.Save("MEOW.exe");

Gunakan Environmnent.CurrentDirectoryuntuk melihat di mana exe dibuat. Jalankan untuk mengamati output yang diinginkan.

masukkan deskripsi gambar di sini

IL yang dihasilkan: masukkan deskripsi gambar di sini

susu
sumber
Saya sebenarnya lebih suka yang ini, daripada yang WPF, karena Anda sebenarnya tidak punya Main () di Majelis Anda apa pun.
hstde
Solusi Anda menarik. Ini adalah yang kedua sehingga Anda akan menang jika pengguna meyakinkan saya bahwa postingan pertama bukanlah solusi yang valid (untuk alasan apa pun).
Martin Rosenau
Jika Anda bertanya kepada saya itu tidak masalah posting mana yang menang, karena mereka berdua oleh pengguna yang sama.
hstde
@ hstde - Maaf, saya tidak melihat ini. Terima kasih.
Martin Rosenau
@milk Anda memposting dua solusi yang valid (well, beberapa pengguna ragu tentang yang pertama) sehingga Anda menang. Selamat.
Martin Rosenau
3

Aplikasi WPF

  1. Buat aplikasi WPF baru. masukkan deskripsi gambar di sini

  2. Ganti semua instance MaindenganMeow masukkan deskripsi gambar di sini

  3. Ganti nama MainWindow.xamlmenjadi MeowWindow.xaml. Ini akan secara otomatis mengubah nama MainWindow.xaml.csmenjadi MeowWindow.xaml.cs.

masukkan deskripsi gambar di sini

  1. Di properti proyek, ubah tipe Output hingga Console Applicationkonsol dibuat. masukkan deskripsi gambar di sini

  2. Tambahkan konsol tulis untuk string keluaran yang diinginkan di MeowWindowkonstruktor Andamasukkan deskripsi gambar di sini

  3. Ctrl + Shift + F untuk mengonfirmasi tidak ada maintempat di direktori sumber. masukkan deskripsi gambar di sini

  4. F5 / kompilasi dan jalankan. masukkan deskripsi gambar di sini

Bagaimana itu bekerja

Untuk aplikasi WPF, Visual Studio menghasilkan obj\Debug\App.g.csyang berisi Mainmetode ini. Yang dihasilkan Mainmembuat instance aplikasi WPF Anda dan memulainya.

susu
sumber
Solusi menarik. Adakah yang berpikir bahwa ini bukan solusi yang valid? Jika ada yang berpikir bahwa posting ini tidak valid, silakan kirim komentar. Kalau tidak, saya akan menyatakan solusi ini yang menang karena itu jelas yang pertama diposting.
Martin Rosenau
@ MartinRosenau Saya merasa bahwa karena Anda dapat mendekompilasi aplikasi WPF dan akan ada metode utama bahwa ini tidak valid, lebih kuat karena pengguna yang sama memposting jawaban lain yang tidak memiliki ambiguitas ini
Saya hanya melihat bahwa kedua jawaban diposting oleh pengguna yang sama. Dalam hal ini pengguna ini akan tetap menang.
Martin Rosenau
0

Sama seperti referensi

Ide saya mirip dengan ide kedua "susu":

Temukan cara untuk membiarkan IDE mengeksekusi kode dan menulis executable ke disk.

Saya secara eksplisit menyebutkan binari Windows dan Linux karena saya berpikir untuk menulis file .EXE biner System.IO.File.WriteAllBytes()sehingga tidak perlu menjadi file .NET EXE.

Masalah saya adalah bahwa VS Express 2010 tampaknya tidak memiliki konsol interaktif sehingga saya harus mencari penggantinya - saya menemukan yang berikut:

Buat proyek DLL dengan jendela dialog dan kontrol khusus; mengkompilasi proyek dan menambahkan kontrol khusus ke jendela dialog. Editor jendela dialog kemudian akan memanggil kode kontrol khusus - dan dalam kode ini Anda dapat menulis file .EXE ke disk ...

Martin Rosenau
sumber