Ir ao conteúdo
  • Cadastre-se

C# Dificuldade em desafio da URI


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

Posts recomendados

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.

  • Obrigado 1
  • Amei 1
Link para o comentário
Compartilhar em outros sites

  • Solução

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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!