Cel
Używając wybranego języka programowania, napisz najkrótszy program, aby wyeliminować komentarze z ciągu znaków reprezentującego program C.
Wejście
Ciąg może być traktowany jako dowolna forma wprowadzania, ale może być również traktowany jako zmienna.
Instrukcje
Należy usunąć dwa różne rodzaje komentarzy:
- komentarze wielowierszowe , zaczynające się
/*
i kończące na*/
- komentarze jednowierszowe , zaczynające się
//
i kończące na łamaniu wierszy w stylu Linux (LF\n
)
Komentarze w ciągach nie mogą być usuwane. Na potrzeby tego wyzwania wystarczy rozważyć "
-delimitowane ciągi. W szczególności możesz zignorować możliwość '
literałów znakowych. Możesz także zignorować trygrafy i kontynuacje linii ( /\<LF>*...
).
Przykłady
Wejście:
#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;
}
Wynik:
#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;
}
Wejście:
/*
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.*/
Wynik:
#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
źródło
źródło
printf("\"/* This will stay too */\"\n");
pojawiło, powinno stać się kodem?// this comment will be removed
. Jakaś reguła?Odpowiedzi:
Siatkówka , 35 + 1 + 2 = 38 bajtów
Ten program składa się z dwóch plików, dlatego do drugiego pliku dołączyłem 1-bajtową karę .
Jest to prosta zamiana wyrażenia regularnego przy użyciu smaku .NET (chociaż działałoby to tak samo w większości innych smaków).
Chodzi o to, aby dopasować zarówno komentarze, jak i ciągi, ale zapisz dopasowanie tylko, jeśli był to ciąg. Przez wyraźne dopasowanie ciągów są one pomijane podczas wyszukiwania komentarzy.
źródło
preg_replace
.Kolekcja kompilatora Shell + coreutils + gcc, 31 bajtów
Ta odpowiedź może wydawać się nieco luźna, ale nie widziałem niczego specjalnie zakazującego jej w pytaniu.
Zamiast używać niezdarnych wyrażeń regularnych, dlaczego nie skorzystać z narzędzia, które zostało zbudowane dla tego zadania. Nie powinno mieć problemu z podaniem poprawnych wyników:
Pobiera dane wejściowe ze STDIN i dane wyjściowe do STDOUT. Zwykle
ccp
wykonuje wszystkie wstępne przetwarzanie (pliki nagłówków, rozwijanie makr, usuwanie komentarzy itp.), Ale z tą-fpreprocessed
opcją pominie większość kroków, ale nadal usunie komentarze. Ponadto cpp dodaje wiersz podobny# 1 "<stdin>"
do początku danych wyjściowych, więcsed
istnieje, aby go usunąć.źródło
.i
,.ii
lub.mi
”. czy możesz zapisać niektóre bajty, zapisując plik w coś podobnegoa.i
zamiast używać flagi?cat>i.i;cpp -o- i.i|sed 1d
będzie równoważne. Następuje jednak pełne przetwarzanie wstępne (np. Wstawiana jest pełna zawartość pliku stdio.h). Możliwy błąd GCC? Może sprawdzę źródło cpp, kiedy dostanę mo.|sed 1d
dodania-P
. Zwróć uwagę, że (jak pozwala na to pytanie), ponieważ oczekuje na wstępnie przetworzony kod, nie będzie poprawnie obsługiwał kaligrafii ani kontynuacji linii.Java 365
Nie golfił
źródło
Python2 -
163134 bajtyJak widać tutaj , wyrażenie regularne składa się z 2 naprzemiennych grup przechwytywania. Pierwszy przechwytuje wszystkie cytowane ciągi. Drugi wszystkie komentarze.
Wszystko, co musimy zrobić, to usunąć wszystko przechwycone przez 2. grupę.
Przykład:
źródło
Rebol - 151
Niegolfowany + kilka adnotacji:
źródło
PHP
Konwertowanie odpowiedzi Martina Endera na php:
teraz
$str
stracił komentarze jedno- i wieloliniowe. Jest to przydatne do usuwania komentarzy w danych JSON przed karmieniemjson_decode()
.źródło
C # (262 znaków):
Z tej bardzo dobrej odpowiedzi SO :
źródło
JS (ES6), 47 znaków (czyszczenie)
DEMO: http://codepen.io/anon/pen/dPEMro
Zainspirowany moimi kodegolfowymi minifierami: http://xem.github.io/miniMinifier/
nie obsługuje jeszcze komentarzy w ciągach ...
Jestem ciekawy, czy można to osiągnąć w wyrażeniach regularnych JS.
źródło