Ir ao conteúdo

C# Dificuldade em desafio da URI


Ir à solução Resolvido por Jheam Storch Ross,

Posts recomendados

Postado

Para desafiar a mim mesmo, recentemente eu estava olhando desafios na URI e, como sou apressado, escolhi um desafio difícil, mas não impossível.

Segue a descrição do desafio, exemplos e o link:

Citação

Leia a hora inicial, minuto inicial, hora final e minuto final de um jogo. A seguir calcule a duração do jogo.

Obs: O jogo tem duração mínima de um (1) minuto e duração máxima de 24 horas.

  • Entrada

Quatro números inteiros representando a hora de início e fim do jogo.

  • Saída

Mostre a seguinte mensagem: “O JOGO DUROU XXX HORA(S) E YYY MINUTO(S)” .

EXEMPLO DE ENTRADA:

7 8 9 10

EXEMPLO DE SAÍDA:

O JOGO DUROU 2 HORA(S) E 2 MINUTO(S)

Link: https://www.urionlinejudge.com.br/judge/pt/problems/view/1047

Segue o meu código:

using System;

namespace uri1047
{
    class Program
    {
        static void Main()
        {
            string[] input = Console.ReadLine().Split(' ');
            byte gameStartH = byte.Parse(input[0]);
            byte gameStartM = byte.Parse(input[1]);
            byte gameEndH = byte.Parse(input[2]);
            byte gameEndM = byte.Parse(input[3]);
            byte gameTimeH = new byte();
            byte gameTimeM = new byte();
            

            if (gameStartH == gameEndH && gameStartM == gameEndM)
            {
                gameTimeH = 24;
                goto skipEnd;
            }
            
            if (gameStartM == gameEndM)
            {
                gameTimeH++;
                gameTimeM = new byte();
                goto skipMid;
            }


            for (int i = gameStartM; i != gameEndM; i++)
            {
                if (i == 60)
                {
                    i = -1;
                    continue;
                }
                gameTimeM++;
            }
        
        skipMid:
            for (int i = gameStartH; i != gameEndH; i++)
            {
                if (i == 24)
                {
                    i = -1;
                    continue;
                }
                gameTimeH++;
            }
        
        skipEnd:
            Console.WriteLine($"O JOGO DUROU {gameTimeH} HORAS(S) E {gameTimeM} MINUTOS(S)");
        }
    }
}

Eu realmente não entendo o que se passa e porque insistem que meu código está com um erro <=10%.

Gostaria de pedir ajuda a todos, não para copiar e colar código pronto, mas, sim, para aprender.

  • Amei 1
  • Solução
Postado

Olá @devair1010 , obrigado por responder!

A resposta que o site me dá é uma Wrong answer (5%) e caso seja culpa de uma quebra de linha o erro não teria que ser 100%?

 

Outra coisa,

Eu fiz um novo algoritmo onde uso ifs e else com subtração para calcular o resto do dia não utilizado e subtrair do ciclo de 24h e 60min, segue o algoritmo:

Spoiler

using System;

namespace uri1047
{
    class Program
    {
        static void Main()
        {
            string[] input = Console.ReadLine().Split(' ');
            int startHr = int.Parse(input[0]);
            int startMin = int.Parse(input[1]);
            int endHr = int.Parse(input[2]);
            int endMin = int.Parse(input[3]);
            int durationHr = new int();
            int durationMin = new int();

            if (startHr == endHr && startMin == endMin)
            {
                durationHr = 24;
            }
            else 
            {
                if (startHr < endHr)
                {
                    durationHr = endHr - startHr;
                }
                else
                {
                    durationHr = 24 + (endHr - startHr);
                }

                if (startMin < endMin)
                {
                    durationMin = endMin - startMin;
                }
                else
                {
                    durationMin = 60 + (endMin - startMin);
                }
            }

            Console.WriteLine("O JOGO DUROU {0} HORAS(S) E {1} MINUTOS(S)", durationHr, durationMin);
        }
    }
}

 

