@@ -18,16 +18,53 @@ struct RotationMap
18
18
}
19
19
20
20
};
21
- void storeDigits (int x, std::queue<int >& queue, std::stack<int >& stack)
21
+
22
+ struct DigitStore
22
23
{
23
- int q = x;
24
- do
24
+ DigitStore (int x)
25
25
{
26
- stack.push (q % 10 );
27
- queue.push (q % 10 );
28
- q /= 10 ;
29
- } while (q);
30
- }
26
+ int q = x;
27
+ do
28
+ {
29
+ origDigitStore.push (q % 10 );
30
+ reverseDigitStore.push (q % 10 );
31
+ q /= 10 ;
32
+ } while (q);
33
+
34
+ if (std::size (origDigitStore) != std::size (reverseDigitStore))
35
+ throw std::logic_error (" Both internal digits store are to be the same size" );
36
+
37
+ }
38
+ int nextOrigDigit ()
39
+ {
40
+ return origDigitStore.front ();
41
+ }
42
+
43
+ int nextReverseDigit ()
44
+ {
45
+ return reverseDigitStore.top ();
46
+ }
47
+
48
+ void pop ()
49
+ {
50
+ origDigitStore.pop ();
51
+ reverseDigitStore.pop ();
52
+ }
53
+
54
+ int size ()
55
+ {
56
+ return origDigitStore.size ();
57
+ }
58
+
59
+ bool empty ()
60
+ {
61
+ return !size ();
62
+ }
63
+
64
+ std::queue<int > origDigitStore;
65
+ std::stack<int > reverseDigitStore;
66
+
67
+ };
31
68
32
69
bool singleDigit (int x)
33
70
{
@@ -48,19 +85,16 @@ int solve(int x, int y)
48
85
++x;
49
86
continue ;
50
87
}
51
- std::queue<int > origDigitStore;
52
- std::stack<int > reverseDigitStore;
53
- storeDigits (x, origDigitStore, reverseDigitStore);
88
+ DigitStore vDigitStore (x);
54
89
auto count{ 0 };
55
90
while (true )
56
91
{
57
- if (origDigitStore. front () != vRotationMap[reverseDigitStore. top ()])
92
+ if (vDigitStore. nextOrigDigit () != vRotationMap[vDigitStore. nextReverseDigit ()])
58
93
break ;
59
94
60
95
++count;
61
- origDigitStore.pop ();
62
- reverseDigitStore.pop ();
63
- if (!std::size (origDigitStore))
96
+ vDigitStore.pop ();
97
+ if (vDigitStore.empty ())
64
98
{
65
99
++result;
66
100
break ;
0 commit comments