// 1) print all combinations of three three-value (i.e. 0, 1, 2) variables // 2) print all combinations of ./+/^ X/O/S 1/2/3 // 3) initialize and output a "int deck_of_cards[27][3]" data structure // 4) replace "X3" format with "XXX" implementation // 5) design initialize_cards() and draw_card() functions // 6) replace state array with struct // 7) add draw_board(), solicit card number (1-12), remove card // 8) add a "fill" command // 9) modify initialize_cards() to shuffle the deck of cards // 10) design is_a_set() // 11) design compute_sets_present() #include #include #include using std::cout; using std::cin; using std::string; using std::stringstream; #if 0 // 1) print all combinations of three three-value (i.e. 0, 1, 2) variables // 000 001 002 010 011 012 020 021 022 // 100 101 102 110 111 112 120 121 122 // 200 201 202 210 211 212 220 221 222 int main( void ) { for (int i=0; i < 3; i = i + 1) { for (int j=0; j < 3; j = j + 1) for (int k=0; k < 3; k = k + 1) cout << i << j << k << ' '; cout << '\n'; } } // 2) print all combinations of ./+/^ X/O/S 1/2/3 // .X1 .X2 .X3 .O1 .O2 .O3 .S1 .S2 .S3 // +X1 +X2 +X3 +O1 +O2 +O3 +S1 +S2 +S3 // ^X1 ^X2 ^X3 ^O1 ^O2 ^O3 ^S1 ^S2 ^S3 int main( void ) { char fills[] = { '.', '+', '^' }; char shaps[] = { 'X', 'O', 'S' }; char numbs[] = { '1', '2', '3' }; for (int i=0; i < 3; i = i + 1) { for (int j=0; j < 3; j = j + 1) for (int k=0; k < 3; k = k + 1) cout << fills[i] << shaps[j] << numbs[k] << " "; cout << '\n'; } } // 3) initialize and output a "int deck_of_cards[27][3]" data structure int main( void ) { int deck_of_cards[27][3]; for (int i=0; i < 3; i = i + 1) for (int j=0; j < 3; j = j + 1) for (int k=0; k < 3; k = k + 1) { deck_of_cards[i*9 + j*3 + k][0] = i; deck_of_cards[i*9 + j*3 + k][1] = j; deck_of_cards[i*9 + j*3 + k][2] = k; } char fills[] = { '.', '+', '^' }; char shaps[] = { 'X', 'O', 'S' }; char numbs[] = { '1', '2', '3' }; for (int i=0; i < 27; i = i + 1) { cout << fills[ deck_of_cards[i][0] ] << shaps[ deck_of_cards[i][1] ] << numbs[ deck_of_cards[i][2] ] << " "; if ((i+1) % 9 == 0) cout << '\n'; } } // 4) replace "X3" format with "XXX" implementation // . X . XX . XXX . O . OO . OOO . S . SS . SSS // + X + XX + XXX + O + OO + OOO + S + SS + SSS // ^ X ^ XX ^ XXX ^ O ^ OO ^ OOO ^ S ^ SS ^ SSS int main( void ) { int deck_of_cards[27][3]; for (int i=0; i < 3; i = i + 1) for (int j=0; j < 3; j = j + 1) for (int k=0; k < 3; k = k + 1) { deck_of_cards[i*9 + j*3 + k][0] = i; deck_of_cards[i*9 + j*3 + k][1] = j; deck_of_cards[i*9 + j*3 + k][2] = k; } char fills[] = { '.', '+', '^' }; char shaps[] = { 'X', 'O', 'S' }; for (int i=0; i < 27; i = i + 1) { cout << fills[ deck_of_cards[i][0] ] << ' '; for (int j=0; j < 3; j = j + 1) if (j <= deck_of_cards[i][2]) cout << shaps[ deck_of_cards[i][1] ]; else cout << ' '; cout << " "; if ((i+1) % 9 == 0) cout << '\n'; } } // 5) design initialize_cards() and draw_card() functions // . X . XX . XXX . O // . OO . OOO . S . SS // . SSS + X + XX + XXX void initialize_cards( int deck_of_cards[27][3] ) { for (int i=0; i < 3; i = i + 1) for (int j=0; j < 3; j = j + 1) for (int k=0; k < 3; k = k + 1) { deck_of_cards[i*9 + j*3 + k][0] = i; deck_of_cards[i*9 + j*3 + k][1] = j; deck_of_cards[i*9 + j*3 + k][2] = k; } } void draw_card( int card[3] ) { char fills[] = { '.', '+', '^' }; char shaps[] = { 'X', 'O', 'S' }; cout << fills[ card[0] ] << ' '; for (int j=0; j < 3; j = j + 1) if (j <= card[2]) cout << shaps[ card[1] ]; else cout << ' '; cout << " "; } int main( void ) { int deck_of_cards[27][3]; initialize_cards( deck_of_cards ); for (int i=0; i < 12; i = i + 1) { draw_card( deck_of_cards[i] ); if ((i+1) % 4 == 0) cout << '\n'; } } // 6) replace state array with struct struct Card { int fill, shap, numb; }; void initialize_cards( Card deck_of_cards[27] ) { for (int i=0; i < 3; i = i + 1) for (int j=0; j < 3; j = j + 1) for (int k=0; k < 3; k = k + 1) { deck_of_cards[i*9 + j*3 + k].fill = i; deck_of_cards[i*9 + j*3 + k].shap = j; deck_of_cards[i*9 + j*3 + k].numb = k; } } void draw_card( Card card ) { char fills[] = { '.', '+', '^' }; char shaps[] = { 'X', 'O', 'S' }; cout << fills[ card.fill ] << ' '; for (int j=0; j < 3; j = j + 1) if (j <= card.numb) cout << shaps[ card.shap ]; else cout << ' '; cout << " "; } int main( void ) { Card deck_of_cards[27]; initialize_cards( deck_of_cards ); for (int i=0; i < 12; i = i + 1) { draw_card( deck_of_cards[i] ); if ((i+1) % 4 == 0) cout << '\n'; } } // 7) add draw_board(), solicit card number (1-12), remove card struct Card { int fill, shap, numb; }; void initialize_cards( Card deck_of_cards[27] ) { for (int i=0; i < 3; i = i + 1) for (int j=0; j < 3; j = j + 1) for (int k=0; k < 3; k = k + 1) { deck_of_cards[i*9 + j*3 + k].fill = i; deck_of_cards[i*9 + j*3 + k].shap = j; deck_of_cards[i*9 + j*3 + k].numb = k; } } void draw_card( Card card ) { char fills[] = { '.', '+', '^' }; char shaps[] = { 'X', 'O', 'S' }; if (card.numb == -1) { cout << " "; return; } cout << fills[ card.fill ] << ' '; for (int j=0; j < 3; j = j + 1) if (j <= card.numb) cout << shaps[ card.shap ]; else cout << ' '; } void draw_board( Card displayed_cards[] ) { cout << '\n'; for (int i=1; i <= 12; i = i + 1) { draw_card( displayed_cards[i-1] ); if (i % 4 == 0) cout << "\n"; else cout << " "; } cout << "\nInput: "; // new } int main( void ) { Card deck_of_cards[27]; Card displayed_cards[12]; initialize_cards( deck_of_cards ); for (int i=0; i < 12; i = i + 1) displayed_cards[i] = deck_of_cards[i]; int input; while (true) { draw_board( displayed_cards ); cin >> input; if (input > 0 && input < 13) displayed_cards[input-1].numb = -1; } } . X . XX . XXX . O . OO . OOO . S . SS . SSS + X + XX + XXX Input: 1 . XX . XXX . O . OO . OOO . S . SS . SSS + X + XX + XXX Input: 6 . XX . XXX . O . OO . S . SS . SSS + X + XX + XXX Input: 11 . XX . XXX . O . OO . S . SS . SSS + X + XXX // 8) add a "fill" command struct Card { int fill, shap, numb; }; void initialize_cards( Card deck_of_cards[27] ) { for (int i=0; i < 3; i = i + 1) for (int j=0; j < 3; j = j + 1) for (int k=0; k < 3; k = k + 1) { deck_of_cards[i*9 + j*3 + k].fill = i; deck_of_cards[i*9 + j*3 + k].shap = j; deck_of_cards[i*9 + j*3 + k].numb = k; } } void draw_card( Card card ) { char fills[] = { '.', '+', '^' }; char shaps[] = { 'X', 'O', 'S' }; if (card.numb == -1) { cout << " "; return; } cout << fills[ card.fill ] << ' '; for (int j=0; j < 3; j = j + 1) if (j <= card.numb) cout << shaps[ card.shap ]; else cout << ' '; } void draw_board( Card displayed_cards[] ) { cout << '\n'; for (int i=1; i <= 12; i = i + 1) { draw_card( displayed_cards[i-1] ); if (i % 4 == 0) cout << "\n"; else cout << " "; } cout << "\nInput: "; } int main( void ) { Card deck_of_cards[27]; Card displayed_cards[12]; initialize_cards( deck_of_cards ); for (int i=0; i < 12; i = i + 1) displayed_cards[i] = deck_of_cards[i]; int next_card = 12, card; string input; // was an int while (true) { draw_board( displayed_cards ); cin >> input; if (input == "fill") { // new if (next_card == 27) { cout << "\nNO MORE CARDS\n"; continue; } for (int i=0; i < 12; i = i + 1) { if (displayed_cards[i].numb == -1) { displayed_cards[i] = deck_of_cards[next_card]; next_card = next_card + 1; } continue; } stringstream ss; // new ss << input; ss >> card; if (card > 0 && card < 13) displayed_cards[card-1].numb = -1; } } . X . XX . XXX . O . OO . OOO . S . SS . SSS + X + XX + XXX Input: 1 . XX . XXX . O . OO . OOO . S . SS . SSS + X + XX + XXX Input: 2 . XXX . O . OO . OOO . S . SS . SSS + X + XX + XXX Input: 3 . O . OO . OOO . S . SS . SSS + X + XX + XXX Input: fill + O + OO + OOO . O . OO . OOO . S . SS . SSS + X + XX + XXX // 9) modify initialize_cards() to shuffle the deck of cards struct Card { int fill, shap, numb; }; void initialize_cards( Card deck_of_cards[27] ) { for (int i=0; i < 3; i = i + 1) for (int j=0; j < 3; j = j + 1) for (int k=0; k < 3; k = k + 1) { deck_of_cards[i*9 + j*3 + k].fill = i; deck_of_cards[i*9 + j*3 + k].shap = j; deck_of_cards[i*9 + j*3 + k].numb = k; } // Shuffle the deck of cards srand( time( 0 ) ); Card temp; for (int i=0,j,k; i < 100; i = i + 1) { j = rand() % 27; k = rand() % 27; temp = deck_of_cards[j]; deck_of_cards[j] = deck_of_cards[k]; deck_of_cards[k] = temp; } } void draw_card( Card card ) { char fills[] = { '.', '+', '^' }; char shaps[] = { 'X', 'O', 'S' }; if (card.numb == -1) { cout << " "; return; } cout << fills[ card.fill ] << ' '; for (int j=0; j < 3; j = j + 1) if (j <= card.numb) cout << shaps[ card.shap ]; else cout << ' '; } void draw_board( Card displayed_cards[] ) { cout << '\n'; for (int i=1; i <= 12; i = i + 1) { draw_card( displayed_cards[i-1] ); if (i % 4 == 0) cout << "\n"; else cout << " "; } cout << "\nInput: "; } int main( void ) { Card deck_of_cards[27]; Card displayed_cards[12]; initialize_cards( deck_of_cards ); for (int i=0; i < 12; i = i + 1) displayed_cards[i] = deck_of_cards[i]; int next_card = 12, card; string input; while (true) { draw_board( displayed_cards ); cin >> input; if (input == "fill") { if (next_card == 27) { cout << "\nNO MORE CARDS\n"; continue; } for (int i=0; i < 12; i = i + 1) if (displayed_cards[i].numb == -1) { displayed_cards[i] = deck_of_cards[next_card]; next_card = next_card + 1; } continue; } stringstream ss; ss << input; ss >> card; if (card > 0 && card < 13) displayed_cards[card-1].numb = -1; } } + X ^ OO + XX + SS . XX + O . X + OOO ^ SSS . O + SSS ^ S // 10) design is_a_set() struct Card { int fill, shap, numb; }; void initialize_cards( Card deck_of_cards[27] ) { for (int i=0; i < 3; i = i + 1) for (int j=0; j < 3; j = j + 1) for (int k=0; k < 3; k = k + 1) { deck_of_cards[i*9 + j*3 + k].fill = i; deck_of_cards[i*9 + j*3 + k].shap = j; deck_of_cards[i*9 + j*3 + k].numb = k; } // Shuffle the deck of cards srand( time( 0 ) ); Card temp; for (int i=0,j,k; i < 100; i = i + 1) { j = rand() % 27; k = rand() % 27; temp = deck_of_cards[j]; deck_of_cards[j] = deck_of_cards[k]; deck_of_cards[k] = temp; } } void draw_card( Card card ) { char fills[] = { '.', '+', '^' }; char shaps[] = { 'X', 'O', 'S' }; if (card.numb == -1) { cout << " "; return; } cout << fills[ card.fill ] << ' '; for (int j=0; j < 3; j = j + 1) if (j <= card.numb) cout << shaps[ card.shap ]; else cout << ' '; } void draw_board( Card displayed_cards[], int sets_found ) { cout << '\n'; for (int i=1; i <= 12; i = i + 1) { draw_card( displayed_cards[i-1] ); if (i % 4 == 0) cout << "\n"; else cout << " "; } cout << "\nsets found - " << sets_found << "\nInput: "; } bool is_a_set( Card one, Card two, Card three ) { if ((one.numb + two.numb + three.numb) % 3 != 0) return false; if ((one.shap + two.shap + three.shap) % 3 != 0) return false; if ((one.fill + two.fill + three.fill) % 3 != 0) return false; return true; } int main( void ) { Card deck_of_cards[27]; Card displayed_cards[12]; initialize_cards( deck_of_cards ); for (int i=0; i < 12; i = i + 1) displayed_cards[i] = deck_of_cards[i]; int next_card = 12, sets_found = 0, first, second, third; string input; while (true) { draw_board( displayed_cards, sets_found ); getline( cin, input ); if (input == "fill") { if (next_card == 27) { cout << "\nNO MORE CARDS\n"; continue; } for (int i=0; i < 12; i = i + 1) if (displayed_cards[i].numb == -1) { displayed_cards[i] = deck_of_cards[next_card]; next_card = next_card + 1; } continue; } stringstream ss; ss << input; // Parse and validate the input ss >> first >> second >> third; if (first < 1 || first > 12 || second < 1 || second > 12 || third < 1 || third > 12 || displayed_cards[first-1].numb == -1 || displayed_cards[second-1].numb == -1 || displayed_cards[third-1].numb == -1) { cout << "\nBAD INPUT\n"; continue; } if ( ! is_a_set( displayed_cards[first-1], displayed_cards[second-1], displayed_cards[third-1] )) { cout << "\nNOT a set\n"; continue; } displayed_cards[first-1].numb = -1; displayed_cards[second-1].numb = -1; displayed_cards[third-1].numb = -1; sets_found = sets_found + 1; } } + X ^ OO + XX + SS . XX + O . X + OOO ^ SSS . O + SSS ^ S sets found - 0 Input: 1 2 3 NOT a set + X ^ OO + XX + SS . XX + O . X + OOO ^ SSS . O + SSS ^ S sets found - 0 Input: 2 8 10 + X + XX + SS . XX + O . X ^ SSS + SSS ^ S sets found - 1 Input: 6 7 12 + X + XX + SS . XX ^ SSS + SSS sets found - 2 Input: 1 2 3 BAD INPUT + X + XX + SS . XX ^ SSS + SSS // 11) design compute_sets_present() int main() { int count = 0; for (int i=0; i < 12 - 2; i = i + 1) for (int j=i+1; j < 12 - 1; j = j + 1) for (int k=j+1; k < 12; k = k + 1) count = count + 1; cout << "count is " << count << '\n'; } // count is 220 struct Card { int fill, shap, numb; }; void initialize_cards( Card deck_of_cards[27] ) { for (int i=0; i < 3; i = i + 1) for (int j=0; j < 3; j = j + 1) for (int k=0; k < 3; k = k + 1) { deck_of_cards[i*9 + j*3 + k].fill = i; deck_of_cards[i*9 + j*3 + k].shap = j; deck_of_cards[i*9 + j*3 + k].numb = k; } // Shuffle the deck of cards srand( time( 0 ) ); Card temp; for (int i=0,j,k; i < 100; i = i + 1) { j = rand() % 27; k = rand() % 27; temp = deck_of_cards[j]; deck_of_cards[j] = deck_of_cards[k]; deck_of_cards[k] = temp; } } void draw_card( Card card ) { char fills[] = { '.', '+', '^' }; char shaps[] = { 'X', 'O', 'S' }; if (card.numb == -1) { cout << " "; return; } cout << fills[ card.fill ] << ' '; for (int j=0; j < 3; j = j + 1) if (j <= card.numb) cout << shaps[ card.shap ]; else cout << ' '; } bool is_a_set( Card one, Card two, Card three ) { if ((one.numb + two.numb + three.numb) % 3 != 0) return false; if ((one.shap + two.shap + three.shap) % 3 != 0) return false; if ((one.fill + two.fill + three.fill) % 3 != 0) return false; return true; } int compute_sets_present( Card displayed_cards[], string& answer_str ) { int number_of_sets = 0; stringstream answer; for (int i=0; i < 12 - 2; i = i + 1) for (int j=i+1; j < 12 - 1; j = j + 1) for (int k=j+1; k < 12; k = k + 1) { if (displayed_cards[i].numb == -1 || displayed_cards[j].numb == -1 || displayed_cards[k].numb == -1) continue; if (is_a_set( displayed_cards[i], displayed_cards[j], displayed_cards[k] )) { number_of_sets = number_of_sets + 1; answer << (i+1) << ' '; answer << (j+1) << ' '; answer << (k+1) << " "; } } answer_str = answer.str(); return number_of_sets; } void draw_board( Card displayed_cards[], int sets_found, string& answer ) { cout << '\n'; for (int i=1; i <= 12; i = i + 1) { draw_card( displayed_cards[i-1] ); if (i % 4 == 0) cout << "\n"; else cout << " "; } cout << "\nsets present " // new << compute_sets_present( displayed_cards, answer ) << ", sets found " << sets_found << "\nInput: "; } int main( void ) { Card deck_of_cards[27]; Card displayed_cards[12]; initialize_cards( deck_of_cards ); for (int i=0; i < 12; i = i + 1) displayed_cards[i] = deck_of_cards[i]; int next_card = 12, sets_found = 0, first, second, third; string input, answer; while (true) { draw_board( displayed_cards, sets_found, answer ); getline( cin, input ); if (input == "answer") { // new cout << "\nanswer " << answer << '\n'; continue; } if (input == "fill") { if (next_card == 27) { cout << "\nNO MORE CARDS\n"; continue; } for (int i=0; i < 12; ++i) if (displayed_cards[i].numb == -1) { displayed_cards[i] = deck_of_cards[next_card]; next_card = next_card + 1; } continue; } stringstream ss; ss << input; // Parse and validate the input ss >> first >> second >> third; if (first < 1 || first > 12 || second < 1 || second > 12 || third < 1 || third > 12 || displayed_cards[first-1].numb == -1 || displayed_cards[second-1].numb == -1 || displayed_cards[third-1].numb == -1) { cout << "\nBAD INPUT\n"; continue; } if ( ! is_a_set( displayed_cards[first-1], displayed_cards[second-1], displayed_cards[third-1] )) { cout << "\nNOT a set\n"; continue; } displayed_cards[first-1].numb = -1; displayed_cards[second-1].numb = -1; displayed_cards[third-1].numb = -1; sets_found = sets_found + 1; } } . SSS ^ XX ^ XXX + XXX . O + SS + OO . X ^ O + SSS + XX . OO sets present 8, sets found 0 Input: answer answer 1 8 12 1 9 11 2 4 8 2 5 10 2 6 12 3 5 6 3 8 11 6 7 11 . SSS ^ XX ^ XXX + XXX . O + SS + OO . X ^ O + SSS + XX . OO sets present 8, sets found 0 Input: 1 8 12 ^ XX ^ XXX + XXX . O + SS + OO ^ O + SSS + XX sets present 3, sets found 1 Input: answer answer 2 5 10 3 5 6 6 7 11 ^ XX ^ XXX + XXX . O + SS + OO ^ O + SSS + XX sets present 3, sets found 1 Input: 2 5 10 ^ XXX + XXX + SS + OO ^ O + XX sets present 1, sets found 2 Input: 6 7 11 ^ XXX + XXX ^ O sets present 0, sets found 3 Input: fill + S + O ^ XXX + XXX ^ OOO . XXX . XX ^ SSS ^ O + OOO . S ^ SS sets present 7, sets found 3 Input: #endif