RosettaCodeData/Task/Department-numbers/JavaScript/department-numbers-4.js

52 lines
1.3 KiB
JavaScript

(() => {
"use strict";
// -------------- NUMBERING CONSTRAINTS --------------
// options :: Int -> Int -> Int -> [(Int, Int, Int)]
const options = lo => hi => total => {
const
bind = xs => f => xs.flatMap(f),
ds = enumFromTo(lo)(hi);
return bind(ds.filter(even))(
x => bind(ds.filter(d => d !== x))(
y => bind([total - (x + y)])(
z => (z !== y && lo <= z && z <= hi) ? [
[x, y, z]
] : []
)
)
);
};
// ---------------------- TEST -----------------------
const main = () => {
const
label = "(Police, Sanitation, Fire)",
solutions = options(1)(7)(12),
n = solutions.length,
list = solutions
.map(JSON.stringify)
.join("\n");
return (
`${label}\n\n${list}\n\nNumber of options: ${n}`
);
};
// ---------------- GENERIC FUNCTIONS ----------------
// enumFromTo :: Int -> Int -> [Int]
const enumFromTo = m =>
n => Array.from({
length: 1 + n - m
}, (_, i) => m + i);
// even :: Integral a => a -> Bool
const even = n => n % 2 === 0;
// MAIN ---
return main();
})();