Tujuan
Dengan menggunakan bahasa pemrograman pilihan Anda, tulislah program terpendek untuk menghilangkan komentar dari string yang mewakili program C.
Memasukkan
String dapat diambil sebagai bentuk input apa pun, tetapi juga dapat dianggap sebagai variabel.
Instruksi
Dua jenis komentar harus dihapus:
- komentar multiline , dimulai dengan
/*
dan diakhiri dengan*/
- komentar satu baris , dimulai dengan
//
dan diakhiri dengan jeda baris bergaya Linux (LF,\n
)
Komentar dalam string tidak harus dihapus. Untuk tujuan tantangan ini, Anda hanya perlu mempertimbangkan "
string -ditedit. Secara khusus, Anda dapat mengabaikan kemungkinan '
karakter literal -delimited. Anda juga dapat mengabaikan trigraph dan garis lanjutan ( /\<LF>*...
).
Contohnya
Memasukkan:
#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;
}
Keluaran:
#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;
}
Memasukkan:
/*
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.*/
Keluaran:
#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
sumber
sumber
printf("\"/* This will stay too */\"\n");
muncul di harus menjadi kode?// this comment will be removed
yang hilang begitu saja. Adakah aturan untuk itu?Jawaban:
Retina , 35 + 1 + 2 = 38 byte
Program ini terdiri dari dua file, oleh karena itu saya telah memasukkan penalti 1 byte untuk file kedua .
Ini adalah penggantian regex sederhana, menggunakan rasa .NET (meskipun ini akan bekerja sama di sebagian besar rasa lain).
Idenya adalah untuk mencocokkan komentar dan string, tetapi hanya menulis pertandingan kembali jika itu adalah string. Dengan mencocokkan string secara eksplisit, mereka dilewati saat mencari komentar.
sumber
preg_replace
.Koleksi shell + coreutils + gcc, 31 byte
Jawaban ini mungkin tampak agak loopholey, tetapi saya tidak melihat sesuatu yang secara khusus melarangnya dalam pertanyaan.
Daripada menggunakan ekspresi reguler yang canggung, mengapa tidak menggunakan alat yang dibangun untuk pekerjaan itu. Seharusnya tidak ada masalah dalam memberikan hasil yang benar:
Mengambil input dari STDIN dan output ke STDOUT. Biasanya
ccp
akan melakukan semua preprocessing (file header, ekspansi makro, penghapusan komentar, dll), tetapi dengan-fpreprocessed
opsi ini, ia akan melewati sebagian besar langkah, tetapi masih akan menghapus komentar. Selain itu, cpp menambahkan garis seperti# 1 "<stdin>"
ke awal output, sehinggased
ada untuk menghapusnya.sumber
.i
,.ii
atau.mi
". mungkin Anda bisa menyimpan beberapa byte dengan menyimpan file di sesuatu sepertia.i
daripada menggunakan flag?cat>i.i;cpp -o- i.i|sed 1d
setara. Tetapi proses preproses penuh terjadi (misalnya, isi stdio.h lengkap dimasukkan). Kemungkinan bug gcc ??? Yah mungkin saya akan memeriksa sumber cpp ketika saya mendapatkan mo '.|sed 1d
jika Anda menambahkan-P
opsi. Perhatikan bahwa (sebagaimana diizinkan oleh pertanyaan), karena ia mengharapkan kode pra-diproses, ia tidak akan menangani trigraph atau kelanjutan garis dengan benar.Java 365
Tidak disatukan
sumber
Python2 -
163134 byteSeperti yang Anda lihat di sini , regex terdiri dari 2 kelompok penangkapan bergantian. Yang pertama menangkap semua string yang dikutip. Yang kedua semua komentar.
Yang perlu kita lakukan adalah menghapus semua yang ditangkap oleh grup ke-2.
Contoh:
sumber
Rebol - 151
Tidak dikumpulkan + beberapa anotasi:
sumber
PHP
Konversi jawaban @Martin Ender untuk php:
sekarang
$str
telah kehilangan komentar single dan multi-line. Ini berguna untuk menghapus komentar dalam data JSON sebelum diumpankan kejson_decode()
.sumber
C # (262 karakter):
Dari jawaban SO yang sangat bagus ini :
sumber
JS (ES6), 47 karakter (penghapusan)
DEMO: http://codepen.io/anon/pen/dPEMro
Terinspirasi oleh minifiers codegolf saya: http://xem.github.io/miniMinifier/
belum menangani komentar di string ...
Saya ingin tahu apakah mungkin untuk mencapai itu di JS regexes.
sumber