0votos

Juego del disparejo en C

por josejuan hace 4 años

Usando bits.

Tres personas lanzan (cada uno) una moneda, si caen las tres monedas en ÁGUILA O SOL nadie gana. Gana quien tenga la moneda diferente de las otras dos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#define BIT(n)       ((m>>n)&1) 
#define TST(A,B,C,n) (((BIT(B)==BIT(C))&&(BIT(A)^BIT(B)))<<n) 
 
int JuegoDelDisparejo(int m) { 
  return TST(0,1,2,2) + TST(1,0,2,1) + TST(2,0,1,0); 
 
/* 
 
  Ya que la tabla de victorias es: 
   
        MONEDAS  || VICTORIA 
       A | B | C || A | B | C 
      ---+---+---++---+---+--- 
       0 | 0 | 0 || - | - | - 
       0 | 0 | 1 || - | - | X 
       0 | 1 | 0 || - | X | - 
       0 | 1 | 1 || X | - | - 
       1 | 0 | 0 || X | - | - 
       1 | 0 | 1 || - | X | - 
       1 | 1 | 0 || - | - | X 
       1 | 1 | 1 || - | - | - 
 
*/ 
 
 
 
 
 
// Por ejemplo (código completo): 
 
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
 
#define BIT(n)       ((m>>n)&1) 
#define TST(A,B,C,n) (((BIT(B)==BIT(C))&&(BIT(A)^BIT(B)))<<n) 
 
int JuegoDelDisparejo(int m) { 
  return TST(0,1,2,2) + TST(1,0,2,1) + TST(2,0,1,0); 
 
void main(int argc, char **argv) { 
 
  int i, j; 
  const char* gana[5] = { "nadie", "A", "B", "", "C" }; 
   
  // ===== tabla de resultados posibles ================================== 
  for(i = 0; i < 8; i++) 
    printf("%i - gana: %i (%s)\n", i, JuegoDelDisparejo(i), gana[JuegoDelDisparejo(i)]); 
     
 
  // ====== todos tienen la misma probabilidad de ganar (y empate) ======= 
  int wins[5] = {0, 0, 0, 0, 0}; 
  srandom(time(0)); 
  for(i = 0; i < 1000000; i++) 
    wins[JuegoDelDisparejo(rand())]++; 
   
  for(j = 1; j < 9; j <<= 1) 
    printf("Gana %s %i veces (%i%%)\n", gana[j&7], wins[j&7], (100 * wins[j&7]) / i); 
 
/* 
 
josejuandisparejo$ gcc disparejo.c 
josejuandisparejo$ ./a.out 
0 - gana: 0 (nadie) 
1 - gana: 4 (C) 
2 - gana: 2 (B) 
3 - gana: 1 (A) 
4 - gana: 1 (A) 
5 - gana: 2 (B) 
6 - gana: 4 (C) 
7 - gana: 0 (nadie) 
Gana A 249888 veces (24%) 
Gana B 249376 veces (24%) 
Gana C 250912 veces (25%) 
Gana nadie 249824 veces (24%) 
josejuandisparejo$ 
 
*/ 
1 comentario
0votos

Escrito por ARIEL hace 4 años

Me parece muy buen código.

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.