Jump to content

Topas 2008 - exC


polska

Recommended Posts

Boas pessoal, estava a resolver o topas 2008 quando me deparei com um output que não percebi, eu tentei várias soluções mas mesmo parecendo estar correcto, não estava...

Reina grande confusão na quinta desde que Jacó chegou. Jacó aprendeu a imitar todos os animais na perfeição - ``piupiu'', ``muuu'', ``miao'', ``cocorocoo'', ``cacaraca'', ``quaqua'', ``auau'', ``meemee'', e ``jaco''. Um extenso repertório! e até faz composições com duas ou três palavras (``meemeeauau'', ``piupiumuu'', ``auaujacoquaqua'', ``cocorocoocacaraca'', etc). O dono começou a achar melhor oferecer Jacó, mas a sua afeição ao bicho impedia-o de tomar uma decisão. Num dia de menos trabalho, fez um registo da situação. Sem se enganar, anotou o número de patas do animal que fez barulho e o barulho que fazia: 2piupiu2meemee4muuu4miao2cocorocoo4meemee2jacocacaraca2auau2jaco2miao

2piupiuquaquajaco4miao4auau2piupiumeemee4muuu4meemee2piupiu2cacaraca... No fim, pensando melhor, viu que não sabia quais eram os registos do papagaio. Mas, nem tudo estava perdido.

Tarefa

Escrever um programa que, dada uma sequência de registos terminada por 0, cada um dos quais numa linha diferente, indique o número de registos total e o número mínimo e máximo dos do papagaio (escritos numa linha, separados por um espaço, e terminando com mudança de linha).

Exemplo 1

Input

2 piupiu

2 meemee

4 muuu

2 jacoquaqua

4 auau

4 miao

0

Output

6 2 3

O problema é muito simples e eu tenho os outputs correctos, mas mesmo assim dá wrong answser, eu tenho quase a certeza que o problema é no ultimo inteiro do output...

Eu não percebo o que eles querem com o número máximo de registo do papagaio... o mínimo é quantos sons foram produzidos pelo papagaio, mas o máximo??

Alguma ajuda?

Edited by polska

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Link to comment
Share on other sites

Alguma ajuda?

Ajuda: quantas patas tem o papagaio?

Edit: pode ter sido o papagaio a emitir o "som" abaixo?

4 auau

Pode ter sido a ovelha a emitir o "som" abaixo?

2 meemee
Edited by pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

Ajuda: quantas patas tem o papagaio?

Edit: pode ter sido o papagaio a emitir o "som" abaixo?

4 auau

Pode ter sido a ovelha a emitir o "som" abaixo?

2 meemee

2

nao

nao

Ou seja, o número máximo é o número de registos que podiam ter sido do papagaio, mesmo não tendo sido, é isso ?

Se sim, eu já tentei isso, mas continuo com wrong answer...

Só se estou a trocar patas nos outros animais...

//ler som
 scanf("%[^\n]", som);
 if(som[0] != '0')
 {
  //tratamento de input
  total++;
  found = false;

  switch(som[0])
  {
  case '2':
   if(strcmp(som, "2 piupiu") == 0 || strcmp(som, "2 cocorocoo") == 0 || strcmp(som, "2 cacaraca") == 0 || strcmp(som, "2 quaqua") == 0 )
 found = true;
   break;
  case '4':
   if(strcmp(som, "4 meemee") == 0 || strcmp(som, "4 miao") == 0 || strcmp(som, "4 auau") == 0 || strcmp(som, "4 muuu") == 0 )
 found = true;
   break;
  }
  if(!found)
   jaco++;
  if(som[0] == '2')
   jaco1++;
  //limpar buffer
  scanf("%*[^\n]"); scanf("%*c");
 }
}while(som[0] != '0');
printf("%d %d %d\n", total, jaco, jaco1);
Edited by polska

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Link to comment
Share on other sites

Faltou-te a parte do "até faz composições com duas ou três palavras".

Nenhuma das tuas condicoes considera a linha de exemplo

2 jacoquaqua
Edited by pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

Faltou-te a parte do "até faz composições com duas ou três palavras".

Nenhuma das tuas condicoes considera a linha de exemplo

2 jacoquaqua

porque eu no switch já comparo com os casos que não pode ter sido o papagaio a emitir.. Se não encontrar, é porque foi um som emitido pelo papagaio, como jacoquaqua, e conta na var jaco ...

Edited by polska

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Link to comment
Share on other sites

O "som" jacoquaqua tem, obrigatoriamente, de ter sido feito pelo papagaio.

A unica duvida que eu tenho (mas suponho que nao aparece nos textos do TOPAS) e se uma galinha pode fazer composicoes ou so o papagaio ...

2 cacaracacacaracacacaraca

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

O "som" jacoquaqua tem, obrigatoriamente, de ter sido feito pelo papagaio.

Exacto...

if(strcmp(som, "2 piupiu") == 0 || strcmp(som, "2 cocorocoo") == 0 || strcmp(som, "2 cacaraca") == 0 || strcmp(som, "2 quaqua") == 0 )
 found = true;
break;
  case '4':
if(strcmp(som, "4 meemee") == 0 || strcmp(som, "4 miao") == 0 || strcmp(som, "4 auau") == 0 || strcmp(som, "4 muuu") == 0 )

Eu aqui comparo o som emitido com todos os sons que não podem ter sido emitidos pelo papagaio, ou seja, se não encontrar nenhum, é porque foi o papagaio, e incrementa sempre na variavel de registo mínimo...

A variável de registos máximos aumenta se foi emitido um som com numero de patas 2.

É suposto estar correcto o problema... Eu penso que não falta nada no enunciado, uma informação para resolver o problema não pode faltar... inclusive em algumas questões colocadas no servidor eles respondem que é preciso ler com cuidado..

Uma das respostas deles foi:

Pergunta:

eu já li e também ja pedi ajuda mas o senhor que me veio explicar não consegui dizer nada. E disse-me para perguntar aqui. No problema pede o número de registos, o mínimo e o máximo dos do papagaio e se for relativo ao número que aparece atrás do som que ele faz não aparece nenhum 3 no exemplo dado. Mas está um 3 no Output e essa é a minha dúvida

Resposta:

O numero de patas é 2 ou 4. O numero de que se fala diz respeito às intervenções do papagaio!

Edited by polska

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Link to comment
Share on other sites

Os numeros do resultado exemplo significam

6 ==> linhas de input

2 ==> sons que obrigatoriamente foram emitidos pelo papagaio (2 meemee + 2 jacoquaqua)

3 ==> sons que podia ter sido o papagaio (os de 2 patas)

E ainda: nenhum dos teus strcmp() compara com "jaco".

Edit: estou a assumir que "jaco" e um som natural para um animal especifico embora nao faca ideia qual seja esse animal

Edited by pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

E ainda: nenhum dos teus strcmp() compara com "jaco".

Não preciso de comparar, tem este output lá também :

2 piupiu

2 auau

2 jaco

2 piupiumiaoquaqua

4 meemee

4 miao

2 auaujacomiao

4 muuu

0

Output

8 4 5

Se eu comparasse dava mal..

Edited by polska

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Link to comment
Share on other sites

O animal que emite o som "jaco" tem 4 patas!

Edit

8 linhas de input

4 papagaio: 2 auau + 2 jaco + 2 piupiumiaoquaqua + 2 auaujacomiao

5 duas patas

Edit2: deve ser o jacare -- LOL

Edited by pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

O animal que emite o som "jaco" tem 4 patas!

Edit

8 linhas de input

4 papagaio: 2 auau + 2 jaco + 2 piupiumiaoquaqua + 2 auaujacomiao

5 duas patas

Edit2: deve ser o jacare -- LOL

LOOOOL! 😄

É bem provável, o que me dá que pensar é que mesmo assim dá wrong answer! Porra! xD

