Telokis icon

Markov chain 2 doublets

Telokis | PRO | 04/09/19 02:19:56 PM UTC | 0 ⭐ | 323 👁️ | Never ⏰ | []
JavaScript |

3.64 KB

|

None

|

0 👍

/

0 👎

const data = [
        'lorem', 'ipsum', 'dolor', 'sit', 'amet', 'consectetur',
        'adipiscing', 'elit', 'curabitur', 'vel', 'hendrerit', 'libero',
        'eleifend', 'blandit', 'nunc', 'ornare', 'odio', 'ut',
        'orci', 'gravida', 'imperdiet', 'nullam', 'purus', 'lacinia',
        'a', 'pretium', 'quis', 'congue', 'praesent', 'sagittis', 
        'laoreet', 'auctor', 'mauris', 'non', 'velit', 'eros',
        'dictum', 'proin', 'accumsan', 'sapien', 'nec', 'massa',
        'volutpat', 'venenatis', 'sed', 'eu', 'molestie', 'lacus',
        'quisque', 'porttitor', 'ligula', 'dui', 'mollis', 'tempus',
        'at', 'magna', 'vestibulum', 'turpis', 'ac', 'diam',
        'tincidunt', 'id', 'condimentum', 'enim', 'sodales', 'in',
        'hac', 'habitasse', 'platea', 'dictumst', 'aenean', 'neque',
        'fusce', 'augue', 'leo', 'eget', 'semper', 'mattis', 
        'tortor', 'scelerisque', 'nulla', 'interdum', 'tellus', 'malesuada',
        'rhoncus', 'porta', 'sem', 'aliquet', 'et', 'nam',
        'suspendisse', 'potenti', 'vivamus', 'luctus', 'fringilla', 'erat',
        'donec', 'justo', 'vehicula', 'ultricies', 'varius', 'ante',
        'primis', 'faucibus', 'ultrices', 'posuere', 'cubilia', 'curae',
        'etiam', 'cursus', 'aliquam', 'quam', 'dapibus', 'nisl',
        'feugiat', 'egestas', 'class', 'aptent', 'taciti', 'sociosqu',
        'ad', 'litora', 'torquent', 'per', 'conubia', 'nostra',
        'inceptos', 'himenaeos', 'phasellus', 'nibh', 'pulvinar', 'vitae',
        'urna', 'iaculis', 'lobortis', 'nisi', 'viverra', 'arcu',
        'morbi', 'pellentesque', 'metus', 'commodo', 'ut', 'facilisis',
        'felis', 'tristique', 'ullamcorper', 'placerat', 'aenean', 'convallis',
        'sollicitudin', 'integer', 'rutrum', 'duis', 'est', 'etiam',
        'bibendum', 'donec', 'pharetra', 'vulputate', 'maecenas', 'mi',
        'fermentum', 'consequat', 'suscipit', 'aliquam', 'habitant', 'senectus',
        'netus', 'fames', 'quisque', 'euismod', 'curabitur', 'lectus',
        'elementum', 'tempor', 'risus', 'cras'
];
 
const randArr = arr => arr[Math.floor(Math.random() * arr.length)];
const bow = Symbol("Beginning of word");
const eow = Symbol("Ending of word");
 
const generateSeedData = raw => {
    const mapping = {
        [bow]: {
            [bow]: []
        },
    };
 
    for (const word of raw) {
        const lowWord = Array.isArray(word) ? word.map(w => w.toLowerCase()) : word.toLowerCase();
        let prev = bow;
        let prevPrev = bow;
 
        for (let i = 0; i < lowWord.length; ++i) {
            const char = lowWord[i];
 
            mapping[prevPrev][prev].push(char);
 
            prevPrev = prev;
            prev = char;
 
            if (!(prevPrev in mapping)) {
                mapping[prevPrev] = {};
            }
            if (!(prev in mapping[prevPrev])) {
                mapping[prevPrev][prev] = [];
            }
 
            if (i === lowWord.length - 1) {
                mapping[prevPrev][prev].push(eow);
            }
        }
    }
 
    return mapping;
};
 
const mapping = generateSeedData(data);
 
const generateWord = (mapping, minLen = 4, maxLen = 50) => {
    let word = "";
 
    let prevLetter = bow;
    let curLetter = bow;
    for (let i = 0; i < maxLen; ++i) {
        const newLetter = randArr(mapping[prevLetter][curLetter]);
 
        prevLetter = curLetter;
        curLetter = newLetter;
 
        if (curLetter === eow) {
            if (i >= minLen) {
                break;
            } else {
                prevLetter = bow;
                curLetter = randArr(mapping[bow][bow]);
            }
        }
 
        word += curLetter;
    }
 
    return word;
};
 
const arr = [];
for (let i = 0; i < 50; ++i) {
    arr.push(generateWord(mapping, 6, 15));
}
 
console.log(arr.sort());

Comments