Solutions and Discussion for Perl Quiz of the Week #17 (Expert Edition)
Mark Jason Dominus <[email protected]> Mon, 21 Jun 2004 22:28:43 -0400
| Newsgroups | gmane.comp.lang.perl.qotw.quiz-of-the-week |
|---|---|
| Organization | Plover Systems |
| Message-ID | <[email protected]> |
Sample solutions and discussion
Perl Expert Quiz of The Week #17 (20040602)
Last year my mother-in-law gave me a delightful little puzzle,
called "The Sphinx". It's seven variously shaped wooden
tiles, which you try to arrange into various configurations.
I did a lot of this kind of puzzle when I was younger; in
particular I spent many many hours playing around with
pentominoes, which are a set of 12 different-shaped tiles each
made by sticking five squares together. Writing a program to
solve pentomino puzzles is not hard, because the configuration
you're typically trying to achieve has all the pieces aligned
with the points of a square grid. The "Sphinx" puzzle was a
nice change for me, because the tiles aren't square at all.
I've illustrated the seven tiles at
http://perl.plover.com/qotw/misc/e017/sph.jpg
http://perl.plover.com/qotw/misc/e017/sph.ps
Exact descriptions follow:
Tile Description Angles Sides Area
A Equilateral 60 60 60 1 1 1 1
triangle
B Isosceles 30 30 120 1 1 S 1
triangle
C Right triangle 30 60 90 1 S 2 2
D Right triangle 30 60 90 1 S 2 2
E Quadrilateral 60 150 30 120 1 S 2 1 3
F Trapezoid 120 60 60 120 1 1 2 1 3
G Rectangle 90 90 90 90 S 1 S 1 4
An "S" in the "Sides" column represents a side with length
sqrt(3). The areas in the "Area" column are measured in
multiples of tile A, which actually has an area of
sqrt(3)/4 square units.
Piece "E" is rather irregular. It is formed by taking a
copy of tile C and gluing a copy of tile A to its short
side.
Tiles C and D are identical.
It is permissible to flip the tiles over. And, of course, to
rotate them or slide them around on the table. But it is not
permitted to overlap them.
Your job is to write a program which can solve Sphinx puzzles.
The program will be given an input file which describes the
configuration that into which the tiles are to be placed. See
http://perl.plover.com/qotw/misc/e017/conf.jpg
http://perl.plover.com/qotw/misc/e017/conf.ps
for an example. The program should figure out a way to place
the tiles into the specified configuration, if there is one,
and report the arrangement unambiguously on the output; if no
arrangement is possible, it should say so.
It's up to you to determine the format of the input and the
output.
The puzzle, by the way, was designed by Nob Yoshigahara, a
famous designer of puzzles. The Sphinx puzzle is a little out
of his usual line. He specializes in puzzles in which you
have to fit a bunch of objects into a container. For example,
see
http://www.johnrausch.com/PuzzleWorld/puz/pack_the_asparagus.htm
----------------------------------------------------------------
Regrettably, there is no sample solution available, because I did not
complete one and because nobody sent one to the discussion list.
However, there are still some points of interest.
1. I posed this quiz because I did not know a good way to solve the
problem and I wanted to see what people would come up with. I
think I did come up with a reasonably good general approach, which
is described in some detail at
http://perl.plover.com/~alias/list.cgi?1:msp:1740
I did try to do an implementation based on this idea, and I think I
succeeded, or else I almost succeeded. But I wasn't entirely sure,
so I didn't clean up the code and put it in order to serve as an
example.
There are two versions. The first one I did had a serious
omission. It would search for a solution to the puzzle, and stop
when it found one, but it wouldn't keep any record of how it had
placed the tiles. So it would finish by saying "I found a
solution," with no way of reporting what the solution was. Oops!
I got to work on a second version that remedied this. The second
version does not work right. I am not sure if the defect is in the
search or in the code that generates the final display, and I
didn't have time to find out where the problem was.
If anyone is interested in tinkering with it, I put my code at
http://perl.plover.com/qotw/misc/e017/sphinx1.pl
http://perl.plover.com/qotw/misc/e017/sphinx2.pl
2. The output from version 2 of my sphinx program is in PostScript. I
thought I'd take a moment to plug PostScript a little. PostScript
is amazingly well-designed. It truly achieves the goal of making
simple things simple and difficult things possible. Like Perl, it
has a very gentle learning curve, you can get useful work done in
PostScript with only a few simple features. The syntax is
extremely simple. The language features are so clear and intuitive
that one's can look at a program that contains unfamiliar
constructions, make educated guesses about what they might be
doing, and have a good chance of being correct.
Over the past four years I've averaged about one PostScript project
per year. Each project took me far less time than I expected it
would, considering that I was working in a totally unfamiliar
language. Each project was a huge success, yielding a large
benefit in relation to the amount of time I had to put in. For
example, a year or two ago I needed to write a tool that would take
a series of PostScript documents and reorganize them into two-up
format. It turned out to be 42 lines of Perl code, and I now use
this tool all the time.
This year I decided that if PostScript was yielding so much benefit
for me even though I didn't know it, I'd get even bigger benefits
if I actually tried to learn it. This has paid off.
The complete language reference manual is available for free
download from Adobe's web site. It is clear and pithy. With the
language manual in hand, you can sit down and study a few sample
PostScript programs and make a great start on learning the language.
I have nothing bad to say about PostScript. People who know me may
find this amazing.
3. Kevin Pfeiffer did some work on a solution to this quiz, but the
code is in C++. (Great heavens!)
http://www.tiros.net/pfeiffer/processing/2004/seven_tiles_in_progress/
Personally, if I were choosing a language in which to write this
program, I would probaly pick Haskell or SML. C++ would be near
the bottom of the list.
Now that I think about it, PostScript might not be a bad choice.
Rod Adams discussed a strategy for solution, and pointed out a
complication:
You'll need to check that the tile you are "subtracting" from
the shape does not go outside of the shape at any other of the
tiles corners. This is not a trivial task.
Ah, but but but! In PostScript, it *is* a trivial task, because
there is a builtin operator for it!
4. Ben Okopnik pointed out a similar project:
http://gtans.sourceforge.net/
This one is written in C. Several people have posted favorable
comments about it on the discuss list.
5. Nob Yoshigahara, the designer of this puzzle, died suddenly on
Saturday. One of the eulogies on his mailing list read, in part:
In 1977 [Nob] was complaining of the shortage of new
puzzle ideas in Japan; but he was largely
responsible for changing Japan into one of the best
places for collectors to go puzzle hunting.
I hope that God enjoys Nob's puzzles at least as much as I have.
6. My medical emergency is over. My apologies to anyone who was
worried. I should have mentioned that although it was an emergency
("a sudden occurrence of a serious and urgent nature that demands
immediate action") it was neither unexpected nor unwelcome. In any
event, it has been resolved satisfactorily. Thanks to everyone who
expressed concern.
I will try to send a new quiz on Wednesday.