C # là vấn đề chính


10

Câu đố lập trình này được lấy cảm hứng từ một câu hỏi khác đã được hỏi ở đây ngày hôm qua nhưng đã bị xóa bởi tác giả ...

Các thách thức:

Tạo tệp nhị phân thực thi (Windows .EXE hoặc Linux nhị phân) bằng Visual C # (hoặc IDE C # yêu thích của bạn) để in văn bản sau thành đầu ra tiêu chuẩn:

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

... mà không sử dụng 4 chữ cái MAIN liên tiếp xuất hiện trong bất kỳ tệp nguồn nào!

Ghi chú:

  • Nếu mã nguồn của bạn chứa văn bản remainder(ví dụ), nó chứa 4 chữ cái MAIN liên tiếp, tuy nhiên nếu nó chứa mxain4 chữ cái thì sẽ không được liên tiếp nữa nên mxainsẽ được phép.
  • Bạn không được phép chạy bất kỳ chương trình nào ngoài IDE C # cũng như không thay đổi cài đặt của IDE C # để chạy các chương trình khác (nhưng những chương trình mà nó thường chạy như trình biên dịch C #).

    Mặt khác, bạn có thể chỉ cần nói: "Tôi viết chương trình Pascal bằng C # IDE và gọi trình biên dịch Pascal trong các bước 'xây dựng trước' của dự án C # của tôi".

    Điều này sẽ quá đơn giản.

  • Người dùng IDE có thể mở rộng bằng cách sử dụng "trình cắm" (hoặc tương tự) hoặc có trình chỉnh sửa tệp nhị phân tích hợp (trình chỉnh sửa hex) sẽ có lợi thế quá lớn so với người dùng IDE C # khác.

    Do đó, những kỳ tích này cũng không nên được sử dụng.

  • Sử dụng các Trình soạn thảo không phải ASCII khác (như trình soạn thảo cửa sổ hộp thoại) được cho phép rõ ràng!
  • Người dùng hỏi câu hỏi ban đầu được đề xuất sử dụng dấu gạch chéo ngược trong các tên hàm giống như thế này: static void M\u0061in()Bởi vì câu trả lời này đã được người dùng khác đọc nên nó sẽ không được chấp nhận nữa!
  • Một người dùng đã hỏi liệu có được phép nhập tệp .EXE vào trình chỉnh sửa mã nguồn hay không và lưu tệp dưới dạng ".exe" thay vì ".cs". Trả lời: Tôi không nghi ngờ rằng điều này là có thể bởi vì cả hai nhị phân Windows và Linux hợp lệ đều chứa các byte NUL. Tuy nhiên nếu bạn tìm thấy một nhị phân hợp lệ có thể được tạo theo cách này, bạn có một giải pháp hợp lệ.

Tên của trang web này là "Câu đố lập trình & Golf Code" - đây là "Câu đố lập trình", không phải "Code Golf": Thách thức là tìm một giải pháp hoạt động trước tất cả người dùng khác, không tìm ra giải pháp nào ngắn hơn tất cả những người khác các giải pháp.

Vì vậy, bài viết đầu tiên mô tả một giải pháp làm việc chiến thắng !

Chúc may mắn!

Nhân tiện: Tôi có một giải pháp hoạt động theo Visual C # Express 2010.


2
Điều gì ngăn tôi sử dụng IDE C # của tôi làm trình soạn thảo văn bản (hoặc nhị phân) để trực tiếp loại ra một tệp thực thi?
frageum

2
Câu trả lời nào thắng thử thách? Câu trả lời hợp lệ đầu tiên? Bạn nên chỉ định điều kiện chiến thắng
James

Nếu IDE chứa một số trình soạn thảo thập lục phân hoặc tương tự thì điều này sẽ KHÔNG được phép. Nếu bạn quản lý để sử dụng trình soạn thảo văn bản ASCII để nhập tệp nhị phân hợp lệ, điều này sẽ được cho phép. Lưu ý rằng tệp nhị phân hợp lệ chứa byte trong phạm vi 0x00 đến 0x1F!
Martin Rosenau

2
Tôi nghĩ rằng đây là một thử thách thú vị. "Viết chương trình C # không có chính". Tuy nhiên, hầu hết các quy tắc là về việc sử dụng công cụ / IDE nào và cấm các phương pháp tiếp cận nhất định. Tôi muốn thấy nhiều câu đố lập trình hơn, (trái ngược với môn đánh gôn) nhưng câu đố này chưa được xác định rõ. Tôi khuyên bạn nên sử dụng hộp cát vào lần tới.
James

4
... Hãy xem xét hộp cát lần sau.
con mèo

Câu trả lời:


5

Cửa sổ tương tác C #

Mở cửa sổ tương tác C # (Xem> Windows khác> C # Interactive trong Visual Studio 2015). Tôi cho rằng không phải tất cả các IDE sẽ có điều này.

