#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define get_rand()  ((float)random()/(float)0xffffffff)
static char smask[] = {0x0,0x8,0x10,0x2,0x20,0x1,0x4,0x0};

unsigned int encode(unsigned int m) {
    return ((m<<5^m<<3)&0x20)
        |  ((m<<4^m<<3)&0x10)
        |  ((m<<2^m<<1)&0x8)
        |       ((m<<2)&0x4)
        |            (m&0x2)
        |       ((m>>2)&0x1);
}

unsigned int correct(unsigned int r) {
    unsigned int s;
    s =   ((r<<2^r^r>>3)&0x4)
        | ((r>>1^r^r>>3)&0x2)
        | ((r>>1^r^r>>3)&0x1);
    return (s!=7)?r^smask[s]:-1;
}

unsigned int decode(unsigned int r) {
    return (r>>2&1) | (r&2) | (r<<2&4);
}

void transmit(int* r,float e) {
    int i,m;
    for (i=0,m=0;i<6;i++)
        m |= ((get_rand()<e)?1:0)<<i;
    *r ^= m;
}

void messages(int* msgs,int n) {
    int i;
    for (i=0;i<n;i++)
        msgs[i] = random()&7;
}

int main(int argc, char** argv) {
    int     n = 1000;
    float   er[] = {0.02,0.6,0.01};
    float e;
    unsigned int i,c,s,nerrs;
    int     msgs[n];


    srand(time(NULL));
    messages(msgs,n);

    printf("{");
    for (e=er[0];e<=er[1];e+=er[2]) {
        for (i=0,nerrs=0;i<n;i++) {
            c = encode(msgs[i]);
            transmit(&c,e);
            s = correct(c);
            if ((s<0) || (msgs[i] != decode(c)))
                nerrs++;
        }
        printf("{%f,%f},\n",e,(float)nerrs/(float)n);
    }
    printf("}\n");
    return 0;
}
