Цель
Используя язык программирования по вашему выбору, напишите самую короткую программу, чтобы исключить комментарии из строки, представляющей программу на Си.
вход
Строка может быть принята как любая форма ввода, но она также может быть принята как переменная.
инструкции
Два разных вида комментариев должны быть удалены:
- многострочные комментарии , начиная с
/*
и заканчивая*/
- однострочные комментарии , начинающиеся
//
и заканчивающиеся переводом строк в стиле Linux (LF,\n
)
Комментарии внутри строк не должны быть удалены. Для этой задачи вам нужно только рассмотреть "
строки -delimited. В частности, вы можете игнорировать возможность '
-ограниченных литералов символов. Вы также можете игнорировать триграфы и продолжения строк ( /\<LF>*...
).
Примеры
Входные данные:
#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;
}
Выход:
#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;
}
Входные данные:
/*
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.*/
Выход:
#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
Матье Родик
источник
источник
printf("\"/* This will stay too */\"\n");
появилось в должен стать кодом?// this comment will be removed
которыми просто исчезли. Любое правило для этого?Ответы:
Сетчатка , 35 + 1 + 2 = 38 байт
Эта программа состоит из двух файлов, поэтому я включил 1-байтовое наказание за второй файл .
Это простая замена регулярных выражений с использованием разновидности .NET (хотя это будет работать так же в большинстве других разновидностей).
Идея состоит в том, чтобы сопоставить как комментарии, так и строки, но записывать соответствие только в том случае, если это была строка. При явном сопоставлении строк они пропускаются при поиске комментариев.
источник
preg_replace
.Коллекция компиляторов оболочки + coreutils + gcc, 31 байт
Этот ответ может показаться немного странным, но я не видел ничего, что бы конкретно запретило его в этом вопросе.
Вместо использования неуклюжих регулярных выражений, почему бы не использовать инструмент, созданный для этой работы. Не должно быть проблем с получением правильных результатов:
Принимает ввод из STDIN и вывод в STDOUT. Обычно
ccp
выполняется вся предварительная обработка (файлы заголовков, раскрытие макросов, удаление комментариев и т. Д.), Но с этой-fpreprocessed
опцией большинство шагов пропускается, но комментарии по-прежнему удаляются. Кроме того, cpp добавляет строку, аналогичную# 1 "<stdin>"
началу вывода, поэтомуsed
она должна быть удалена.источник
.i
,.ii
или.mi
". Вы могли бы сохранить некоторые байты, сохранив файл в чем-то вроде,a.i
вместо использования флага?cat>i.i;cpp -o- i.i|sed 1d
будет эквивалентным. Но происходит полная предварительная обработка (например, вставляется полное содержимое stdio.h). Возможная ошибка gcc ??? Ну, возможно, я проверю исходники cpp, когда получу mo '.|sed 1d
если добавите эту-P
опцию. Обратите внимание, что (как позволяет вопрос), поскольку он ожидает предварительно обработанный код, он не будет правильно обрабатывать триграфы или продолжения строк.Java 365
Ungolfed
источник
Python2 -
163134 байтаКак вы можете видеть здесь , регулярное выражение состоит из 2 чередующихся групп захвата. Первый захватывает все цитируемые строки. На втором все комментарии.
Все, что нам нужно сделать, это удалить все, захваченное 2-й группой.
Пример:
источник
Реболь - 151
Ungolfed + некоторые аннотации:
источник
PHP
Преобразование ответа @Martin Ender для php:
теперь
$str
потерял одно- и многострочные комментарии. Это полезно для удаления комментариев в данных JSON перед передачей вjson_decode()
.источник
C # (262 символа):
От этого очень хорошего ответа SO :
источник
JS (ES6), 47 символов (wip)
ДЕМО: http://codepen.io/anon/pen/dPEMro
Вдохновлен моими минифайерами с кодом-гольфом: http://xem.github.io/miniMinifier/
еще не обрабатывает комментарии в строках ...
Мне любопытно посмотреть, возможно ли достичь этого в регулярных выражениях JS.
источник