if(strcmp(som, "4 meemee") == 0 || strcmp(som, "4 miao") == 0 || strcmp(som, "4 auau") == 0 || strcmp(som, "4 muuu") == 0 || strcmp(som, "4 jaco") == 0)
 found = true;

Eu pensei que jaco fosse mesmo o papagaio.. não outro animal... Mas nem dá de uma nem de outra maneira! xD

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Link to comment
Share on other sites

Nos teus strcmp, quando o som for "2 piupiumiao", a comparacao seguinte falha e nao obriga esse som a ter sido produzido pelo papagaio

strcmp(som, "2 piupiu")

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

Nos teus strcmp, quando o som for "2 piupiumiao", a comparacao seguinte falha e nao obriga esse som a ter sido produzido pelo papagaio

strcmp(som, "2 piupiu")

Como assim? é normal que falhe não é? São strings diferentes, não encontra e incrementa.. Comigo esta a dar certo

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Link to comment
Share on other sites

O meu codigo (dentro dum spoiler: acaba o teu antes de veres este) ficou assim

#include <stdio.h>
#include <string.h>

int main(void) {
 char buffer[100] = {0};
 unsigned minjaco = 0, maxjaco = 0, count = 0;

 while (fgets(buffer, sizeof buffer, stdin)) {
   if (buffer[0] == '0') break;
   count++;
   if (buffer[0] == '4') continue;
   maxjaco++;
        if (buffer[2] == 'a') minjaco++;
   else if (buffer[2] == 'm') minjaco++;
   else if (buffer[2] == 'j') minjaco++;
   else if ((buffer[2] == 'c') &&
            (buffer[10] != '\n') &&
            (buffer[11] != '\n')) minjaco++;
   else if ((buffer[2] == 'p') && buffer[8] != '\n') minjaco++;
   else if ((buffer[2] == 'q') && buffer[8] != '\n') minjaco++;
   memset(buffer, 0, sizeof buffer);
 }
 printf("%d %d %d\n", count, minjaco, maxjaco);
 return 0;
}

O meu codigo assume que sons repetidos so o papagaio pode fazer, isto e, uma galinha nao pode fazer

2 cacaracacacaraca

Comigo esta a dar certo

Se calhar sao os teus scanf()s

A funcao scanf() nao e aconselhada para inputs variados. Usa fgets() para ler uma linha completa.

Mete, imediatamente a seguir ao teu scanf() um print de debug, para veres o que o teu programa esta a considerar

  scanf("%[^\n]", som);
 printf("debug som tem [%s]\n", som);
Edited by pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

O meu codigo (dentro dum spoiler: acaba o teu antes de veres este) ficou assim

#include <stdio.h>
#include <string.h>

int main(void) {
 char buffer[100] = {0};
 unsigned minjaco = 0, maxjaco = 0, count = 0;

 while (fgets(buffer, sizeof buffer, stdin)) {
if (buffer[0] == '0') break;
count++;
if (buffer[0] == '4') continue;
maxjaco++;
	 if (buffer[2] == 'a') minjaco++;
else if (buffer[2] == 'm') minjaco++;
else if (buffer[2] == 'j') minjaco++;
else if ((buffer[2] == 'c') &&
		 (buffer[10] != '\n') &&
		 (buffer[11] != '\n')) minjaco++;
else if ((buffer[2] == 'p') && buffer[8] != '\n') minjaco++;
else if ((buffer[2] == 'q') && buffer[8] != '\n') minjaco++;
memset(buffer, 0, sizeof buffer);
 }
 printf("%d %d %d\n", count, minjaco, maxjaco);
 return 0;
}

O meu codigo assume que sons repetidos so o papagaio pode fazer, isto e, uma galinha nao pode fazer

2 cacaracacacaraca

Se calhar sao os teus scanf()s

A funcao scanf() nao e aconselhada para inputs variados. Usa fgets() para ler uma linha completa.

