-
-
Notifications
You must be signed in to change notification settings - Fork 79
Expand file tree
/
Copy pathvanschnitz.alt.c
More file actions
239 lines (214 loc) · 3.25 KB
/
vanschnitz.alt.c
File metadata and controls
239 lines (214 loc) · 3.25 KB
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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
#ifndef INITIALIZED
/*
* If n isn't defined, make it 5
*/
#ifndef n
#define n 05
#endif
/*
* Some useful variables
*/
#define THIS_FILE __FILE__
#define FORMAT_STRING "Move disk %d from peg %d to peg %d\n"
#define INITIALIZED
/*
* Translate n into bits
*/
#if n&01
#define bit0
#endif
#if n&02
#define bit1
#endif
#if n&04
#define bit2
#endif
#if n>>3
#define bit3
#endif
/*
* Here's the program!
*/
main(){
printf(
#include THIS_FILE
#define NOW_DO_THE_NUMBERS
#include THIS_FILE
);}
#else
/*
* Check to see if the number is zero (bottom of recursion)
*/
#ifdef bit0
#define N_IS_NOT_ZERO
#endif
#ifdef bit1
#define N_IS_NOT_ZERO
#endif
#ifdef bit2
#define N_IS_NOT_ZERO
#endif
#ifdef bit3
#define N_IS_NOT_ZERO
#endif
#ifdef N_IS_NOT_ZERO
#undef N_IS_NOT_ZERO
/*
* Decrement n
*/
#ifndef bit0
#define bit0
#ifndef bit1
#define bit1
#ifndef bit2
#define bit2
#ifndef bit3
#define bit3
#else
#undef bit3
#endif
#else
#undef bit2
#endif
#else
#undef bit1
#endif
#else
#undef bit0
#endif
/*
* Here's recursion
*/
#include THIS_FILE
/*
* Note: Odd numbered disks always cycle from 1 => 2 => 3 => 1 => 2 => 3
* Even numbered disks always cycle from 1 => 3 => 2 => 1 => 3 => 2
*/
/*
* Check to see if n is zero. If so, we're moving disk 1.
* In general, for any n we're moving disk n+1. That means that
* when n is odd, we're moving an even disk, and vice versa.
*/
#ifndef bit0
#ifndef bit1
#ifndef bit2
#ifndef bit3
#define N_IS_ZERO
#endif
#endif
#endif
#endif
#ifdef N_IS_ZERO
#undef N_IS_ZERO
#ifndef NOW_DO_THE_NUMBERS
FORMAT_STRING
#else
/*
* If disk 1 is on peg 2, move it 2 => 3
*/
#ifdef DISK_ONE_IS_ON_PEG_TWO
,1,2,3
#undef DISK_ONE_IS_ON_PEG_TWO
#define DISK_ONE_IS_ON_PEG_THREE
#else
/*
* If disk 1 is on peg 3, move it 3 => 1
*/
#ifdef DISK_ONE_IS_ON_PEG_THREE
,1,3,1
#undef DISK_ONE_IS_ON_PEG_THREE
#else
/*
* Disk 1 must be on peg 1. Move it 1 => 2
*/
,1,1,2
#define DISK_ONE_IS_ON_PEG_TWO
#endif
#endif
#endif
#else
/*
* Here, we handle disks >1. Remember that odds cycle 1 => 2 => 3 => 1,
* and evens cycle 1 => 2 => 3 => 1. Combine this with the knowledge
* of where disk 1 is, and we can determine how to move any disk.
*/
#ifndef NOW_DO_THE_NUMBERS
FORMAT_STRING
#else
/*
* Print the disk number. Remember, disk number = n+1
*/
,1
#ifdef bit0
+1
#endif
#ifdef bit1
+2
#endif
#ifdef bit2
+4
#endif
#ifdef bit3
+8
#endif
/*
* Disk 1 on peg 2
*/
#ifdef DISK_ONE_IS_ON_PEG_TWO
#ifdef bit0
,1,3 /* Even: 1 => 3 (n is odd, so the disk is even) */
#else
,3,1 /* Odd: 3 => 1 */
#endif
#else
/*
* Disk 1 on peg 3
*/
#ifdef DISK_ONE_IS_ON_PEG_THREE
#ifdef bit0
,2,1 /* Even: 2 => 1 */
#else
,1,2 /* Odd: 1 => 2 */
#endif
#else
/*
* Disk 1 on peg 1
*/
#ifdef bit0
,3,2 /* Even: 3 => 2 */
#else
,2,3 /* Odd: 2 => 3 */
#endif
#endif
#endif
#endif
#endif
/*
* More recursion
*/
#include THIS_FILE
/*
* Increment n
*/
#ifdef bit0
#undef bit0
#ifdef bit1
#undef bit1
#ifdef bit2
#undef bit2
#ifdef bit3
#undef bit3
#else
#define bit3
#endif
#else
#define bit2
#endif
#else
#define bit1
#endif
#else
#define bit0
#endif
#endif /* #ifdef N_IS_NOT_ZERO */
#endif /* #else of #ifndef INITIALIZED */