Skip to content

Instantly share code, notes, and snippets.

@snoj
Last active March 30, 2017 05:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save snoj/8d5fb20ce0a30bec53232785f8612dcb to your computer and use it in GitHub Desktop.
Save snoj/8d5fb20ce0a30bec53232785f8612dcb to your computer and use it in GitHub Desktop.
hamstrings
function FromRight(str1, str2) {
var longest, tmpshortest, shortest;
if(str1.length != str2.length) {
if(str1.length > str2.length) {
longest = str1;
tmpshortest = str2;
} else {
longest = str2;
tmpshortest = str1;
}
shortest = "\0".repeat(longest.length - tmpshortest.length) + tmpshortest;
} else {
longest = str1;
shortest = str2;
}
return FromLeft(longest, shortest);
}
function FromLeft(str1, str2) {
var longest, tmpshortest, shortest, max, score, diff, percent;
if(str1.length != str2.length) {
if(str1.length > str2.length) {
longest = str1;
tmpshortest = str2;
} else {
longest = str2;
tmpshortest = str1;
}
shortest = tmpshortest + "\0".repeat(longest.length - tmpshortest.length);
} else {
longest = str1;
shortest = str2;
}
max = longest.length;
score = (function (longest, shortest) {
var i, result;
i = longest.length;
result = 0;
while(i--) {
result += Number(longest[i] == shortest[i]);
}
return result;
})(longest, shortest);
return {
score: score,
percent: (score/max),
diff: (max-score),
max: max
};
};
function BestFirstMatch(str1, str2) {
var longest, shortest, max, score, diff, percent;
if(str1.length != str2.length) {
if(str1.length > str2.length) {
longest = str1;
shortest = str2;
} else {
longest = str2;
shortest = str1;
}
} else {
longest = str1;
shortest = str2;
}
max = longest.length;
var searchresults = (function(longest, shortest) {
var i = longest.length - shortest.length;
var testlength = shortest.length;
var best = {score: 0};
var iscore = {score: 0};
var besti = i;
while(i--) {
iscore = FromLeft(longest.slice(i, i+testlength), shortest);
if(iscore.score >= best.score) {
best = iscore;
best.index = i;
}
}
return best;
})(longest, shortest);
return searchresults;
};
module.exports = {
BestFirstMatch: BestFirstMatch,
FromLeft: FromLeft,
FromRight: FromRight
};
var assert = require('assert')
var s = require('./index.js');
(function() {
//{ score: 3, percent: 0.42857142857142855, diff: 4, max: 7 }
var result = s.FromLeft("abc", "abcdefg");
assert.eq(result.score, 3);
assert.eq(result.diff, 4);
assert.eq(result.max, 7);
})();
(function() {
//{ score: 0, percent: 0, diff: 7, max: 7 }
var result = s.FromRight("abc", "abcdefg");
assert.eq(result.score, 0);
assert.eq(result.diff, 0);
assert.eq(result.max, 7);
})();
(function() {
//{ score: 3, percent: 0.75, diff: 1, max: 4, index: 4 }
var result = s.BestFirstMatch("cdxf", "_fabcdefg04ma");
assert.eq(result.score, 3);
assert.eq(result.diff, 1);
assert.eq(result.max, 4);
assert.eq(result.index, 4);
})();
(function() {
//{ score: 4, percent: 1, diff: 0, max: 4, index: 4 }
var result = s.FromLeft("cdef", "_fabcdefg04ma");
assert.eq(result.score, 4);
assert.eq(result.diff, 0);
assert.eq(result.max, 4);
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment