Pesquisar este blog

Livros Recomendados

Mostrando postagens com marcador JavaScript. Mostrar todas as postagens
Mostrando postagens com marcador JavaScript. Mostrar todas as postagens

quarta-feira, 24 de março de 2021

URI (BEECROWD) - 1001 - Extremamente Básico - Iniciante - JavaScript e Haskell

Plataforma: URI (BEECROWD)

Problema1001

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))

URI (BEECROWD) - 1002 - Área do Círculo - Iniciante - JavaScript, Python3, Haskell, C e C++

Plataforma: URI (BEECROWD)

Problema1002

Linguagens: JavaScript, Python3, C e C++

Enunciado:

A fórmula para calcular a área de uma circunferência é: area = π . raio2. Considerando para este problema que π = 3.14159:

- Efetue o cálculo da área, elevando o valor de raio ao quadrado e multiplicando por π.

Solução:

Esse é um dos exercícios mais simples da plataforma, ideal para quem está começando no mundo da programação. Resolvi ele em três linguagens diferentes até o momento: JavaScript, Python3, C e C++.

A solução em JavaScript tem as duas primeiras linhas que são padrão. No URI você precisa ler o arquivo de texto da entrada padrão e dividir os dados de entrada, linha a linha, jogando isso para um array chamado lines. Basicamente é isso que é feito nas duas primeiras linhas. Considere que elas serão obrigatórias nas suas soluções de problemas com a linguagem JavaScript.

De acordo com a documentação, "o método shift() remove o primeiro elemento de um array e retorna esse elemento. Este método muda o tamanho do array". Como nosso array terá (em tese) somente um valor, pelo menos tomando como base os arquivos de entrada que estão no exemplo do exercício, isso não será problema, pois estamos armazenando o valor na variável r, com o devido cast realizado para que o valor seja um número (number).

Criamos então uma variável para o resultado (res), que faz o cálculo necessário para a área do círculo (pi x r²) e fixa a precisão em quatro casas decimais utilizando toFixed com parâmetro 4.

Depois disso é só usar o comando de escrita console.log no formato solicitado.

var input = require('fs').readFileSync('/dev/stdin', 'utf8');
var lines = input.split('\n');

var r = Number(lines.shift());
var res = (r * r * 3.14159).toFixed(4);
   
console.log(`A=${(res)}`);

Solução em Python3:

r = float(input())
print("A={:.4f}".format(r * r * 3.14159))

Solução em Haskell:

Em Haskell é necessário importar a função printf, pois com ela é fácil de delimitar as casas decimais. Usa-se readLn para ler o valor da entrada padrão e tratá-lo como um Double, como pede o exercício. Depois basta formatar a saída com printf, calculando n x R² com n = 3.14159 como sugere o exercício.

import Text.Printf (printf)
main :: IO ()
main = do 
   r <- readLn :: IO Double
   printf "A=%.4f\n" (3.14159 * r * r)

Solução em C: 

Existem vários caminhos para resolver este problema em C.  Eu criei uma variável de ponto flutuante de dupla precisão (double), realizei a leitura com scanf e fiz o cálculo da área diretamente no printf. Utilizei a função pow, da biblioteca math.h, que já faz a potência e retorna o valor também em double.
Na formatação da saída, usei %.4lf porque o .4 aqui faz a delimitação de quatro casas decimais.

Importante: pode ser que ao testar o código com math.h você precise usar "-lm" no gcc. Isso se deve à linkedição (ligação) que precisa ser realizada com a biblioteca matemática. Pode ser que isso seja necessário com outras bibliotecas também.

#include <stdio.h>
#include <math.h>

int main() {
    double r;
    
    scanf("%lf", &r);
    printf("A=%.4lf\n", 3.14159 * pow(r, 2.0));
}

Solução em C++: 

A fórmula para a questão é sempre a mesma, o que muda são as instruções de entrada e saída, basicamente. Aqui usei std::cin para a leitura do valor e std::cout para a escrita da resposta. A delimitação de casas decimais foi feita com fixed e setprecision(4). Esta função está na biblioteca iomanip, que foi incluída na linha 2 do código.

#include <iostream>
#include <iomanip>

using namespace std;

int main() {
    double r;
    
    cin >> r;
    cout << "A=" << fixed << setprecision(4) << 3.14159 * (r * r) << endl;
    
    return 0;
}

E as suas soluções, como ficaram? Estão diferentes das minhas?

domingo, 15 de novembro de 2020

URI - 1000 - Hello World! - Iniciante - JavaScript

Plataforma: URI

Problema1000

Enunciado:
O problema deve imprimir "Hello World!", com quebra de linha no fim.

Linguagem: JavaScript

Solução:

var lines = require('fs').readFileSync('/dev/stdin', 'utf8').split('\n');
console.log("Hello World!");

Postagem em destaque

URI (BEECROWD) - 2158 - Helping Uncle Cláudio (Ajudando o Tio Cláudio) - Matemática - C, C++ e Haskell

Buenas! Estou aqui mais uma vez para resolver um problema de Matemática! Agora tenho resolvido alguns dessa categoria, pra que vocês possam ...

Postagens mais visitadas