|
- #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];
- }
- }
- }
- }
|