Just getting up to speed in Ramda, I have implemented this:
var R = require('ramda');
var divisibleBy = (b) => R.compose(R.equals(0), R.flip(R.modulo)(b))
var fizzbuzz = R.map(R.cond([
[R.both(divisibleBy(3), divisibleBy(5)), R.always('FizzBuzz')],
[divisibleBy(3), R.always('Fizz')],
[divisibleBy(5), R.always('Buzz')],
[R.T, R.identity]
]));
console.log(fizzbuzz(R.range(1,101)))
Can I improve this, or is there a more canonical way of doing this in Ramda?
2 Answers 2
This got some discussion in the Ramda Gitter Room. Although several people had different suggestions, my feeling -- and I believe the consensus -- was that this is very well done, and there's little to improve.
If you want it slightly more points-free, you could write divisibleBy
like this:
var divisibleBy = R.curry(R.pipe(R.flip(R.modulo), R.equals(0)));
But, no, I don't think there is any more canonical way of doing this in Ramda.
BTW, I'm one of the original authors of Ramda, and as far as I've seen, yours is the very first Ramda fizzbuzz in existence!
-
\$\begingroup\$ in your suggestion, does it need the curry? \$\endgroup\$Keith Nicholas– Keith Nicholas2015年10月24日 01:43:09 +00:00Commented Oct 24, 2015 at 1:43
-
1\$\begingroup\$ Yes, it does. We tried currying the result of
pipe
/compose
in versions 0.16/0.17, but there were serious issues with it, and that's been reverted in version 0.18. \$\endgroup\$Scott Sauyet– Scott Sauyet2015年10月24日 02:34:43 +00:00Commented Oct 24, 2015 at 2:34
I won't claim it's more canonical but how about this for an alternative:
const isMultipleOf = curry(compose(equals(0),flip(modulo)));
const rule = (f, s) => when(
compose(f, view(lensIndex(0))),
over(lensIndex(1), concat(__,s))
);
const fizzBuzz = n => map(
pipe(
rule( isMultipleOf(3), 'Fizz' ),
rule( isMultipleOf(5), 'Buzz' ),
filter( compose(not, isEmpty) ),
last
),
xprod( times(inc, n), of('') )
);
const printFizzBuzz = compose( forEach(console.log), fizzBuzz );
printFizzBuzz(15);
It avoids the duplication of the 'FizzBuzz' case, i.e. when divisible by both 3 and 5.
Explore related questions
See similar questions with these tags.