-- Algoritmo
pitag n
= let lista
= [1..n
] in [(gcd a b
== 1, a
, b
, c
) | a
<- lista
, b
<- lista
, c
<- lista
, a
<b
&& b
<c
, a
^2 + b
^2 == c
^2, a
+b
+c
<= n
]
-- Início da interacção com o utilizador:
-- Pergunta qual o modo de input pretendido
main = do
putStrLn "1 = Introduzir um perímetro máximo\n2 = Introduzir lista de perímetros" if opcao
== 1 then mainpitag1
else if opcao
== 2 then mainpitag2
else putStrLn "Opção inexistente."
-- Hipótese de saída nº 1:
-- Pede perímetro máximo, mostrar números opcional
mainpitag1 = do
putStrLn $ "Mostrar trios? (0 = NÃO, outro = SIM)" mapM_ putStrLn $ let res
= pitag n
in ("(pitagoreanos, primários) -> " ++ (if mostrar
/= 0 then map ((" * " ++) . show) res
else [])
-- Hipótese de saída nº 2:
-- Pede lista de perímetros, mostrar números de cada um opcional
mainpitag2 = do
putStrLn $ "Lista de perímetros máximos? (e.g., \"[50, 100, 24]\"):" putStrLn $ "Mostrar trios? (0 = NÃO, outro = SIM)" putStrLn $ "Perímetro -> (pitagoreanos, primários)" where
resultado n mst
= map (\x
-> let res
= pitag x
in show x
++ " -> " ++ (if mst
/= 0 then "\n" ++ (concat . map ((" * " ++) . (++ "\n") . show) $ res
) else [])) $ n
LS0gQWxnb3JpdG1vCnBpdGFnIG4gPSBsZXQgbGlzdGEgPSBbMS4ubl0gaW4gWyhnY2QgYSBiID09IDEsIGEsIGIsIGMpIHwgYSA8LSBsaXN0YSwgYiA8LSBsaXN0YSwgYyA8LSBsaXN0YSwgYTxiICYmIGI8YywgYV4yICsgYl4yID09IGNeMiwgYStiK2MgPD0gbl0KCi0tIEluw61jaW8gZGEgaW50ZXJhY8Onw6NvIGNvbSBvIHV0aWxpemFkb3I6Ci0tIFBlcmd1bnRhIHF1YWwgbyBtb2RvIGRlIGlucHV0IHByZXRlbmRpZG8KbWFpbiA6OiBJTygpCm1haW4gPSBkbwogICAgcHV0U3RyTG4gIjEgPSBJbnRyb2R1emlyIHVtIHBlcsOtbWV0cm8gbcOheGltb1xuMiA9IEludHJvZHV6aXIgbGlzdGEgZGUgcGVyw61tZXRyb3MiCiAgICBvcGNhbyA8LSAocmVhZExuIDo6IElPIEludCkKICAgIGlmIG9wY2FvID09IDEgdGhlbiBtYWlucGl0YWcxIGVsc2UgaWYgb3BjYW8gPT0gMiB0aGVuIG1haW5waXRhZzIgZWxzZSBwdXRTdHJMbiAiT3DDp8OjbyBpbmV4aXN0ZW50ZS4iCgotLSBIaXDDs3Rlc2UgZGUgc2HDrWRhIG7CuiAxOgotLSBQZWRlIHBlcsOtbWV0cm8gbcOheGltbywgbW9zdHJhciBuw7ptZXJvcyBvcGNpb25hbAptYWlucGl0YWcxIDo6IElPKCkKbWFpbnBpdGFnMSA9IGRvCiAgICBwdXRTdHJMbiAkICJQZXLDrW1ldHJvIG3DoXhpbW8/IgogICAgbiA8LSAocmVhZExuIDo6IElPIEludCkKICAgIHB1dFN0ckxuICQgIk1vc3RyYXIgdHJpb3M/ICgwID0gTsODTywgb3V0cm8gPSBTSU0pIgogICAgbW9zdHJhciA8LSAocmVhZExuIDo6IElPIEludCkKICAgIG1hcE1fIHB1dFN0ckxuICQgbGV0IHJlcyA9IHBpdGFnIG4gaW4gKCIocGl0YWdvcmVhbm9zLCBwcmltw6FyaW9zKSAtPiAiICsrCiAgICAgICAgc2hvdyAobGVuZ3RoICQgcmVzLCBsZW5ndGggLiBmaWx0ZXIgKFwoYSwgXywgXywgXykgLT4gYSA9PSBUcnVlKSAkIHJlcykpIDoKICAgICAgICAoaWYgbW9zdHJhciAvPSAwIHRoZW4gbWFwICgoIiAgICogIiArKykgLiBzaG93KSByZXMgZWxzZSBbXSkKCi0tIEhpcMOzdGVzZSBkZSBzYcOtZGEgbsK6IDI6Ci0tIFBlZGUgbGlzdGEgZGUgcGVyw61tZXRyb3MsIG1vc3RyYXIgbsO6bWVyb3MgZGUgY2FkYSB1bSBvcGNpb25hbAptYWlucGl0YWcyIDo6IElPKCkKbWFpbnBpdGFnMiA9IGRvCiAgICBwdXRTdHJMbiAkICJMaXN0YSBkZSBwZXLDrW1ldHJvcyBtw6F4aW1vcz8gKGUuZy4sIFwiWzUwLCAxMDAsIDI0XVwiKToiCiAgICBuIDwtIChyZWFkTG4gOjogSU8gW0ludF0pCiAgICBwdXRTdHJMbiAkICJNb3N0cmFyIHRyaW9zPyAoMCA9IE7Dg08sIG91dHJvID0gU0lNKSIKICAgIG1vc3RyYXIgPC0gKHJlYWRMbiA6OiBJTyBJbnQpCiAgICBwdXRTdHJMbiAkICJQZXLDrW1ldHJvIC0+IChwaXRhZ29yZWFub3MsIHByaW3DoXJpb3MpIgogICAgbWFwTV8gcHV0U3RyTG4gJCByZXN1bHRhZG8gbiBtb3N0cmFyCiAgICAgICAgd2hlcmUKICAgICAgICAgICAgcmVzdWx0YWRvIG4gbXN0ID0gbWFwIChceCAtPiBsZXQgcmVzID0gcGl0YWcgeCBpbiBzaG93IHggKysgIiAtPiAiICsrCiAgICAgICAgICAgICAgICBzaG93IChsZW5ndGggJCByZXMsIGxlbmd0aCAuIGZpbHRlciAoXChhLCBfLCBfLCBfKSAtPiBhID09IFRydWUpICQgcmVzKSArKwogICAgICAgICAgICAgICAgKGlmIG1zdCAvPSAwIHRoZW4gIlxuIiArKyAoY29uY2F0IC4gbWFwICgoIiAgICogIiArKykgLiAoKysgIlxuIikgLiBzaG93KSAkIHJlcykgZWxzZSBbXSkpICQgbg==
1 = Introduzir um perímetro máximo
2 = Introduzir lista de perímetros
Lista de perímetros máximos? (e.g., "[50, 100, 24]"):
Mostrar trios? (0 = NÃO, outro = SIM)
Perímetro -> (pitagoreanos, primários)
100 -> (17,7)
50 -> (6,3)