Skip to content

Instantly share code, notes, and snippets.

@stepharr
Created May 12, 2017 16:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save stepharr/e1fb67848d2e5630fe442bb2cdc0b738 to your computer and use it in GitHub Desktop.
Save stepharr/e1fb67848d2e5630fe442bb2cdc0b738 to your computer and use it in GitHub Desktop.
Up and Down Kata solutions

Up and Down Kata Solutions

Solution #1

function arrange(str) {
  var words = str.split(' ');
 
  for (var d = 1, j = 0, i = 1; i < words.length; i++) {
    if (d * words[j].length > d * words[i].length) {
      [words[j], words[i]] = [words[i], words[j]];
    }

    j = i;
    d = -d;
  } 

  return words
    .map((w, i) => w[i % 2 ? 'toUpperCase' : 'toLowerCase']())
    .join(' ');
}

Solution #2

function arrange(s) {
  let words = s.toLowerCase().split(' ');
  return mapIf( mapIf(words, areUnordered, toSwapped), indexIsOdd, toUpCase ).join(" ")
}

function mapIf( arr, pred, mapper ){
  return arr.map( (v,i,aa) => pred(v,i,aa) ? mapper(v,i,aa) : v )
}

const unordered = [
  (a,b) => a.length> b.length,
  (a,b) => a.length< b.length
]

function areUnordered(v,i,aa){
  let next = aa[i+1]||false;
  return next && unordered[i%2](v,next)
}

function toSwapped(v,i,aa){
  v = aa[i+1];
  aa[i+1] = aa[i];
  return v
}

const indexIsOdd = (_,x) => x%2;
const toUpCase = x => x.toUpperCase();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment