Plataforma: URI (BEECROWD)
Problema: 1001
Linguagens: JavaScript e Haskell
Enunciado:
Leia 2 valores inteiros e armazene-os nas variáveis A e B. Efetue a soma de A e B atribuindo o seu resultado na variável X. Imprima X conforme exemplo apresentado abaixo. Não apresente mensagem alguma além daquilo que está sendo especificado e não esqueça de imprimir o fim de linha após o resultado, caso contrário, você receberá "Presentation Error".
Solução:
Este exercício é um dos mais básicos da plataforma, devem ser lidos dois valores e a soma deles deve ser apresentada no formato X = a+b.
Código em JavaScript: aqui as duas primeiras linhas são padrão, servem para ler os valores do arquivo de entrada padrão e para dividi-lo em linhas. As duas linhas seguintes pegam cada entrada de dados e a colocam nas variáveis a e b, respectivamente. O comando console.log imprime o valor informado, que será X = (valor da soma de a+b).
var input = require("fs").readFileSync("/dev/stdin", "utf8");
var lines = input.split("\n");
var a = parseInt(lines.shift());
var b = parseInt(lines.shift());
console.log(`X = ${(a+b)}`);
Código em Haskell: Haskell é uma linguagem funcional muito interessante. Aqui se usa as duas primeiras linhas, que serão sempre essas em suas soluçẽs, e as funções readLn para ler os valores e inseri-los respectivamente em a e b. Haskell tem um sistema de tipos bem particular, e neste caso, podemos ver que na atribuição dos valores de a e b temos a parte qu diz :: IO Int, isso significa que os valores lidos serão inteiros. A função putStrLn realiza a saída. Sempre deve-se colocar putStrLn $ id na saída, e entre parênteses colocamos o que será impresso.
Neste exemplo, foi utilizada a função show com o parâmetro a+b. A função show faz a conversão do seu parâmetro para string, semelhante a funções toString de outras linguagens de programação. O operador ++ faz a concatenação de listas. Como em Haskell uma string é uma lista de carcteres, o operador ++ está juntando a expressão "X = " com o resultado da função show. Por exemplo, se a = 5 e b = 9, a mensagem escrita será "X = 14".
Observação: como o URI (ou agora BEECROWD) exige quebra de linha após o último comando de escrita, optou-se por usar putStrLn. Caso não seja desejável a quebra de linha, usa-se putStr.
main :: IO ()
main = do
a <- readLn :: IO Int
b <- readLn :: IO Int
putStrLn $ id ("X = " ++ show(a + b))
Solução 2 em Haskell:
Como já vimos em outras postagens, o id é simplesmente a função identidade. Desta forma, podemos removê-la, assim como o cifrão/dólar ($), que faz apenas a substituição do termo da direita na função da esquerda. Portanto, outro código equivalente e que passa corretamente pelo juíz online do Beecrowd é:
main :: IO ()
main = do
a <- readLn :: IO Int
b <- readLn :: IO Int
putStrLn ("X = " ++ show(a + b))
Solução 3 em Haskell:
Aqui a única diferença é "quebrar" o texto de saída em duas partes, a parte constante "X = " e a parte da soma (a+b). A diferença é que na primeira parte foi usado putStr para não quebrar a linha, depois usa-se com Ln no fim (putStrLn) para que a linha seja quebrada, conforme solicitado pelo padrão do juíz online do URI/Beecrowd.
main :: IO ()
main = do
a <- readLn :: IO Int
b <- readLn :: IO Int putStr ("X = ")
putStrLn (show(a + b))
Nenhum comentário:
Postar um comentário