Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > [QUIZ] Sliding Puzzle (#196)

Thread Tools

[QUIZ] Sliding Puzzle (#196)

Daniel Moore
Posts: n/a

The three rules of Ruby Quiz:

1. Please do not post any solutions or spoiler discussion for this
quiz until 48 hours have elapsed from the time this message was

2. Support Ruby Quiz by submitting ideas and responses
as often as you can! Visit: <>

3. Enjoy!

Suggestion: A [QUIZ] in the subject of emails about the problem
helps everyone on Ruby Talk follow the discussion. Please reply to
the original quiz message, if you can.


## Sliding Puzzle (#196)

Bienvenidos fellow Rubyists,

This weeks quiz will be to create and implement a [sliding puzzle][1].
The puzzle must be playable from keyboard input. The program will
generate a puzzle in a random configuration and the puzzle generated
must be solvable. You may create either the 8-puzzle or the 15-puzzle.
You may include a mode that will automatically solve the puzzle or
present a hint.

The puzzle must throw a small party when solved.

Bonus: Have the puzzle be displayed as an ascii art image that needs
to be arranged instead of simple numbers.


Have Fun!

Reply With Quote
Daniel Moore
Posts: n/a
The sole submission to this week's quiz comes from Martin Boese.
Martin provided a simple and versatile solution. It can generate
puzzles of any size, and is able to shuffle to a random starting
configuration. It also throws a nice party when the player succeeds.

The program provides a driver that reads keyboard commands and
translates them into the correct actions on the puzzle class. The
program accepts four movement commands as well as commands to quit and

Here's a look at the puzzle's shuffle method to randomize the configuration:

def shuffle
100.times { move 'udlr'[(rand*4).to_i].chr }

The shuffling is done by making 100 random moves, this ensures that
the puzzle remains solvable; a random shuffling of the tiles without
maintaining the movement constraints is not necessarily solvable.
Additionally, this leverages the existing functionality of the `move`
method to keep the code simple. One potential drawback is that this
doesn't select all possible starting positions with equal probability.
However, having the random configurations generated with equal
probability wasn't a quiz requirement, and it is often best to go with
the least complex solution that meets the requirements.

The method to detect whether or not the puzzle is solved also
leverages existing functionality to reduce complexity, it checks if
the current board is equal to a newly created board. Because the newly
created board starts in the solved position and the board is an array
of integers, this leads to a short and sweet definition:

def solved?
@board == mkboard(@x,@y) && @moved

The check for `@moved` to be true is to prevent the puzzle from
partying when the game is first created and before it is shuffled.
Speaking of the party, here's the section responsible for that magical

10.times { $stdout.print '*'; sleep 0.1; $stdout.flush }
puts " You won!\n"

It creates a rapid display of asterisks and congratulates the player!

Thank you, Martin, for a wonderful solution!

- Daniel

Reply With Quote

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off

Similar Threads
Thread Thread Starter Forum Replies Last Post
TCP Sliding Window? Wendy Cisco 4 12-05-2004 06:42 PM
Cache and Sliding Expiration Guadala Harry ASP .Net 1 11-04-2004 09:36 AM
A puzzle to puzzle you sk A+ Certification 1 07-17-2004 05:19 PM
OT: sliding puzzle code Developwebsites Java 1 08-26-2003 02:03 PM
sliding puzzle code help Developwebsites C++ 1 08-23-2003 07:10 AM