Objetivo
Reemplace todos los comentarios en C, C ++ o Java Code con el comentario // Do the needful
.
Detalles específicos
Este desafío de codificación es simple. Tomar como entrada el nombre de un archivo. El archivo de entrada deberá contener código C, C ++ o Java. El código deberá contener uno o más comentarios. Los comentarios pueden ser de una sola línea /* */
o //
delimitados, así como /* */
delimitados por varias líneas . La salida del programa debe ser idéntica a la entrada, excepto que todos los comentarios deben convertirse // Do the needful
.
Por ejemplo, si el archivo de entrada es:
#include <iostream.h>
int result; // the result of the calculations
char oper_char; // the user-specified operator
int value; // value specified after the operator
/* standard main function */
int main()
{
result = 0; // initialize the result
// Loop forever (or till we hit the break statement)
while (1) {
cout << "Result: " << result << '\n';
/* This code outputs display and requests
input from the user */
cout << "Enter operator and number: ";
cin >> oper_char;
cin >> value;
if (oper_char = '+') {
result += value;
} else {
cout << "Unknown operator " << oper_char << '\n';
}
}
return (0);
}
La salida del programa debería leer
#include <iostream.h>
int result; // Do the needful
char oper_char; // Do the needful
int value; // Do the needful
// Do the needful
int main()
{
result = 0; // Do the needful
// Do the needful
while (1) {
cout << "Result: " << result << '\n';
// Do the needful
cout << "Enter operator and number: ";
cin >> oper_char;
cin >> value;
if (oper_char = '+') {
result += value;
} else {
cout << "Unknown operator " << oper_char << '\n';
}
}
return (0);
}
Puntuación
Este es un concurso de popularidad. Usted consigue dos votos extra añadido a su puntuación si ninguna de las siguientes palabras aparece en su programa en caso de cualquier variación: {"do", "the", "needful"}
. El puntaje es el número de votos más el bono si corresponde.
Subsidios
Si los comentarios aparecen en literales de cadena, es aceptable convertirlos // Do the needful
también. Después de todo ... nunca puedes tener lo suficiente necesario.
fuente
"d" + "o"
,"t" + "he"
y"need" + "ful"
? Además, ¿el envío tiene que ser capaz de manejar algún código C, C ++ o Java válido? Eso es bastante duro y equivale a escribir un lexer para los tres idiomas (estoy pensando en comentarios literales en cadenas y viceversa). Si es así, ¿qué pasa con las bibliotecas de lexer de terceros?/* ... */
precede a un no comentario en una línea?char str[]="/**///";
o/*
aparece una secuencia de inicio de comentario en un/*
comentario, o aparece una barra diagonal inversa-nueva línea en un//
comentario, o un//
comentario dentro de un/**/
comentario?Respuestas:
CoffeeScript (66 bytes)
Este código analizará las cadenas, pero hay una buena razón. Verá, existe la posibilidad de que haya un comentario en una plantilla que genere
/**/
comentarios en C.Esto consigue la ventaja, ya que evita casos de juegos compatibles insensibles a
Do
,the
yneedful
. También usa el[^]
operador ES5 candle ( ) para hacer cosas. Pondría un comentarioDo the needful
en este programa, pero eso eliminaría la bonificación.fuente
Perl, 68 caracteres
Esto toma algunas libertades con la especificación y conserva el estilo de comentario original. Esto evita el problema con los
/* ... */
comentarios que aparecen antes del final de la línea.No se intenta evitar los comentarios dentro de los literales de cadena, y no se hace ningún reclamo por los puntos de bonificación.
fuente
/* ... */
comentario precede al código real (no puede convertirlo ingenuamente en un//
comentario).Perl
¡Primera anarquía mundial! :)
"nunca puedes tener lo suficiente necesario"
fuente
Python 3.x, expresiones regulares
Como no se trata de un código de golf, no me preocupe por la longitud del código. Nada impresionante, pero me divertí recordando / reaprendiendo lo básico sobre expresiones regulares.
fuente
sed, 90 caracteres
Podría ser mejorado. Aprendí mucho sobre sed mientras hacía esto.
Lee desde entrada estándar, salidas a salida estándar. Asume una entrada válida: si tiene comentarios no terminados, no lo tratará como un comentario.
Probado en GNU sed v4.2.2.
¿Y el premio de legibilidad es para ...?
Versión de una línea:
Explicación
El flujo de control salta mucho, por medio de declaraciones GOTO (sí, ¡sed las tiene!). sed no tiene ningún bucle o declaraciones condicionales convenientes AFAIK.
fuente
BrainFuck
Sí, BrainFuck es un lenguaje completo de Turing.
Buena suerte para entender este código.
Básicamente, el pseudocódigo es:
Algunos intérpretes en línea están rotos.
Pruébelo aquí con el ejemplo dado por el OP (finalizado con null-char para romper el bucle correctamente):
fuente
Rebol
No es código golf, así que seré prolijo.
(Nota: por razones políticas, estoy presionando COMBINAR aquí, pero aún no es estándar . Así que si realmente quieres ejecutar esto, usa REJOIN. Pero odio REJUINAR. ¡Una verruga en un lenguaje hermoso! conduce a escucharme. Gracias.)
PARSE es un dialecto, o lenguaje dentro de un idioma, en Rebol y Red. Retorce las cosas, por lo que, por ejemplo, los tipos de símbolos que se usan para la asignación (el
terminator:
interminator: newline
) adquieren un nuevo significado cuando se usan en el paradigma de código como datos ... guarda la posición de análisis actual en una variable con ese nombre . Puedes leer más sobre por qué es genial aquí .ACTUALIZACIÓN: Oh, está bien, yo también jugaré golf. En Rebmu , 72 caracteres ... usando rebmu / args que inyecta A como argumento:
pa DtsRDa[anTO["/*"(T"*/")|"//"(Tlf)]SthT F(chpS"// Do the needful^/"f)]d
Exactamente el mismo programa.
fuente