#include #include #include struct group { char c[4]; int enabled; int num; }; static struct group groups[] = { "LRlr", 0xf, 4, "UDud", 0xf, 4, "BFbf", 0xf, 4 }; static int ngroups = sizeof groups / sizeof(struct group); static int group_len; static int toto; static int myrand(int n) { return random() % n; } static void add_scramble(char c) { int mod; mod = myrand(3); if (mod == 0) printf("%c ", c); else if (mod == 1) printf("%c' ", c); else printf("%c2 ", c); } static void enable_group(int group) { toto += group_len - groups[group].num; groups[group].enabled = (1 << group_len) - 1; groups[group].num = group_len; } static char gen_new(int *group) { int i; int g; int r; int numen = 0; numen = toto; r = myrand(numen); for (g = 0; g < ngroups; g++) { if (r < groups[g].num) { for (i = 0; i < group_len; i++) { if (groups[g].enabled & (1 << i)) { if (r-- == 0) { groups[g].enabled &= ~(1 << i); groups[g].num--; --toto; *group = g; return groups[g].c[i]; } } } } r -= groups[g].num; } printf("Oh noes!\n"); exit(1); } int main(int argc, char *argv[]) { int last_group; int num; int i; if (strcmp(argv[0], "./4x4") == 0) group_len = 4; else group_len = 2; #if 0 else { fprintf(stderr, "What kind of scramble is this?\n"); return 1; } #endif if (argc < 2) { num = 20; } else { num = atoi(argv[1]); if (num < 1) num = 1; #if 0 else if (num > 100) num = 100; #endif } /* Seed the random number generator. */ srandom((int)time(NULL)); for (i = 0; i < ngroups; i++) groups[i].num = group_len; toto = ngroups * group_len; for (i = 0; i < num; i++) { int group; add_scramble(gen_new(&group)); if (i > 0 && group != last_group) { /* Re-enable the last group. */ enable_group(last_group); } last_group = group; } printf("\n"); return 0; }