C #은 주요 문제입니다


10

이 프로그래밍 퍼즐은 어제 여기에 묻었지만 저자가 삭제 한 또 다른 질문에서 영감을 얻었습니다.

도전 과제 :

다음 텍스트를 표준 출력으로 인쇄하는 Visual C # (또는 선호하는 C # IDE)을 사용하여 실행 가능한 바이너리 (Windows .EXE 또는 Linux 바이너리)를 만듭니다.

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

... 모든 소스 파일에 4 개의 연속 문자 MAIN이 사용되지 않습니다!

노트:

  • 소스 코드에 텍스트가 포함 된 경우 remainder(예를 들어) 4 개의 연속 문자 MAIN이 포함되지만 mxain4 개의 문자가 포함 된 경우 더 이상 연속되지 않으므로 mxain허용됩니다.
  • 프로그램을 실행할 수 없으며 C # IDE를 사용하거나 C # IDE의 설정을 변경하여 다른 프로그램을 실행할 수 있습니다 (그러나 일반적으로 C # 컴파일러와 같이 실행되는 프로그램).

    그렇지 않으면 "C # IDE를 사용하여 Pascal 프로그램을 작성하고 C # 프로젝트의 '사전 빌드'단계에서 Pascal 컴파일러를 호출합니다"라고 간단히 말할 수 있습니다.

    이것은 너무 간단합니다.

  • "플러그인"(또는 이와 유사한)을 사용하여 확장 할 수 있거나 내장 이진 파일 편집기 (16 진 편집기)가있는 IDE 사용자는 다른 C # IDE 사용자에 비해 너무 큰 이점이 있습니다.

    따라서 이러한 특징도 사용해서는 안됩니다.

  • 대화 상자 창 편집기와 같은 다른 비 ASCII 편집기를 사용하는 것은 명시 적으로 허용됩니다!
  • 함수 이름에 백 슬래시를 사용하여 제안 된 원래 질문을하는 사용자는 다음과 같이 기능합니다. static void M\u0061in()이 답변은 다른 사용자가 이미 읽었으므로 더 이상 허용되지 않습니다!
  • 사용자는 소스 코드 편집기에 .EXE 파일을 입력하고 ".cs"대신 ".exe"로 파일을 저장할 수 있는지 묻습니다. 답변 : 유효한 Windows 및 Linux 바이너리 모두에 NUL 바이트가 포함되어 있기 때문에 이것이 가능하지는 않습니다. 그러나이 방법으로 만들 수있는 유효한 바이너리를 찾으면 유효한 솔루션이 있습니다.

이 사이트의 이름은 "Programming Puzzles & Code Golf"입니다. 이것은 "Code Golf"가 아닌 "Programming Puzzle"입니다. 문제는 다른 모든 사용자보다 먼저 솔루션을 찾는 것입니다. 솔루션.

따라서 작업 솔루션을 설명하는 첫 번째 게시물이 승리합니다 !

행운을 빕니다!

그건 그렇고 : Visual C # Express 2010에서 작동하는 솔루션이 있습니다.


2
실행 파일을 직접 입력하기 위해 C # IDE를 텍스트 (또는 이진) 편집기로 사용하지 못하는 이유는 무엇입니까?
feersum

2
어떤 대답이 도전에서 이기는가? 첫 번째 유효한 답변? 당첨 조건을 지정해야합니다
James

IDE에 16 진 편집기 나 이와 유사한 것이 포함되어 있으면 허용되지 않습니다. ASCII 텍스트 편집기를 사용하여 유효한 이진 파일을 입력하면 이것이 허용됩니다. 유효한 이진 파일에는 0x00 ~ 0x1F 범위의 바이트가 포함되어 있습니다!
Martin Rosenau

2
이것이 전체적으로 흥미로운 도전이라고 생각합니다. "메인없이 C # 프로그램을 작성하십시오." 그러나 대부분의 규칙은 어떤 접근 방식을 사용하고 금지 할 도구 / IDE에 관한 것입니다. 더 많은 프로그래밍 퍼즐 (코드 골프와 반대)을보고 싶지만이 퍼즐은 지정되어 있지 않습니다. 다음 에 샌드 박스를 사용 하는 것이 좋습니다 .
James

4
... 다음 에 샌드 박스를 고려하십시오 .
고양이

답변:


5

C # 대화식 창

C # 대화 형 창을 엽니 다 (Visual Studio 2015에서보기> 기타 창> C # 대화 형). 모든 IDE에이 기능이있는 것은 아닙니다.

