C # मुख्य समस्या है


10

यह प्रोग्रामिंग पहेली एक अन्य प्रश्न से प्रेरित है जिसे कल यहां पूछा गया था लेकिन जिसे लेखक ने हटा दिया था ...

चुनौती:

विजुअल C # (या आपके पसंदीदा C # IDE) का उपयोग करके एक निष्पादन योग्य बाइनरी (विंडोज .EXE या लिनक्स बाइनरी) बनाएं जो निम्न पाठ को मानक आउटपुट में प्रिंट करता है:

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

... किसी भी स्रोत फ़ाइल में प्रदर्शित होने वाले 4 लगातार पत्रों का उपयोग किए बिना!

टिप्पणियाँ:

  • यदि आपके स्रोत कोड में पाठ शामिल है remainder(उदाहरण के लिए) इसमें 4 लगातार अक्षर MAIN शामिल हैं, हालांकि यदि इसमें mxain4 अक्षर शामिल हैं तो लगातार कोई भी ऐसा नहीं होगा, जिसकी mxainअनुमति होगी।
  • आपको किसी भी कार्यक्रम को चलाने की अनुमति नहीं है लेकिन C # IDE और न ही अन्य कार्यक्रमों को चलाने के लिए C # IDE की सेटिंग्स को बदलें (लेकिन सामान्य रूप से यह C # संकलक के रूप में चलेगा)।

    अन्यथा आप बस कह सकते हैं: "मैं C # IDE का उपयोग करके पास्कल प्रोग्राम लिखता हूं और अपने C # प्रोजेक्ट के 'पूर्व-निर्माण' चरणों में पास्कल संकलक को आमंत्रित करता हूं।"

    यह बहुत आसान होगा।

  • एक आईडीई के उपयोगकर्ता जो "प्लग-इन" (या समान) का उपयोग करके विस्तारित हो सकते हैं या जिनके पास अंतर्निहित बाइनरी फ़ाइल संपादक (हेक्स-संपादक) हैं, अन्य सी # आईडीई के उपयोगकर्ताओं पर बहुत बड़ा लाभ होगा।

    इसलिए इन करतबों का भी इस्तेमाल नहीं किया जाना चाहिए।

  • अन्य गैर-एएससीआईआई-संपादकों (जैसे संवाद खिड़की संपादक) का उपयोग करने की स्पष्ट रूप से अनुमति है!
  • उपयोगकर्ता इस तरह से फ़ंक्शन नामों में बैकस्लैश का उपयोग करके प्रस्तावित मूल प्रश्न पूछ रहा है: static void M\u0061in() क्योंकि यह उत्तर पहले ही अन्य उपयोगकर्ताओं द्वारा पढ़ा जा चुका है, इसे कोई और स्वीकार नहीं किया जाएगा!
  • एक उपयोगकर्ता ने पूछा कि क्या इसे स्रोत कोड संपादक में .EXE फ़ाइल टाइप करने और फ़ाइल को ".cs" के बजाय ".exe" के रूप में सहेजने की अनुमति दी जाएगी। उत्तर: मुझे संदेह नहीं है कि यह संभव है क्योंकि मान्य विंडोज और लिनक्स बायनेरिज़ दोनों में एनयूएल बाइट्स हैं। हालाँकि यदि आप एक वैध बाइनरी पाते हैं जो इस तरह बनाई जा सकती है कि आपके पास एक वैध समाधान हो।

इस साइट का नाम है "प्रोग्रामिंग पहेलियाँ और कोड गोल्फ" है - यह एक "प्रोग्रामिंग पहेली" है, न कि "कोड गोल्फ": चुनौती अन्य सभी उपयोगकर्ताओं से पहले एक कार्यशील समाधान खोजने की है, अन्य सभी की तुलना में कम समाधान खोजने की नहीं। समाधान।

इसलिए एक काम समाधान का वर्णन करने वाला पहला पोस्ट जीतता है !

सौभाग्य!

