Objetivo
Usando a linguagem de programação de sua escolha, escreva o programa mais curto para eliminar comentários de uma sequência que representa um programa em C.
Entrada
A string pode ser usada como qualquer forma de entrada, mas também pode ser usada como uma variável.
Instruções
Dois tipos diferentes de comentários devem ser removidos:
- comentários multilinhas , começando
/*
e terminando com*/
- comentários de linha única , começando
//
e terminando com quebras de linha no estilo Linux (LF,\n
)
Os comentários nas cadeias não devem ser excluídos. Para o objetivo desse desafio, você só precisa considerar "
cadeias delimitadas. Em particular, você pode ignorar a possibilidade de '
literais de caracteres delimitados. Você também pode ignorar trigramas e continuações de linha ( /\<LF>*...
).
Exemplos
Entrada:
#include <stdio.h>
int main(int argc, char** argv)
{
// this comment will be removed
if (argc > 1) {
printf("Too many arguments.\n"); // this too will be removed
return 1;
}
printf("Please vist http://this.will.not.be.removed.com\n");
printf("/* This will stay */\n");
printf("\"/* This will stay too */\"\n");
printf("//and so will this\\");
// but not this
printf("just \"ano//ther\" test.");
return 0;
}
Resultado:
#include <stdio.h>
int main(int argc, char** argv)
{
if (argc > 1) {
printf("Too many arguments.\n");
return 1;
}
printf("Please vist http://this.will.not.be.removed.com\n");
printf("/* This will stay */\n");
printf("\"/* This will stay too */\"\n");
printf("//and so will this\\");
printf("just \"ano//ther\" test.");
return 0;
}
Entrada:
/*
this shall disappear
*/
#include <string>
int main(int argc, char** argv)
{
string foo = ""/*remove that!**/;
// Remove /* this
int butNotThis = 42;
// But do */ remove this
int bar = 4 /*remove this*/* 3; // but don't remove that 3. */
return 0;//just a comment
}/*end of the file has been reached.*/
Resultado:
#include <string>
int main(int argc, char** argv)
{
string foo = "";
int butNotThis = 42;
int bar = 4 * 3;
return 0;
}
code-golf
string
regular-expression
comment
Mathieu Rodic
fonte
fonte
printf("\"/* This will stay too */\"\n");
apareceu no deve se tornar código?// this comment will be removed
quais desapareceram. Alguma regra para isso?Respostas:
Retina , 35 + 1 + 2 = 38 bytes
Este programa consiste em dois arquivos, portanto, incluí uma penalidade de 1 byte para o segundo arquivo .
Esta é uma substituição simples de regex, usando o sabor .NET (embora isso funcione da mesma forma na maioria dos outros sabores).
A idéia é combinar os comentários e as strings, mas apenas escreva a correspondência de volta se for uma string. Ao corresponder as strings explicitamente, elas são ignoradas ao procurar comentários.
fonte
preg_replace
.Coleção de compiladores Shell + coreutils + gcc, 31 bytes
Essa resposta pode parecer um pouco incompleta, mas não vi nada especificamente banindo-a na pergunta.
Em vez de usar expressões regulares desajeitadas, por que não usar a ferramenta criada para o trabalho. Não deve ter nenhum problema em fornecer resultados corretos:
Leva a entrada de STDIN e a saída para STDOUT. Normalmente
ccp
, todo o pré-processamento é feito (arquivos de cabeçalho, expansão de macro, remoção de comentários, etc.), mas com a-fpreprocessed
opção, ele ignora a maioria das etapas, mas ainda remove os comentários. Além disso, o cpp adiciona uma linha como# 1 "<stdin>"
no início da saída, entãosed
existe para excluí-la.fonte
.i
,.ii
ou.mi
". você poderá salvar alguns bytes salvando o arquivo em algo como, ema.i
vez de usar o sinalizador?cat>i.i;cpp -o- i.i|sed 1d
ser equivalente. Mas o pré-processamento completo ocorre (por exemplo, o conteúdo completo do stdio.h é inserido). Possível bug do gcc ??? Bem, talvez eu verifique a fonte do cpp quando receber um mês.|sed 1d
se você adicionar a-P
opção. Observe que (conforme permitido pela pergunta), como espera um código pré-processado, ele não manipulará trigramas ou continuações de linha corretamente.Java 365
Ungolfed
fonte
Python2 -
163134 bytesComo você pode ver aqui , o regex consiste em 2 grupos de captura alternados. O primeiro captura todas as strings citadas. O segundo todos os comentários.
Tudo o que precisamos fazer é remover tudo o que foi capturado pelo 2º grupo.
Exemplo:
fonte
Rebol - 151
Ungolfed + algumas anotações:
fonte
PHP
Convertendo a resposta de @Martin Ender para php:
agora
$str
perdeu comentários de uma e várias linhas. Isso é útil para remover comentários nos dados JSON antes de alimentarjson_decode()
.fonte
C # (262 caracteres):
A partir desta resposta SO muito boa :
fonte
JS (ES6), 47 caracteres (wip)
DEMO: http://codepen.io/anon/pen/dPEMro
Inspirado pelos meus minificadores codegolfed: http://xem.github.io/miniMinifier/
ainda não lida com comentários em strings ...
Estou curioso para ver se é possível conseguir isso em expressões regulares JS.
fonte