이 방법은 저자가 쓰지 않고 원하는 문자열을 인쇄하는 C # exe를 만들기 위해 대화 형 창에서 C #을 실행합니다 main. 보너스로, exe의 IL은 또한 포함하지 않습니다 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.CurrentDirectoryexe가 작성된 위치를 보는 데 사용 하십시오. 원하는 출력을 관찰하기 위해 실행하십시오.

여기에 이미지 설명을 입력하십시오

결과 IL : 여기에 이미지 설명을 입력하십시오


실제로이 어셈블리를 더 좋아하고 WPF 하나를 좋아합니다. 어셈블리에 Main ()이 실제로 없기 때문입니다.
hstde

당신의 해결책은 흥미 롭습니다. 두 번째 글이므로 사용자가 첫 번째 게시물이 유효한 솔루션이 아니라고 확신 해야하는 경우 이길 것입니다 (어떤 이유로 든).
Martin Rosenau

당신이 나에게 묻는다면, 어느 게시물이 같은 사용자에 의해 있기 때문에 어떤 게시물이이기는지는 중요하지 않습니다.
hstde

@hstde-죄송합니다. 이걸 보지 못했습니다. 감사.
Martin Rosenau

@milk 당신은 두 가지 유효한 솔루션을 게시했습니다. 축하합니다.
Martin Rosenau

3

WPF 신청

  1. 새로운 WPF 응용 프로그램을 만듭니다. 여기에 이미지 설명을 입력하십시오

  2. 의 모든 인스턴스 MainMeow 여기에 이미지 설명을 입력하십시오

  3. 로 이름 MainWindow.xaml을 바꾸십시오 MeowWindow.xaml. 이름이 MainWindow.xaml.cs로 바뀝니다 MeowWindow.xaml.cs.

여기에 이미지 설명을 입력하십시오

  1. 프로젝트 특성 Console Application에서 콘솔이 작성되도록 출력 유형을 변경하십시오 . 여기에 이미지 설명을 입력하십시오

  2. MeowWindow생성자 에서 원하는 출력 문자열에 대한 콘솔 쓰기 추가여기에 이미지 설명을 입력하십시오

  3. main소스 디렉토리에 아무 곳 이 없는지 확인하려면 Ctrl + Shift + F여기에 이미지 설명을 입력하십시오

  4. F5 / 컴파일 및 실행 여기에 이미지 설명을 입력하십시오

작동 원리

WPF 응용 프로그램의 obj\Debug\App.g.cs경우 Main메서드 가 포함 된 Visual Studio가 생성됩니다 . 생성 된 MainWPF 앱의 인스턴스가 생성 되어 시작됩니다.


재미있는 해결책. 이것이 올바른 해결책이 아니라고 생각하는 사람이 있습니까? 이 게시물이 유효하지 않다고 생각하는 사람이 있으면 의견을 게시하십시오. 그렇지 않으면 분명히이 솔루션이 승리 한 솔루션이라고 선언 할 것입니다.
Martin Rosenau

@MartinRosenau I 느낌 당신은 WPF 응용 프로그램을 컴파일 할 수 이것은 잘못된 것을 주요 방법이 될 것이기 때문에 더 강하게 같은 사용자가이 모호성이없는 다른 답변을 게시 때문에

방금 두 답변이 동일한 사용자에 의해 게시 된 것을 보았습니다. 이 경우이 사용자는 어쨌든 이길 것입니다.
Martin Rosenau

0

참고로

내 생각은 "우유"의 두 번째 아이디어와 비슷했습니다.

IDE가 코드를 실행하고 실행 파일을 디스크에 쓸 수있는 방법을 찾으십시오.

이진 .EXE 파일을 사용하여 System.IO.File.WriteAllBytes().NET EXE 파일이 아니어야 한다고 생각했기 때문에 Windows 및 Linux 이진 파일을 명시 적으로 언급 했습니다.

내 문제는 VS Express 2010에 대화 형 콘솔이없는 것 같아서 대체품을 찾아야한다는 것입니다.

대화창과 커스텀 컨트롤로 DLL 프로젝트를 만듭니다; 프로젝트를 컴파일하고 대화 상자 창에 사용자 정의 컨트롤을 추가하십시오. 대화 상자 창 편집기는 사용자 지정 컨트롤의 코드를 호출합니다.이 코드에서는 .EXE 파일을 디스크에 쓸 수 있습니다 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.