Up and Down Kata Solutions http://www.codewars.com/kata/up-and-down 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();