-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.cpp
149 lines (123 loc) · 5.42 KB
/
main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#include <algorithm>
#include <cctype>
#include <chrono>
#include <iomanip>
#include <iostream>
#include <random>
#include <set>
#include <string>
#include <vector>
namespace
{
auto constexpr minimumNumberOfDigits{ 2 };
auto constexpr maximumNumberOfDigits{ 200 };
auto constexpr maximumNumberOfColumns{ 20 };
static_assert(minimumNumberOfDigits >= 2 && maximumNumberOfDigits >= minimumNumberOfDigits);
}
int main()
{
setlocale(LC_CTYPE,"");
std::string keepPlaying{};
do
{
std::cout << "Cu cate cartonase vrei sa joci (" << minimumNumberOfDigits << "<=n<=" << maximumNumberOfDigits
<< ")? ";
int numberOfDigits{};
std::cin >> numberOfDigits;
if (numberOfDigits < minimumNumberOfDigits || numberOfDigits > maximumNumberOfDigits)
return 1;
std::vector<int> digits(numberOfDigits);
std::default_random_engine generator(std::chrono::steady_clock::now().time_since_epoch().count());
std::uniform_int_distribution<int> distribution(0, 9);
std::generate(digits.begin(), digits.end(), [&distribution, &generator]
{
return distribution(generator);
});
std::cout << std::endl;
auto const columns = std::min(numberOfDigits, maximumNumberOfColumns);
std::cout << " ";
for (auto column = 0; column < columns; column++)
std::cout << ' ' << std::left << std::setw(2) << column + 1;
std::cout << std::endl;
auto const rows = numberOfDigits / columns + (numberOfDigits % columns != 0);
for (auto row = 0; row < rows; row++)
{
auto const actualColumns = row == rows - 1 ? numberOfDigits - (rows - 1) * columns : columns;
std::cout << " ";
for (auto column = 0; column < actualColumns; column++)
std::cout << "\u256d\u2500\u256e";
std::cout << std::endl;
std::cout << std::right << std::setw(2) << row + 1 << ' ';
for (auto column = 0; column < actualColumns; column++)
std::cout << "\u2502" << '?' << "\u2502";
std::cout << std::endl;
std::cout << " ";
for (auto column = 0; column < actualColumns; column++)
std::cout << "\u2570\u2500\u256f";
std::cout << std::endl;
}
std::cout << std::endl;
std::cout << "Cate cifre vrei sa aiba numarul? ";
int numberOfDigitsToTurn{};
std::cin >> numberOfDigitsToTurn;
std::cout << std::endl;
std::cout << "Ce cartonase intorci (trebuie sa fie " << numberOfDigitsToTurn << ")? Scrie linia si coloana: ";
std::set<std::pair<int, int>> turnedDigits{};
for (auto i = 0; i < numberOfDigitsToTurn; i++)
{
int row{}, col{};
std::cin >> row >> col;
turnedDigits.emplace(row - 1, col - 1);
}
std::cout << std::endl;
std::cout << " ";
for (auto column = 0; column < columns; column++)
std::cout << ' ' << std::left << std::setw(2) << column + 1;
std::cout << std::endl;
for (auto row = 0; row < rows; row++)
{
auto const actualColumns = row == rows - 1 ? numberOfDigits - (rows - 1) * columns : columns;
std::cout << " ";
for (auto column = 0; column < actualColumns; column++)
std::cout << "\u256d\u2500\u256e";
std::cout << std::endl;
std::cout << std::right << std::setw(2) << row + 1 << ' ';
for (auto column = 0; column < actualColumns; column++)
{
if (std::find(turnedDigits.cbegin(), turnedDigits.cend(), std::pair{row, column}) != turnedDigits.end())
std::cout << "\u2502" << digits[row * actualColumns + column] << "\u2502";
else
std::cout << "\u2502" << ' ' << "\u2502";
}
std::cout << std::endl;
std::cout << " ";
for (auto column = 0; column < actualColumns; column++)
std::cout << "\u2570\u2500\u256f";
std::cout << std::endl;
}
std::cout << std::endl;
std::cout << "Care este cel mai mare numar ce se poate forma din cele " << numberOfDigitsToTurn << " cifre? ";
std::string playerLargestNumber{};
std::cin >> playerLargestNumber;
std::vector<int> selectedDigits{};
selectedDigits.reserve(numberOfDigitsToTurn);
for (auto const &[row, column] : turnedDigits)
selectedDigits.emplace_back(digits[row * columns + column]);
std::sort(selectedDigits.begin(), selectedDigits.end(), std::greater<>());
std::string largestNumberAsString;
for (auto const d : selectedDigits)
largestNumberAsString += static_cast<char>(d + '0');
std::cout << std::endl;
if (playerLargestNumber == largestNumberAsString)
std::cout << "Felicitari, asa mi-a dat si mie :)." << std::endl;
else
std::cout << "Imi pare rau, dar ai gresit. Mie mi-a dat " << largestNumberAsString << '.' << std::endl;
std::cout << std::endl;
std::cout << "Mai joci? (da/nu): ";
std::cin >> keepPlaying;
std::transform(keepPlaying.begin(), keepPlaying.end(), keepPlaying.begin(), [](unsigned char c){ return std::tolower(c); });
std::cout << std::endl;
}
while (keepPlaying == "da");
return 0;
}