RosettaCodeData/Task/List-comprehensions/JavaScript/list-comprehensions-3.js

32 lines
828 B
JavaScript

(n => {
'use strict';
// GENERIC FUNCTIONS ------------------------------------------------------
// concatMap :: (a -> [b]) -> [a] -> [b]
const concatMap = (f, xs) => [].concat.apply([], xs.map(f));
// enumFromTo :: Int -> Int -> [Int]
const enumFromTo = (m, n) =>
Array.from({
length: Math.floor(n - m) + 1
}, (_, i) => m + i);
// EXAMPLE ----------------------------------------------------------------
// [(x, y, z) | x <- [1..n], y <- [x..n], z <- [y..n], x ^ 2 + y ^ 2 == z ^ 2]
return concatMap(x =>
concatMap(y =>
concatMap(z =>
x * x + y * y === z * z ? [
[x, y, z]
] : [],
enumFromTo(y, n)),
enumFromTo(x, n)),
enumFromTo(1, n));
})(20);