C # ana sorun


10

Bu programlama bulmacasına dün burada sorulan ancak yazar tarafından silinen başka bir sorudan ilham alındı ​​...

Meydan okuma:

Aşağıdaki metni standart çıktıya yazdıran Visual C # (veya en sevdiğiniz C # IDE) kullanarak yürütülebilir bir ikili dosya (Windows .EXE veya Linux ikili dosyası) oluşturun:

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

... MAIN herhangi bir kaynak dosyada görünen 4 ardışık harf kullanmadan!

Notlar:

  • Kaynak kodunuz remainder(örneğin) metni içeriyorsa, birbirini takip eden 4 MAIN harfi içerir, ancak mxain4 harfi içeriyorsa , art arda ardışık mxainolmayacaktır.
  • C # IDE dışında herhangi bir program çalıştırmanıza ve diğer programları çalıştırmak için C # IDE ayarlarını değiştirmenize izin verilmez (ancak normalde C # derleyicisi gibi çalışacakları).

    Aksi takdirde şunu söyleyebilirsiniz: "C # IDE kullanarak bir Pascal programı yazıyorum ve Pascal derleyicisini C # projemin 'pre-build' adımlarında çağırıyorum".

    Bu çok basit olurdu.

  • "Eklentiler" (veya benzeri) kullanılarak genişletilebilen veya yerleşik ikili dosya düzenleyicileri (onaltılık düzenleyiciler) olan bir IDE kullanıcıları, diğer C # IDE'lerin kullanıcılarına göre çok büyük bir avantaja sahip olacaktır .

    Bu nedenle bu özellikler de kullanılmamalıdır.

  • ASCII olmayan diğer Editörlerin (iletişim penceresi düzenleyicisi gibi) kullanımına açıkça izin verilir!
  • İşlev adlarında ters eğik çizgi kullanılarak önerilen orijinal soruyu soran kullanıcı şu şekilde: static void M\u0061in()Bu yanıt diğer kullanıcılar tarafından zaten okunduğundan artık kabul edilmeyecektir!
  • Bir kullanıcı, kaynak kod düzenleyicisine bir .EXE dosyası yazmasına ve ".cs" yerine ".exe" olarak kaydetmesine izin verilip verilmeyeceğini sordu. Cevap: Bunun geçerli olduğundan emin değilim çünkü hem geçerli Windows hem de Linux ikili dosyaları NUL bayt içeriyor. Ancak bu şekilde oluşturulabilecek geçerli bir ikili dosya bulursanız, geçerli bir çözümünüz olur.

Bu sitenin adı "Programlama Bulmacaları ve Kod Golf" - bu bir "Programlama Bulmaca", "Kod Golf" değil: Zorluk diğer tüm kullanıcılar daha önce değil, diğer tüm daha kısa bir çözüm bulmak için çalışan bir çözüm bulmaktır çözümleri.

Bu nedenle çalışan bir çözümü tanımlayan ilk yazı kazanır !

İyi şanslar!

Bu arada: Visual C # Express 2010 altında çalışan bir çözümüm var.


2
C # IDE'mi doğrudan bir yürütülebilir dosya yazmak için metin (veya ikili) editör olarak kullanmamı engelleyen nedir?
feersum

2
Hangi cevap mücadeleyi kazanır? İlk geçerli cevap? Kazanan koşulu belirtmelisiniz
James

IDE bir onaltılık düzenleyici veya benzeri bir düzenleyici içeriyorsa buna izin VERİLMEZ. Geçerli bir ikili dosya yazmak için ASCII metin düzenleyicisini kullanmayı başarırsanız buna izin verilir. Geçerli bir ikili dosyanın 0x00 ila 0x1F aralığındaki bayt içerdiğine dikkat edin!
Martin Rosenau

2
Bunun genel olarak ilginç bir zorluk olduğunu düşünüyorum. Msgstr "Ana olmadan bir C # programı yaz". Bununla birlikte, kuralların çoğu hangi araçların / IDE'lerin kullanılacağı ve belirli yaklaşımların yasaklanmasıyla ilgilidir. (Kod-golf aksine), daha fazla programlama bulmaca görmek isterdim ama bu bir underpecified olduğunu. Bir dahaki sefere kum havuzunu kullanmanızı tavsiye ederim .
James

4
... Bir dahaki sefere kum havuzunu düşünün .
kedi

Yanıtlar:


5

C # Etkileşimli Pencere

