// scramgen.c
// 3x3x3 Scramble Generator
// by Anthony Hsu
// March 12, 2009
// Real de Catorce, Mexico

// scramgen [turns] [# of scrambles] [seed for random #s]

#include <stdio.h>
#include <stdlib.h>

void errorcheck(int, char *[]);
void print_turn(int);

int main(int argc, char *argv[])
// argv[1] = how many turns you want each scramble to be
// argv[2] = how many scrambles you want generated
// argv[3] = seed for randomness
{
    errorcheck(argc, argv);
    
    int turns, s, d, prev, prev2;
    // s = side, d = direction, prev = previous side, prev2 = last last side
    int num_scrambles = atoi(argv[2]);
    srand(atoi(argv[3]));
    
    while (num_scrambles != 0)
    {
          turns = atoi(argv[1]);
          prev = prev2 = -1;
          while (turns != 0)
          {
                s = rand() % 6;
                if (s == prev)
                   continue;
                else if (s == 0)
                {
                     if (prev == 1 && prev2 == 0)
                        continue;
                     else
                     {
                         prev2 = prev;
                         prev = s;
                         print_turn(s);
                     }
                }
                else if (s == 1)
                {
                     if (prev == 0 && prev2 == 1)
                        continue;
                     else
                     {
                         prev2 = prev;
                         prev = s;
                         print_turn(s);
                     }
                }
                else if (s == 2)
                {
                     if (prev == 3 && prev2 == 2)
                        continue;
                     else
                     {
                         prev2 = prev;
                         prev = s;
                         print_turn(s);
                     }
                }
                else if (s == 3)
                {
                     if (prev == 2 && prev2 == 3)
                        continue;
                     else
                     {
                         prev2 = prev;
                         prev = s;
                         print_turn(s);
                     }
                }
                else if (s == 4)
                {
                     if (prev == 5 && prev2 == 4)
                        continue;
                     else
                     {
                         prev2 = prev;
                         prev = s;
                         print_turn(s);
                     }
                }
                else if (s == 5)
                {
                     if (prev == 4 && prev2 == 5)
                        continue;
                     else
                     {
                         prev2 = prev;
                         prev = s;
                         print_turn(s);
                     }
                }                         
                turns--;
          }
          printf("\n\n");
          num_scrambles--;
    }
}

void errorcheck(int n, char *args[])
{
     if (n != 4 || atoi(args[1]) == 0 || atoi(args[2]) == 0)
     {
        printf("scramgen [turns] [# of scrambles] [seed for random #s]\n");
        exit(0);
     }
}

void print_turn(int s)
{
     int d = rand() % 3;
     char c;
     switch (s)
     {
            case 0: c = 'U'; break;
            case 1: c = 'D'; break;
            case 2: c = 'L'; break;
            case 3: c = 'R'; break;
            case 4: c = 'F'; break;
            case 5: c = 'B'; break;
     }
     
     if (d == 0)
        printf("%c ", c);
     else if (d == 1)
          printf("%c' ", c);
     else
         printf("%c2 ", c);
}
