RosettaCodeData/Task/Sum-and-product-puzzle/JavaScript/sum-and-product-puzzle-3.js
2023-07-01 13:44:08 -04:00

83 lines
2 KiB
JavaScript

(() => {
"use strict";
// ------------- SUM AND PRODUCT PUZZLE --------------
// main :: IO ()
const main = () => {
const
// xs :: [Int]
xs = enumFromTo(1)(100),
// s1 s2, s3, s4 :: [(Int, Int)]
s1 = xs.flatMap(
x => xs.flatMap(y =>
(1 < x) && (x < y) && 100 > (x + y) ? [
[x, y]
] : []
)
),
s2 = s1.filter(
p => sumEq(p, s1).every(
q => 1 < mulEq(q, s1).length
)
),
s3 = s2.filter(
p => 1 === intersectBy(pairEQ)(
mulEq(p, s1)
)(s2).length
);
return s3.filter(
p => 1 === intersectBy(pairEQ)(
sumEq(p, s1)
)(s3).length
);
};
// ---------------- PROBLEM FUNCTIONS ----------------
// add, mul :: (Int, Int) -> Int
const
add = xy => xy[0] + xy[1],
mul = xy => xy[0] * xy[1],
// sumEq, mulEq :: (Int, Int) ->
// [(Int, Int)] -> [(Int, Int)]
sumEq = (p, s) => {
const addP = add(p);
return s.filter(q => add(q) === addP);
},
mulEq = (p, s) => {
const mulP = mul(p);
return s.filter(q => mul(q) === mulP);
},
// pairEQ :: ((a, a) -> (a, a)) -> Bool
pairEQ = a => b => (
a[0] === b[0]
) && (a[1] === b[1]);
// ---------------- GENERIC FUNCTIONS ----------------
// enumFromTo :: Int -> Int -> [Int]
const enumFromTo = m =>
n => Array.from({
length: 1 + n - m
}, (_, i) => m + i);
// intersectBy :: (a -> a -> Bool) -> [a] -> [a] -> [a]
const intersectBy = eqFn =>
// The intersection of the lists xs and ys
// in terms of the equality defined by eq.
xs => ys => xs.filter(
x => ys.some(eqFn(x))
);
// MAIN ---
return main();
})();