Este quebra-cabeça de programação é inspirado em outra pergunta que foi feita aqui ontem, mas que foi excluída pelo autor ...
O desafio:
Crie um binário executável (Windows .EXE ou Linux) usando o Visual C # (ou seu IDE favorito do C #) que imprime o seguinte texto na saída padrão:
Main() is the main method of C# programs!
... sem usar as 4 letras consecutivas PRINCIPAIS que aparecem em qualquer arquivo de origem!
Notas:
- Se o seu código fonte contiver o texto
remainder
(por exemplo), ele conterá as 4 letras consecutivas MAIN, no entanto, se contivermxain
as 4 letras, não seria mais consecutivo, portanto,mxain
seria permitido. Você não tem permissão para executar nenhum programa, exceto o C # IDE, nem alterar as configurações do C # IDE para executar outros programas (mas os que normalmente seriam executados, como o compilador C #).
Caso contrário, você poderia simplesmente dizer: "Eu escrevo um programa Pascal usando o C # IDE e invoco o compilador Pascal nas etapas de 'pré-compilação' do meu projeto C #".
Isso seria muito simples.
Os usuários de um IDE que possam ser estendidos usando "plug-ins" (ou similares) ou que tenham editores de arquivos binários internos (editores hexadecimais) terão uma vantagem muito grande sobre os usuários de outros IDEs C #.
Portanto, esses talentos também não devem ser usados.
- É permitido o uso de outros editores não ASCII (como o editor da janela de diálogo)!
- O usuário que faz a pergunta original proposta usando a barra invertida nos nomes das funções, assim:
static void M\u0061in()
Como essa resposta já foi lida por outros usuários, ela não será mais aceita! - Um usuário perguntou se seria permitido digitar simplesmente um arquivo .EXE no editor de código-fonte e salvar o arquivo como ".exe" em vez de ".cs". Resposta: Não duvido que isso seja possível porque os binários válidos do Windows e Linux contêm NUL bytes. No entanto, se você encontrar um binário válido que possa ser criado dessa maneira, terá uma solução válida.
O nome deste site é "Quebra - cabeças de programação e código de golfe" - este é um "Quebra-cabeça de programação", não "Código de golfe": o desafio é encontrar uma solução funcional para todos os outros usuários, não encontrar uma solução mais curta que todas as outras soluções.
Portanto, o primeiro post que descreve uma solução funcional vence !
Boa sorte!
A propósito: Eu tenho uma solução trabalhando no Visual C # Express 2010.
fonte
Respostas:
Janela C # interativa
Abra a janela interativa do C # (Exibir> Outras janelas> C # interativo no Visual Studio 2015). Suponho que nem todos os IDEs terão isso.
Essa abordagem executa C # na janela interativa para criar um exe em C # que imprime a string desejada sem que o autor nunca tenha escrito
main
. Como bônus, o IL do exe também não contémmain
.Execute o seguinte código na janela interativa
Use
Environmnent.CurrentDirectory
para ver onde o exe foi criado. Execute-o para observar a saída desejada.IL resultante:
fonte
Aplicativo WPF
Crie um novo aplicativo WPF.
Substitua todas as instâncias
Main
porMeow
Renomeie
MainWindow.xaml
paraMeowWindow.xaml
. Isso será renomeado automaticamenteMainWindow.xaml.cs
paraMeowWindow.xaml.cs
.Nas propriedades do projeto, altere o Tipo de saída para
Console Application
para que o console seja criado.Adicione gravação de console para a sequência de saída desejada em seu
MeowWindow
construtorCtrl + Shift + F para confirmar que não há nenhum
main
lugar no diretório de origem.F5 / compilar e executar.
Como funciona
Para aplicativos WPF, o Visual Studio gera
obj\Debug\App.g.cs
qual contém oMain
método O geradoMain
cria uma instância do seu aplicativo WPF e o inicia.fonte
Apenas como referência
Minha idéia foi semelhante à segunda idéia do "leite":
Encontre uma maneira de permitir que o IDE execute o código e grave um executável no disco.
Mencionei explicitamente os binários do Windows e Linux, porque pensei em gravar o arquivo .EXE binário usando,
System.IO.File.WriteAllBytes()
para que não fosse necessariamente um arquivo .NET EXE.Meu problema era que o VS Express 2010 parece não ter um console interativo, então tive que encontrar um substituto para isso - encontrei o seguinte:
Crie um projeto DLL com uma janela de diálogo e um controle personalizado; compile o projeto e adicione o controle personalizado à janela de diálogo. O editor da janela de diálogo chamará o código do controle personalizado - e nesse código você poderá gravar o arquivo .EXE no disco ...
fonte