JavaScript Test Tasks
[ javascript ]I passed the simple coding test during registration on the web site few days ago. There are 3 tasks:
1. Sort the numbers by frequency and leave original order for equal frequency numbers
I implemented modified bubble-sort for both the sorting and the saving original order
const input = '1 1 3 5 8 8 4 8 9';
var output = countSort(input);
console.log(output);
function countSort(s) {
  const a = s.split(' ').map(ch => +ch);
  const counters = {};
  a.forEach(x => {
    if (!counters[x])
      counters[x] = 1;
    else
      counters[x] += 1;
  });
  let process = true;
  while (process) {
    process = false;
    for (let i = 0, n = a.length; i < n - 1; i++)
      if (counters[a[i]] < counters[a[i+1]]) {
        const c = a[i];
        a[i] = a[i+1];
        a[i+1] = c;
        process = true;
      }
  }
  return a.join(' ');
}
2. Perfect numbers
6, 28, 496, …
for (let i = 0; i < 500; i++) {
  if (isPerfect(i))
    console.log(i);
}
function isPerfect(n) {
  if (n < 6)
    return false;
  let s = 0;
  for (let i = 1, count = n / 2; i <= count; i++) {
    if (n % i === 0)
      s += i;
  }
  return s === n;
}
3. String rank
I’m afraid there is be some more elegant pure regex solution. But I’ve done dummy straightforward solution.
console.log(stringRank('onion')); // on - 2
console.log(stringRank('codenrock')); // 0
console.log(stringRank('undergrounder')); // under - 5
function stringRank(s) {
  const a = s.toLowerCase().split('');
  if (a.length <= 1)
    return 0;
  let result = 0;
  for (let i = 1, n = a.length; i < n; i++) {
    let j;
    for (j = 0; j < i; j++)
      if (a[j] !== a[n-i+j])
        break;
    if (j === i)
      result = i;
  }
  return result;
}
Happy coding!