ডেড কোড নির্মূলকরণ


20

ডেড কোড সেখানে কিছু করছে না, আমাদের কখনই মৃত্যুর মুখোমুখি হয়ে তা দেখে কখনই মৃত্যুদন্ড কার্যকর করা হবে না ... তবে আজ আমরা প্রতিশোধ নিতে পারি।

সবিস্তার বিবরণী

ইনপুটটি একাধিক স্ট্রিং হবে।

প্রতিটি লাইন হয় একটি অ্যাসাইনমেন্ট বা একটি এক্সপ্রেশন হতে পারে ।

নিয়োগ

একটি অ্যাসাইনমেন্ট সেই ফর্মের <name> = numberযেখানে নাম হ'ল অক্ষর, আন্ডারস্কোর এবং সংখ্যাগুলির অনুক্রম, তবে কোনও সংখ্যার সাথে শুরু হয় না।

চলকগুলি যে কোনও সময় নির্ধারিত হতে পারে।

অভিব্যক্তি

একটি অভিব্যক্তি ফর্ম হয় <var_name OR number> <operation> <var_name OR number> ...

একটি অভিব্যক্তি এর যে কোনও সমন্বয় হতে পারে:

  • ভেরিয়েবলগুলি ইতিমধ্যে সংজ্ঞায়িত
  • বেসিক পাটিগণিত অপারেটর +-*/
  • সংখ্যা (পূর্ণসংখ্যা)

প্রত্যাশিত আউটপুট

অপ্রয়োজনীয় অ্যাসাইনমেন্ট , অ্যাসাইনমেন্টগুলি যা এর পরে অনুসরণ করা কোনও এক্সপ্রেশন ব্যবহার করে না সেগুলি সরিয়ে আউটপুট করা উচিত । দয়া করে মনে রাখবেন বরাদ্দকরণ এছাড়াও অপ্রয়োজনীয় তৈরি করা যাবে যদি একটি অতিরিক্ত নিয়োগ একই পরিবর্তনশীল একটি সামনে সঞ্চালিত হয় অভিব্যক্তি পরিবর্তনশীল ব্যবহার মৃত্যুদন্ড কার্যকর করা হয়।

পরীক্ষার মামলা

ভিতরে

a = 10
a * 3

আউট

a = 10
a * 3

ভিতরে

foo = 8
2 - 1
a = 18

আউট

2 - 1

ভিতরে

a = 10
a = 8
b = 4
ab = 72  
b / 6
b + 1

আউট

b = 4
b / 6
b + 1

ভিতরে

a = 1
a = 2
a + 1

আউট

a = 2
a + 1

ভিতরে

FooBar1 = 0
Fuz__ = 8
Fuz__ / 1

আউট

Fuz__ = 8
Fuz__ / 1

ভিতরে

a = 1
a + 1
a = 2
a + 1

আউট

a = 1
a + 1
a = 2
a + 1

ভিতরে

a = 1
1 / 5 * 8 + 4

আউট

1 / 5 * 8 + 4

ভিতরে

a = 1
a + 1
a = 1
a + 1

আউট

a = 1
a + 1
a = 1
a + 1

ভিতরে

a = 7
5 / a

আউট

a = 7
5 / a

1
আপনি এই প্রবণতা বিশেষ করে কঠিন কেস যোগ উচিত: a = 1; a + 1; a = 1; a + 1;? যেখানে দ্বিতীয়টি a = 1বাতিল করা যেতে পারে কারণ aআগে একই মান ( 1) এ সেট করা হয়েছিল ।
ফ্লডেল

3
@ ফ্লোডেল না, মানগুলি দেখার দরকার নেই
ক্যারিডরক

@ ফ্লোডেল টেস্টকেস অন্তর্ভুক্ত করা হয়েছে
ক্যারিডর্ক

আপনার একটি টেস্ট কেস যুক্ত করা উচিত যেখানে অভিব্যক্তিতে ভেরিয়েবল ব্যবহার করা হয় তবে এক্সপ্রেশনটির প্রথম উপাদান হিসাবে নয়। অভিব্যক্তির শেষ সদস্য হিসাবে বিশেষত গুরুত্বপূর্ণ।
isaacg

@ আইসএইচজি কোনও ডেড কোড নেই, ভেরিতে যে কোনও জায়গা থাকতে পারে,
টেস্টকেস

উত্তর:


9

পিএইচপি - 197 বাইট

