इनपुट के रूप में एक C++ प्रोग्राम दिया गया है, उससे टिप्पणियाँ हटाएं। 'source' एक वेक्टर है जहां सोर्स कोड की i-वीं लाइन source[i] है। यह सोर्स कोड स्ट्रिंग को न्यूलाइन कैरेक्टर \n से विभाजित करने का परिणाम दर्शाता है। C++ में, हम दो प्रकार की टिप्पणियाँ बना सकते हैं, यानी, लाइन टिप्पणियाँ, ब्लॉक टिप्पणियाँ।
स्ट्रिंग '\\' लाइन टिप्पणी को दर्शाता है, जिसका अर्थ है कि इसके दाईं ओर का स्ट्रिंग प्रोग्राम द्वारा नजरअंदाज किया जाएगा।
स्ट्रिंग '/* और */' एक मल्टीलाइन टिप्पणी है जो '/*' से शुरू होकर '*/' तक के स्ट्रिंग को नजरअंदाज करने का प्रतिनिधित्व करती है।
पहली उपयोगी टिप्पणी दूसरों पर पूर्वता लेती है: यदि स्ट्रिंग // ब्लॉक टिप्पणी में आती है, तो इसे नजरअंदाज किया जाता है। इसी तरह, यदि स्ट्रिंग /* लाइन या ब्लॉक टिप्पणी में आती है, तो इसे भी नजरअंदाज किया जाता है। यदि टिप्पणियाँ हटाने के बाद कोड की एक निश्चित लाइन खाली है, तो आपको उस लाइन को आउटपुट नहीं करना चाहिए - उत्तर सूची में प्रत्येक स्ट्रिंग गैर-खाली होगी।
उदाहरण के लिए -
इनपुट-1 -
source = ["/*Test program */", "int main()", "{ ", " // variable declaration ", "int a, b, c;", "/* This is a test", " multiline ", " comment for ", " testing */", "a = b + c;", "}"]
लाइन दर लाइन कोड इस प्रकार है:
/*Test program */
int main() {
// variable declaration
int a, b, c;
/* This is a test multiline comment for testing */
a = b + c;
}
आउटपुट -
["int main()","{ "," ","int a, b, c;","a = b + c;","}"]
लाइन दर लाइन कोड इस प्रकार है:
int main() /// मुख्य फंक्शन {
int a, b, c;
a = b + c;
}
व्याख्या - स्ट्रिंग /* का अर्थ है एक मल्टीलाइन टिप्पणी, जिसमें लाइन 1 और लाइन 6-9 शामिल हैं। स्ट्रिंग // लाइन 4 को टिप्पणी के रूप में दर्शाता है।
इस प्रॉब्लम को हल करने का दृष्टिकोण
हम एक आदर्श कंपाइलर की तरह स्ट्रिंग को लाइन दर लाइन पार्स करेंगे। जब हम // या '/*' का सामना करेंगे तो हम इन ब्लॉक कोट्स के बीच और बाद के सभी वर्णों को नजरअंदाज कर देंगे।
एक फंक्शन removeString(vector<string>& source) सोर्स कोड को इनपुट के रूप में लेता है और उसकी टिप्पणियाँ हटाने के बाद कोड लौटाता है।
एक बूलियन वेरिएबल कमेंट को false के रूप में इनिशियलाइज़ किया जाता है, जो जांचेगा कि वर्णों का विशेष ब्लॉक या वर्ण टिप्पणी है या नहीं।
यदि हम एक ब्लॉक टिप्पणी शुरू करते हैं और हम ब्लॉक में नहीं हैं, तो हम अगले दो वर्णों को छोड़ देंगे और उस विशेष ब्लॉक में अपनी स्थिति बदल देंगे।
यदि हम एक ब्लॉक टिप्पणी समाप्त करते हैं और हम ब्लॉक में हैं, तो हम अगले दो वर्णों को छोड़ देंगे और अपनी स्थिति को ब्लॉक में नहीं होने के लिए बदल देंगे।
यदि हम एक लाइन टिप्पणी शुरू करते हैं और ब्लॉक में नहीं हैं, तो हम लाइन के बाकी हिस्से को नजरअंदाज कर देंगे।
यदि हम ब्लॉक टिप्पणी में नहीं हैं (और यह टिप्पणी की शुरुआत नहीं थी), तो हम उस वर्ण को रिकॉर्ड करेंगे जिस पर हम हैं।
यदि हम प्रत्येक लाइन के अंत में ब्लॉक में नहीं हैं, तो हम लाइन को रिकॉर्ड करेंगे।
एल्गोरिदम O(source) समय जटिलता में चलता है। सोर्स इनपुट स्ट्रिंग है।
उदाहरण
#include <bits/stdc++.h>
using namespace std;
vector<string> removeComments(vector<string>& source) {
vector<string> ans;
string s;
bool comment = false;
for (int i = 0; i < source.size(); i++) {
for (int j = 0; j < source[i].size(); j++) {
if (!comment && j + 1 < source[i].size() && source[i][j] == '/' && source[i][j+1] == '/')
break;
else if (!comment && j + 1 < source[i].size() && source[i][j] == '/' && source[i][j+1] == '*')
comment = true, j++;
else if (comment && j + 1 < source[i].size() && source[i][j] == '*' && source[i][j+1] == '/')
comment = false, j++;
else if (!comment)
s.push_back(source[i][j]);
}
if (!comment && s.size()) ans.push_back(s), s.clear();
}
return ans;
}
int main() {
vector<string> source = {"/*Test program */", "int main()", "{ ", " // variable declaration ", "int a, b, c;", "/* This is a test", " multiline ", " comment for ", " testing */", "a = b + c;", "}"};
vector<string> res = removeComments(source);
for (auto x : res) {
cout << x;
}
return 0;
}
आउटपुट
["int main()","{ "," ","int a, b, c;","a = b + c;","}"]
लाइन दर लाइन कोड इस प्रकार है:
int main() {
int a, b, c;
a = b + c;
}