वैसे: मेरे पास विज़ुअल सी # एक्सप्रेस 2010 के तहत काम करने का एक समाधान है।


2
एक पाठ (या बाइनरी) संपादक के रूप में मेरे सी # आईडीई का उपयोग करने से मुझे सीधे एक निष्पादन योग्य टाइप करने से क्या रोकता है?
फ़ेरसम

2
कौन सा जवाब चुनौती जीतता है? पहला वैध उत्तर? आपको जीतने की स्थिति निर्दिष्ट करनी चाहिए
जेम्स

यदि IDE में कुछ हेक्साडेसिमल संपादक या समान है तो इसकी अनुमति नहीं होगी। यदि आप मान्य बाइनरी फ़ाइल में टाइप करने के लिए ASCII टेक्स्ट एडिटर का उपयोग करने का प्रबंधन करते हैं तो इसकी अनुमति होगी। ध्यान दें कि एक मान्य बाइनरी फ़ाइल में 0x00 से 0x1F की सीमा होती है!
मार्टिन रोसेनौ

2
मुझे लगता है कि यह एक दिलचस्प चुनौती है। "मुख्य के बिना एक C # प्रोग्राम लिखें"। हालाँकि, अधिकांश नियम इस बात के हैं कि कुछ दृष्टिकोणों का उपयोग करने और उन पर प्रतिबंध लगाने के लिए कौन से उपकरण / आईडीई हैं। मैं अधिक प्रोग्रामिंग पज़ल्स देखना पसंद करूंगा, (कोड-गोल्फ के विपरीत) लेकिन यह एक अंडरस्क्राइब है। मैं अगली बार सैंडबॉक्स का उपयोग करने की सलाह दूंगा
जेम्स

4
... अगली बार सैंडबॉक्स पर विचार करें ।
बिल्ली

जवाबों:


5

सी # इंटरएक्टिव विंडो

सी # इंटरएक्टिव विंडो खोलें (देखें> अन्य विंडोज> सी # इंटरएक्टिव इन विजुअल स्टूडियो 2015)। मुझे लगता है कि सभी आईडीई के पास यह नहीं होगा।

यह दृष्टिकोण इंटरएक्टिव विंडो में C # को निष्पादित करने के लिए निष्पादित करता है ताकि लेखक कभी लिखे बिना वांछित स्ट्रिंग प्रिंट कर सके main। एक बोनस के रूप में, एक्स का आईएल भी शामिल नहीं है main

इंटरएक्टिव विंडो में निम्न कोड चलाएँ

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.CurrentDirectoryयह देखने के लिए उपयोग करें कि exe कहाँ बनाया गया था। वांछित आउटपुट का निरीक्षण करने के लिए इसे चलाएं।

यहाँ छवि विवरण दर्ज करें

परिणामी IL: यहाँ छवि विवरण दर्ज करें


मुझे वास्तव में यह एक बेहतर लगता है, फिर WPF एक, क्योंकि आपके पास वास्तव में आपके विधानसभा में कोई मेन () नहीं है।
hstde

आपका समाधान दिलचस्प है। यह दूसरा है ताकि आप जीतेंगे अगर उपयोगकर्ताओं को मुझे यह विश्वास दिलाना चाहिए कि पहला पोस्ट एक वैध समाधान नहीं है (कभी भी किस कारण से)।
मार्टिन रोसेनौ

यदि आप मुझसे पूछते हैं कि वास्तव में यह मायने नहीं रखता कि कौन सी पोस्ट जीतती है, क्योंकि वे दोनों एक ही उपयोगकर्ता द्वारा हैं।
hstde 13

@ हस्ते - क्षमा करें, मैंने यह नहीं देखा। धन्यवाद।
मार्टिन रोसेनौ

@milk आपने दो वैध समाधान पोस्ट किए हैं (ठीक है, कुछ उपयोगकर्ताओं को पहले एक के बारे में संदेह है) ताकि आप जीतें। बधाई हो।
मार्टिन रोसेनौ

