-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjaro_distance.sf
55 lines (43 loc) · 1.11 KB
/
jaro_distance.sf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#!/usr/bin/ruby
#
## https://rosettacode.org/wiki/Jaro_distance
#
func jaro(s, t) {
var s_len = s.len
var t_len = t.len
var match_distance = ((::max(s_len, t_len) // 2) - 1)
var s_matches = []
var t_matches = []
var matches = 0
var transpositions = 0
for i in ^s_len {
var start = ::max(0, i-match_distance)
var end = ::min(i+match_distance, t_len-1)
for k in (start .. end) {
t_matches[k] && next
s[i] == t[k] || next
s_matches[i] = true
t_matches[k] = true
matches++
break
}
}
return 0 if (matches == 0)
var k = 0
for i in ^s_len {
s_matches[i] || next
while (!t_matches[k]) { ++k }
s[i] == t[k] || ++transpositions
++k
}
((matches / s_len) +
(matches / t_len) +
((matches - transpositions/2) / matches)) / 3
}
for pair in [
[%c"MARTHA", %c"MARHTA"],
[%c"DIXON", %c"DICKSONX"],
[%c"JELLYFISH", %c"SMELLYFISH"],
] {
say "jaro(#{pair.map{.join.dump}.join(', ')}) = #{'%.10f' % jaro(pair...)}"
}