HiveBrain v1.2.0
Get Started
← Back to all entries
snippetjavascriptModerate

More efficient loops to generate unpronounceable words

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
unpronounceablewordsloopsmoreefficientgenerate

Problem

I wanted to write a function to generate only unpronounceable words. I realised afterwards that the same thing could probably be achieved by just taking out the vowels. Regardless, I feel that there is probably a better way to iterate through the syllable checking.

function unpronouncable(length) {
    var twoLetters = ['aa','ae','ag','ai','ar','ao','as','aw','ay','ba','da','de','ed','ef','eh','ei','em','en','er','et','ex','fa','fe','fu','gi','go','hm','ho','so','id','ie','jo','ka','ki','ku','lo','mi','mm','mu','na','ne','nu','od','oe','oi','om','op','os','os','oy','pe','pi','qi','re','se','ta','ti','ut','wo','xi','xi','ya','yu','za','zo','co','my','qu','ge','ro','ra','xa','wa'];
    var threeLetters = ['thm','css','dvd','buh','bad','rue','cun','pub','puk','pul'];

    var letters = "abcdefghijklmnopqrstuvwxyz";
    var string = "";
    for (var i = 0; i < length; i += 1) {
        string += letters[Math.floor(Math.random() * letters.length)];
    }

    function generate() {
        for (var j = 0; j < string.length; j += 1) {
            var test = string.slice(j,j+2);
            for (var k = 0; k < twoLetters.length; k += 1) {
                if (twoLetters[k] === test) {
                    console.log('Has two letter syllable');
                    return unpronouncable(length);
                }
            }
        }
        for (var j = 0; j < string.length; j += 1) {
            var test = string.slice(j,j+3);
            for (var k = 0; k < twoLetters.length; k += 1) {
                if (threeLetters[k] === test) {
                    console.log('Has three letter syllable');
                    return unpronouncable(length);
                }
            }           
        }

        return string;
    }
    return generate();
}

console.log(unpronouncable(8));

Solution

Copy Pasting

If you are copy-pasting code, it is a sign that you should write it differently (your two for loops are quite obviously copy pasted).

Bug

I'm pretty sure that here:

for (var k = 0; k < twoLetters.length; k += 1) {
            if (threeLetters[k] === test) {


you meant to change it to k -1; to check if a string contains another string.

And just out of curiosity: how would you pronounce css or dvd?

Code Snippets

for (var k = 0; k < twoLetters.length; k += 1) {
            if (threeLetters[k] === test) {
function generateHelper(string, array, charCount) {
    for (var j = 0; j < string.length; j += 1) {
        var test = string.slice(j,j+charCount);
        for (var k = 0; k < array.length; k += 1) {
            if (array[k] === test) {
                console.log('Has ' + charCount + ' letter syllable');
                return unpronouncable(length);
            }
        }
    }
}
function generate() {
}
return generate();
function unpronouncable(length) {
    // filter these out
    var twoLetters = ['aa', 'ae', 'ag', 'ai', 'ar', 'ao', 'as', 'aw', 'ay', 'ba', 'da', 'de', 'ed', 'ef', 'eh', 'ei', 'em', 'en', 'er', 'et', 'ex', 'fa', 'fe', 'fu', 'gi', 'go', 'hm', 'ho', 'so', 'id', 'ie', 'jo', 'ka', 'ki', 'ku', 'lo', 'mi', 'mm', 'mu', 'na', 'ne', 'nu', 'od', 'oe', 'oi', 'om', 'op', 'os', 'os', 'oy', 'pe', 'pi', 'qi', 're', 'se', 'ta', 'ti', 'ut', 'wo', 'xi', 'xi', 'ya', 'yu', 'za', 'zo', 'co', 'my', 'qu', 'ge', 'ro', 'ra', 'xa', 'wa'];
    var threeLetters = ['thm', 'css', 'dvd', 'buh', 'bad', 'rue', 'cun', 'pub', 'puk', 'pul'];

    // generate a new string until one is found that does not contain the filters
    var generatedString = "";
    var done = false;
    while (!done) {
        generatedString = generate(length);
        done = !contains(generatedString, twoLetters, 2) && !contains(generatedString, threeLetters, 3);
    }
    return generatedString;

    // generates a random string with given length
    function generate(length) {
        var letters = "abcdefghijklmnopqrstuvwxyz";
        var string = "";
        for (var i = 0; i < length; i++) {
            string += letters[Math.floor(Math.random() * letters.length)];
        }
        return string;
    }

    // returns true if string contains any characters in the stringArray.
    function contains(string, stringArray, charCount) {
        for (var k = 0; k < stringArray.length; k++) {
            if (string.indexOf(stringArray[k]) > -1) {
                console.log('Has ' + charCount + ' letter syllable');
                return true;
            }
        }
        return false;
    }
}
console.log(unpronouncable(8));

Context

StackExchange Code Review Q#61483, answer score: 10

Revisions (0)

No revisions yet.