ফাংশন প্রতিটি লাইন বিপরীত ক্রমে এবং একের পর এক বিশ্লেষণ করে এবং ব্যবহৃত ভেরিয়েবলগুলির অ্যারে বজায় রেখে কাজ করে।

  • যদি সমান চরিত্র থাকে =লাইনে থাকে তবে এটি একটি কাজ।
    • এটি ভেরিয়েবলটি ব্যবহৃত হয়, অ্যাসাইনমেন্টটি কার্যকর এবং লাইনটি মুদ্রিত হয় তবে ভেরিয়েবলটি আর ব্যবহার করা হয় না বলে বিবেচিত হয়।
    • নাহলে কিছুই করবেন না।
  • অন্যথায়, লাইনটি একটি অভিব্যক্তি। আমরা প্রতিটি স্থানের পরে লাইনটি বিভক্ত করি এবং প্রতিটি চিহ্নকে ব্যবহৃত চলকগুলির তালিকায় যুক্ত করি। নম্বর ( 1,, 2…) এবং অপারেটর ( +,, -…) খুব যোগ করা হবে, তবে যেহেতু তারা বৈধ ভেরিয়েবলের নাম নয়, এটি কোনও সমস্যা নয়। লাইনটি অবশ্যই মুদ্রিত হয়।
