MPC Boggle Mayhem

JavaScript performance comparison

Test case created by Joshua Piccari

Preparation code

 
<script>
Benchmark.prototype.setup = function() {
    var word = 'hyperbole',
    steve = (function(){
        var vowels = ['a', 'e', 'i', 'o', 'u', 'y'],
        iterifyArr = function (arr) {
        var cur = 0,
            ret;
        arr.next = function () {
            if(cur > arr.length){
                ret = -1;
            }
            else{
                ret = this[cur];
                cur++;
            }        
            return ret;
        };
        arr.prev = function () {
            if(cur < 0){
                ret = -1;
            }
            else{
                ret = this[cur];
                cur--;
            }
            return ret;
        };
        return arr;
    };
   
    function isVowel(letter){
        if(vowels.indexOf(letter) !== -1){
            return true;
        }
        return false;
    }
                   
    function getVowelCount(word){
       return extractVowels(word).length;  
    }
   
    function extractVowels(word){
        var vowels = [];
        for(var i = 0; i < word.length; i++){
            if(isVowel(word[i])){
                vowels.push(word[i]);
            }
        }
        return vowels;
    }
   
    function findCombinations(charArray, comboLength){
        var results = [],
                currentChar,
                comboSet;
   
        for(var i = 0; i < comboLength; i++){
                comboSet = [];
                // go through each combination set
                for(var j = 0; j < charArray.length; j++){
                        currentChar = charArray[j]; //go through each letter                   
                        if(i === 0){
                                comboSet.push(currentChar);
                        }
                        else{
                                //go through every combo in the last index
                                for(var k = 0; k < results[i-1].length; k++){
                                        comboSet.push(currentChar + results[i-1][k]);
                                }
                        }
                }
                results.push(comboSet);
        }
        return results;
    }
   
    function vowelizer(word) {
        //return all vowel combinations of given word
        var vowelCount = getVowelCount(word),
            combinations = findCombinations(vowels,vowelCount)[vowelCount -1],
            vowelSetAr,
            newWord,
            wordCombinations = [],
            re = /[aeiouy]/g;
     
        for(var i = 0, len = combinations.length; i < len; i++){
            vowelSetAr = iterifyArr(combinations[i].split(''));
            newWord = word.replace(re, function(){
                return vowelSetAr.next();
            });
            wordCombinations.push(newWord);
        }
        return wordCombinations;
    }
   
    return vowelizer;
    }()),
   
    nicholas = (function() {
    function vowelizer(word) {
        var wordDict = [];
        var wordArray = word.split('');
        var vowelArray = ['a', 'e', 'i', 'o', 'u', 'y'];
   
        funVowels(wordArray, vowelArray, 0, wordDict);
   
        return wordDict;
   
    }
   
    function funVowels(wordArray, vowelArray, index, wordDict) {
   
        if (index === wordArray.length) {
            wordDict.push(wordArray.join(''));
        } else {
            if (vowelArray.indexOf(wordArray[index]) !== -1) {
                for (var i=0;i<vowelArray.length;i++) {
                    var skewArray = wordArray;
                    skewArray[index] = vowelArray[i];
                    funVowels(skewArray, vowelArray, index + 1, wordDict);
                }
   
            } else {
                funVowels(wordArray, vowelArray, index + 1, wordDict);
            }
        }
    }
   
        return vowelizer;
    }()),
   
    jimmy = (function(){
   
        function vowelizer(word)
    {
        // Go nuts, this is your function
        var result = [""];
       
        //iterate over each character
        for(var i = 0; i < word.length; ++i)
        {
                if(isConsonant(word[i]))
            {
                //append the consonant to the word completion
                result = result.map(function(value){
                        return value + word[i];
                });
            }
            else
            {
                //create all possible vowel combinations
                var tmpArray = [];
                for(var k = 0; k < result.length; ++k)
                {
                        tmpArray = tmpArray.concat(["a", "e", "i", "o", "u", "y"].map(function(value){
                        return result[k] + value;
                    }));
                }
                result = tmpArray;
            }
        }
       
        return result;
    }
   
    function isConsonant(c)
    {
        return /[^aeiouy]/ig.test(c);
    }
   
        return vowelizer;
    }()),
   
    haebin = (function(){
   
    function vowelizer(word) {
        // possible vowels - a, e, i, o, u, and y
        var vowels = ['a','e','i','o','u','y'],
                chars = word.split(''),
                index = [],
                counter = 0,
                result = [];
   
        for(var i = 0; i<chars.length ; i++){
                if(vowels.indexOf(chars[i])>-1){
                        index.push(i);
                }      
        }
        var len = index.length;
       
        function getResults(array, counter){
                result = [];
                counter++;
   
                for (i = 0; i< array.length; i++) {
                        var val = array[i];
   
                        if(counter === len) {
                                for(var x=0; x< val.length ; x++){
                                        chars[index[x]] = val[x];
                                }
                                var newword = chars.join('');
                                result.push(newword);
                        } else {
   
                                for(var n=0; n< vowels.length; n++) {
                                        if(counter === 1) {
                                                result.push([val, vowels[n]]);
                                        } else {
                                                array[i] = val.concat(vowels[n]);
                                                result.push(array[i]);
                                        }
                                }
                        }
   
                }
   
                if(counter < len) {
                        getResults(result, counter);
                }
                else
                        return result;
        }
       
        getResults(vowels, counter);
   
        return result;
    }
   
        return vowelizer;
    }());
};
</script>

Test runner

Warning! For accurate results, please disable Firebug before running the tests. (Why?)

Java applet disabled.

Testing in unknown unknown
Test Ops/sec
Steve
steve(word);
pending…
Nicholas
nicholas(word);
pending…
Jimmy
jimmy(word);
pending…
Haebin
haebin(word);
pending…

Compare results of other browsers

Revisions

You can edit these tests or add even more tests to this page by appending /edit to the URL. Here’s a list of current revisions for this page:

0 comments

Add a comment