Objectif
En utilisant le langage de programmation de votre choix, écrivez le programme le plus court pour éliminer les commentaires d'une chaîne représentant un programme C.
Contribution
La chaîne peut être considérée comme n'importe quelle forme d'entrée, mais elle peut également être considérée comme une variable.
Instructions
Deux types de commentaires différents doivent être supprimés:
- commentaires multilignes , commençant par
/*
et se terminant par*/
- commentaires sur une seule ligne , commençant
//
et se terminant par des sauts de ligne de style Linux (LF,\n
)
Les commentaires dans les chaînes ne doivent pas être supprimés. Aux fins de ce défi, il vous suffit de considérer les "
chaînes délimitées. En particulier, vous pouvez ignorer la possibilité de '
littéraux de caractères délimités. Vous pouvez également ignorer les trigraphes et les continuations de ligne ( /\<LF>*...
).
Exemples
Contribution:
#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;
}
Production:
#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;
}
Contribution:
/*
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.*/
Production:
#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
la source
la source
printf("\"/* This will stay too */\"\n");
est apparu dans le code devrait devenir ?// this comment will be removed
lesquels viennent de disparaître. Une règle pour ça?Réponses:
Rétine , 35 + 1 + 2 = 38 octets
Ce programme se compose de deux fichiers, j'ai donc inclus une pénalité de 1 octet pour le deuxième fichier .
Il s'agit d'un simple remplacement d'expression régulière, utilisant la saveur .NET (bien que cela fonctionnerait de la même manière dans la plupart des autres saveurs).
L'idée est de faire correspondre les commentaires et les chaînes, mais de réécrire la correspondance uniquement s'il s'agissait d'une chaîne. En faisant correspondre explicitement les chaînes, elles sont ignorées lors de la recherche de commentaires.
la source
preg_replace
.Collection de compilateurs Shell + Coreutils + GCC, 31 octets
Cette réponse peut sembler un peu échappatoire, mais je n'ai rien vu d'interdire spécifiquement dans la question.
Plutôt que d'utiliser des expressions régulières maladroites, pourquoi ne pas utiliser l'outil qui a été conçu pour le travail. Il ne devrait y avoir aucun problème à donner des résultats corrects:
Prend l'entrée de STDIN et la sortie vers STDOUT. Normalement,
ccp
fera tout le prétraitement (fichiers d'en-tête, expansion de macro, suppression de commentaires, etc.), mais avec l'-fpreprocessed
option, il sautera la plupart des étapes, mais il supprimera toujours les commentaires. De plus, cpp ajoute une ligne comme# 1 "<stdin>"
au début de la sortie, donc lesed
est là pour la supprimer.la source
.i
,.ii
ou.mi
". pourriez-vous être en mesure d'enregistrer certains octets en enregistrant le fichier dans quelque chose commea.i
au lieu d'utiliser l'indicateur?cat>i.i;cpp -o- i.i|sed 1d
équivalent. Mais un prétraitement complet s'ensuit (par exemple, le contenu complet de stdio.h est inséré). Bug gcc possible ??? Eh bien peut-être que je vérifierai la source cpp quand j'aurai un mo '.|sed 1d
si vous ajoutez l'-P
option. Notez que (comme le permet la question), car il attend du code prétraité, il ne traitera pas correctement les trigraphes ou les continuations de ligne.Java 365
Non golfé
la source
Python2 -
163134 octetsComme vous pouvez le voir ici , l'expression régulière se compose de 2 groupes de capture alternés. La première capture toutes les chaînes citées. Le second tous les commentaires.
Tout ce que nous devons faire, c'est supprimer tout ce qui a été capturé par le 2e groupe.
Exemple:
la source
Rebol - 151
Non golfé + quelques annotations:
la source
PHP
Conversion de la réponse de @Martin Ender pour php:
a maintenant
$str
perdu les commentaires sur une ou plusieurs lignes. Ceci est utile pour supprimer les commentaires dans les données JSON avant de les alimenterjson_decode()
.la source
C # (262 caractères):
De cette très bonne réponse SO :
la source
JS (ES6), 47 caractères (wip)
DEMO: http://codepen.io/anon/pen/dPEMro
Inspiré par mes minificateurs golfiques: http://xem.github.io/miniMinifier/
ne gère pas encore les commentaires dans les chaînes ...
Je suis curieux de voir s'il est possible d'y parvenir dans les expressions régulières JS.
la source