Python no Uri Online Judge: Entradas e saídas para iniciantes

UraPython Community
9 min readFeb 1, 2020

--

Uri Online Judge é uma plataforma contendo mais de mil problemas divididos em várias categorias e níveis de dificuldade. Estes problemas podem ser resolvidos em diversas linguagens, por exemplo, Java, Lua, Kotlin, C, C++, Javascript, Haskell, Pascal, Scala, Ruby e Python. A plataforma pode ser acessada neste link.

Python é uma linguagem de programação que ganhou muitos adeptos no últimos anos e sua comunidade vem crescendo cada vez mais. Utilizar o Uri Online Judge como plataforma de treinamento é uma maneira excelente de melhorar suas habilidades com a linguagem. Se você está começando a aprender a linguagem Python comece por aqui.

Cada problema do Uri Online Judge fornece entradas e saídas que podem ser de formas variadas e, nesse tutorial, aprenderemos como tratar a maioria destas em Python.

Primeiro problema (1001)

O problema mais fácil na plataforma é o de número 1001 e pode ser encontrado clicando nesse link. Vejamos um exemplo de entradas do problema 1001:

O problema descreve a entrada como duas linhas, ambas contendo um número inteiro. Para leitura de uma linha em Python, usamos a built-in function input. No entanto, essa função retorna uma string após leitura. Logo, como as entradas são inteiras, é necessário fazer a conversão usando a built-in function int. Armazenaremos as respectivas entradas nas variáveis A e B, pois iremos trabalhar com elas no próximo passo. O código fica então da seguinte forma:

O próximo passo é converter as entradas em saída. O problema diz que devemos efetuar a soma das entradas das duas linhas e esta soma deve ser armazenada numa variável X para posteriormente ser utilizada na impressão da saída. Converter entradas em saídas é a parte lógica do problema:

Por fim, o problema nos diz como dever ser a saída. Neste ponto é importante deixar a saída exatamente como descrita, fique atento às instruções e ao exemplo dado no exercício.

Para o exercício 1001 a saída contém a letra X seguida por um espaço, em seguida um sinal de igualdade também seguido por um espaço e, por fim, o inteiro X resultado da soma de A com B. Os espaços são importantes e se faltar ou passar algum receberemos uma mensagem de erro, geralmente presentation errror. Vejamos como fica a saída em Python:

O código completo fica então:

Para enviar o código clicamos em enviar no menu lateral, mudamos a linguagem para Python 3, colamos o código abaixo das linhas já preenchidas e clicamos no botão verde Enviar. Aguardamos uns segundos e, no menu superior, vamos em Submissões -> Todas:

O resultado da nossa última submissão aparece no topo da lista. Caso seja Accepted, PARABÉNS, resolvemos nosso primeiro problema no Uri Online Judge!

Veremos a seguir tipos diferentes de entradas e saídas que podem aparecer nos problemas!

Sugestões de problemas com entradas e saídas semelhantes ao 1001: 1003, 1004, 1007, 1016

Saídas com casas decimais (1002)

Muitos problemas pedem para que o resultado seja impresso com um número determinado de casas decimais. Nessa seção resolveremos o problema 1002 como exemplo! Primeiro, trataremos as entradas.

A entrada é dada por uma única linha contendo um ponto flutuante de dupla precisão. Usaremos a built-in function input para ler a linha e float para transformar a entrada em ponto flutuante. Armazenaremos a entrada numa variável chamada raio.

O problema é calcular a área em função do raio utilizando como π o valor de 3.14159. Logo, o cálculo para área é dado pelo seguinte código:

Por fim, o problema pede que a saída seja a letra A seguida de um sinal de igualdade seguido pela area com 4 casas decimais. Dessa vez não há espaços na saída. Para limitar o valor da área à 4 casas decimais, usaremos :.4f entre chaves. O método format de strings, reconhecerá o padrão:

O código completo fica da seguinte forma:

Sugestões de problemas com entradas e saídas semelhantes ao 1002: 1005, 1006, 1008, 1009, 1011, 1014 e 1017

Várias entradas numa mesma linha (1013)

Alguns problemas fornecem mais de um valor de entrada por linha. Um exemplo é o 1013. Resolveremos este problema para ilustrar a leitura desses tipos de entradas.

A entrada é composta por três números inteiros separados por espaço. Novamente, para ler a linha utilizaremos a built-in function input. Para separar os valores por espaço, utilizaremos o método split e passaremos o espaço como parâmetro (não seria necessário, pois espaço já é o parâmetro padrão, mas passaremos mesmo assim, para fins didáticos). É necessário converter toda a lista de números para inteiros, para isso utilizaremos a built-in function map. Como primeiro parâmetro da função map passaremos a built-in function int. Como segundo parâmetro, passaremos a lista de números. Por fim, teremos uma lista com 3 inteiros. Guardaremos estes inteiros nas variáveis A, B e C:

Observe o espaço “ “ passado como parâmetro para o método split. Se as entradas tivessem separadas por vírgula, passaríamos vírgula “,” ao invés de espaço “ “.

Atribuir elementos de uma lista às variáveis numa só atribuição é chamado de desempacotamento (unpacking). Da maneira como resolveremos esse problema, o desempacotamento não seria necessário. Mas ignore este parágrafo por enquanto.

