স্ট্রিং থেকে একক লাইন এবং মাল্টলাইন মন্তব্যগুলি সরান


19

লক্ষ্য

আপনার পছন্দসই প্রোগ্রামিং ভাষা ব্যবহার করে, একটি সি প্রোগ্রামের প্রতিনিধিত্বকারী স্ট্রিং থেকে মন্তব্যগুলি মুছে ফেলার জন্য সংক্ষিপ্ততম প্রোগ্রামটি লিখুন ।


ইনপুট

স্ট্রিংটি যে কোনও ধরণের ইনপুট হিসাবে নেওয়া যেতে পারে তবে এটি ভেরিয়েবল হিসাবেও নেওয়া যেতে পারে।


নির্দেশনা

দুটি ভিন্ন ধরণের মন্তব্য মুছে ফেলা হবে:

  • মাল্টলাইন মন্তব্য , এর সাথে শুরু /*এবং শেষ করা*/
  • //লিনাক্স-স্টাইলের লাইন ব্রেক (এলএফ, \n) দিয়ে শুরু এবং শেষ হওয়াতে একক লাইন মন্তব্যগুলি

স্ট্রিংয়ের মধ্যে থাকা মন্তব্যগুলি মুছতে হবে না। এই চ্যালেঞ্জের উদ্দেশ্যে, আপনাকে কেবল- "সীমাবদ্ধ স্ট্রিংগুলি বিবেচনা করতে হবে । বিশেষত, আপনি '-Dilimited অক্ষর অক্ষরগুলির সম্ভাবনাটিকে উপেক্ষা করতে পারেন । আপনি ট্রিগ্রাফ এবং লাইন ধারাবাহিকতা ( /\<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;
}

1
কোথা থেকে কোডটিতে printf("\"/* This will stay too */\"\n");হাজির হওয়া উচিত ?
manatwork

ওফস, দুঃখিত ... এটি কেবল একটি টাইপ ছিল। দেখার জন্য ধন্যবাদ!
ম্যাথিউ রডিক

হোয়াইটস্পেস গণনা করা হয়? সামনে 4 টি স্পেস রয়েছে // this comment will be removedযা কেবল অদৃশ্য হয়ে গেছে। তার জন্য কোনও নিয়ম?
manatwork

1
আমি তালিকাভুক্ত কোনও ভাষাও জানি না যে ভাল, তাই আরও কিছু উদাহরণ সহ একরকম স্ব-অন্তর্ভুক্ত বৈশিষ্ট্যটি দুর্দান্ত be
জাগারব

@ মান্যাটওয়ার্ক: হোয়াইটস্পেস অপসারণ বাধ্যতামূলক নয়
ম্যাথিউ রডিক

উত্তর:


11

রেটিনা , 35 + 1 + 2 = 38 বাইট

এই প্রোগ্রামটি দুটি ফাইল নিয়ে গঠিত, তাই আমি দ্বিতীয় ফাইলের জন্য 1 বাইট জরিমানা অন্তর্ভুক্ত করেছি ।

//.*|/\*[\s\S]*?\*/|("(\\.|[^"])*")
$1

এটি নেট রিভার্স ব্যবহার করে একটি সাধারণ রেইগেক্স রিপ্লেসমেন্ট (যদিও এটি অন্যান্য স্বাদে একই কাজ করবে)।

মতামত এবং স্ট্রিং উভয়ই মিলানোর ধারণা, তবে এটি যদি স্ট্রিং হয় তবে কেবল ম্যাচটি আবার লিখুন। স্ট্রিংগুলিকে স্পষ্টভাবে মিলিয়ে, মন্তব্যগুলি অনুসন্ধান করার সময় এগুলি এড়িয়ে যায় are


1
এটি পিএইচপি-তে আশ্চর্যজনকভাবে ভালভাবে কাজ করে: regex101.com/r/kB5kA4/1
ইসমাইল মিগুয়েল

1
@ ইসমাইল মিগুয়েল হ্যাঁ, আমি নির্দিষ্ট কোনও বৈশিষ্ট্য ব্যবহার করিনি। নেট বেছে নেওয়ার একমাত্র কারণ হ'ল রেটিনা আমাকে পছন্দ করার মতো কোনওরকম ওভারহেড ছাড়াই কেবলমাত্র রেইগেক্স-প্রোগ্রাম লিখতে দেয় preg_replace
মার্টিন এন্ডার

আমি এটার ব্যাপারে অবগত. আপনি এটি আগে অনেক ব্যবহার করেছেন। আমি যদি সঠিক হয় তবে এটি আপনার দ্বারা তৈরি হয়েছিল। এটি ছিল কৌতূহলের জন্য। এবং এছাড়াও, আপনার এখন একটি পরীক্ষা-স্যুট রয়েছে যেখানে আপনি এই প্রশ্নের যে কোনও পরিবর্তন আসবে তা পরীক্ষা করতে পারবেন (আমি অনেকের পূর্বাভাস দিয়েছি)
ইসমাইল মিগুয়েল

