首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#是主要问题

C#是主要问题
EN

Code Golf用户
提问于 2016-10-19 20:01:41
回答 3查看 1.2K关注 0票数 11

这个编程难题的灵感来源于昨天在这里提出的另一个问题,但作者删除了这个问题。

的挑战:

使用Visual.EXE(或您最喜欢的C# IDE)创建一个可执行二进制文件(Windows或Linux二进制),它将以下文本打印到标准输出:

代码语言:javascript
运行
复制
Main() is the main method of C# programs!

..。不使用出现在任何源文件中的连续4个字母appearing!

备注:

  • 如果您的源代码包含文本remainder (例如),它包含连续的4个字母M- any,但是如果它包含mxain,则4个字母将不再是连续的,因此mxain将被允许。
  • 您不允许运行除C# IDE之外的任何程序,也不允许将C# IDE的设置更改为运行其他程序(但是它通常会运行的程序,如C#编译器)。否则,您可以简单地说:“我使用C# IDE编写Pascal程序,并在我的C#项目的‘预构建’步骤中调用Pascal编译器”。这太简单了。
  • 可以使用“插件”(或类似的)扩展或内置二进制文件编辑器(十六进制编辑器)的IDE的用户将比其他C# IDE的用户拥有太大的优势。因此,这些功能也不应该使用。
  • 使用其他非ASCII编辑器(例如对话框窗口编辑器)是明确允许的!
  • 问原来问题的用户建议在函数名中使用反斜杠,就像这样:static void M\u0061in(),因为这个答案已经被其他用户读过了,它将不再被接受!
  • 一个用户询问是否允许它只在源代码编辑器中输入一个.EXE文件,并将该文件保存为".exe“而不是".cs”。答:我不认为这是可能的,因为有效的Windows和Linux二进制文件都包含NUL字节。但是,如果您找到可以以这种方式创建的有效二进制文件,则有一个有效的解决方案。

这个网站的名称是“编程难题和代码高尔夫”--这是一个“编程难题”,而不是“代码高尔夫”:挑战是在所有其他用户之前找到一个可行的解决方案,而不是找到一个比所有其他解决方案都短的解决方案。

因此,描述工作解决方案的第一篇文章就赢了!

祝好运!

顺便说一句:我有一个在下工作的解决方案。

EN

回答 3

Code Golf用户

回答已采纳

发布于 2016-10-21 01:36:02

C#交互式窗口

在Visual 2015中打开C#互动窗口(查看>其他窗口> C#互动)。我想不是所有的IDE都会有这个。

这种方法在Interactive中执行C#,以便创建一个C# exe,它无需作者编写main就可以打印所需的字符串。作为一种奖励,exe的IL也不包含main

在“互动”窗口中运行以下代码

代码语言:javascript
运行
复制
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:

票数 6
EN

Code Golf用户

发布于 2016-10-20 23:32:58

WPF应用程序

  1. 创建一个新的WPF应用程序。
  1. Main的所有实例替换为Meow
  1. MainWindow.xaml重命名为MeowWindow.xaml。这将自动将MainWindow.xaml.cs重命名为MeowWindow.xaml.cs
  1. 在项目属性中,将输出类型更改为Console Application,以便创建控制台。
  1. MeowWindow构造函数中为所需的输出字符串添加控制台写入
  1. Ctrl+Shift+F来确认源目录中任何地方都没有main
  1. F5 /编译并运行。

是如何工作的

对于WPF应用程序,Visual生成包含obj\Debug\App.g.cs方法的Main。生成的Main创建一个WPF应用程序的实例并启动它。

票数 3
EN

Code Golf用户

发布于 2016-10-19 20:12:25

我必须打破规则因为我用vim和csc.

代码语言:javascript
运行
复制
class C {
    static void \u004d\u0061\u0069\u006e(){
        Syste\u006d.Co\u006esole.Write("\u004d\u0061\u0069\u006e() is the \u006d\u0061\u0069\u006e \u006dethod of C# progra\u006ds!");
    }
}
票数 -5
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/96772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档