Fixes to 1993/ejb
Rename ejb.explain[12] files to their respective markdown files with the name of the puzzle they explain. Fix formatting of README.md.
This commit is contained in:
1 parent
639c3db2bf
commit
2155ec8bfa
5 files changed
+217
-200
No files matched your search
+62
-50
@@ -10,69 +10,81 @@
|
|||||||
|
|
||||||
make all
|
make all
|
||||||
|
|
||||||
### To run
|
### To run:
|
||||||
|
|
||||||
./ejb level
|
./ejb level
|
||||||
|
|
||||||
where:
|
where:
|
||||||
level a value from -128 to 127
|
|
||||||
|
|
||||||
## Judges' comments
|
level a value from -128 to 127
|
||||||
|
|
||||||
A negative argument plays the patience puzzle. An argument
|
## Judges' comments:
|
||||||
greater than 0 plays the Tower of Hanoi puzzle. In either case
|
|
||||||
the absolute value of the argument specifies the size of the
|
|
||||||
respective puzzle. Refer to the files ejb.explain1 and
|
|
||||||
ejb.explain2 for more information on these puzzles.
|
|
||||||
|
|
||||||
Of course, you need a different kind of "patience" if you give
|
A negative argument plays the patience puzzle. An argument
|
||||||
the argument 127 to this program and want to see it finish!
|
greater than 0 plays the Tower of Hanoi puzzle. In either case
|
||||||
|
the absolute value of the argument specifies the size of the
|
||||||
|
respective puzzle. Refer to the files [hanoi.md](hanoi.md) and
|
||||||
|
[patience.md](patience.md) for more information on these puzzles.
|
||||||
|
|
||||||
|
Of course, you need a different kind of "patience" if you give
|
||||||
|
the argument 127 to this program and want to see it finish!
|
||||||
|
|
||||||
|
We note that this also works under macOS just fine.
|
||||||
|
|
||||||
## Author's comments
|
## Author's comments
|
||||||
|
|
||||||
WHAT THIS PROGRAM DOES
|
WHAT THIS PROGRAM DOES
|
||||||
======================
|
======================
|
||||||
|
|
||||||
./ejb 5 Output: solution to Towers of Hanoi for five rings
|
### Output solution to Towers of Hanoi for five rings:
|
||||||
./ejb -6 Output: solution to the Patience puzzle for six rings
|
|
||||||
|
|
||||||
The format of the output for the Towers of Hanoi case is simply a
|
./ejb 5
|
||||||
text description of how to solve the puzzle. For the patience
|
|
||||||
puzzle, the output is a sequence binary codes representing
|
|
||||||
successive states of the puzzle. The rightmost digit represents
|
|
||||||
the first ring. A "1" means the ring is on the U; a "0" means it
|
|
||||||
is off the U. The program prints the word "Invalid" in response to
|
|
||||||
illegal command line parameters.
|
|
||||||
|
|
||||||
MOTIVATION
|
The format of the output for the Towers of Hanoi case is simply a
|
||||||
==========
|
text description of how to solve the puzzle.
|
||||||
Most people who have written software for other people have been
|
|
||||||
asked to count lines of code. Naturally, this brings up the
|
|
||||||
controversial question of exactly what defines a line of code.
|
|
||||||
This program serves to show that counting semicolons will not
|
|
||||||
always provide a meaningful measure of code size. This is
|
|
||||||
especially true in this program where the number of semicolons
|
|
||||||
itself is ambiguous. Does it have two or three? In addition, the
|
|
||||||
only "C" keyword this program uses besides type names and
|
|
||||||
qualifiers is "return", and the only function defined in the code
|
|
||||||
is "main". The level of complexity of the program without multiple
|
|
||||||
semicolons, statements, and functions is achieved by abusing C
|
|
||||||
operators, especially the comma operator. Considerable use of ||,
|
|
||||||
&&, and ? : helps too. In addition, main is called recursively.
|
|
||||||
The null pointer that terminates argv is used to pass additional
|
|
||||||
information into main. Even though the algorithms used by this
|
|
||||||
code are simple, this program is still hard to follow even when
|
|
||||||
indented properly. (It is pretty hard to indent this code
|
|
||||||
reasonably, however.)
|
|
||||||
|
|
||||||
Although this program is has only been tested on UNIX systems but
|
### Output solution to the Patience puzzle for six rings:
|
||||||
will probably run on just about any machine with an ANSI C
|
|
||||||
compiler. It does not use the C preprocessor at all. The only
|
|
||||||
functions it uses are atoi, malloc, memset, printf, and puts. It
|
./ejb -6
|
||||||
does, however, require that the architecture it runs on have bytes
|
|
||||||
that are at least eight bits long and pointers that are at least
|
|
||||||
four bytes long. In addition, it requires an ANSI compiler since
|
For the patience puzzle, the output is a sequence binary codes representing
|
||||||
it uses "signed char" and ANSI-style function declarations.
|
successive states of the puzzle. The rightmost digit represents the first ring.
|
||||||
|
A "1" means the ring is on the U; a "0" means it is off the U. The program
|
||||||
|
prints the word "Invalid" in response to illegal command line parameters.
|
||||||
|
|
||||||
|
|
||||||
|
MOTIVATION
|
||||||
|
==========
|
||||||
|
|
||||||
|
Most people who have written software for other people have been
|
||||||
|
asked to count lines of code. Naturally, this brings up the
|
||||||
|
controversial question of exactly what defines a line of code.
|
||||||
|
This program serves to show that counting semicolons will not
|
||||||
|
always provide a meaningful measure of code size. This is
|
||||||
|
especially true in this program where the number of semicolons
|
||||||
|
itself is ambiguous. Does it have two or three? In addition, the
|
||||||
|
only "C" keyword this program uses besides type names and
|
||||||
|
qualifiers is "return", and the only function defined in the code
|
||||||
|
is "main". The level of complexity of the program without multiple
|
||||||
|
semicolons, statements, and functions is achieved by abusing C
|
||||||
|
operators, especially the comma operator. Considerable use of ||,
|
||||||
|
&&, and ? : helps too. In addition, main is called recursively.
|
||||||
|
The null pointer that terminates argv is used to pass additional
|
||||||
|
information into main. Even though the algorithms used by this
|
||||||
|
code are simple, this program is still hard to follow even when
|
||||||
|
indented properly. (It is pretty hard to indent this code
|
||||||
|
reasonably, however.)
|
||||||
|
|
||||||
|
Although this program is has only been tested on UNIX systems but
|
||||||
|
will probably run on just about any machine with an ANSI C
|
||||||
|
compiler. It does not use the C preprocessor at all. The only
|
||||||
|
functions it uses are atoi, malloc, memset, printf, and puts. It
|
||||||
|
does, however, require that the architecture it runs on have bytes
|
||||||
|
that are at least eight bits long and pointers that are at least
|
||||||
|
four bytes long. In addition, it requires an ANSI compiler since
|
||||||
|
it uses "signed char" and ANSI-style function declarations.
|
||||||
|
|
||||||
## Copyright and CC BY-SA 4.0 License:
|
## Copyright and CC BY-SA 4.0 License:
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
The Towers of Hanoi is a puzzle consisting of three posts
|
|
||||||
and several rings of various sizes. The initial
|
|
||||||
configuration of the game is that all the rings are stacked
|
|
||||||
in decreasing order of size on one post. The object of the
|
|
||||||
game is to move all the rings from one post to another
|
|
||||||
subject to two rules: only one ring can be moved at a time,
|
|
||||||
and at no time can one ring be placed on top of a smaller
|
|
||||||
ring. The number of steps necessary to solve this puzzle is
|
|
||||||
exponential in the number rings.
|
|
||||||
@@ -1,141 +0,0 @@
|
|||||||
The Patience puzzle, probably of Chinese origin, consists of
|
|
||||||
an iron U-shaped piece and several rings that link around
|
|
||||||
it. The physical shape of the puzzle is very difficult to
|
|
||||||
describe verbally, but here is an attempt.
|
|
||||||
|
|
||||||
This description of the puzzle is presented as a set of
|
|
||||||
instructions for constructing the puzzle. Start with a flat
|
|
||||||
piece of iron about 15 centimeters long by about two
|
|
||||||
centimeters wide. Drill six holes in the piece of iron.
|
|
||||||
Through each hole, place a rod. The rod should have a
|
|
||||||
diameter slightly less than that of the hole so that it can
|
|
||||||
move freely. One end of the rod is like the head of a nail
|
|
||||||
and is larger than the hole to prevent it from coming free.
|
|
||||||
The other end is looped around a metal ring with a diameter
|
|
||||||
of about five centimeters. This completely prevents the
|
|
||||||
iron rod from separating from the base. Each rod, in
|
|
||||||
addition to going through the iron base, goes through the
|
|
||||||
ring at the end of the rod to its right. The only rod free
|
|
||||||
of this restriction is the rightmost rod. What has been
|
|
||||||
described so far is one of the two components of the puzzle.
|
|
||||||
|
|
||||||
The other component is another iron rod shaped like a U.
|
|
||||||
the U is as long from the tips to the base as the original
|
|
||||||
piece of iron with the holes in it. The ends of the U are
|
|
||||||
looped around another ring of about five centimeters in
|
|
||||||
diameter. In the puzzle's initial configuration, the U is
|
|
||||||
placed through the rings so that it is held in place by the
|
|
||||||
iron rods. Imagine starting with the U piece before the
|
|
||||||
iron loop is placed at the end. Slide the legs of the U
|
|
||||||
through the loops so that the iron rods securing the loops
|
|
||||||
to the metal strip go up the center of the U. Placing the
|
|
||||||
final ring at the ends of the U prevents it from coming out.
|
|
||||||
The object of the puzzle is to free the U-shaped piece from
|
|
||||||
the other piece.
|
|
||||||
|
|
||||||
The following illustration (sideways) shows a three-ring
|
|
||||||
case of this puzzle. If you look carefully, you can see
|
|
||||||
that the first ring could be lifted over the edge of the U
|
|
||||||
and slid down through the center of the U, thereby freeing
|
|
||||||
the U from the first iron rod. The second ring can also be
|
|
||||||
freed in the initial configuration since it is already over
|
|
||||||
the rod for the first ring. The third ring cannot be moved,
|
|
||||||
however, since it is blocked by the iron rod two which the
|
|
||||||
first ring is attached. If the first first is removed, then
|
|
||||||
the third ring is no longer blocked by the first ring's iron
|
|
||||||
rod and can be removed freely. The second ring, however
|
|
||||||
cannot be moved if the first ring is gone because it will
|
|
||||||
then be blocked by the first ring in its new position
|
|
||||||
outside of the U.
|
|
||||||
|
|
||||||
Here is an illustration of the three-ring case. The bottom
|
|
||||||
of the puzzle is on the left-hand side of the page.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//==\\
|
|
||||||
|| ||
|
|
||||||
|| ||
|
|
||||||
*****||** ||
|
|
||||||
*** || ***||
|
|
||||||
** || *||
|
|
||||||
|\ ** || ||**
|
|
||||||
| \ *** || || ***
|
|
||||||
| \ *** | || ===
|
|
||||||
| \ *** || // * \\
|
|
||||||
| \ *** || || ** ||
|
|
||||||
| | | ********** ||
|
|
||||||
| | || || || ||
|
|
||||||
| | || || || ||
|
|
||||||
| | *****||** || \\ ||
|
|
||||||
| | |\ | *** || ***|| ||
|
|
||||||
|==| |=========-**-===-||-============//
|
|
||||||
|==| |=========-**-===-||-===========//
|
|
||||||
| | \| | *** || || ***
|
|
||||||
| | *** || || ===
|
|
||||||
| | ***| || // * \\
|
|
||||||
| | *** || || ** ||
|
|
||||||
| | ||********** ||
|
|
||||||
| | || || || ||
|
|
||||||
| | *****||** || \\ ||
|
|
||||||
| | |\ | *** || ***|| ||
|
|
||||||
|==| |=========-**-===-||-============//
|
|
||||||
|==| |=========-**-===-||-===========//
|
|
||||||
| | \| | *** || || ***
|
|
||||||
| | *** || || ===
|
|
||||||
| | ***| || // * \\
|
|
||||||
| | *** || || ** ||
|
|
||||||
| | ||********** ||
|
|
||||||
| | || || || ||
|
|
||||||
| | || || || ||
|
|
||||||
| | | || || \\ ||
|
|
||||||
| | |\ | || || ||
|
|
||||||
|==| |================-||-============//
|
|
||||||
|==| |================-||-===========//
|
|
||||||
| | \| | || ||
|
|
||||||
| | || ||
|
|
||||||
| | || ||
|
|
||||||
| | || ||
|
|
||||||
\ | || ||
|
|
||||||
\ | \\ ||
|
|
||||||
\ | \\ ||
|
|
||||||
\ | \\ ||
|
|
||||||
\ | \\||
|
|
||||||
\| \||
|
|
||||||
|
|
||||||
This puzzle takes other forms as well. One such puzzle is
|
|
||||||
called "Spin-Out". This puzzle consists of one plastic
|
|
||||||
piece that encases another piece that can slide in and out
|
|
||||||
of it. The movement of the smaller piece is restricted by
|
|
||||||
discs that, when turned to one angle, lock the smaller piece
|
|
||||||
inside the larger one and, when turned the other way, allow
|
|
||||||
it to move. This puzzle is as difficult to describe as the
|
|
||||||
first and, since I don't have one in front of me, I will not
|
|
||||||
attempt to describe it. The object of this puzzle is to
|
|
||||||
free the smaller piece from the larger one. The other
|
|
||||||
puzzle that is like this one consists of a cylinder with
|
|
||||||
rods protruding from the top. The rods can be slid from the
|
|
||||||
center to the edge of the cylinder constrained by a series
|
|
||||||
of discs in the center. The discs have cuts in them that
|
|
||||||
allow some rods to move and force others in one place based
|
|
||||||
on the relative rotations of the discs. The object here is
|
|
||||||
to move all the rods from the inside to the outside.
|
|
||||||
|
|
||||||
What makes these puzzles similar is that the physical shapes
|
|
||||||
of the puzzles put the same restrictions on the movement of
|
|
||||||
the pieces. Specifically, there is always one piece that is
|
|
||||||
free to move. The only other piece that is free to move is
|
|
||||||
the second one that is still attached to the base it is
|
|
||||||
trying to be freed from. In the case of the original
|
|
||||||
puzzle, consider the rings numbered from 1 to 6 with ring 1
|
|
||||||
being the one at the closed send of the U. Ring 1 can
|
|
||||||
always be removed from or added to the U. In the initial
|
|
||||||
state, when all rings are around the U, ring 2 is the other
|
|
||||||
one that can be moved because it is second. If ring 1 is
|
|
||||||
removed, then only two operations are possible: the
|
|
||||||
restoration of ring 1 and the removal of ring 3. This is
|
|
||||||
because ring 1 is always movable, and ring 3 is currently
|
|
||||||
the second ring still attached to the U. This constraint
|
|
||||||
leads to a recursive solution to the puzzle. Like the
|
|
||||||
Towers of Hanoi, the number of steps to solve this puzzle is
|
|
||||||
exponential in the number of rings.
|
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
# The Towers of Hanoi puzzle
|
||||||
|
|
||||||
|
The Towers of Hanoi is a puzzle consisting of three posts
|
||||||
|
and several rings of various sizes. The initial
|
||||||
|
configuration of the game is that all the rings are stacked
|
||||||
|
in decreasing order of size on one post. The object of the
|
||||||
|
game is to move all the rings from one post to another
|
||||||
|
subject to two rules: only one ring can be moved at a time,
|
||||||
|
and at no time can one ring be placed on top of a smaller
|
||||||
|
ring. The number of steps necessary to solve this puzzle is
|
||||||
|
exponential in the number rings.
|
||||||
@@ -0,0 +1,144 @@
|
|||||||
|
# The Patience puzzle
|
||||||
|
|
||||||
|
The Patience puzzle, probably of Chinese origin, consists of
|
||||||
|
an iron U-shaped piece and several rings that link around
|
||||||
|
it. The physical shape of the puzzle is very difficult to
|
||||||
|
describe verbally, but here is an attempt.
|
||||||
|
|
||||||
|
This description of the puzzle is presented as a set of
|
||||||
|
instructions for constructing the puzzle. Start with a flat
|
||||||
|
piece of iron about 15 centimeters long by about two
|
||||||
|
centimeters wide. Drill six holes in the piece of iron.
|
||||||
|
Through each hole, place a rod. The rod should have a
|
||||||
|
diameter slightly less than that of the hole so that it can
|
||||||
|
move freely. One end of the rod is like the head of a nail
|
||||||
|
and is larger than the hole to prevent it from coming free.
|
||||||
|
The other end is looped around a metal ring with a diameter
|
||||||
|
of about five centimeters. This completely prevents the
|
||||||
|
iron rod from separating from the base. Each rod, in
|
||||||
|
addition to going through the iron base, goes through the
|
||||||
|
ring at the end of the rod to its right. The only rod free
|
||||||
|
of this restriction is the rightmost rod. What has been
|
||||||
|
described so far is one of the two components of the puzzle.
|
||||||
|
|
||||||
|
The other component is another iron rod shaped like a U.
|
||||||
|
The U is as long from the tips to the base as the original
|
||||||
|
piece of iron with the holes in it. The ends of the U are
|
||||||
|
looped around another ring of about five centimeters in
|
||||||
|
diameter. In the puzzle's initial configuration, the U is
|
||||||
|
placed through the rings so that it is held in place by the
|
||||||
|
iron rods. Imagine starting with the U piece before the
|
||||||
|
iron loop is placed at the end. Slide the legs of the U
|
||||||
|
through the loops so that the iron rods securing the loops
|
||||||
|
to the metal strip go up the center of the U. Placing the
|
||||||
|
final ring at the ends of the U prevents it from coming out.
|
||||||
|
The object of the puzzle is to free the U-shaped piece from
|
||||||
|
the other piece.
|
||||||
|
|
||||||
|
The following illustration (sideways) shows a three-ring
|
||||||
|
case of this puzzle. If you look carefully, you can see
|
||||||
|
that the first ring could be lifted over the edge of the U
|
||||||
|
and slid down through the center of the U, thereby freeing
|
||||||
|
the U from the first iron rod. The second ring can also be
|
||||||
|
freed in the initial configuration since it is already over
|
||||||
|
the rod for the first ring. The third ring cannot be moved,
|
||||||
|
however, since it is blocked by the iron rod two which the
|
||||||
|
first ring is attached. If the first first is removed, then
|
||||||
|
the third ring is no longer blocked by the first ring's iron
|
||||||
|
rod and can be removed freely. The second ring, however
|
||||||
|
cannot be moved if the first ring is gone because it will
|
||||||
|
then be blocked by the first ring in its new position
|
||||||
|
outside of the U.
|
||||||
|
|
||||||
|
Here is an illustration of the three-ring case. The bottom
|
||||||
|
of the puzzle is on the left-hand side of the page.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//==\\
|
||||||
|
|| ||
|
||||||
|
|| ||
|
||||||
|
*****||** ||
|
||||||
|
*** || ***||
|
||||||
|
** || *||
|
||||||
|
|\ ** || ||**
|
||||||
|
| \ *** || || ***
|
||||||
|
| \ *** | || ===
|
||||||
|
| \ *** || // * \\
|
||||||
|
| \ *** || || ** ||
|
||||||
|
| | | ********** ||
|
||||||
|
| | || || || ||
|
||||||
|
| | || || || ||
|
||||||
|
| | *****||** || \\ ||
|
||||||
|
| | |\ | *** || ***|| ||
|
||||||
|
|==| |=========-**-===-||-============//
|
||||||
|
|==| |=========-**-===-||-===========//
|
||||||
|
| | \| | *** || || ***
|
||||||
|
| | *** || || ===
|
||||||
|
| | ***| || // * \\
|
||||||
|
| | *** || || ** ||
|
||||||
|
| | ||********** ||
|
||||||
|
| | || || || ||
|
||||||
|
| | *****||** || \\ ||
|
||||||
|
| | |\ | *** || ***|| ||
|
||||||
|
|==| |=========-**-===-||-============//
|
||||||
|
|==| |=========-**-===-||-===========//
|
||||||
|
| | \| | *** || || ***
|
||||||
|
| | *** || || ===
|
||||||
|
| | ***| || // * \\
|
||||||
|
| | *** || || ** ||
|
||||||
|
| | ||********** ||
|
||||||
|
| | || || || ||
|
||||||
|
| | || || || ||
|
||||||
|
| | | || || \\ ||
|
||||||
|
| | |\ | || || ||
|
||||||
|
|==| |================-||-============//
|
||||||
|
|==| |================-||-===========//
|
||||||
|
| | \| | || ||
|
||||||
|
| | || ||
|
||||||
|
| | || ||
|
||||||
|
| | || ||
|
||||||
|
\ | || ||
|
||||||
|
\ | \\ ||
|
||||||
|
\ | \\ ||
|
||||||
|
\ | \\ ||
|
||||||
|
\ | \\||
|
||||||
|
\| \||
|
||||||
|
|
||||||
|
This puzzle takes other forms as well. One such puzzle is
|
||||||
|
called "Spin-Out". This puzzle consists of one plastic
|
||||||
|
piece that encases another piece that can slide in and out
|
||||||
|
of it. The movement of the smaller piece is restricted by
|
||||||
|
discs that, when turned to one angle, lock the smaller piece
|
||||||
|
inside the larger one and, when turned the other way, allow
|
||||||
|
it to move. This puzzle is as difficult to describe as the
|
||||||
|
first and, since I don't have one in front of me, I will not
|
||||||
|
attempt to describe it. The object of this puzzle is to
|
||||||
|
free the smaller piece from the larger one. The other
|
||||||
|
puzzle that is like this one consists of a cylinder with
|
||||||
|
rods protruding from the top. The rods can be slid from the
|
||||||
|
center to the edge of the cylinder constrained by a series
|
||||||
|
of discs in the center. The discs have cuts in them that
|
||||||
|
allow some rods to move and force others in one place based
|
||||||
|
on the relative rotations of the discs. The object here is
|
||||||
|
to move all the rods from the inside to the outside.
|
||||||
|
|
||||||
|
What makes these puzzles similar is that the physical shapes
|
||||||
|
of the puzzles put the same restrictions on the movement of
|
||||||
|
the pieces. Specifically, there is always one piece that is
|
||||||
|
free to move. The only other piece that is free to move is
|
||||||
|
the second one that is still attached to the base it is
|
||||||
|
trying to be freed from. In the case of the original
|
||||||
|
puzzle, consider the rings numbered from 1 to 6 with ring 1
|
||||||
|
being the one at the closed send of the U. Ring 1 can
|
||||||
|
always be removed from or added to the U. In the initial
|
||||||
|
state, when all rings are around the U, ring 2 is the other
|
||||||
|
one that can be moved because it is second. If ring 1 is
|
||||||
|
removed, then only two operations are possible: the
|
||||||
|
restoration of ring 1 and the removal of ring 3. This is
|
||||||
|
because ring 1 is always movable, and ring 3 is currently
|
||||||
|
the second ring still attached to the U. This constraint
|
||||||
|
leads to a recursive solution to the puzzle. Like the
|
||||||
|
[Towers of Hanoi](hanoi.md), the number of steps to solve this puzzle is
|
||||||
|
exponential in the number of rings.
|
||||||
Reference in new issue
Block a user