데드 코드 제거


20

죽은 코드는 아무 것도하지 않고, 실행되지 않을 것임을 우리를 쳐다보고 있지만 오늘 우리는 복수 할 수 있습니다.

사양

입력은 여러 줄 문자열입니다.

각 줄은 대입 식이 거나 식일 수 있습니다.

할당

과제는 <name> = numbername이 일련의 문자, 밑줄 및 숫자이지만 숫자로 시작하지 않는 형식입니다.

변수는 여러 번 할당 될 수 있습니다.

표현

표현은 형식입니다 <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되었기 때문에 두 번째 를 버릴 수있는 위치 . a1
flodel

3
@flodel 아니오, 가치를 볼 필요가 없습니다
Caridorc

@flodel 테스트 케이스 통합
Caridorc

표현식에서 변수가 사용되지만 표현식의 첫 번째 요소가 아닌 테스트 케이스를 추가해야합니다. 표현의 마지막 구성원으로서 특히 중요합니다.
isaacg

@isaacg 죽은 코드가 없습니다, var는 어디에나있을 수 있습니다, 테스트 케이스 추가
Caridorc

답변:


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실제 줄 바꿈 (0x0A)으로 바꿔야합니다.

이것은 문자열이 항상 줄 바꿈으로 끝나는 것으로 가정합니다.

이 정규식은 .NET 관련 기능을 사용하지 않으므로 regex101에서 테스트 할 수 있습니다 .

아이디어는 매우 간단합니다. 변수를 다시 사용하지 않고 동일한 변수 또는 문자열의 끝으로 다른 할당을 찾을 수있는 모든 할당을 제거하십시오.


6

Pyth, 40 바이트

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

좀 긴 것 같습니다. 어쩌면 내일 1-2 바이트를 절약 할 수 있습니다.

온라인으로 사용해보십시오 : 데모 또는 테스트 스위트

설명:

_.__.z입력 라인의 모든 접미사를 역순으로 제공합니다. 예를 들어 입력 FooBar1 = 0; Fuz__ = 8; Fuz__ / 1은 목록을 제공합니다.

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

그런리스트 요소 I 필터 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
정말 귀여워 ....__.
orlp

이 코드는 실패 pyth.herokuapp.com/...
isaacg

@isaacg 고정.
Jakube

4

CJam, 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. 탭

@Kamehameha 덕분에 3 바이트가 절약되었습니다!


에서 인쇄 후 공간 print ''.joinin인은 in [n제거 할 수 있습니다.
Kamehameha

또한 줄 뒤의 이중 공백 대신 1 바이트를 저장 하여이 트릭을 사용할 수 있습니다 . tabexcept
Kamehameha

2

R 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인수를 해당 위치 로 대체 할 수도 있지만 쉼표가 어디로 향하는 지 기억할 수 없습니다.
Alex A.

... 절약 6. 아주 좋습니다. 알렉스 감사합니다!
flodel

2

자바 스크립트 (ES6) 164 177

템플릿 문자열을 사용하면 모든 줄 바꿈이 중요하고 계산됩니다.

FireFox 에서 스 니펫 실행 테스트 (화살표 기능을 포함한 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 바이트가 아닙니다!
Cyphase

@Cyphase 라인 1:20 + 1 개행, 2; 92 + 1 개행, 3:48 + 1 개행, 4 : 1 21 + 93 + 49 + 1 => 164.이 ungolfed부분은 설명을위한 것입니다. 그 TEST부분은 ... 음 그냥 추측 ...
edc65

알아. 농담이야 죄송합니다 :).
Cyphase

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
  `

Safari Nightly에서 테스트되었습니다. Firefox 친화적 인 버전 :

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`
`

babeljs 에 빠져 ES5 버전을 얻을 수 있습니다 .


@ Blackhole 나는 그것을 고쳤습니다.
Downgoat

예제에 따르면 @ edc65 구분 기호는 줄 바꿈입니다. 입력은 또한 공백 등으로 엄격한 형식으로되어 있습니다.
Downgoat

@ edc65 확실합니까? 함수를 괄호로 묶어 그와 같이 실행하십시오. 그것은 나를 위해 작동합니다 (Safari Nightly).
Downgoat

어쩌면 나는 너무 고집이지만 모든 경우에 잘 작동하는 것이 너무 간단하다고 생각합니다. Firefox에서 검색 호출에 대괄호를 추가하여 오류없이 실행되도록했습니다 (여전히 짧습니다). 그리고 "a = 1 \ na + a \ na = 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.