II MARATONA DE PROGRAMAÇÃO IFSP SÃO CARLOS Caderno de Tarefas 25 de outubro de 2012 Patrocínio: Realização: 1
INSTRUÇÕES: Este caderno de tarefas é composto por 5 tarefas divididas em 12 páginas. Verifique se o caderno está completo. É proibido o uso de notebook, celular, smartphone, tablet, pendrive, livros, revistas e qualquer outro material ou equipamento eletrônico que possa conceder alguma vantagem e/ou ajuda em relação a prova. O acesso à internet não será permitido. Atente ao nome do código fonte exigido para cada tarefa. As tarefas foram separas em dois níveis de dificuldade: fácil e difícil. As tarefas de nível fácil têm um valor de 100 pontos e penalidade de 10 pontos para cada submissão errada. As de nível difícil têm um valor de 200 pontos e penalidade de 20 pontos para cada submissão errada. Todos os dados devem ser lidos através da entrada padrão (teclado) e escritos na saída padrão (monitor). Por exemplo: read, readln, write e writeln em Pascal e scanf, printf, getchar e putchar em C. Após concluído o algoritmo a equipe deverá submeter o código fonte para avaliação e testes. A partir deste momento a tarefa será avaliada pela banca e a equipe poderá começar a resolução de outra. Concluído o processo de testes a equipe será avisada se a tarefa está correta ou não. Caso não, a equipe poderá tentar novamente. Haverá um quadro de classificação onde os participantes poderão acompanhar o tempo de prova e o número de tarefas submetidas por cada equipe. A classificação final se dará pelo número de pontos ao final do tempo de prova. Em caso de empate será adotado os seguintes critérios: número de tarefas resolvidas, número de submissões erradas, horário da última submissão. Tempo de duração: 3 horas. 2
Bolsa de valores Arquivo fonte: bolsa.pas ou bolsa.c Valor desta tarefa: 100 pontos. Penalidade: 10 pontos. Carlos trabalha na bolsa de valores e é responsável por gerenciar compras e vendas das ações de diversos empresários. Para melhor gerenciar essas transações, Carlos contratou você para fazer um programa capaz de gerar um relatório de movimentação das ações. 1. Tarefa Sua tarefa é desenvolver um programa que dado a quantidade de ações movimentadas e o horário de movimentação das mesmas seja capaz de gerar um relatório com o número de total de movimentações dentre um determinado espaço de tempo. 2. Entrada A entrada é composta por um conjunto linhas. Cada linha representa uma movimentação e é composta por um número inteiro Q representando a quantidade de ações movimentadas e dois inteiros H e M indicando a hora e minuto da movimentação respectivamente. O final das entradas das movimentações se da por Q = 0. Após as entradas de movimentações será feito mais duas linhas de entrada. Cada uma delas contendo dois inteiros H e M representando também a hora e minuto em que se deseja obter o relatório. Exemplo de entrada: 150 14 35 225 15 30 530 15 42 425 16 22 125 17 20 0 0 0 15 30 16 30 3. Saída Seu programa deve gerar uma única linha de saída contendo o número total de ações movimentadas dentro do período solicitado. Exemplo de saída (corresponde ao exemplo de entrada acima): 3
1180 4. Considerações 0 < Q <= 1000 (0 apenas para indicar final da entrada) 0 <= H < 24 0 <= M < 60 4
Caixa eletrônico Arquivo fonte: caixa.pas ou caixa.c Valor desta tarefa: 100 pontos. Penalidade: 10 pontos. Um novo banco está se instalando no condado de Ibaté e precisa fixar um caixa eletrônico para seus clientes. Para isso ele contratou seus serviços para desenvolver o software que será usado no caixa eletrônico. 1. Tarefa Sua tarefa será desenvolver um programa que leia o valor desejado para o saque e mostre a quantidade de cada nota que deverá ser entregue ao cliente de forma a minimizar o número de notas entregues. O caixa eletrônico possui apenas notas de R$ 50, R$ 20, R$ 10, R$ 5 e R$ 1. 2. Entrada A entrada é composta vários saques. Cada saque possui um número inteiro V que representa o valor solicitado para o saque. O final da entrada é indicado por V = 0. Exemplo de entrada: 13 55 342 0 3. Saída Para cada saque seu programa deve gerar uma linha de saída contendo cinco inteiros I, J, K, L e M representando, respectivamente, a quantidade de notas de 50, 20, 10, 5 e 1 entregue ao cliente. Exemplo de saída (corresponde ao exemplo de entrada acima): 0 0 1 0 3 1 0 0 1 0 6 2 0 0 2 4. Considerações 0 <= V <= 10000 5
Diferença entre Datas Arquivo fonte: data.pas ou data.c Valor desta tarefa: 100 pontos. Penalidade: 10 pontos. Cleovaldo é um jovem muito nerd que adora assistir aos programas da National Geographic. Um dia viu uma reportagem que falava das profecias sobre o fim do mundo. Uma delas é a profecia sobre o calendário Maia, onde diz que o mundo terá fim no ano de 2012, mais precisamente no dia 21 de dezembro de 2012. Muito preocupado com a chegada desses dias, Cleovaldo pediu para você fazer um programa que diga a quantidade de dias de vida que lhe restam e assim poder se planejar para realizar todos seus objetivos enquanto vivo. 1. Tarefa Sua tarefa será desenvolver um programa que, dado o dia, mês e ano de duas datas distintas, calcule a diferença em dias entre elas. 2. Entrada A entrada será composta de duas linhas. Cada uma contendo três inteiros que representam o dia, mês e ano de cada data, respectivamente. Lembrando que os meses de janeiro a dezembro têm respectivamente a seguinte quantidade de dias: 31, 28 (29 para ano bissexto), 31, 30, 31, 30, 31, 31, 30, 31, 30 e 31. Último ano bissexto: 2008. Exemplos de entrada: 10 5 2005 11 5 2005 10 10 2010 25 10 2011 3. Saída Ao final das entradas, imprima uma única linha contendo um inteiro representando o número de dias entre as duas datas. Exemplos de saída (corresponde aos exemplos de entrada acima): 1 380 6
4. Considerações 1 <= dia <= 31 1 <= mês <= 12 1900 <= ano <= 2999 (formato AAAA - com quatro dígitos) data1 < data2 (a segunda data será sempre maior que a primeira) 7
Jogo de Multiplicar Arquivo fonte: multiplicar.pas ou multiplicar.c Valor desta tarefa: 200 pontos. Penalidade: 20 pontos. Em um reino havia dois grande matemáticos Euclides e Fermat, que sempre disputavam para saber quem era o melhor. Para resolver esse dilema o rei propôs o jogo da multiplicação. Que funcionava de acordo com as regras: Euclides e Fermat deveriam multiplicar um número inteiro p por um número de 2 a 9. Euclides sempre começava com p = 1, fazia a sua multiplicação e então Fermat multiplicava o resultado por um número entre 2 e 9, depois novamente o Euclides, e assim por diante. Antes do jogo começar o rei sugeria um inteiro com valor entre 1 < n < 60000 e o vencedor era quem chegasse primeiro a p >= n. 1. Tarefa Assumindo que os dois matemáticos jogavam de modo perfeito, você o mago da corte deverá construir um programa que mostrará quem será o vencedor da batalha conforme o número fornecido pelo rei. Mostrando a todos que a sua magia é bem mais poderosa que a matemática deles. 2. Entrada A entrada se dará por um conjunto de teste. Cada teste é composto por uma linha de entrada contendo um número inteiro n que representa um número dado pelo rei. Quando n for igual a 0 (zero) indica o fim de entradas. Exemplo de entrada: 162 17 500 0 3. Saída Para cada entrada deverá ter uma saída dizendo o nome do matemático vencedor. Exemplo de saída (corresponde ao exemplo de entrada acima): Euclides Fermat Euclides 8
4. Considerações 1 < n < 60000 II MARATONA DE PROGRAMAÇÃO - IFSP SÃO CARLOS 9
Jogo de RPG Arquivo fonte: jogo.pas ou jogo.c Valor desta tarefa: 200 pontos. Penalidade: 20 pontos. Você sabia que antes mesmo de inventarem as interfaces gráficas já existiam jogos para computador? Muitos deles são bem famosos como os de RPG (role-playing game). Esses eram jogados através de ações específicas pela linha de comando, a famosa tela preta. 1. Tarefa Sua tarefa será desenvolver um jogo que dado as coordenadas X e Y do plano cartesiano, controle os passos de um ou mais personagem pelo mapa através de comandos de direção específicos. O mapa poderá conter portais de teletransporte que irão redirecionar o personagem para um outro ponto do mapa. E também árvores que não podem ser atravessadas pelo personagem. Exemplo: se houver uma árvore na coordenada 51,60 e um personagem na coordenada 50,60 e for dado um comando para o mesmo se mover para a direita, a ação deve ser desconsiderada e o personagem continua na mesma posição. O mesmo aplica-se a coordenadas em que outros personagens estejam ocupando. 2. Entrada A primeira entrada será um número inteiro N que representa o número de personagens que o seu jogo deve controlar os passos. As N linhas seguintes serão as coordenadas iniciais X e Y dos personagens. A seguinte entrada será outro número inteiro M que irá representar a quantidade de árvores espalhadas pelo mapa. As M linhas seguintes serão dois inteiros representando as coordenadas X e Y dessas árvores. A próxima entrada será um número inteiro J que será a quantidade de portais no mapa. As J linhas seguintes será composta por quatro inteiros representando as coordenadas X e Y dos portais e coordenadas X e Y dos pontos para onde os mesmos redirecionarão os personagens, respectivamente. As entradas seguintes serão strings S representando a direção que o personagem deve seguir. São elas: norte, sul, leste e oeste as quais devem fazer o personagem se mover para cima (Y-1), baixo (Y+1), direita (X+1) e esquerda (X-1) respectivamente. O programa deve ler os comandos de direção até que seja passada a palavra fim indicando o fim das entradas. Se houver mais que um personagem as entradas de direção se dará em ordem para cada um deles. Por exemplo: se houver dois personagens a primeira entrada de direção será para o primeiro personagem, a segunda entrada para o segundo personagem, a terceira para o primeiro personagem novamente e assim por diante. 10
Representação gráfica do exemplo de entrada abaixo. Exemplo de entrada: 2 //quantidade de personagens 41 31 //coordenada inicial do primeiro personagem 51 32 //coordenada inicial do segundo personagem 3 //quantidade de árvores 41 33 //coordenada da primeira árvore 46 31 //coordenada da segunda árvore 48 32 //coordenada da terceira árvore 1 //quantidade de portais 52 31 51 33 //coordenada do portal e ponto de redirecionamento sul //comando de direção para o primeiro personagem norte //comando de direção para o segundo personagem sul //comando de direção para o primeiro personagem leste //comando de direção para o segundo personagem leste //comando de direção para o primeiro personagem oeste //comando de direção para o segundo personagem fim //fim das entradas 3. Saída A saída deverá ser uma linha para cada personagem (seguindo a ordem de entrada) contendo as coordenadas X e Y das atuais posições do mesmo. Exemplo de saída (corresponde ao exemplo de entrada acima): 42 32 //coordenada final do primeiro personagem 50 33 //coordenada final do segundo personagem 11
4. Considerações II MARATONA DE PROGRAMAÇÃO - IFSP SÃO CARLOS 1 <= N <= 100 0 <= M <= 100 0 <= J <= 100 1 <= X <= 999 1 <= Y <= 999 S = norte, sul, leste, oeste ou fim (string sem espaços) Considere também que as coordenadas iniciais dos personagens, árvores e portais são distintas. Um portal nunca irá redirecionar o personagem para outro portal, coordenada de uma árvore ou de outro personagem. 12