নিস! এই নিয়মিত প্রকাশটি এমনকি অন্যান্য প্রোগ্রামিং ভাষার সাথেও কাজ করে (যখন স্ল্যাশগুলি এড়িয়ে যায়)।
ম্যাথিউ রডিক

আমি আপনার রেগেক্স কৌশলটি ব্যবহার করি যার সাথে আমি কাজ করি তৃতীয় পক্ষের লাইব্রেরিটি উন্নত করতে: ডোজো টুলকিট
mbomb007

15

শেল + কোর্টিলস + জিসিসি সংকলক সংগ্রহ, 31 বাইট

এই উত্তরটি কিছুটা লুপফুলি মনে হতে পারে তবে আমি বিশেষভাবে প্রশ্নটিতে এটি নিষিদ্ধ করার কিছুই দেখিনি।

আনাড়ি নিয়মিত এক্সপ্রেশন ব্যবহার না করে, কেন কাজের জন্য তৈরি করা সরঞ্জামটি ব্যবহার করবেন না। সঠিক ফলাফল দিতে কোনও সমস্যা হওয়া উচিত নয়:

cpp -fpreprocessed -o- -|sed 1d

STDIN এবং আউটপুট STDOUT এ ইনপুট নেয়। সাধারণত ccpসমস্ত প্রিপ্রোসেসিং (শিরোনাম ফাইল, ম্যাক্রো সম্প্রসারণ, মন্তব্য অপসারণ, ইত্যাদি) -fpreprocessedকরবে তবে বিকল্পের সাহায্যে এটি বেশিরভাগ পদক্ষেপ এড়িয়ে যাবে, তবে এটি মন্তব্যগুলি সরিয়ে ফেলবে। এছাড়াও, সিপিপি # 1 "<stdin>"আউটপুট শুরুর মতো একটি লাইন যুক্ত করে, তাই এটি sedমুছতে পারা যায়।


1
"-fpreprocessed অন্তর্নিহিত হলে ইনপুট ফাইল এক্সটেনশন এক হয়েছে .i, .iiবা .mi"। আপনি কি a.iপতাকা ব্যবহারের পরিবর্তে ফাইলটি সংরক্ষণ করে কিছু বাইট সংরক্ষণ করতে পারবেন ?
মার্টিন এন্ডার

@ মার্টিনব্যাটনার হ্যাঁ, আমি লক্ষ্য করেছি যে ম্যানুয়ালটিতেও। সুতরাং আমি cat>i.i;cpp -o- i.i|sed 1dসমমানের মতো কিছু আশা করব । তবে পূর্ণ প্রিপ্রোসেসিং নিশ্চিত হয় (উদাহরণস্বরূপ, stdio.h এর সম্পূর্ণ সামগ্রী contentsোকানো হয়)। সম্ভাব্য জিসিসি বাগ ??? আমি যখন একটি mo পাই তখন সম্ভবত আমি সিপিপি উত্সটি পরীক্ষা করব।
ডিজিটাল ট্রমা

আপনি বিকল্পটি |sed 1dযুক্ত করলে আপনি এটি সরাতে পারেন -P। মনে রাখবেন (যেমন প্রশ্ন দ্বারা অনুমতিপ্রাপ্ত), যেমন এটি প্রাক প্রক্রিয়াজাত কোডটি প্রত্যাশা করে, এটি ট্রাইগ্রাফ বা লাইন ধারাবাহিকতা সঠিকভাবে পরিচালনা করবে না।
sch

3

জাভা 365

String a(String s){String o="";int m=1;for(int i=0;i<s.length();i++){String u=s.substring(i,Math.min(i+2,s.length()));char c=s.charAt(i);switch(m){case 1:m=u.equals("/*")?5:u.equals("//")?4:c=='"'?3:1;break;case 3:m=c=='"'?1:c=='\\'?2:3;break;case 2:m=3;break;case 4:m=c=='\n'?1:4;continue;case 5:m=u.equals("*/")?1:5;i+=m==1?1:0;continue;}o+=m<4?c:"";}return o;}}

Ungolfed

public static final int DEFAULT = 1;
public static final int ESCAPE = 2;
public static final int STRING = 3;
public static final int ONE_LINE_COMMENT = 4;
public static final int MULTI_LINE_COMMENT = 5;

String clear(String s) {
    String out = "";
    int mod = DEFAULT;
    for (int i = 0; i < s.length(); i++) {
        String substring = s.substring(i, Math.min(i + 2 , s.length()));
        char c = s.charAt(i);
        switch (mod) {
            case DEFAULT: // default
                mod = substring.equals("/*") ? MULTI_LINE_COMMENT : substring.equals("//") ? ONE_LINE_COMMENT : c == '"' ? STRING : DEFAULT;
                break;
            case STRING: // string
                mod = c == '"' ? DEFAULT : c == '\\' ? ESCAPE : STRING;
                break;
            case ESCAPE: // string
                mod = STRING;
                break;
            case ONE_LINE_COMMENT: // one line comment
                mod = c == '\n' ? DEFAULT : ONE_LINE_COMMENT;
                continue;
            case MULTI_LINE_COMMENT: // multi line comment
                mod = substring.equals("*/") ? DEFAULT : MULTI_LINE_COMMENT;
                i += mod == DEFAULT ? 1 : 0;
                continue;
        }
        out += mod < 4 ? c : "";
    }

    return out;
}