Mete, imediatamente a seguir ao teu scanf() um print de debug, para veres o que o teu programa esta a considerar

  scanf("%[^\n]", som);
 printf("debug som tem [%s]\n", som);

Com os printf's, mostrava que a variavel ficava sempre com o input correcto...

Eu usei scanf neste problema, porque o meu fgets estava a ler mal o input, por exemplo:

//input
do
{
 //ler som
 fgets(som, sizeof som, stdin);
 if(som[0] != '0')
 {
  //tratamento de input
  total++;
  found = false;

  switch(som[0])
  {
  case '2':
if(strcmp(som, "2 piupiu") == 0 || strcmp(som, "2 cocorocoo") == 0 || strcmp(som, "2 cacaraca") == 0 || strcmp(som, "2 quaqua") == 0 )
 found = true;
break;
  case '4':
if(strcmp(som, "4 meemee") == 0 || strcmp(som, "4 miao") == 0 || strcmp(som, "4 auau") == 0 || strcmp(som, "4 muuu") == 0 || strcmp(som, "4 jaco") == 0)
 found = true;
break;
  }
  if(!found)
jaco++;
  if(som[0] == '2')
jaco1++;
 }
}while(som[0] != '0');
printf("%d %d %d\n", total, jaco, jaco1);

Aqui uso o fgets, e o output é 6 6 7...Ou seja, falha as comparações.. Enquanto se mudar para gets não posso porque o servidor não permite a utiização dessa função, e se usar scanf já dá o output correcto..

Já agora, o código está correcto, mas não percebo, o meu código também assume que todos os sons repetidos são feitos pelo papagaio, porque o 'found' iria ser false ... Será mesmo do scanf?

Edited by polska

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Link to comment
Share on other sites

mudar para gets

NAO!

Eu nao sugeri isso! Eu sugeri que mudasses para fgets().

Experimenta o print de debug ...

Edit: Atencao que o fgets mantem o '\n' no fim da string!

// fgets(...)
// strcmp(..., "2 piupiu\n")
Edited by pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

NAO!

Eu nao sugeri isso! Eu sugeri que mudasses para fgets().

Experimenta o print de debug ...

ahahaha, eu mesmo assim não usaria, é pouco seguro..

Mas é como disse no post anterior, eu inicialmente usei fgets, mas não estava a ler direito o input e então não fazia as comparações direitas...

Acabei de mudar o problema e mesmo assim dá problema, por exemplo, se som for 2 piupiu, ao comparar com 2 piupiu, diz que é diferente e aumenta no jaco

while(fgets(som, sizeof som, stdin))
{
if(som[0] == '0')
break;
total++;
if(som[0] == '4')
continue;
jaco1++;
if( (strcmp(som, "2 piupiu")!=0) && (strcmp(som, "2 cocorocoo")!=0) && (strcmp(som, "2 cacaraca")!=0) && (strcmp(som, "2 quaqua")!=0) )
jaco++;
}

EDIT: Conssegui fazer as comparações direitas, mas agora não posso submeter uma vez que já foi aceite xD :

#include <stdio.h>
#include <string.h>
int main()
{
char som[100] = {0};
int total, jaco, jaco1;

total = jaco = jaco1 = 0;
//input
while(fgets(som, sizeof som, stdin))
{
 if(som[0] == '0')
  break;
 total++;
 if(som[0] == '4')
  continue;
 jaco1++;
 if( (strcmp(som, "2 piupiu\n")!=0) && (strcmp(som, "2 cocorocoo\n")!=0) && (strcmp(som, "2 cacaraca\n")!=0) && (strcmp(som, "2 quaqua\n")!=0) )
  jaco++;
 memset(som, 0, sizeof som);
}
printf("%d %d %d\n", total, jaco, jaco1);

return 0;
}

Agora este também daria correcto certo? Sons repetidos são considerados como emitidos pelo papagaio..

Edited by polska

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Link to comment
Share on other sites

EDIT: Conssegui fazer as comparações direitas...

Conceito a reter desta experiencia: o scanf nao presta para input!

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.