Telokis

Markov chain 2 doublets

Apr 9th, 2019
358
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const data = [
  2.         'lorem', 'ipsum', 'dolor', 'sit', 'amet', 'consectetur',
  3.         'adipiscing', 'elit', 'curabitur', 'vel', 'hendrerit', 'libero',
  4.         'eleifend', 'blandit', 'nunc', 'ornare', 'odio', 'ut',
  5.         'orci', 'gravida', 'imperdiet', 'nullam', 'purus', 'lacinia',
  6.         'a', 'pretium', 'quis', 'congue', 'praesent', 'sagittis',
  7.         'laoreet', 'auctor', 'mauris', 'non', 'velit', 'eros',
  8.         'dictum', 'proin', 'accumsan', 'sapien', 'nec', 'massa',
  9.         'volutpat', 'venenatis', 'sed', 'eu', 'molestie', 'lacus',
  10.         'quisque', 'porttitor', 'ligula', 'dui', 'mollis', 'tempus',
  11.         'at', 'magna', 'vestibulum', 'turpis', 'ac', 'diam',
  12.         'tincidunt', 'id', 'condimentum', 'enim', 'sodales', 'in',
  13.         'hac', 'habitasse', 'platea', 'dictumst', 'aenean', 'neque',
  14.         'fusce', 'augue', 'leo', 'eget', 'semper', 'mattis',
  15.         'tortor', 'scelerisque', 'nulla', 'interdum', 'tellus', 'malesuada',
  16.         'rhoncus', 'porta', 'sem', 'aliquet', 'et', 'nam',
  17.         'suspendisse', 'potenti', 'vivamus', 'luctus', 'fringilla', 'erat',
  18.         'donec', 'justo', 'vehicula', 'ultricies', 'varius', 'ante',
  19.         'primis', 'faucibus', 'ultrices', 'posuere', 'cubilia', 'curae',
  20.         'etiam', 'cursus', 'aliquam', 'quam', 'dapibus', 'nisl',
  21.         'feugiat', 'egestas', 'class', 'aptent', 'taciti', 'sociosqu',
  22.         'ad', 'litora', 'torquent', 'per', 'conubia', 'nostra',
  23.         'inceptos', 'himenaeos', 'phasellus', 'nibh', 'pulvinar', 'vitae',
  24.         'urna', 'iaculis', 'lobortis', 'nisi', 'viverra', 'arcu',
  25.         'morbi', 'pellentesque', 'metus', 'commodo', 'ut', 'facilisis',
  26.         'felis', 'tristique', 'ullamcorper', 'placerat', 'aenean', 'convallis',
  27.         'sollicitudin', 'integer', 'rutrum', 'duis', 'est', 'etiam',
  28.         'bibendum', 'donec', 'pharetra', 'vulputate', 'maecenas', 'mi',
  29.         'fermentum', 'consequat', 'suscipit', 'aliquam', 'habitant', 'senectus',
  30.         'netus', 'fames', 'quisque', 'euismod', 'curabitur', 'lectus',
  31.         'elementum', 'tempor', 'risus', 'cras'
  32. ];
  33.  
  34. const randArr = arr => arr[Math.floor(Math.random() * arr.length)];
  35. const bow = Symbol("Beginning of word");
  36. const eow = Symbol("Ending of word");
  37.  
  38. const generateSeedData = raw => {
  39.     const mapping = {
  40.         [bow]: {
  41.             [bow]: []
  42.         },
  43.     };
  44.  
  45.     for (const word of raw) {
  46.         const lowWord = Array.isArray(word) ? word.map(w => w.toLowerCase()) : word.toLowerCase();
  47.         let prev = bow;
  48.         let prevPrev = bow;
  49.  
  50.         for (let i = 0; i < lowWord.length; ++i) {
  51.             const char = lowWord[i];
  52.  
  53.             mapping[prevPrev][prev].push(char);
  54.  
  55.             prevPrev = prev;
  56.             prev = char;
  57.  
  58.             if (!(prevPrev in mapping)) {
  59.                 mapping[prevPrev] = {};
  60.             }
  61.             if (!(prev in mapping[prevPrev])) {
  62.                 mapping[prevPrev][prev] = [];
  63.             }
  64.  
  65.             if (i === lowWord.length - 1) {
  66.                 mapping[prevPrev][prev].push(eow);
  67.             }
  68.         }
  69.     }
  70.  
  71.     return mapping;
  72. };
  73.  
  74. const mapping = generateSeedData(data);
  75.  
  76. const generateWord = (mapping, minLen = 4, maxLen = 50) => {
  77.     let word = "";
  78.  
  79.     let prevLetter = bow;
  80.     let curLetter = bow;
  81.     for (let i = 0; i < maxLen; ++i) {
  82.         const newLetter = randArr(mapping[prevLetter][curLetter]);
  83.  
  84.         prevLetter = curLetter;
  85.         curLetter = newLetter;
  86.  
  87.         if (curLetter === eow) {
  88.             if (i >= minLen) {
  89.                 break;
  90.             } else {
  91.                 prevLetter = bow;
  92.                 curLetter = randArr(mapping[bow][bow]);
  93.             }
  94.         }
  95.  
  96.         word += curLetter;
  97.     }
  98.  
  99.     return word;
  100. };
  101.  
  102. const arr = [];
  103. for (let i = 0; i < 50; ++i) {
  104.     arr.push(generateWord(mapping, 6, 15));
  105. }
  106.  
  107. console.log(arr.sort());
Advertisement
Add Comment
Please, Sign In to add comment