v1
- by nikkypizza 5/18/202300
Setup HTML - click to add setup HTML
disable setup JavaScript
Setup JavaScript

const test = (fn) => {
	fn('Are they here', 'yes, they are here');
	fn(" In manyDDFF languages", " there's a pair of functions");
	fn("mmmmm m nnnnn y&friend&Paul has heavy hats! &", "my frie n d Joh n has ma n y ma n y frie n ds n&");
}
delete caserun single casemove downdrag and drop case


ready



function mixMine(s1, s2) {
  /** Only lowercase letters */
  const cleanStrings = [s1, s2].map(it => it.replace(/[^a-z]/g, '').split(''));
  
  /** {a: [3,2], b: [0,5], c: [6,6]} */
  const lettersCount = cleanStrings.reduce((acc, arr, index) => {
    for (let i = 0; i < arr.length; i++) {
      const letter = arr[i];
      if (!acc[letter]) {
        acc[letter] = [0, 0];
      }

      acc[letter][index] += 1;
    }
    return acc;
  }, {});

  /** {2: ['1:gg', '2:ee', '2:ff'], 3: ['1:aaa', '1:nnn']} */
  const lengthToArr = {};

  for (const letter in lettersCount) {
    let [first, second] = lettersCount[letter];

    if (first >= 2 || second >= 2) {
      if (first === second) {
        if (!lengthToArr[second]) lengthToArr[second] = [];

        lengthToArr[second].push(`=:${letter.repeat(second)}`)
        lengthToArr[second].sort();
      } else {
        const maxLen = Math.max(first, second);
        if (!lengthToArr[maxLen]) lengthToArr[maxLen] = [];

        lengthToArr[maxLen].push(`${first > second ? 1 : 2}:${letter.repeat(maxLen)}`)
        lengthToArr[maxLen].sort();
      }
    }
  }

  return Object.keys(lengthToArr).sort((a, b) => +b - +a).reduce((acc, it) => {
    acc.push(lengthToArr[it].join('/'));
    return acc;
  }, []).join('/');
}

test(mixMine);
delete caserun single casemove upmove downdrag and drop case


ready



const alphabet = 'abcdefghijklmnopqrstuvwxyz'.split('');

function mixTopSolution(s1, s2) {
  return alphabet
    .map(char => {
      const s1Count = s1.split('').filter(x => x === char).length,
            s2Count = s2.split('').filter(x => x === char).length,
            maxCount = Math.max(s1Count, s2Count);

      return {
        char: char,
        count: maxCount,
        src: maxCount > s1Count ? '2' : maxCount > s2Count ? '1' : '='
      };
    })
    .filter(c => c.count > 1)
    .sort((objA, objB) => objB.count - objA.count || (objA.src + objA.char > objB.src + objB.char ? 1 : -1))
    .map(c => `${c.src}:${c.char.repeat(c.count)}`)
    .join('/');
}

test(mixTopSolution);
delete caserun single casemove upmove downdrag and drop case


ready



function mixSecondToTop(s1, s2) {
  var counter = s => s.replace(/[^a-z]/g,'').split('').sort().reduce((x,y)=> (x[y] = 1 + (x[y]||0), x),{});
  s1 = counter(s1); s2 = counter(s2);
  var res = [], keys = new Set(Object.keys(s1).concat(Object.keys(s2)));
  keys.forEach(key => {
    var c1 = s1[key]||0, c2 = s2[key]||0, count = Math.max(c1, c2);
    if (count>1) {
      var from = [1, '=', 2][Math.sign(c2-c1)+1];
      var str = [...Array(count)].map(_=>key).join('');
      res.push(from+':'+str);
    }
  });
  return res.sort((x, y) => y.length - x.length || (x < y ? -1 : 1)).join('/');}


test(mixSecondToTop)
delete caserun single casemove upmove downdrag and drop case


ready




const sanitise = string => {
  return string
          .split('')
          .filter(Boolean)
          .filter(c => 'abcdefghijklmnopqrstuvwxyz'.indexOf(c) > -1)
          .filter(c => string.match(new RegExp(c, 'g')).length > 1)
          .join('');
}

const group = string => {
  return string.split('').sort().reduce((acc, c, i, arr) => {
    if (!acc[c]) acc[c] = arr.slice(arr.indexOf(c), arr.lastIndexOf(c) + 1).length;
    return acc;
  }, {});
}

const alphaSort = (a, b) => {
  if (a > b) return -1;
  if (a < b) return 1;
  return 0;
}

const sort = (a, b) => {
  const comparator = a.split(':')[1].length - b.split(':')[1].length;
  return comparator !== 0 ? comparator : alphaSort(a, b);
}

const repeat = (c, n) => {
  return Array(n + 1).join(c)
}

function mixLongestSolution(s1, s2) {
  const group1 = group(sanitise(s1));
  const group2 = group(sanitise(s2));
  const keys = [...Object.keys(group1), ...Object.keys(group2)];

  return keys
    .filter((c, i, arr) => arr.indexOf(c) === i)
    .reduce((output, k) => {
      const len1 = group1[k] || 0;
      const len2 = group2[k] || 0;

      if (len1 === len2) {
        return [...output, `=:${repeat(k, len1)}`];
      }
      else if (len1 > len2) {
        return [...output, `1:${repeat(k, len1)}`];
      }
      else {
        return [...output, `2:${repeat(k, len2)}`];
      }
      return output;
    }, [])
    .sort(sort)
    .reverse()
    .join('/');
}

test(mixLongestSolution)
delete caserun single casemove updrag and drop case


ready



    function compSol(a, b) {
        var r;
        var cp = b.length - a.length;
        if (cp === 0) {
            if (a < b) r = -1; else r = 1;
        } else {
            r = cp;
        }
        return r;
    }
    function mixAuthorSolution(s1, s2) {
      var alpha_s1 = Array(27).join(1).split('').map(function(){return 0;});
      var alpha_s2 = Array(27).join(1).split('').map(function(){return 0;});
      var l1 = s1.length; var l2 = s2.length; var i; var res = ""; var c;
      for(i = 0; i < l1; i++) {
        c = s1.charCodeAt(i);
        if (c >= 97 && c <= 122)
          alpha_s1[c - 97]++;
      }
      for(i = 0; i < l2; i++) {
        c = s2.charCodeAt(i);
        if (c >= 97 && c <= 122)
          alpha_s2[c - 97]++;
      }
      for(i = 0; i < 26; i++) {
        var sm = Math.max(alpha_s1[i], alpha_s2[i]);
        if (sm > 1) {
          if (sm > alpha_s1[i]) {
            res += "2:" + Array(sm+1).join(String.fromCharCode(i + 97)) + "/";
          } else {
            if (sm > alpha_s2[i]) {
              res += "1:" + Array(sm+1).join(String.fromCharCode(i + 97)) + "/";
            } else {
            res += "=:" + Array(sm+1).join(String.fromCharCode(i + 97)) + "/";
            }
          }
        }
      }
      if (res.Length === 0) return "";
      return res.substring(0, res.length - 1).split("/").sort(compSol).join("/");
    }


test(mixAuthorSolution)
Test Case - click to add another test case
Teardown JS - click to add teardown JavaScript
Output (DOM) - click to monitor output (DOM) while test is running
RUN