Neste post, nosso objetivo é apresentar como lidar com entradas e saídas. A lógica ficará para posts futuros. Este problema pede para utilizar uma elaborada função para calcular o máximo entre A e B. No entanto, utilizaremos apenas a built-in function max. Isso não causará erro, pois o corretor só analisa entradas e saídas, não a lógica envolvida. Guardaremos o resultado do máximo numa variável chamada maior.

A saída não tem técnicas novas:

O código completo fica:

Sugestões de problemas com entradas e saídas semelhantes ao 1013: 1010, 1012, 1015 e 1044

Várias entradas (1072)

Em muitos problemas haverá um número entradas variável. Como é o caso do problema 1072. A entrada é composta por uma primeira linha contendo um inteiro que representa o número de entradas inteiras que seguirão a partir da 2ª linha.

Para ler entradas desse tipo, armazenamos o inteiro da primeira linha numa variável numEnts. Em seguida iniciamos uma lista vazia chamada ents. Esta lista armazenará as entradas que seguirão. Por fim, utilizamos for para criar um loop que lê, converte em inteiro e armazena todas as entradas que seguirão nas próximas numEnts linhas:

O problema pede para contar as entradas no intervalo entre 10 e 20, incluindo estes dois números. O número de entradas fora do intervalo também é solicitado. Logo, no próximo passo deveremos determinar o número de entradas no intervalo, que guardaremos numa variável chamada count_ins, e o número de entradas fora desse intervalo, que guardaremos numa variável chamada count_outs:

Na linha 2 da figura acima utilizamos um processo chamado List comprehension. Basicamente, criamos uma nova lista apenas com os valores no intervalo determinado pelo problema. Na linha 3 calculamos o número de valores inteiros no intervalo e na linha 4 o número de valores inteiros fora do intervalo.

Por fim, basta imprimir a saída. Nesse caso, composta por duas linhas:

O código completo fica:

Alguns problemas tem restrição de memória, outros de tempo. A lista _ins poderia ter sido montada dentro do loop. Esse processo evitaria percorrer a lista duas vezes e o algoritmo rodaria mais rápido. Em relação à memória, dependendo do problema não será possível guardar na memória uma lista com todos os valores da entrada. Nesse caso, uma estratégia é, assim que utilizar o valor, deletá-lo da memória. Neste exemplo, era possível calcular count_ins e count_outs na medida que os valores são lidos:

O tempo gasto no segundo método (0.020) foi bem menor que o gasto pelo método anterior (0.036):

Esse tipo de estratégia não é o foco deste tutorial. A intenção é só aprender como fazer a leitura das entradas e como imprimir as saídas.

Sugestões de problemas com entradas e saídas semelhantes ao problema 1072: 1074, 1079, 1080 e 1099

Várias entradas com condição de parada (1113)

Outros problemas, não fornecem um número de entradas, no entanto uma condição de parada pode aparecer. Em outras palavras, devemos ler as entradas até que determinada condição seja satisfeita. Um exemplo desse tipo de problema é o de número 1113. Neste problema devemos ler uma linha com dois valores inteiros separados por espaço até que estes valores sejam iguais.

Para esse tipo de problema podemos usar loops do tipo while. O loop será finalizado quando a condição de parada for satisfeita. No caso do problema 1113, a última entrada ocorre quando os inteiros de uma mesma linha forem iguais. O código fica da seguinte forma:

Neste problema se X < Y devemos imprimir Crescente. Caso X > Y, devemos imprimir Decrescente. Logo, a lógica é a seguinte:

Sugestões de problemas com entradas e saídas semelhantes ao 1113: 1114, 1115, 1117 e 1118

Várias entradas com condição de parada EOF (2653)

Em alguns problemas devemos ler as entradas até o fim do arquivo, o chamado EOF. Um exemplo desse tipo é o problema 2653. Para esses casos utilizaremos try e except. Essas palavras-chave (keywords) são utilizadas para tratamento de erro em Python. Nesse caso, o erro é tentar ler a próxima linha do arquivo estando no final do mesmo (EOFError). Quando isso acontece, finalizamos o código. Vejamos como fica:

Observe que há possibilidade de imprimir saídas na linha 6, quando o problema pede uma saída para cada caso (ver exemplo 1113) ou imprimir uma saída na linha 10, quando o problema pede uma única saída para todos os casos. Este segundo é o caso do problema 2653.

Neste problema 2653 devemos contar quantas entradas são diferentes. Para isso colocaremos as entradas numa variável do tipo set a qual chamaremos de joias. Como variáveis do tipo set não armazena objetos repetidos, bastará contarmos o número de elementos desta utilizando a built-in function len:

Sugestões de problemas com entradas e saídas semelhantes ao 2653: 1564, 1789 e 2518

Considerações finais

Neste tutorial aprendemos a fazer leituras de entradas e imprimir saídas na plataforma Uri Online Judge utilizando a linguagem de programação Python.

Se você viu algum tipo de leitura de entradas que não foi contemplada nesse tutorial, deixe um comentário!

Algumas maratonas de programação, como a mineira, ainda não suportam a linguagem Python. Caso o objetivo do leitor seja a participação nesse tipo de maratona, os mesmos exercícios aqui apresentados também foram feitos na linguagem C. Consulte o link: https://github.com/eldereng/UriOnlineBasic

Agora é só treinar!!!

Até a próxima!!!

--

--

UraPython Community

Comunidade Python na cidade de Uberaba com objetivo de melhorar a vida dos uberabenses por meio do conhecimento da linguagem de programação Python.