Tor
Schreiben Sie in der Programmiersprache Ihrer Wahl das kürzeste Programm , um Kommentare aus einer Zeichenfolge zu entfernen, die ein C-Programm darstellt.
Eingang
Die Zeichenfolge kann als eine beliebige Form der Eingabe verwendet werden, sie kann jedoch auch als Variable verwendet werden.
Anleitung
Zwei verschiedene Arten von Kommentaren sind zu entfernen:
- Mehrzeilige Kommentare , beginnend mit
/*
und endend mit*/
- Einzeilige Kommentare , beginnend mit
//
und endend mit Zeilenumbrüchen im Linux-Stil (LF,\n
)
Kommentare in Strings dürfen nicht gelöscht werden. Für diese Herausforderung müssen Sie nur "
-begrenzte Zeichenfolgen berücksichtigen . Insbesondere können Sie die Möglichkeit von '
Literalen mit -begrenzten Zeichen ignorieren . Sie können auch Trigraphen und Linienfortsetzungen ignorieren ( /\<LF>*...
).
Beispiele
Eingang:
#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;
}
Ausgabe:
#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;
}
Eingang:
/*
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.*/
Ausgabe:
#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
quelle
quelle
printf("\"/* This will stay too */\"\n");
erschien in der werden soll Code?// this comment will be removed
denen gerade verschwunden ist. Irgendeine Regel dafür?Antworten:
Retina , 35 + 1 + 2 = 38 Bytes
Dieses Programm besteht aus zwei Dateien, daher habe ich eine 1-Byte-Strafe für die zweite Datei eingefügt .
Dies ist ein einfacher regulärer Ausdruck, der die .NET-Variante verwendet (obwohl dies in den meisten anderen Varianten genauso funktioniert).
Die Idee ist, sowohl Kommentare als auch Zeichenfolgen abzugleichen, aber die Übereinstimmung nur dann zurückzuschreiben, wenn es sich um eine Zeichenfolge handelte. Wenn die Zeichenfolgen explizit abgeglichen werden, werden sie bei der Suche nach Kommentaren übersprungen.
quelle
preg_replace
.Shell + Coreutils + Gcc-Compiler-Auflistung, 31 Bytes
Diese Antwort mag ein bisschen lückenhaft erscheinen, aber ich habe in der Frage nichts spezielles gesehen, was sie verbietet.
Verwenden Sie nicht umständliche reguläre Ausdrücke, sondern das für den Job erstellte Tool. Es sollte kein Problem geben korrekte Ergebnisse:
Übernimmt die Eingabe von STDIN und gibt sie an STDOUT aus. Normalerweise
ccp
wird die gesamte Vorverarbeitung durchgeführt (Header-Dateien, Makro-Erweiterung, Entfernen von Kommentaren usw.), aber mit der-fpreprocessed
Option werden die meisten Schritte übersprungen, aber es werden weiterhin Kommentare entfernt. Außerdem fügt cpp eine Zeile wie# 1 "<stdin>"
am Anfang der Ausgabe hinzu, damitsed
diese gelöscht werden kann.quelle
.i
,.ii
oder.mi
". könnten Sie in der Lage sein, einige Bytes zu speichern, indem Sie die Datei in etwas speichern,a.i
anstatt das Flag zu verwenden?cat>i.i;cpp -o- i.i|sed 1d
gleichwertig ist. Es erfolgt jedoch eine vollständige Vorverarbeitung (z. B. wird der gesamte Inhalt von stdio.h eingefügt). Möglicher gcc Bug ??? Naja, vielleicht überprüfe ich die cpp-Quelle, wenn ich einen mo 'bekomme.|sed 1d
wenn Sie die-P
Option hinzufügen . Beachten Sie, dass (wie in der Frage angegeben) vorverarbeiteter Code nicht ordnungsgemäß mit Trigraphen oder Linienfortsetzungen verarbeitet werden kann.Java 365
Ungolfed
quelle
Python2 -
163134 BytesWie Sie hier sehen können , besteht der Regex aus 2 abwechselnden Erfassungsgruppen. Der erste erfasst alle angegebenen Zeichenfolgen. Der zweite alle Kommentare.
Alles, was wir tun müssen, ist, alles zu entfernen, was von der 2. Gruppe erfasst wurde.
Beispiel:
quelle
Rebol - 151
Ungolfed + einige Anmerkungen:
quelle
PHP
@Martin Enders Antwort für PHP konvertieren:
hat jetzt
$str
ein- und mehrzeilige Kommentare verloren. Dies ist nützlich, um Kommentare in JSON-Daten zu entfernen, bevor sie an gesendet werdenjson_decode()
.quelle
C # (262 Zeichen):
Aus dieser sehr guten SO Antwort:
quelle
JS (ES6), 47 Zeichen (wip)
DEMO: http://codepen.io/anon/pen/dPEMro
Inspiriert von meinen Codegolf-Minibändern: http://xem.github.io/miniMinifier/
behandelt noch keine Kommentare in Strings ...
Ich bin gespannt, ob das mit JS-Regexen möglich ist.
quelle