[Prévia] [Próxima] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico]
[Índice de assunto]
Re: Problema 1 aula
- Subject: Re: Problema 1 aula
- From: Anonymous <anony@sti.com.br>
- Date: Sat, 13 Mar 1999 19:49:50 -0300 (EST)
Oi gente,
Andre, andei pensando tambem nesse problema. E (felismente :)
cheguei a uma conclusao semelhante `a sua, com excecao a parte de escolher
a primeira opcao da sequencia como o contrario da ultima do outro jogador.
Acho que essa parte seria realmente aleatoria. Porem, nao posso afirmar...
Quanto ao seu programa, gostei bastante. E resolvi fazer o meu com
base na ideia de ser totalmente de representacao binaria. Acho que assim
agilizaria um pouco se escolhesse muitas partidas.
Um abraco,
Rodrigo Couto
Um pequeno PS: o meu programa foi feito no linux. Nao tenho windows aqui
em casa para testar no djgpp. Desculpas pessoal. Desculpas tambem pela
falta de documentacao.
/***************************************************************
* Programa de teste do 'desafio das moedas' *
* *
* Author: Rodrigo Couto *
* Date: Sat Mar 13 19:45:33 EST 1999 *
***************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <getopt.h>
#include <time.h>
/*
* utilizarei numeros binarios para representar tanto cara('h') como coroa
* ('t'):
* h = 1
* t = 0
* e amarzenarei-os em short int(16bits), limitando os patterns de 4 a 15.
*/
/* funcao translation: transforma uma string contento h's e t's na forma
* binaria
* argumentos:
* char* string: pointer para a string a ser traduzida
* retorna:
* short int contendo a sequencia. Em caso de erros retorna NULL
*/
short int translation(char* string) {
int i, n;
short int answer;
char c;
/* zerando... */
answer = 0;
/* checando tamanho da string */
n = strlen(string);
if((n > 15) || (n < 4))
return (short int) NULL;
/* parsing... */
for(i = 0; i < n; i++) {
switch(string[i])
{
case 'h':
answer = (answer << 1) | 1;
break;
case 't':
answer <<= 1;
break;
default:
return (short int) NULL;
}
}
return answer;
}
/*
* funcao matches: simula n partidas
* argumentos:
* int times: o numero de partidas a serem disputadas
* short int patt: a 1a. sequencia escolhida
* short int patt2: a 2a. sequencia escolhida(ou gerada)
* int size: o numero de elementos nas sequencias patt*
*/
void matches(int times, short int patt, short int patt2, int size) {
short int temp, mask;
int victories; // vitorias da seq1
int i, j, flag;
flag = 0;
victories = 0;
mask = 0;
for(i = 0; i < size; i++)
mask = (mask << 1) | 1;
for(i = 0; i < times; i++) {
for(j = 0; j < (size - 1); j++)
temp = (temp << 1) | (rand() % 2);
for(;;) {
temp = (temp << 1) | (rand() % 2);
temp &= mask;
if(temp == patt) {
victories++;
break;
} else if(temp == patt2) {
break;
}
}
}
printf("Vitorias da Seq1: %d\n", victories);
printf("Vitorias da Seq2: %d\n", times - victories);
}
/*
* funcao gen_seq: gera uma sequencia de tamanho n que em tese terah maior
* probabilidade de ganhar. (segundo o email do Andre)
* argumentos:
* short int other: a sequencia do outro jogador
* int size: o tamanho da sequencia
* retorna:
* short int contento a nova sequencia
*/
short int gen_seq(short int other, int size) {
short int temp;
int i;
temp = 0;
other >>=1; // eliminando a ultima opcao da
// sequencia do 1 jogador;
temp |= other; // transferindo para o temp;
temp |= (((other | 1) ^ 1) ? 0 : 1 << size);
// colocando o oposto da ultima opcao
// do outro jogador como primeira opcao
// nossa ;
return temp;
}
int main(int argc, char* argv[]) {
short int temp, temp2;
int c, i, flag, flag2;
int times, size, size2;
/* random seed */
srand(time(NULL));
/* pegando argumentos */
if(argc == 1) {
fprintf(stderr,
"E necessario pelo menos um argumento. %s -h para ajuda.\n",
argv[0]);
return 1;
}
flag = 1;
flag2 = 1;
times = 100;
while((c = getopt(argc, argv, "p:s:hm:")) != -1)
switch(c) {
case 'p':
flag = 0;
if((temp = translation(optarg)) != (short int) NULL) {
size = strlen(optarg);
break;
} else {
fprintf(stderr,
"Nao eh uma sequencia valida. %s -h para ajuda.\n",
argv[0]);
return 1;
}
case 's':
flag2 = 0;
if((temp2 = translation(optarg)) != (short int) NULL) {
size2 = strlen(optarg);
break;
} else {
fprintf(stderr,
"Nao eh uma sequencia valida. %s -h para ajuda.\n",
argv[0]);
return 1;
}
case 'm':
for(i = 0; i < strlen(optarg); i++)
if(!isdigit(optarg[i])) {
fprintf(stderr, "Numero de partidas nao eh valido.\n");
return 1;
}
times = atoi(optarg);
break;
case 'h':
break;
case '?':
if (isprint (optopt))
fprintf (stderr, "Unknown option `-%c'.\n", optopt);
else
fprintf (stderr,
"Unknown option character `\\x%x'.\n",
optopt);
return 1;
default:
abort ();
}
if(flag) {
fprintf(stderr, "Sequencia nao especificada.\n");
return 1;
}
else if(flag2) {
printf("Nao ha segunda sequencia. Criando uma sequencia...\n");
temp2 = gen_seq(temp, size);
}
else if(size != size2) {
printf("Sequencias de tamanhos diferentes. Abortando.\n");
return 1;
}
else if(temp == temp2) {
printf("Sequencias identicas. Empate iminente.\n");
return 1;
}
printf("Seq1\tSeq2\n0x%04X\t0x%04X\n", temp, temp2);
/* iniciando partidas */
matches(times, temp, temp2, size);
return 0;
}