2

পাইথন 2 - 163 134 বাইট

import re
def f(s):
 for x in re.findall(r'("[^\n]*"(?!\\))|(//[^\n]*$|/(?!\\)\*[\s\S]*?\*(?!\\)/)',s,8):s=s.replace(x[1],'')
 print s

আপনি এখানে দেখতে পাচ্ছেন , রেজেক্সে 2 টি পর্যায়ক্রমে ক্যাপচারিং গ্রুপ রয়েছে। প্রথমটি সমস্ত উদ্ধৃত স্ট্রিং ক্যাপচার করে। দ্বিতীয়টি সমস্ত মন্তব্য।

আমাদের যা করার দরকার তা হ'ল ২ য় গোষ্ঠীর দ্বারা ক্যাপচারিত সমস্ত কিছু সরিয়ে ফেলা হচ্ছে।

উদাহরণ:

Python 2.7.9 (default, Dec 11 2014, 04:42:00) 
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> def f(s):
...  for x in re.findall(r'("[^\n]*"(?!\\))|(//[^\n]*$|/(?!\\)\*[\s\S]*?\*(?!\\)/)',s,8):s=s.replace(x[1],'')
...  print s
... 
>>> code = r'''#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;
... }
... /*
...     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.*/'''
>>> f(code)
#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;
}

#include <string>
int main(int argc, char** argv)
{
    string foo = "";

    int butNotThis = 42;

    int bar = 4 * 3; 
    return 0;
}

1

রিবোল - 151

f: func[t][Q:{"}W: complement charset Q parse t[any[[Q any["\\"|"\"Q | W]Q]|[a:[["//"to[lf | end]]|["/*"thru"*/"]]b:(remove/part a b):a skip]| skip]]t]

অবহেলিত + কিছু টিকা:

f: func [t] [
    Q: {"}
    W: complement charset Q     ;; any char thats not a double quote

    ; rule to parse t (c program) - it can be ANY of 
    ;     1. string 
    ;     2. OR comment (if so then remove)
    ;     3. OR pass thru

    parse t [
        any [
            ;; 1. String rule
            [Q any ["\\" | "\" Q | W] Q]

            ;; 2. OR comments rule
            | [
                a:  ;; mark beginning of match
                [
                    ;;    // comment    OR  /* comment */
                    ["//" to [lf | end]] | ["/*" thru "*/"]
                ]
                b:  ;; mark end of match 
                (remove/part a b) :a skip   ;; remove comment
            ]

            ;; 3. OR allow thru (so not a String or Comment)
            | skip
        ]
    ]

    t
]

1

পিএইচপি

পিএইচপি-র জন্য @ মার্টিন এন্ডারের উত্তর রূপান্তর করা:

$str = preg_replace_callback('/\/\/.*|\/\*[\s\S]*?\*\/|("(\\.|[^"])*")/m', 
  function($matches){
     if(\is_array($matches) && (\count($matches) > 1)){
        return $matches[1];
     }else{
        return '';
     }
  }, $str);

এখন $strএকক এবং বহু-লাইন মন্তব্য হারিয়েছে। এটি খাওয়ানোর আগে JSON ডেটাতে মন্তব্যগুলি সরিয়ে ফেলার জন্য দরকারী json_decode()


আপনি কোনও টেরিনারি অপারেটর ব্যবহার করে বাইটস গণনা হ্রাস করতে পারেন?
ম্যাথিউ রডিক

0

সি # (২2২ টি চর):

এই খুব ভাল SO উত্তর থেকে:

string a(string i){return Regex.Replace(i, @"/\*(.*?)\*/|//(.*?)\r?\n|""((\\[^\n]|[^""\n])*)""|@(""[^""]*"")+", m => { var v = m.Value; if (v.StartsWith("/*") || v.StartsWith("//")) return v.StartsWith("//") ? "\r\n" : ""; return v; }, RegexOptions.Singleline);

-1

জেএস (ইএস 6), 47 টি অক্ষর (মুছা)

ডেমো: http://codepen.io/anon/pen/dPEMro

a=b=>b.replace(/(\/\*[^]*?\*\/|\/\/.*)\n?/g,"")

আমার কোডগল্ড মিনিফায়ার দ্বারা অনুপ্রাণিত: http://xem.github.io/miniMinifier/

মন্তব্যগুলিকে স্ট্রিংয়ে এখনও পরিচালনা করে না ...

আমি জানতে আগ্রহী যে জেএস রেজিজেসে এটি অর্জন সম্ভব কিনা।


যদি এই উত্তরটি প্রয়োজনীয়তাগুলি পূরণ করে না, তবে তা হয় স্থির বা মুছে ফেলা উচিত।
mbomb007
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.