मृत कोड उन्मूलन


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) पर सेट किया गया था ।
flodel

3
@flodel नहीं, मूल्यों को देखने की आवश्यकता नहीं है
कारिडोरक

@flodel testcase निगमित
22

आपको एक परीक्षण मामला जोड़ना चाहिए जहां एक चर का उपयोग अभिव्यक्ति में किया जाता है, लेकिन अभिव्यक्ति के पहले तत्व के रूप में नहीं। विशेष रूप से महत्वपूर्ण अभिव्यक्ति के अंतिम सदस्य के रूप में है।
isaacg

@isaacg कोई मृत कोड नहीं है, वर कहीं भी हो सकता है,
टेस्टकेस

जवाबों:


9

PHP - 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;}

यहाँ ungolfed संस्करण है:

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इसे वास्तविक लाइन फ़ीड (0x04) के साथ प्रतिस्थापित किया जाना चाहिए।

यह मानता है कि स्ट्रिंग हमेशा एक पंक्ति फ़ीड के साथ समाप्त होगी।

चूंकि यह regex किसी भी .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
Aww .__.
इट्स

यह कोड pyth.herokuapp.com/…
isaacg

@ आइसाकग फिक्स्ड।
जक्यूब

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 बाइट्स @Kamehameha के लिए धन्यवाद बचा लिया!


में प्रिंट के बाद अंतरिक्ष print ''.joinऔर inमें in [nहटाया जा सकता है।
कम्मेहा

इसके अलावा, आप लाइन के बाद डबल स्थान के बजाय का उपयोग करके और एक बाइट को बचाकर इस चाल का उपयोग कर सकते हैं । tabexcept
कम्मेहा

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

2

जावास्क्रिप्ट (ईएस 6) 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

जावास्क्रिप्ट ईएस 6, 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`
`

आप ES5 संस्करण प्राप्त करने के लिए बैबलज में छोड़ सकते हैं ।


@ ब्लेकहोल मैं तय कर लिया है।
डाउनगेट

@ edc65 उदाहरणों के अनुसार विभाजक एक नई रेखा है। इनपुट रिक्त स्थान के साथ एक सख्त प्रारूप में भी है, आदि
डाउगोएट

@ edc65 क्या आपको यकीन है? कोष्ठक में फ़ंक्शन को लपेटने का प्रयास करें और इसे उसी तरह चलाएं। यह मेरे लिए काम करता है (सफारी नाइटली)।
डाउनगोट

हो सकता है कि मैं भी अड़ंगा लगाऊं लेकिन मुझे अभी भी लगता है कि हर मामले में अच्छा काम करना बहुत आसान है। मैंने इसे फ़ायरफ़ॉक्स में ब्रैकेट्स को सर्च कॉल में त्रुटि के बिना चलाया (अभी भी मेरा जितना छोटा है)। और "a = 1 \ na + a \ na = 2" की कोशिश की। और यह विफल रहता है ...
edc65

अपने सुझाव में अपने सुझाव को जोड़ने के लिए Thx। -1 क्योंकि यह अभी भी
खराब है

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.