3

WPF अनुप्रयोग

  1. एक नया WPF एप्लिकेशन बनाएं। यहाँ छवि विवरण दर्ज करें

  2. के सभी बदल दें MainसाथMeow यहाँ छवि विवरण दर्ज करें

  3. नाम बदलें MainWindow.xamlकरने के लिए MeowWindow.xaml। यह स्वचालित रूप से नाम बदल देगा MainWindow.xaml.csकरने के लिए MeowWindow.xaml.cs

यहाँ छवि विवरण दर्ज करें

  1. प्रोजेक्ट गुणों में, आउटपुट प्रकार को परिवर्तित करें Console Applicationताकि कंसोल बनाया जाए। यहाँ छवि विवरण दर्ज करें

  2. अपने MeowWindowनिर्माता में वांछित आउटपुट स्ट्रिंग के लिए कंसोल लिखेंयहाँ छवि विवरण दर्ज करें

  3. mainस्रोत निर्देशिका में कहीं भी नहीं होने की पुष्टि करने के लिए Ctrl + Shift + F है । यहाँ छवि विवरण दर्ज करें

  4. F5 / संकलन और चलाएं। यहाँ छवि विवरण दर्ज करें

यह काम किस प्रकार करता है

WPF अनुप्रयोगों के लिए, Visual Studio उत्पन्न obj\Debug\App.g.csकरता है जिसमें Mainविधि शामिल है । उत्पन्न Mainआपके WPF ऐप का एक उदाहरण बनाता है और इसे शुरू करता है।


दिलचस्प समाधान। जो कोई भी सोचता है कि यह एक वैध समाधान नहीं है? अगर किसी को लगता है कि यह पोस्ट मान्य नहीं है, तो कृपया एक टिप्पणी पोस्ट करें। अन्यथा मैं इस समाधान को जीतने वाला घोषित करूंगा क्योंकि यह स्पष्ट रूप से पहला पोस्ट था।
मार्टिन रोसेनौ

@MartinRosenau मुझे लगता है कि चूंकि आप wpf एप्लिकेशन को डिकंपाइल कर सकते हैं और एक मुख्य तरीका होगा कि यह अमान्य है, इसलिए अधिक दृढ़ता से क्योंकि उसी उपयोगकर्ता ने एक और उत्तर पोस्ट किया है जिसमें यह अस्पष्टता नहीं है

मैंने अभी देखा कि दोनों उत्तर एक ही उपयोगकर्ता द्वारा पोस्ट किए गए थे। इस मामले में यह उपयोगकर्ता वैसे भी जीत जाएगा।
मार्टिन रोसेनौ

0

बस एक संदर्भ के रूप में

मेरा विचार "दूध" के दूसरे विचार के समान था:

आईडीई कोड को निष्पादित करने और डिस्क पर निष्पादन योग्य लिखने के लिए एक तरीका खोजें।

मैंने स्पष्ट रूप से विंडोज और लिनक्स बायनेरिज़ का उल्लेख किया है क्योंकि मैंने बाइनरी .EXE फ़ाइल का उपयोग करने के बारे में सोचा था System.IO.File.WriteAllBytes() ताकि यह एक .NET EXE फ़ाइल नहीं होगी।

मेरी समस्या यह थी कि वीएस एक्सप्रेस 2010 में एक इंटरैक्टिव कंसोल नहीं है, इसलिए मुझे उसके लिए एक प्रतिस्थापन ढूंढना पड़ा - मुझे निम्नलिखित मिला:

एक संवाद खिड़की और एक कस्टम नियंत्रण के साथ एक DLL प्रोजेक्ट बनाएं; प्रोजेक्ट संकलित करें और कस्टम नियंत्रण को संवाद विंडो में जोड़ें। संवाद विंडो संपादक तब कस्टम नियंत्रण के कोड को कॉल करेगा - और इस कोड में आप .EXE फ़ाइल को डिस्क पर लिख सकते हैं:

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.