diff 알고리즘을 찾고 여기에 와서 나만의 구현을했습니다. vcdiff에 대해 모르겠습니다.
위키 백과 : 가장 긴 공통 서브 시퀀스에서 diff-like 출력을 얻는 작은 단계 일뿐입니다. 서브 시퀀스에 항목이 없지만 원래 항목에 있으면 항목을 삭제해야합니다. (아래의 '–'표시) 하위 시퀀스에는 없지만 두 번째 시퀀스에있는 경우 추가해야합니다 ( '+'표시).
LCS 알고리즘 의 멋진 애니메이션은 여기에 있습니다 .
빠른 LCS 루비 구현에 연결하십시오 .
느리고 간단한 루비 적응은 다음과 같습니다.
def lcs(xs, ys)
if xs.count > 0 and ys.count > 0
xe, *xb = xs
ye, *yb = ys
if xe == ye
return [xe] + lcs(xb, yb)
end
a = lcs(xs, yb)
b = lcs(xb, ys)
return (a.length > b.length) ? a : b
end
return []
end
def find_diffs(original, modified, subsequence)
result = []
while subsequence.length > 0
sfirst, *subsequence = subsequence
while modified.length > 0
mfirst, *modified = modified
break if mfirst == sfirst
result << "+#{mfirst}"
end
while original.length > 0
ofirst, *original = original
break if ofirst == sfirst
result << "-#{ofirst}"
end
result << "#{sfirst}"
end
while modified.length > 0
mfirst, *modified = modified
result << "+#{mfirst}"
end
while original.length > 0
ofirst, *original = original
result << "-#{ofirst}"
end
return result
end
def pretty_diff(original, modified)
subsequence = lcs(modified, original)
diffs = find_diffs(original, modified, subsequence)
puts 'ORIG [' + original.join(', ') + ']'
puts 'MODIFIED [' + modified.join(', ') + ']'
puts 'LCS [' + subsequence.join(', ') + ']'
puts 'DIFFS [' + diffs.join(', ') + ']'
end
pretty_diff("human".scan(/./), "chimpanzee".scan(/./))
# ORIG [h, u, m, a, n]
# MODIFIED [c, h, i, m, p, a, n, z, e, e]
# LCS [h, m, a, n]
# DIFFS [+c, h, +i, -u, m, +p, a, n, +z, +e, +e]