-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathcommon.h
122 lines (100 loc) · 3.1 KB
/
common.h
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
#ifndef __COMMON_H
#define __COMMON_H
#include <vector>
#include <utility>
#include <sstream>
#include <cstdio>
// #include <algorithm>
using namespace std;
#define rep(var,n) for(int var=0;var<(n);var++)
#define all(c) (c).begin(),(c).end()
#define tr(i, c) for(auto i=(c).begin(); i!=(c).end(); i++)
#define found(e, s) ((s).find(e) != (s).end())
extern const char *num_full[13];
extern const char *num_single;
extern const char *suite_full[4];
extern const char *suite_single;
typedef int Card;
#define HEART 0
#define CLUB 1
#define DIAMOND 2
#define SPADE 3
#define VACANT -1
#define VACANT_CH '~'
#define VACANT_STR "~"
inline bool is_black(int suite) { return suite % 2; }
int char_to_card_num(char ch);
int char_to_card_suite(char ch);
int trans_str(std::vector<int>& v, const char *s);
int read_card_num(FILE *fp);
int read_card_suite(FILE *fp);
std::vector<int> read_card_nums(FILE *fp);
std::vector<Card> read_cards(FILE *fp);
inline int make_card(int num, int suite) { // 0-12, 0-3
if (num < 0 || suite < 0) return VACANT;
return (num << 2) | (suite);
}
inline int card_num(Card card) { return (card >= 0) ? (card >> 2) : -1; }
inline int card_suite(Card card) { return (card >= 0) ? (card & 3) : -1; }
inline bool pilable(Card card_below, Card card_above) {
return (is_black(card_suite(card_below)) != is_black(card_suite(card_above))
&& card_num(card_below) == card_num(card_above) + 1);
}
inline bool is_valid_card(Card card) {
int num = card_num(card), suite = card_suite(card);
return ((0 <= num && num < 13) && (0 <= suite && suite < 4));
}
inline char _single(Card card) {
if (card == VACANT) return VACANT_CH;
// int num = card_num(card);
// assert(0 <= num && num < 13);
return num_single[card_num(card)];
}
inline std::string _full(Card card) {
if (card == VACANT) return VACANT_STR;
std::stringstream ss;
int num = card_num(card), suite = card_suite(card);
ss << num_full[num] << suite_full[suite];
return ss.str();
}
inline std::string _full_cards(std::vector<Card> cards, char *delim=" ") {
std::stringstream ss;
int L = cards.size();
for (int i=0; i<L; ++i) {
Card card = cards[i];
int num = card_num(card), suite = card_suite(card);
if (i > 0) ss << delim;
ss << num_full[num] << suite_full[suite];
}
return ss.str();
}
inline char card_serialize(Card card) {
if (!is_valid_card(card)) return VACANT_CH;
int num = card_num(card), suite = card_suite(card);
char c;
if (suite < 2) {
c = 'A' + suite*13 + num;
} else {
c = 'a' + (suite - 2)*13 + num;
}
// assert(0x20 <= c && c <= 0x7e);
return c;
}
inline Card card_deserialize(char c) {
if (c == VACANT_CH) return VACANT;
int num = -1, suite = -1;
if ('A' <= c && c <= 'M') {
num = (c - 'A'); suite = 0;
}
if ('N' <= c && c <= 'Z') {
num = (c - 'N'); suite = 1;
}
if ('a' <= c && c <= 'm') {
num = (c - 'a'); suite = 2;
}
if ('n' <= c && c <= 'z') {
num = (c - 'n'); suite = 3;
}
return make_card(num, suite);
}
#endif