Levenshtein distance
Compute distance for each pair. Notice that this recursive implementation is very inefficient. Wagner-Fischer algorithm is iterative and much faster. #vimscript
Start file
" Levenshtein distance between two strings
function! LD(s1, s2)
let l1 = strlen(a:s1)
let l2 = strlen(a:s2)
if l1 <= 0
return l2
elseif l2 <= 0
return l1
elseif a:s1[0] ==# a:s2[0]
return LD(a:s1[1:], a:s2[1:])
else
return 1 + min([
\ LD(a:s1, a:s2[1:]), LD(a:s1[1:], a:s2), LD(a:s1[1:], a:s2[1:])
\ ])
endif
endfunction
" Humm... Is this useful?
"nmap M I<C-R>=LD("<C-R>a","<C-R>b")<CR><Esc>
"VIM VimGolf
"keystroke matt
"vimscript way
"reformat refactor
"challenge chatter
"colons semicolons
"golfer golfers
"order sorting
"modules models
"shift+ret ctrl+ret
"ninja manic
"destination distance
"pattern lines
"linewrapping linewrapping
"swap switch
"vice versa
"split multiples
"block blackened
"-a-b-c c-a-b
"hello_world hello world!
End file
6
8
9
5
5
4
1
5
2
5
4
7
6
0
4
4
7
5
3
2
View Diff
1,39c1,20
< " Levenshtein distance between two strings
< function! LD(s1, s2)
< let l1 = strlen(a:s1)
< let l2 = strlen(a:s2)
< if l1 <= 0
< return l2
< elseif l2 <= 0
< return l1
< elseif a:s1[0] ==# a:s2[0]
< return LD(a:s1[1:], a:s2[1:])
< else
< return 1 + min([
< \ LD(a:s1, a:s2[1:]), LD(a:s1[1:], a:s2), LD(a:s1[1:], a:s2[1:])
< \ ])
< endif
< endfunction
< " Humm... Is this useful?
< "nmap M I<C-R>=LD("<C-R>a","<C-R>b")<CR><Esc>
<
< "VIM VimGolf
< "keystroke matt
< "vimscript way
< "reformat refactor
< "challenge chatter
< "colons semicolons
< "golfer golfers
< "order sorting
< "modules models
< "shift+ret ctrl+ret
< "ninja manic
< "destination distance
< "pattern lines
< "linewrapping linewrapping
< "swap switch
< "vice versa
< "split multiples
< "block blackened
< "-a-b-c c-a-b
< "hello_world hello world!
---
> 6
> 8
> 9
> 5
> 5
> 4
> 1
> 5
> 2
> 5
> 4
> 7
> 6
> 0
> 4
> 4
> 7
> 5
> 3
> 2
Solutions by @zulolosi:
Unlock 1 remaining solutions by signing in and submitting your own entry