User:Ledrug/bits: Difference between revisions

no edit summary
No edit summary
No edit summary
 
Line 1:
<lang c>#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <math.h>
 
#define N 100
#define D 6
 
typedef float flt;
typedef struct { flt p1, p2; int32_t hold; } strat;
strat ** prob;
#define P(op, sc, h) (prob[(op) * N + (sc)][h])
inline flt better(strat * p) {
return p->hold ? p->p1 : p->p2;
}
 
inline flt p_better(int op, int sc, int h) {
return better(&P(op, sc, h));
}
 
#define FOR(x, n) for (x = 0; x < n; x++)
 
void mkarray()
{
int i, j;
prob = malloc(sizeof(*prob) * N * N);
strat * pp = calloc(sizeof(*pp), N * N * (N + 1) / 2);
 
FOR(i, N) FOR(j, N)
prob[i * N + j] = pp, pp += N - j;
}
 
int step_array()
{
int converged = 1;
int i, j, k, r;
 
FOR(i, N) FOR(j, N) FOR(k, N - j) {
strat *p = &P(i, j, k);
 
flt p_current = p_better(i, j, k), chance1, chance2;
 
chance1 = 1 - p_better(j + k, i, 0); // if holding
 
chance2 = 1 - p_better(j, i, 0); // if rolling
for (r = 2; r <= D; r++)
chance2 += (j + k + r >= N) ? 1 : p_better(i, j, k + r);
chance2 /= D;
 
p->p1 = chance1;
p->p2 = chance2;
p->hold = k && chance1 > chance2;
 
if (converged && fabs(p_better(i, j, k) - p_current) > 1e-4)
converged = 0;
}
 
return converged;
}
 
void write_array()
{
int i, j, k;
FOR(i, N) {
FOR(j, N - i) {
printf("%2d %2d: ", i, j);
FOR(k, N) {
strat *p = &P(k,i,j);
putchar(p->hold ? '.' : 'R');
printf("(%.3f %.3f) ", p->p1, p->p2);
}
putchar('\n');
}
putchar('\n');
}
}
 
int main(void)
{
int i = 0;
mkarray();
 
while (!step_array())
fprintf(stderr, "iter %d\n", ++i);
 
write_array();
 
return 0;
}</lang>
 
<lang c>#include <ucontext.h>
#include <stdlib.h>
Anonymous user