@@ -27,11 +27,71 @@ std::string joinVectorCharVector(const std::vector<std::vector<char> > &strings,
27
27
v.push_back (char_string);
28
28
}
29
29
30
+ return joinStringVector (v, delimiter);
31
+ }
30
32
33
+ void rotateClockwise (std::vector<std::vector<char > > &v, int layer) {
34
+ // TODO: assume v is square-shaped
35
+ int n = v.size ();
36
+ int top = layer;
37
+ int bottom = n - 1 - layer;
38
+ int left = layer;
39
+ int right = n - 1 - layer;
31
40
32
- return joinStringVector (v, delimiter);
41
+ if (left >= right) {
42
+ return ;
43
+ }
44
+
45
+ int d = 0 ;
46
+ while (left + d < right) {
47
+ auto t = v[top][left + d];
48
+ v[top][left + d] = v[bottom - d][left];
49
+ v[bottom - d][left] = v[bottom][right - d];
50
+ v[bottom][right - d] = v[top + d][right];
51
+ v[top + d][right] = t;
52
+
53
+ d++;
54
+ }
55
+ rotateClockwise (v, layer + 1 );
33
56
}
34
57
58
+ void rotateCounterClockwise (std::vector<std::vector<char > > &v, int layer) {
59
+ // TODO: assume v is square-shaped
60
+ int n = v.size ();
61
+ int top = layer;
62
+ int bottom = n - 1 - layer;
63
+ int left = layer;
64
+ int right = n - 1 - layer;
65
+
66
+ if (left >= right) {
67
+ return ;
68
+ }
69
+
70
+ int d = 0 ;
71
+ while (left + d < right) {
72
+ auto t = v[top][left + d];
73
+ v[top][left + d] =v[top + d][right];
74
+ v[top + d][right] = v[bottom][right - d];
75
+ v[bottom][right - d] = v[bottom - d][left];
76
+ v[bottom - d][left] = t;
77
+
78
+ d++;
79
+ }
80
+ rotateClockwise (v, layer + 1 );
81
+ }
82
+
83
+ std::vector<std::vector<char >> toCharsVectors (const std::string &s) {
84
+ int n = (int ) std::sqrt (s.length ());
85
+
86
+ std::vector<std::vector<char >> v;
87
+ for (int i = 0 ; i < s.length (); i += n) {
88
+ auto ss = s.substr (i, n);
89
+ std::vector<char > chars (ss.begin (), ss.end ());
90
+ v.push_back (chars);
91
+ }
92
+
93
+ return v;
94
+ }
35
95
36
96
char FILLER_CHAR = (char ) 11 ;
37
97
std::string FILLER (1 , FILLER_CHAR);
@@ -43,17 +103,32 @@ class CodeSqStrings {
43
103
44
104
std::vector temp (n, std::vector<char >(n, FILLER_CHAR));
45
105
106
+ // fill strng into temp
46
107
for (int i = 0 ; i < strng.length (); ++i) {
47
108
int y = i / n;
48
109
int x = i % n;
49
110
temp[y][x] = strng[i];
50
111
}
51
112
113
+ // rotate 90 degrees clockwise
114
+ rotateClockwise (temp, 0 );
52
115
53
116
return joinVectorCharVector (temp, " \n " );
54
117
}
55
118
56
119
static std::string decode (const std::string &strng) {
57
- return " " ;
120
+ auto temp = toCharsVectors (strng);
121
+
122
+ // rotate 90 degrees counter-clockwise
123
+ rotateCounterClockwise (temp, 0 );
124
+
125
+ auto s = joinVectorCharVector (temp, " " );
126
+
127
+ std::string::size_type loc = s.find ( FILLER, 0 );
128
+ if ( loc != std::string::npos ) {
129
+ return s;
130
+ } else {
131
+ return s.substr (0 , loc);
132
+ }
58
133
}
59
134
};
0 commit comments