E esse, novamente, retorna a resposta Wrong answer (5%).

adicionado 45 minutos depois

AEE C*R*LHOOOOOOO!!!!!!!! 😄

 

Código aceito:

Spoiler

using System;

namespace uri1047
{
    class Program
    {
        static void Main()
        {
            string[] input = Console.ReadLine().Split(' ');
            byte gameStartH = byte.Parse(input[0]);
            byte gameStartM = byte.Parse(input[1]);
            byte gameEndH = byte.Parse(input[2]);
            byte gameEndM = byte.Parse(input[3]);
            byte gameTimeH = new byte();
            byte gameTimeM = new byte();
            

            if (gameStartH == gameEndH && gameStartM == gameEndM)
            {
                gameTimeH = 24;
                goto skipEnd;
            }
            
            if (gameStartM == gameEndM)
            {
                gameTimeH++;
                gameStartH++;
                goto skipMid;
            }


            for (int i = gameStartM; i != gameEndM; i++)
            {
                if (i == 60)
                {
                    i = -1;
                    gameStartH++;
                    continue;
                }
                gameTimeM++;
            }
        
        skipMid:
            for (int i = gameStartH; i != gameEndH; i++)
            {
                if (i == 24)
                {
                    i = -1;
                    continue;
                }
                gameTimeH++;
            }
        
        skipEnd:
            Console.WriteLine($"O JOGO DUROU {gameTimeH} HORA(S) E {gameTimeM} MINUTO(S)");
        }
    }
}

 

Tá, mais o que aconteceu?

  • No segundo if onde trata o caso dos minutos serem iguais eu precisava indicar não só que tinha uma hora completa de tempo de jogo, como também era necessário indicar isso para o for que contava as horas para que ele não contasse essa hora que já fora tratada pelo if;
  • Eliminada a redundância do segundo if atribuir zero(0) à variável gameTimeM sendo que ela já estava contendo zero de qualquer forma;
  • Colocada um incrementador na variável gameStartH no primeiro for (que calcula os minutos de jogo) para evitar que o segundo for (que calcula as horas de jogo) adicione uma hora de jogo quando na verdade o ciclo não se fechou (Ex: 7 50 8 40 - O JOGO DUROU 0 HORA(S) E 50 MINUTO(S));
  • A saída tinha um erro onde eu repetia o S ("O JOGO DUROU 1 HORAS(S)"[...]).

 

Gostaria de agradecer a ajuda do @devair1010 e fico triste em ver o quão Clube (só) do Hardware (principalmente para recomendações do PC que você sonha) se tornou.

  • Curtir 1
Postado

Só mais um detalhe, o código que usa ifs e else para fazer o mesmo calculo eu acabei de modificar um pouco e também foi aceito, então vou postar aqui só para fins de estudo:

Spoiler

using System;

namespace uri1047
{
    class Program
    {
        static void Main()
        {
            string[] input = Console.ReadLine().Split(' ');
            int startHr = int.Parse(input[0]);
            int startMin = int.Parse(input[1]);
            int endHr = int.Parse(input[2]);
            int endMin = int.Parse(input[3]);
            int durationHr = new int();
            int durationMin = new int();

            if (startHr == endHr && startMin == endMin)
            {
                durationHr = 24;
            }
            else 
            {
                if (startMin <= endMin)
                {
                    durationMin = endMin - startMin;
                }
                else
                {
                    durationMin = 60 + (endMin - startMin);
                    startHr++;
                }
                
                if (startHr <= endHr)
                {
                    durationHr = endHr - startHr;
                }
                else
                {
                    durationHr = 24 + (endHr - startHr);
                }

            }

            Console.WriteLine("O JOGO DUROU {0} HORA(S) E {1} MINUTO(S)", durationHr, durationMin);
        }
    }
}

 

Basicamente esse novo código corrige um problema que acontecia quando startHr == endHr ^^ startMin == endMin.

Muito obrigado por tudo.

Spoiler

Alguém aí sabe de um fórum para programadores que tenha membros mais ativos?

 

  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...