Department numbers: Difference between revisions

→‎{{header|Javascript}}: Added an ES5 version
m (→‎{{header|Haskell}}: (a touch more sugar for the List comprehension and Do versions))
(→‎{{header|Javascript}}: Added an ES5 version)
Line 336:
 
=={{header|Javascript}}==
===ES5===
<lang JavaScript>(function () {
'use strict';
 
// NUMBERING CONSTRAINTS --------------------------------------------------
 
// options :: Int -> Int -> Int -> [(Int, Int, Int)]
function options(lo, hi, total) {
var bind = flip(concatMap),
ds = enumFromTo(lo, hi);
 
return bind(filter(even, ds),
function (x) { // X is even,
return bind(filter(function (d) { return d !== x; }, ds),
function (y) { // Y is distinct from X,
return bind([total - (x + y)],
function (z) { // Z sums with x and y to total, and is in ds.
return z !== y && lo <= z && z <= hi ? [
[x, y, z]
] : [];
})})})};
 
// GENERIC FUNCTIONS ------------------------------------------------------
 
// concatMap :: (a -> [b]) -> [a] -> [b]
function concatMap(f, xs) {
return [].concat.apply([], xs.map(f));
};
 
// enumFromTo :: Int -> Int -> [Int]
function enumFromTo(m, n) {
return Array.from({
length: Math.floor(n - m) + 1
}, function (_, i) {
return m + i;
});
};
 
// even :: Integral a => a -> Bool
function even(n) {
return n % 2 === 0;
};
 
// filter :: (a -> Bool) -> [a] -> [a]
function filter(f, xs) {
return xs.filter(f);
};
 
// flip :: (a -> b -> c) -> b -> a -> c
function flip(f) {
return function (a, b) {
return f.apply(null, [b, a]);
};
};
 
// length :: [a] -> Int
function length(xs) {
return xs.length;
};
 
// map :: (a -> b) -> [a] -> [b]
function map(f, xs) {
return xs.map(f);
};
 
// show :: a -> String
function show(x) {
return JSON.stringify(x);
}; //, null, 2);
 
// unlines :: [String] -> String
function unlines(xs) {
return xs.join('\n');
};
 
// TEST -------------------------------------------------------------------
var xs = options(1, 7, 12);
return '(Police, Sanitation, Fire)\n\n' +
unlines(map(show, xs)) + '\n\nNumber of options: ' + length(xs);
})();</lang>
{{Out}}
<pre>(Police, Sanitation, Fire)
 
[2,3,7]
[2,4,6]
[2,6,4]
[2,7,3]
[4,1,7]
[4,2,6]
[4,3,5]
[4,5,3]
[4,6,2]
[4,7,1]
[6,1,5]
[6,2,4]
[6,4,2]
[6,5,1]
 
Number of options: 14</pre>
===ES6===
By composition of generic functions.
9,655

edits