Skip to content

Commit 2c486d3

Browse files
authored
Merge pull request #409 from david-ds/skasch/day22
Day 22, C++
2 parents 4840640 + f01817d commit 2c486d3

File tree

3 files changed

+229
-0
lines changed

3 files changed

+229
-0
lines changed

day-22/input/skasch.txt

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
Player 1:
2+
7
3+
1
4+
9
5+
10
6+
12
7+
4
8+
38
9+
22
10+
18
11+
3
12+
27
13+
31
14+
43
15+
33
16+
47
17+
42
18+
21
19+
24
20+
50
21+
39
22+
8
23+
6
24+
16
25+
46
26+
11
27+
28+
Player 2:
29+
49
30+
41
31+
40
32+
35
33+
44
34+
29
35+
30
36+
19
37+
14
38+
2
39+
34
40+
17
41+
25
42+
5
43+
15
44+
32
45+
20
46+
48
47+
45
48+
26
49+
37
50+
28
51+
36
52+
23
53+
13

day-22/part-1/skasch.cpp

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
#include <ctime>
2+
#include <deque>
3+
#include <iostream>
4+
#include <sstream>
5+
#include <string>
6+
7+
static std::deque<int> kPlayer1;
8+
static std::deque<int> kPlayer2;
9+
10+
std::deque<int> *Play() {
11+
int card1 = kPlayer1.front();
12+
kPlayer1.pop_front();
13+
int card2 = kPlayer2.front();
14+
kPlayer2.pop_front();
15+
if (card1 > card2) {
16+
kPlayer1.push_back(card1);
17+
kPlayer1.push_back(card2);
18+
return kPlayer2.empty() ? &kPlayer1 : nullptr;
19+
} else {
20+
kPlayer2.push_back(card2);
21+
kPlayer2.push_back(card1);
22+
return kPlayer1.empty() ? &kPlayer2 : nullptr;
23+
}
24+
}
25+
26+
std::string run(const std::string &input) {
27+
// Your code goes here
28+
std::istringstream iss(input);
29+
std::string line;
30+
std::getline(iss, line);
31+
for (; std::getline(iss, line);) {
32+
if (line.empty()) {
33+
break;
34+
}
35+
kPlayer1.push_back(atoi(line.c_str()));
36+
}
37+
std::getline(iss, line);
38+
for (; std::getline(iss, line);) {
39+
kPlayer2.push_back(atoi(line.c_str()));
40+
}
41+
std::deque<int> *winner = nullptr;
42+
while (winner == nullptr) {
43+
winner = Play();
44+
}
45+
int result = 0;
46+
for (int index = 0; index < winner->size(); ++index) {
47+
result += (winner->size() - index) * winner->at(index);
48+
}
49+
return std::to_string(result);
50+
}
51+
52+
int main(int argc, char **argv) {
53+
if (argc < 2) {
54+
std::cout << "Missing one argument" << std::endl;
55+
exit(1);
56+
}
57+
58+
clock_t start = clock();
59+
auto answer = run(argv[1]);
60+
61+
std::cout << "_duration:" << float(clock() - start) * 1000.0 / CLOCKS_PER_SEC
62+
<< "\n";
63+
std::cout << answer << "\n";
64+
return 0;
65+
}

day-22/part-2/skasch.cpp

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
#include <ctime>
2+
#include <deque>
3+
#include <iostream>
4+
#include <iterator>
5+
#include <sstream>
6+
#include <string>
7+
#include <unordered_set>
8+
9+
std::string ToString(const std::deque<int> &player1,
10+
const std::deque<int> &player2) {
11+
std::string s;
12+
for (int card1 : player1) {
13+
s.push_back(card1);
14+
}
15+
s.push_back('_');
16+
for (int card2 : player2) {
17+
s.push_back(card2);
18+
}
19+
return s;
20+
}
21+
22+
std::deque<int> *Play(std::deque<int> &player1, std::deque<int> &player2,
23+
std::unordered_set<std::string> &visited);
24+
25+
std::deque<int> *Game(std::deque<int> &player1, std::deque<int> &player2) {
26+
std::unordered_set<std::string> visited;
27+
std::deque<int> *winner = nullptr;
28+
while (winner == nullptr) {
29+
winner = Play(player1, player2, visited);
30+
}
31+
return winner;
32+
}
33+
34+
std::deque<int> *Play(std::deque<int> &player1, std::deque<int> &player2,
35+
std::unordered_set<std::string> &visited) {
36+
std::string s = ToString(player1, player2);
37+
if (auto it = visited.find(s); it != visited.end()) {
38+
return &player1;
39+
}
40+
visited.insert(s);
41+
int card1 = player1.front();
42+
player1.pop_front();
43+
int card2 = player2.front();
44+
player2.pop_front();
45+
bool player1_wins = card1 > card2;
46+
if (card1 <= player1.size() && card2 <= player2.size()) {
47+
std::deque<int> sub_player1;
48+
auto sub_card1 = player1.begin();
49+
for (int idx = 0; idx < card1; ++idx) {
50+
sub_player1.push_back(*sub_card1);
51+
std::advance(sub_card1, 1);
52+
}
53+
std::deque<int> sub_player2;
54+
auto sub_card2 = player2.begin();
55+
for (int idx = 0; idx < card2; ++idx) {
56+
sub_player2.push_back(*sub_card2);
57+
std::advance(sub_card2, 1);
58+
}
59+
std::deque<int> *winner = Game(sub_player1, sub_player2);
60+
player1_wins = winner == &sub_player1;
61+
}
62+
if (player1_wins) {
63+
player1.push_back(card1);
64+
player1.push_back(card2);
65+
return player2.empty() ? &player1 : nullptr;
66+
} else {
67+
player2.push_back(card2);
68+
player2.push_back(card1);
69+
return player1.empty() ? &player2 : nullptr;
70+
}
71+
}
72+
73+
std::string run(const std::string &input) {
74+
// Your code goes here
75+
std::istringstream iss(input);
76+
std::string line;
77+
std::getline(iss, line);
78+
std::deque<int> player1;
79+
std::deque<int> player2;
80+
for (; std::getline(iss, line);) {
81+
if (line.empty()) {
82+
break;
83+
}
84+
player1.push_back(atoi(line.c_str()));
85+
}
86+
std::getline(iss, line);
87+
for (; std::getline(iss, line);) {
88+
player2.push_back(atoi(line.c_str()));
89+
}
90+
std::deque<int> *winner = Game(player1, player2);
91+
int result = 0;
92+
for (int index = 0; index < winner->size(); ++index) {
93+
result += (winner->size() - index) * winner->at(index);
94+
}
95+
return std::to_string(result);
96+
}
97+
98+
int main(int argc, char **argv) {
99+
if (argc < 2) {
100+
std::cout << "Missing one argument" << std::endl;
101+
exit(1);
102+
}
103+
104+
clock_t start = clock();
105+
auto answer = run(argv[1]);
106+
107+
std::cout << "_duration:" << float(clock() - start) * 1000.0 / CLOCKS_PER_SEC
108+
<< "\n";
109+
std::cout << answer << "\n";
110+
return 0;
111+
}

0 commit comments

Comments
 (0)