How to resolve the algorithm Sum and product puzzle step by step in the Haskell programming language
How to resolve the algorithm Sum and product puzzle step by step in the Haskell programming language
Table of Contents
Problem Statement
Solve the "Impossible Puzzle": It can be hard to wrap one's head around what the three lines of dialog between S (the "sum guy") and P (the "product guy") convey about the values of X and Y. So for your convenience, here's a break-down: Terminology:
Your program can solve the puzzle by considering all possible pairs (X, Y) in the range 2 ≤ X < Y ≤ 98, and then successively eliminating candidates based on the three facts. It turns out only one solution remains! See the Python example for an implementation that uses this approach with a few optimizations.
Let's start with the solution:
Step by Step solution about How to resolve the algorithm Sum and product puzzle step by step in the Haskell programming language
Puzzle:
The code solves a mathematical puzzle: find the set of pairs of integers (x, y)
such that:
1 < x < y < 100
x + y < 100
- There exists only one other pair within the set of solutions (
s1
) that has the same sum as the pair(x, y)
- There exists only one other pair within the set of solutions that has the same product as the pair
(x, y)
Solution:
The code follows these steps:
-
Generate Pairs (
s1
):- Generate all pairs of integers
(x, y)
that satisfy the initial constraints (line 14).
- Generate all pairs of integers
-
Filter Pairs by Sum (
s2
):- For each pair
p
, find all other pairsq
that have the same sum asp
(line 16). - Filter out pairs
p
where the number of pairsq
with the same sum is not equal to 1 (line 17).
- For each pair
-
Filter Pairs by Product (
s3
):- For each pair
p
froms2
, find all other pairsq
that have the same product asp
(line 19). - Filter out pairs
p
where the number of pairsq
with the same sum is not equal to 1 (line 20).
- For each pair
-
Filter Pairs by Intersection (
s4
):- For each pair
p
froms3
, find all other pairsq
that have the same sum asp
(line 22). - Filter out pairs
p
where the number of pairsq
with the same sum is not equal to 1 (line 23).
- For each pair
-
Print Result:
- Print the list of pairs
s4
that satisfy all the conditions (line 26).
- Print the list of pairs
Additional Notes:
- The
intersect
function fromData.List
is used to find the intersection of two lists. - The
>>=
operator is the "bind" operator from Haskell's monadic syntax, which allows for chaining together computations. - The
filter
function is used to filter a list based on a predicate function. - The
all
function checks if all elements in a list satisfy a predicate function. - The
uncurry
function converts a function that takes a tuple as an argument to a function that takes individual arguments.
Source code in the haskell programming language
import Data.List (intersect)
s1, s2, s3, s4 :: [(Int, Int)]
s1 = [(x, y) | x <- [1 .. 100], y <- [1 .. 100], 1 < x && x < y && x + y < 100]
add, mul :: (Int, Int) -> Int
add (x, y) = x + y
mul (x, y) = x * y
sumEq, mulEq :: (Int, Int) -> [(Int, Int)]
sumEq p = filter (\q -> add q == add p) s1
mulEq p = filter (\q -> mul q == mul p) s1
s2 = filter (\p -> all (\q -> (length $ mulEq q) /= 1) (sumEq p)) s1
s3 = filter (\p -> length (mulEq p `intersect` s2) == 1) s2
s4 = filter (\p -> length (sumEq p `intersect` s3) == 1) s3
main = print s4
import Data.List (intersect)
------------------ SUM AND PRODUCT PUZZLE ----------------
s1, s2, s3, s4 :: [(Int, Int)]
s1 =
[2 .. 100]
>>= \x ->
[succ x .. 100]
>>= \y ->
[ (x, y)
| x + y < 100
]
s2 = filter (all ((1 /=) . length . mulEq) . sumEq) s1
s3 = filter ((1 ==) . length . (`intersect` s2) . mulEq) s2
s4 = filter ((1 ==) . length . (`intersect` s3) . sumEq) s3
sumEq, mulEq :: (Int, Int) -> [(Int, Int)]
sumEq p = filter ((add p ==) . add) s1
mulEq p = filter ((mul p ==) . mul) s1
add, mul :: (Int, Int) -> Int
add = uncurry (+)
mul = uncurry (*)
--------------------------- TEST -------------------------
main :: IO ()
main = print $ take 1 s4
You may also check:How to resolve the algorithm Identity matrix step by step in the AutoHotkey programming language
You may also check:How to resolve the algorithm Write to Windows event log step by step in the REXX programming language
You may also check:How to resolve the algorithm Rot-13 step by step in the Malbolge programming language
You may also check:How to resolve the algorithm Inverted syntax step by step in the Perl programming language
You may also check:How to resolve the algorithm Averages/Pythagorean means step by step in the Erlang programming language