Files
Cody Boone Ferguson 1a26232be0 Add missing alt subsections to 1995/vanschnitz
The spoiler.c was also renamed to vanschnitz.alt.c and the Makefile was
updated so that running make alt will compile it. The Makefile also now
has -Wno-implicit-int.
2023-12-17 12:29:12 -08:00

240 lines
3.3 KiB
C

#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 */