Objetivo
Usando el lenguaje de programación de su elección, escriba el programa más corto para eliminar los comentarios de una cadena que representa un programa en C.
Entrada
La cadena se puede tomar como cualquier forma de entrada, pero también se puede tomar como una variable.
Instrucciones
Se deben eliminar dos tipos diferentes de comentarios:
- comentarios multilínea , comenzando
/*
y terminando con*/
- comentarios de una sola línea , comenzando
//
y terminando con saltos de línea estilo Linux (LF,\n
)
Los comentarios dentro de las cadenas no se deben eliminar. Para el propósito de este desafío, solo necesita considerar "
cadenas delimitadas. En particular, puede ignorar la posibilidad de '
literales de caracteres delimitados. También puede ignorar los trigrafos y las continuaciones de línea ( /\<LF>*...
).
Ejemplos
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;
}
Salida:
#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.*/
Salida:
#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
fuente
fuente
printf("\"/* This will stay too */\"\n");
apareció eso en el debería convertirse en código?// this comment will be removed
cuales simplemente desaparecieron. ¿Alguna regla para eso?Respuestas:
Retina , 35 + 1 + 2 = 38 bytes
Este programa consta de dos archivos, por lo tanto, he incluido una penalización de 1 byte para el segundo archivo .
Este es un reemplazo simple de expresiones regulares, usando el sabor .NET (aunque esto funcionaría igual en la mayoría de los otros sabores).
La idea es hacer coincidir los comentarios y las cadenas, pero solo escribir la coincidencia de nuevo si era una cadena. Al hacer coincidir las cadenas explícitamente, se omiten al buscar comentarios.
fuente
preg_replace
.Colección del compilador Shell + coreutils + gcc, 31 bytes
Esta respuesta puede parecer un poco falsa, pero no vi nada que la prohibiera específicamente en la pregunta.
En lugar de usar expresiones regulares torpes, ¿por qué no usar la herramienta que se creó para el trabajo? No debería tener problemas para dar resultados correctos:
Toma la entrada de STDIN y la salida a STDOUT. Normalmente
ccp
hará todo el preprocesamiento (archivos de encabezado, expansión de macros, eliminación de comentarios, etc.), pero con la-fpreprocessed
opción, omitirá la mayoría de los pasos, pero aún eliminará los comentarios. Además, cpp agrega una línea como# 1 "<stdin>"
al comienzo de la salida, por lo quesed
está allí para eliminarla.fuente
.i
,.ii
o.mi
". ¿podría guardar algunos bytes guardando el archivo en algo así como ena.i
lugar de usar la bandera?cat>i.i;cpp -o- i.i|sed 1d
fuera equivalente. Pero se produce un preprocesamiento completo (por ejemplo, se inserta el contenido completo de stdio.h). Posible error de gcc ??? Bueno, tal vez verifique la fuente de cpp cuando tenga un mo '.|sed 1d
si agrega la-P
opción. Tenga en cuenta que (según lo permitido por la pregunta), ya que espera código preprocesado, no manejará los trigrafos o las continuaciones de línea correctamente.Java 365
Sin golf
fuente
Python2 -
163134 bytesComo puede ver aquí , la expresión regular consta de 2 grupos de captura alternativos. El primero captura todas las cadenas citadas. El segundo todos los comentarios.
Todo lo que necesitamos hacer es eliminar todo lo capturado por el segundo grupo.
Ejemplo:
fuente
Rebol - 151
Ungolfed + algunas anotaciones:
fuente
PHP
Convirtiendo la respuesta de @Martin Ender para php:
ahora
$str
ha perdido comentarios de una o varias líneas. Esto es útil para eliminar comentarios en datos JSON antes de alimentarlosjson_decode()
.fuente
C # (262 caracteres):
De esta muy buena respuesta SO :
fuente
JS (ES6), 47 caracteres (wip)
DEMO: http://codepen.io/anon/pen/dPEMro
Inspirado por mis minificadores codegolfed: http://xem.github.io/miniMinifier/
no maneja comentarios en cadenas todavía ...
Tengo curiosidad por ver si es posible lograr eso en JS regexes.
fuente