#include "cpp_headers/fcpp.hh"

bool deck_check(int deck[], int n) {
    for (int i = 0; i < n; i++) {
        // compare deck with number at this position
        // because initial deck is [0,1,2,3,..., n-1]
        if (deck[i] != i) {
            // if a difference is found, return false
            return false;
        }
    }
    // if no problem was found, deck is the original deck
    return true;
}

int main() {
    // query the amount of cards that should be shuffled
    int size = enter_int("How many cards do you want to be shuffled? ");
    // only shuffle even number of cards
    if (size <= 0, size % 2 != 0) {
        print("Invalid input, please enter an even number >= 2");
        return 0;
    }
    // initialize the deck of cards
    int deck[size];
    for (int i = 0; i<size; i++) {
        deck[i] = i;
    }

    // initialize a working array
    int newdeck[size];

    // perfect out shuffle
    for (int times = 1; ;times++) {
        // shuffle with perfect out
        for (int i = 0; i<size/2; i++) {
            newdeck[i*2] = deck[i];
            newdeck[i*2+1] = deck[i+size/2];
        }
        // check if newdeck is the original deck
        if (deck_check(newdeck, size)) {
            // print out the amount of iterations needed
            printf("We needed %d perfect out shuffle iterations to get back to the original deck\n", times);
            break;
        } else {
            // otherwise set deck to newdeck
            for (int i = 0; i <size; i++) {
                deck[i] = newdeck[i];
            }
        }
    }

    // reset the deck
    for (int i = 0; i<size; i++) {
        deck[i] = i;
    }
    
    // perfect in shuffle
    for (int times = 1; ;times++) {
        // shuffle with perfect in
        for (int i = 0; i<size/2; i++) {
            newdeck[i*2] = deck[i+size/2];
            newdeck[i*2+1] = deck[i];
        }
        // check if newdeck is the original deck
        if (deck_check(newdeck, size)) {
            // print out the amount of iterations needed
            printf("We needed %d perfect in shuffle iterations to get back to the original deck\n", times);
            break;
        } else {
            // otherwise set deck to newdeck
            for (int i = 0; i <size; i++) {
                deck[i] = newdeck[i];
            }
        }
    }
}
