\$\begingroup\$
\$\endgroup\$
2
Solution to 99 lisp problems: P08, with functional javascript
If a list contains repeated elements they should be replaced with a single copy of the element. The order of the elements should not be changed.
* (compress '(a a a a b c c a a d e e e e))
(A B C A D E)
Anyone want to review?
function cond( check, _then, _continuation ) {
if(check) return _then( _continuation )
else return _continuation()
}
function compress( list ) {
return (function check( index, item, nextItem, compressed ) {
return cond( item !== nextItem, function _then( continuation ) {
compressed = compressed.concat([ item ])
return continuation()
},
function _continueation() {
return cond(!nextItem, function _then() {
return compressed
},
function _continuation() {
return check( index + 1, list[index + 1], list[index + 2], compressed )
})
})
})( 0, list[0], list[1], [] )
}
asked Jul 23, 2012 at 1:51
1 Answer 1
\$\begingroup\$
\$\endgroup\$
1
I don't think you need so much complexity in javascript. It's not a fully functional language, don't try to make it so.
var arr = [
'a', 'a', 'a', 'b', 'b', 'c', 'd', 'd', 'a', 'e', 'e', 'e'
];
arr = arr.filter( function( el, i ) {
// return if the current isn't the same as the next
return el !== arr[ i + 1 ];
});
console.log( arr ); // ["a", "b", "c", "d", "a", "e"]
This is 2 lines.
answered Jul 23, 2012 at 8:01
-
\$\begingroup\$ The function passed to
filter
can be generalized by adding a third parameterarr
. \$\endgroup\$delete me– delete me2012年07月26日 01:10:59 +00:00Commented Jul 26, 2012 at 1:10
Explore related questions
See similar questions with these tags.
lang-lisp
cond
function can probably be replaced with a ternary operator and switching the order a little. \$\endgroup\$