function($c){$u=[];foreach(array_reverse(split('
',$c))as$l){if($p=strpos($l,'=')){if(!isset($u[$x=substr($l,0,$p-1)]))continue;
unset($u[$x]);}else$u+=array_flip(split(' ',$l));$f="
$l$f";}echo$f;}

নিখরচায় সংস্করণটি এখানে:

function removeDeadCode($code)
{
    $usedVariables = [];
    $finalCode = '';

    foreach (array_reverse(explode("\n", $code)) as $line)
    {
        if ($equalPosition = strpos($line, '='))
        {
            $variable = substr($line, 0, $equalPosition - 1);
            if (isset($usedVariables[$variable]))
            {
                $finalCode = "\n" . $line . $finalCode;
                unset($usedVariables[$variable]);
            }
        }
        else
        {
            $usedVariables += array_flip(explode(' ', $line));
            $finalCode = "\n" . $line . $finalCode;
        }
    }

    echo $finalCode;
}

7

রেটিনা , 45 বাইট

m`^(\w+) =.*\n(?=((?!\b\1\b)[^!])*(^\1 =|\Z))
<empty>

গণনা উদ্দেশ্যে, প্রতিটি লাইন পৃথক ফাইলে যায় (যেখানে <empty>খালি ফাইল থাকে) এবং\n একটি আসল লাইন ফিড (0x0A) দিয়ে প্রতিস্থাপন করা উচিত।

এটি ধরে নিয়েছে যে স্ট্রিংটি সর্বদা একটি লাইন ফিডের সাথে শেষ হবে।

যেহেতু এই রেজেক্স কোনও NET- নির্দিষ্ট বৈশিষ্ট্য ব্যবহার করে না, আপনি এটি regex101 এ পরীক্ষা করতে পারেন

ধারণাটি মোটামুটি সহজ: সমস্ত অ্যাসাইনমেন্টগুলি সরিয়ে ফেলুন যা থেকে আমরা ভেরিয়েবলের অন্য ব্যবহারটি পাস না করে একই ভেরিয়েবলের স্ট্রিংয়ের শেষের জন্য আরও একটি কার্য (সন্ধানের জন্য) খুঁজে পেতে পারি।


6

পাইথ, 40 বাইট

eMf|!}K\=eT&Jf}+dhceTK++dYdPT!}KeJ_.__.z

দীর্ঘ মনে হচ্ছে। আগামীকাল আমি এক বা দুটি বাইট সংরক্ষণ করতে পারি।

এটি অনলাইনে ব্যবহার করে দেখুন: বিক্ষোভ বা পরীক্ষার স্যুট

ব্যাখ্যা:

_.__.zবিপরীত ক্রমে ইনপুট লাইনের সমস্ত পোস্টফিক্স দেয়। উদাহরণস্বরূপ ইনপুট FooBar1 = 0; Fuz__ = 8; Fuz__ / 1তালিকা দেয়:

[['Fuz__ / 1', 'Fuz__ = 8', 'FooBar1 = 0'], 
 ['Fuz__ / 1', 'Fuz__ = 8']
 ['Fuz__ / 1']]

তারপরে আমি তালিকার উপাদানগুলির জন্য ফিল্টার করি T, যার =মধ্যে T(এক্সপ্রেশন) বা (অ্যাসাইনমেন্ট) এর শেষ উপাদানটি থাকে না Tযার মধ্যে ভেরিয়েবল নাম থাকে, এটি একটি এক্সপ্রেশন। এর পরে অবশিষ্ট উপাদানগুলির প্রত্যেকের একটি পৃথক লাইনে মুদ্রণ করুন।

eMf|!}K\=eT&Jf}+dhceTK++dYdPT!}KeJ_.__.z
                                      .z  all input lines
                                     _    reverse order
                                   ._     all prefixes
                                  _       reverse order
  f                                       filter for elements T, which satisfy:
      K\=                                   K = '='
    !}K  eT                                 '=' is not in T[-1]
   |                                        or
             f             PT                 filter for elements Y in T[:-1],
                                              which satisfy:
                 hceTK                          extract variable name of T[-1]
                                                with an additional space at the end
               +d                               and at the beginning
              }       ++dYd                     ^ in space+Y+space
            J                                 assign these list to J
           &                                  J not empty and
                             !KeJ             '=' is not in J[-1]
eM                                        take the last element of each and print

8
.__.
ওহ

এই কোডটি pyth.herokuapp.com/…

@ আইস্যাকগ ফিক্সড।
জাকুবে

4

সিজেম, 49 বাইট

LqN/W%{_'=#_){(<:V1$\e=_{\Va-\}&}{;S/+1}?},\;W%N*

এটি অনলাইনে চেষ্টা করুন

এখানে দৃষ্টিভঙ্গি হ'ল সামনের দিকে ইনপুট লাইনগুলি প্রক্রিয়াকরণের সময় অ-সাইন করা ভেরিয়েবলগুলির একটি তালিকা বজায় রাখা হয়:

  • লাইনটি যদি একটি এক্সপ্রেশন হয় তবে এক্সপ্রেশনটির সমস্ত ভেরিয়েবলগুলি তালিকায় যুক্ত হয়। প্রকৃতপক্ষে, প্রয়োগে, সমস্ত টোকেন তালিকায় যুক্ত করা হয়, যেহেতু এটি কোড সংরক্ষণ করে এবং তালিকায় নম্বর এবং অপারেটর থাকা কোনও ক্ষতি করে না।

  • লাইনটি যদি কোনও অ্যাসাইনমেন্ট হয় তবে নির্ধারিত ভেরিয়েবলের নাম তালিকায় রয়েছে কিনা এটি পরীক্ষা করে। যদি তা হয় তবে অ্যাসাইনমেন্টটি গৃহীত হবে এবং ভেরিয়েবলের নামটি তালিকা থেকে সরানো হবে। অন্যথায়, অ্যাসাইনমেন্টটি এড়িয়ে যায়।

ব্যাখ্যা:

L     Start with empty list.
qN/   Get input and split at newlines.
W%    Reverse to process lines back to front.
{     Start of filter block.
  _     Copy line.
  '=#   Find equal sign.
  _     Copy position of equal sign, will use original later to extract
        variable name from assignment.
  )     Increment to produce truthy/falsy value (-1 from find means not found).
  {     Start if-block that processes assignments.
    (<    Slice off everything but variable name.
    :V    Save in variable V for later re-use.
    1$\   Place copy of unassigned variable list and new variable name at
          top of stack.
    e=    Count occurrences. This tells us if variable name was in list.
    _     Copy the condition value because it will also be used as the
          overall filter result.
    {     Start of block that removes variable name from list.
      \V    Bring list to top, and push variable name.
      a-    Remove the variable name from list.
      \     Swap to get variable list to bottom of stack for next iteration,
            and filter result to top.
    }&    End of conditional block to remove variable name.
  }     End of if-block for assignment.
  {     Start of else-block for expression.
    ;     Pop result of find operation.
    S/    Split expression at spaces.
    +     Concatenate the new variables with the existing ones in the list.
    1     Filter result, expressions are always accepted.
  }?    End of if for assignment vs. expression.
},    End of filter.
\;    Get rid of variable list at bottom of stack.
W%    Reverse order of filtered result, since we worked back to front.
N*    Join with newlines.

4

পাইথন 2, 270 267 বাইট

import sys,re
d={}
s=list(enumerate(sys.stdin))
for n,l in s:
 try:v,_=l.split('=');v=v.strip();d[v]=d.get(v,[])+[[0,n]]
 except:
  for v in re.findall('[a-zA-Z_]\w*',l):d[v][-1][0]+=1
print''.join(l for n,l in s if n not in[n for x in d.values()for c,n in x if c==0])

সূচকটি হ'ল: 1. স্থান 2. ট্যাব

@ কামেমেহেহাকে ধন্যবাদ 3 বাইট সংরক্ষিত!


প্রিন্ট-ইন print ''.joinএবং inইন করার পরে স্থানটি in [nসরানো যেতে পারে।
কামেহেহেহা

এছাড়াও, আপনি এই কৌশলটি লাইনের tabপরে ডাবল স্পেসের পরিবর্তে exceptএবং একটি বাইট সংরক্ষণ করে ব্যবহার করতে পারেন ।
কামেহেহেহা

2

আর 144

Q=R=c()
for(L in rev(scan(,"",,,"\n"))){W=strsplit(L," ")[[1]]
if("="%in%W)if(W[1]%in%R)R=R[R!=W[1]]else next else R=c(R,W)
Q=c(L,Q)}write(Q,"")

কোথায়

  • L ইনপুট থেকে একটি লাইন (শেষ থেকে শুরু)
  • W একটি লাইনের প্রতীক (ভেরিয়েবল, অপারেটর, সংখ্যা)
  • Rপ্রতীকগুলির একটি ভেক্টর যা মুদ্রিত হবে। এটিতে ভেরিয়েবলগুলি অন্তর্ভুক্ত রয়েছে যার অ্যাসাইনমেন্টটি প্রয়োজনীয়।
  • Q আউটপুট লাইনের ভেক্টর

আপনি প্রতিস্থাপন করতে পারেন scan(what="",sep="\n")সঙ্গে scan(,"",sep="\n")। আপনি নামযুক্ত sepযুক্তিটির অবস্থানগত সমতুল্য সাথেও প্রতিস্থাপন করতে সক্ষম হতে পারেন তবে কমাগুলি এর জন্য কোথায় যাবে তা আমি মনে করতে পারি না।
অ্যালেক্স এ।

... সংরক্ষণ 6. খুব সুন্দর। আপনাকে ধন্যবাদ অ্যালেক্স!
ফ্লোডেল

2

জাভাস্ক্রিপ্ট (ES6) 164 177

টেমপ্লেট স্ট্রিং ব্যবহার করে, সমস্ত নতুনলাইনগুলি হ'ল লক্ষণীয় এবং গণনা করা।

ফায়ারফক্সে স্নিপেট চলমান পরীক্ষা করুন (তীর ফাংশন সহ ES6 সামঞ্জস্যের জন্য প্রয়োজনীয়)

f=s=>(k=>{s=s.split`
`,s.map((t,n)=>(r=t.match(/\w+/g)).map(v=>k[v]=f,~t.search`=`?k[s[k[v=r[0]]]=r[0]=0,v]=n:0))
for(v in k)s[k[v]]=0})([])||s.filter(r=>r).join`
`

ungolfed=s=>
{
  k={} // list line defining variables, by name, until used
  s=s.split`\n`
  s.forEach((t,n)=>
  {
    r=t.match(/\w+/g); // list variables in the line, operators are lost
    if (t.search`=` >= 0) // if it's an assignment
    {
      v=r[0] // new variable
      s[k[v]]=r[0]=0 // kill previous definition if not used
      k[v]=n
    }
    r.forEach(v=>k[v]='') // for each used variable, forget its definition line
  })
  for(v in k)s[k[v]]=0; // kill all remaining unused definitions
  return s.filter(r=>r).join`\n`
}

// TEST
out=x=>O.innerHTML+=x+'\n';


;[['a = 10\na * 3', 'a = 10\na * 3']
 ,['foo = 8\n2 - 1\na = 18','2 - 1'] 
 ,['a = 10\na = 8\nb = 4\nab = 72\nb / 6\nb + 1','b = 4\nb / 6\nb + 1'] 
 ,['a = 1\na = 2\na + 1','a = 2\na + 1'] 
 ,['FooBar1 = 0\nFuz__ = 8\nFuz__ / 1','Fuz__ = 8\nFuz__ / 1'] 
 ,['a = 1\na + 1\na = 2\na + 1','a = 1\na + 1\na = 2\na + 1']
 ,['a = 1\na + a\na = 2', 'a = 1\na + a']
 ,['a = 1\n1 / 5 * 8 + 4', '1 / 5 * 8 + 4']
 ,['a = 1\na + a\na = 2', 'a = 1\na + a']
 ,['a = 1\na + 1\na = 1\na + 1', 'a = 1\na + 1\na = 1\na + 1']
 ,['a = 7\n5 / a', 'a = 7\n5 / a']
]
.forEach(([i,k])=>(r=f(i),
  out('Test '+(r==k?'OK':'Fail')+'\nInput:  '+i.replace(/\n/g,',')
      +'\nResult: '+r.replace(/\n/g,',')
      +'\nCheck:  '+k.replace(/\n/g,',')+'\n')
));
Note: newlines trasformed to commas to save space in output
<pre id=O></pre>


আরে, এটি 164 বাইট না!
সাইফেজ

@ সাইফেস লাইন 1:20 + 1 নিউলাইন, লাইন 2; 92 + 1 নিউলাইন, লাইন 3:48 + 1 নিউলাইন, লাইন 4: 1। 21 + 93 + 49 + 1 => 164. ungolfedঅংশটি কেবল ব্যাখ্যার জন্য। TESTঅংশ ... UHM শুধু অনুমান ...
edc65

আমি জানি. আমি তো মজা করছিলাম. দুঃখিত :)।
সাইফেজ

1

জাভাস্ক্রিপ্ট ES6, 79 75 118 বাইট

s=>s.split`
`.filter((l,i,a)=>(q=l.split`=`)[1]?!~(a.slice(i+1)+0).search(q[0]+'=')&&~s.search(q[0]+'[^=]'):1).join`
`

যদি এটি কোনও মামলায় কাজ করে না তবে আমাকে বলুন। গল্ফ করার জন্য কোনও ধারণা স্বাগত।


ব্যাখ্যা

s=>          // Function with argument "s"
  s.split`   // Splits each line
  `
  .filter(   // Filters through each line,
    (item,index,array)=>
      (q=l.split`=`)[1]? // If there is something after the equal sign
        !~ // XOR (~) will  essentially make -1, 0. NOT (!) will make 0, 1, vice-versa
         (a.slice(i+1)+0) // Gets following lines
         .search`^${z=q[0]}=` // Checks if following lines have the same variable name and then =
        && // AND...
         ~s.search(z+'[^=]') // Check if there is an expression with the variable
        :1) // If there is no equal sign, return 1 (true)
  .join` // Join everything back, seperated by newlines
  `

সাফারি নাইটলি পরীক্ষিত। ফায়ারফক্সের বন্ধুত্বপূর্ণ সংস্করণ:

s=>s.split`
`.filter((l,i,a)=>(q=l.split`=`)[1]?!~(a.slice(i+1)+0).search(`^${z=q[0]}=`)&&~s.search(z+'[^=]'):1).join`
`

আপনি ইএস 5 সংস্করণ পেতে বাবেলজে নামাতে পারেন।


@ ব্ল্যাকহোল আমি ঠিক করেছি।
ডাউনগোট

@ edc65 উদাহরণ অনুসারে বিভাজক যদিও একটি নতুন লাইন। ফাঁকা স্থান ইত্যাদির সাথে
ইনপুটটিও

@ edc65 আপনি কি নিশ্চিত? ফাংশনটিকে প্রথম বন্ধনে আবৃত করার চেষ্টা করুন এবং এটি এর মতো চালান। এটি আমার পক্ষে (সাফারি নাইটলি) কাজ করে।
ডাউনগোট

হতে পারে আমি খুব বাধা কিন্তু আমি এখনও মনে করি এটি প্রতিটি ক্ষেত্রে ভাল কাজ করা খুব সহজ। ফায়ারফক্সে ত্রুটি ছাড়াই এটি চালিয়েছি সার্চ কলটিতে বন্ধনী যুক্ত করা (এখনও আমার চেয়ে কম পথ)। এবং "a = 1 \ na + a \ না = 2" চেষ্টা করেছেন। এবং এটি ব্যর্থ হয় ...
edc65

আপনার উত্তরে আমার পরামর্শ যুক্ত করার জন্য ধন্যবাদ। -1 কারণ এটি এখনও বাগড
edc65

1

হাস্কেল, 187 বাইট

ব্যবহার d

import Data.List
f=filter
(!)=map
b((v,e,w):t)=e||or((\(_,p,_)->p)!take 1(f(\(x,_,y)->v==x||v`elem`y)t))
d=unlines.(\l->snd!f fst(zip(b!tails(((\(v:o:w)->(v,o/="=",w)).words)!l))l)).lines
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.