C # Etkileşimli Penceresini açın (Görünüm> Diğer Windows> C # Etkileşimli Visual Studio 2015'te). Sanırım tüm IDE'ler buna sahip olmayacak.

Bu yaklaşım, yazarı yazmadan istenen dizeyi yazdıran bir C # exe oluşturmak için Etkileşimli Pencerede C # yürütür main. Bir bonus olarak, exe'nin IL'si de içermez main.

Etkileşimli Pencerede aşağıdaki kodu çalıştırın

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");

Environmnent.CurrentDirectoryExe'nin nerede oluşturulduğunu görmek için kullanın . İstenilen çıkışı gözlemlemek için çalıştırın.

resim açıklamasını buraya girin

Ortaya çıkan IL: resim açıklamasını buraya girin


Aslında bunu daha iyi seviyorum, o zaman WPF olanı, çünkü Meclisinizde aslında Main () yok.
hstde

Çözümünüz ilginç. Bu ikincisidir, böylece kullanıcılar beni ilk gönderinin geçerli bir çözüm olmadığına ikna etmelidirlerse kazanırsınız (herhangi bir nedenle).
Martin Rosenau

Bana sorarsanız, her ikisi de aynı kullanıcı tarafından olduğu için hangi yazı kazanacağının önemi yoktur.
hstde

@hstde - Üzgünüm, bunu görmedim. Teşekkürler.
Martin Rosenau

@milk İki geçerli çözüm gönderdiniz (bazı kullanıcılar ilk çözümden şüphe duyuyorlar) böylece kazanıyorsunuz. Tebrikler.
Martin Rosenau

3

WPF Uygulaması

  1. Yeni bir WPF uygulaması oluşturun. resim açıklamasını buraya girin

  2. Tüm örneklerini değiştirme MainileMeow resim açıklamasını buraya girin

  3. Rename MainWindow.xamliçin MeowWindow.xaml. Bu işlem otomatik olarak yeniden adlandırır MainWindow.xaml.csiçin MeowWindow.xaml.cs.

resim açıklamasını buraya girin

  1. Proje özelliklerinde, Çıktı türünü Console Applicationkonsol oluşturulacak şekilde değiştirin. resim açıklamasını buraya girin

  2. Sizin istenen çıkış dize için konsol yazma ekle MeowWindowyapıcısı resim açıklamasını buraya girin

  3. mainKaynak dizinde herhangi bir yer olmadığını doğrulamak için Ctrl + Shift + F.resim açıklamasını buraya girin

  4. F5 / derleyin ve çalıştırın. resim açıklamasını buraya girin

Nasıl çalışır

WPF uygulamaları için, yöntemi obj\Debug\App.g.csiçeren Visual Studio oluşturur Main. Oluşturulan MainWPF uygulamanızın bir örneğini oluşturur ve başlatır.


İlginç bir çözüm. Bunun geçerli bir çözüm olmadığını düşünen var mı? Birisi bu gönderinin geçerli olmadığını düşünüyorsa, lütfen bir yorum gönderin. Aksi takdirde bu çözümü kazanan olan olarak ilan edeceğim çünkü açıkçası ilk gönderilen oldu.
Martin Rosenau

@MartinRosenau Eğer wpf app koda olabilir ve bu geçersiz bir ana yöntem olacağını hissediyorum, daha güçlü çünkü aynı kullanıcı bu belirsizliği olmayan başka bir cevap gönderdi

Her iki cevabın da aynı kullanıcı tarafından gönderildiğini gördüm. Bu durumda bu kullanıcı yine de kazanacaktır.
Martin Rosenau

0

Referans olarak

Fikrim "süt" ün ikinci fikrine benziyordu:

IDE'nin kodu yürütmesine ve diske yürütülebilir bir dosya yazmasına izin vermenin bir yolunu bulun.

Açıkça Windows ve Linux ikili dosyalarından bahsettim çünkü ikili .EXE dosyasını yazmayı düşündüm, System.IO.File.WriteAllBytes()bu yüzden neccesseously bir .NET EXE dosyası olmazdı.

Benim sorunum VS Express 2010 interaktif bir konsolu var gibi görünüyordu, bu yüzden bunun için bir yedek bulmak zorundaydım - aşağıdakileri buldum:

Bir iletişim penceresi ve özel denetim içeren bir DLL projesi oluşturun; projeyi derleyin ve özel denetimi iletişim penceresine ekleyin. İletişim penceresi düzenleyicisi daha sonra özel denetimin kodunu çağıracaktır ve bu kodda .EXE dosyasını diske yazabilirsiniz ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.