Solitaire for Squares

[Home]   [Puzzles & Projects]    [Delphi Techniques]   [Math topics]   [Library]   [Utilities]

 

Search

Search WWW

Search DelphiForFun.org

As of October, 2016, Embarcadero is offering a free release of Delphi (Delphi 10.1 Berlin Starter Edition ).     There are a few restrictions, but it is a welcome step toward making more programmers aware of the joys of Delphi.  They do say "Offer may be withdrawn at any time", so don't delay if you want to check it out.  Please use the feedback link to let me know if the link stops working.

 

Support DFF - Shop

 If you shop at Amazon anyway,  consider using this link. We receive a few cents from each purchase.   Thanks.


Support DFF - Donate

 If you benefit from the website,  in terms of knowledge, entertainment value, or something otherwise useful, consider making a donation via PayPal  to help defray the costs.  (No PayPal account necessary to donate via credit card.)  Transaction is secure.

Contact

Feedback:  Send an e-mail with your comments about this program (or anything else).

Search DelphiForFun.org only

 

 

Problem Description

Here's a simple puzzle that can be solved with or without a computer.  Remove the 13 spades and 13 hearts from a deck of cards.  Layout the 13 spades and place the 13 hearts, one on each spade so that the sum of each pair of cards is a perfect square (1, 4, 9, 16, etc.) for every pair.     Jacks, Queens and Kings have values of 11, 12 and 13 respectively.   By the way,  don't count on the start shown here being correct. 

Background & Techniques

This was a fun one day project mainly to see if the card drawing unit introduced last year still works (it does).  I added a hint button that will help anyone that gets really stuck.  (Only partial credit if you solve it with hints though.)  

I ran across this problem description in Martin Gardner's book: "Time Travel and Other Mathematical Bewilderments" , Freeman Books, 1988The problem is attributed to David L. Silverman.

Non-programmers are welcome to read on, but may want to skip to the bottom of this page to download an executable version of the program.

Notes for Programmers

The structure for this problem is pretty simple.  Array Board  is an array of 13 integers.  the position of each number in the array represents the Spade value and the value of each entry represents the Heart value.  So for each filled entry, i+board[i] is a  square number.  An IsSquare function checks whether a passed value is a  square.  

The code has two main functions:

bulletManage card objects as the user drags them around:   I use the U_CardsComponent  introduced in Cards 2 to define the 26 cards needed.  The global array, Board,  holds the current status of the cards.  We'll use the FormDragDrop procedure to do the necessary checking and updating the Board array.   At drop time we also check to see if all cards are in place.

 

bulletDeliver hints to user on request:  A recursive function, GetNextMove, is called at FormCreate time to build a TargetBoard array with the final positions of the Hearts.  This, together with the  Board array, lets us decide which card should be moved temporarily to its proper location when the user clicks the Hint button. . 

The MoveCard function cleverly adjusts the pixel increment to maintain a reasonable move speed across processors of differing speeds while displaying hints.   If the card moved faster than 250 pixels per second, the increment is decreased; if slower the increment is increased. 

Running/Exploring the Program 

bulletBrowse source extract
bulletDownload source
bulletDownload  executable

Suggestions for Further Explorations

Probably not much more for this problem.  But there are hundreds of others just waiting in the wings.   Here's one more example from Gardner's Time Travel book:  
  1. Place the 13 cards of any one suit face up in  a row,  Ace through King
  2. Starting with the 1st card, turn over every card
  3. Starting with the 2nd card, turn over every 2nd card
  4. Start with the 3rd card, turn over every 3rd card 
  5. Continue in manner until, on the 13th pass, you turn over only the 13th card.

Which cards are face up?  Can you figure out  why?

 
Original Date: July 14, 2002

Modified: February 18, 2016

 
  [Feedback]   [Newsletters (subscribe/view)] [About me]
Copyright 2000-2017, Gary Darby    All rights reserved.