Cách tiếp cận này thực thi C # trong Cửa sổ tương tác để tạo exe C # in chuỗi mong muốn mà không cần tác giả viết main. Như một phần thưởng, IL của exe cũng không chứa main.

Chạy đoạn mã sau trong Cửa sổ tương tác

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

Sử dụng Environmnent.CurrentDirectoryđể xem nơi exe đã được tạo ra. Chạy nó để quan sát đầu ra mong muốn.

nhập mô tả hình ảnh ở đây

Kết quả IL: nhập mô tả hình ảnh ở đây


Tôi thực sự thích cái này tốt hơn, sau đó là WPF, vì bạn thực sự không có Main () trong hội của bạn.
hstde

Giải pháp của bạn thật thú vị. Đây là bài thứ hai vì vậy bạn sẽ giành chiến thắng nếu người dùng nên thuyết phục tôi rằng bài đăng đầu tiên không phải là một giải pháp hợp lệ (vì lý do gì bao giờ).
Martin Rosenau

Nếu bạn hỏi tôi, bài đăng nào không thực sự quan trọng, vì cả hai đều do cùng một người dùng.
hstde

@hstde - Xin lỗi, tôi không thấy điều này. Cảm ơn.
Martin Rosenau

@milk Bạn đã đăng hai giải pháp hợp lệ (tốt, một số người dùng nghi ngờ về giải pháp đầu tiên) để bạn giành chiến thắng. Xin chúc mừng.
Martin Rosenau

3

Ứng dụng WPF

  1. Tạo một ứng dụng WPF mới. nhập mô tả hình ảnh ở đây

  2. Thay thế tất cả các trường hợp MainbằngMeow nhập mô tả hình ảnh ở đây

  3. Đổi tên MainWindow.xamlthành MeowWindow.xaml. Điều này sẽ tự động đổi tên MainWindow.xaml.csthành MeowWindow.xaml.cs.

nhập mô tả hình ảnh ở đây

  1. Trong thuộc tính dự án, thay đổi loại đầu ra để Console Applicationgiao diện điều khiển được tạo. nhập mô tả hình ảnh ở đây

  2. Thêm giao diện điều khiển ghi cho chuỗi đầu ra mong muốn ở bạn MeowWindowconstructor nhập mô tả hình ảnh ở đây

  3. Ctrl + Shift + F để xác nhận không có mainchỗ nào trong thư mục nguồn. nhập mô tả hình ảnh ở đây

  4. F5 / biên dịch và chạy. nhập mô tả hình ảnh ở đây

Làm thế nào nó hoạt động

Đối với các ứng dụng WPF, Visual Studio tạo ra obj\Debug\App.g.cscó chứa Mainphương thức. Việc tạo Mainsẽ tạo một phiên bản của ứng dụng WPF của bạn và khởi động nó.


Giải pháp thú vị. Bất cứ ai nghĩ rằng đây không phải là một giải pháp hợp lệ? Nếu bất cứ ai nghĩ rằng bài viết này không hợp lệ xin vui lòng gửi bình luận. Nếu không, tôi sẽ tuyên bố giải pháp này là giải thưởng vì nó rõ ràng là giải pháp đầu tiên được đăng.
Martin Rosenau

@MartinRosenau Tôi cảm thấy rằng vì bạn có thể dịch ngược ứng dụng wpf và sẽ có một phương pháp chính là không hợp lệ, mạnh mẽ hơn bởi vì cùng một người dùng đã đăng một câu trả lời khác không có sự mơ hồ này

Tôi chỉ thấy rằng cả hai câu trả lời đã được đăng bởi cùng một người dùng. Trong trường hợp này, người dùng này sẽ giành chiến thắng.
Martin Rosenau

0

Chỉ là một tài liệu tham khảo

Ý tưởng của tôi tương tự như ý tưởng thứ hai của "sữa":

Tìm cách để IDE thực thi mã và ghi tệp thực thi vào đĩa.

Tôi đã đề cập rõ ràng đến các tệp nhị phân của Windows và Linux vì tôi nghĩ về việc viết tệp nhị phân .EXE bằng cách sử dụng System.IO.File.WriteAllBytes()để nó không nhất thiết phải là tệp .NET EXE.

Vấn đề của tôi là VS Express 2010 dường như không có bảng điều khiển tương tác nên tôi phải tìm một sự thay thế cho điều đó - tôi đã tìm thấy như sau:

Tạo một dự án DLL với một cửa sổ hộp thoại và điều khiển tùy chỉnh; biên dịch dự án và thêm điều khiển tùy chỉnh vào cửa sổ hộp thoại. Trình soạn thảo cửa sổ hộp thoại sau đó sẽ gọi mã của điều khiển tùy chỉnh - và trong mã này, bạn có thể ghi tệp .EXE vào đĩa ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.