Post Reply 
new puzzle challenge
04-04-2015, 12:48 PM (This post was last modified: 04-05-2015 02:37 AM by Claudio L..)
Post: #29
RE: new puzzle challenge
(04-03-2015 08:43 PM)PANAMATIK Wrote:  Perhaps you are aware, perhaps not, that many other members or nonmembers are reading this thread with great pleasure, seeing your efforts and results, without being able to participate in these kind of mathematics games, but admiring it. I'm one of these quiet readers and want to congratulate any of you in advance for finding all the n-th order solution eggs.

Happy Easter!
Bernhard

Thanks for the encouragement. You shall be rewarded with the full source code:

For proper code optimization, this is the variable numbering (quite strange for humans, but optimized for the machine:

Code:

       A   B   C
     L   R   M   D
   K   Q   S   N   E
     J   P   O   F
       I   H   G

A trough L are the outer ring, where we can write the first 6 equations with only 3 letters each, and completely decoupled from the rest. This allows to solve for the first 6 variables out of seven. As explained in my previous post, the code walks the perimeter setting a number for A, then trying all values of B knowing A+B>=19, and computing C per the corresponding equation C=38-(A+B).

This is done by this code:

Code:

@@ AUXILIARY ROUTINE 'TAKEN' CHECKS IF THE NUMBER ON LEVEL 1
@@ WAS ALREADY PRESENT IN THE STACK, RETURNS 1=WAS TAKEN, 0=NOT REPEATED
<< DEPTH IF 1 <= THEN 0 ELSE
         0 -> RESULT << 
         DEPTH 1 + 3 SWAP FOR K DUP K PICK 
         IF == THEN 1 'RESULT' STO 1000 'K' STO END NEXT 
         RESULT >> 
         END
 >> 'TAKEN' STO 

@@ ROUTINE DOLOOP DOES THE RECURSION FOR THE OUTER RING
@@ EXPECTS THE FIRST VALUE TO BE ON THE STACK ALREADY
@@ IT LEAVES ONLY THAT ORIGINAL VALUE ON THE STACK UPON EXIT
@@ TRIES ALL POSSIBLE COMBINATIONS OF THE OUTER RING

 << DEPTH IF 11 == THEN 
@@ SPECIAL CASE TO "CLOSE" THE RING ONCE WE HAVE ALL VARIABLES
        11 PICK OVER + 38 SWAP - 
             IF TAKEN NOT OVER 1 >= AND OVER 19 <= AND THEN 
@@ IF THE RING "CLOSED", THEN DO THE INNER RING CHECK...
                  CHKINNER 
             END DROP 
        ELSE 
@@ REGULAR CASE, TRY ALL VALUES IN A LOOP FOR THE NEXT NUMBER
            19 OVER - DUP 1 < + 19 SWAP FOR K K 
                    IF TAKEN THEN DROP ELSE
                            2 DUPN + 38 SWAP -
                            IF TAKEN NOT THEN DOLOOP END
                            DROP DROP
                    END
            -1 STEP
        END
 >> 'DOLOOP' STO

M is the 7th independent variable. Once the outer ring is known, trying all possible values for M allows to calculate all letters N through R in the "inner ring" by using the 4-term equations.
N=38-(B+M+F)
O=38-(D+N+H)
...

The inner ring code expects to find already on the stack the 12 variables A through L with L on level 1.
The inner ring is solved by this code:
Code:

@@ ROUTINE CHKINNER, COMPUTES THE LAST REMAINING INDEP. VARIABLE
@TRY ALL NUMBERS FROM 1 THROUGH 19 IN A LOOP
 << 1 19 FOR K 
          K IF TAKEN THEN DROP ELSE
@@ IF THE NUMBER WAS VALID, THEN SOLVE FOR N THROUGH R
@@ USING THE EQUATIONS WITH 4-TERMS
                   IF  1 -> INNERCHECK << 1 5 FOR J 13 J 2 * - DUP 
                                                       IF 1 < THEN 12 + END J + PICK 
                                                       10 J 2 * - DUP
                                                       IF 1 < THEN 12 + END J + PICK
                                                       + OVER + 38 SWAP -
                                                       IF TAKEN OVER 1 < OR OVER 19 > OR THEN 
                                                       J DROPN 0 'INNERCHECK' STO 1000 'J' STO
                                                       END
                                                       NEXT
                                                       INNERCHECK >> 

                   THEN
@@ INNER RING CHECKS OUT, NOW CHECK THE 
@@ CENTER VALUE BEFORE WE CLAIM TO HAVE A SOLUTION
                         IF CHKCENTER THEN
@@ WE HAVE A SOLUTION, ADD IT TO A LIST CALLED 'SOLUTIONS'
                              19 DUPN 19 ->LIST 1 ->LIST
                              SOLUTIONS SWAP + 'SOLUTIONS' STO
                              7 DROPN
                         ELSE 6 DROPN 
                         END
                  ELSE DROP
                  END
       END
       NEXT
  >> 'CHKINNER' STO

Finally, we need to do the proper checks with the center value (last position, S).
All we have to do is find the only number that was not taken in the stack and check all 3 equations with 5-terms.

This is done here:
Code:

@@ ROUTINE CHKCENTER CHECKS IF THE CENTER VALUE IS CORRECT
@@ USING THE 5-TERM EQUATIONS
 << 1 19 FOR K
       K IF TAKEN NOT THEN 1000 'K' STO ELSE DROP END
       NEXT

        19 PICK 3 PICK + OVER + 6 PICK + 14 PICK + IF 38 == THEN
                  17 PICK 8 PICK + OVER + 5 PICK + 12 PICK + IF 38 == THEN
                            9 PICK 4 PICK + OVER + 7 PICK + 16 PICK + IF 38 == THEN
                                         1
                            ELSE DROP 0 END
                  ELSE DROP 0 END
        ELSE DROP 0 END
 >> 'CHKCENTER' STO

And to wrap it all up, the code above needs a couple of things to run properly:
  • A variable named 'SOLUTIONS' initialized to an empty list
  • A clear stack
  • A loop to try all 19 initial values

This is done here:

Code:

@@ ROUTINE RUNIT DOES THE COMPLETE TEST
 << { } 'SOLUTIONS' STO
       CLEAR
       1 19 FOR I I DOLOOP DROP NEXT
       SOLUTIONS LIST->
 >> 'RUNIT' STO


For the short of patience, partial tests can be ran, if you put a partial list of numbers (must be a valid partial solution, of course), and run the DOLOOP test to see if any solutions are found.
Just make sure 'SOLUTIONS' contains an empty list and that there's nothing else in the stack but your partial solution.
The partial solution has to contain 1, 3, 5... elements. In other words, think of the corners as the independent variables, then to give 2 independent variables you must also provide the intermediate value between them (A, B and C).

This is tested and finds all 12 solutions, but of course I tested it on a PC with newRPL, don't have the patience to wait 19 hours, but if somebody does, please measure time and report here.

Happy coding.

PS: Still not a one-line RPL solution... but faster than my first try at 97 days!

EDIT:
Forgot to mention, if you don't wait to wait 19 hours, and don't care about the different rotations, you can get a nice solution by doing:
Code:
 { } 'SOLUTIONS' STO 3 DOLOOP

This will leave SOLUTIONS with all solutions that have a 3 in the first variable: exactly 2 solutions, one mirror of the other, and only for about 1 hr of your time.
Find all posts by this user
Quote this message in a reply
Post Reply 


Messages In This Thread
new puzzle challenge - Don Shepherd - 03-30-2015, 02:30 AM
RE: new puzzle challenge - Paul Dale - 03-30-2015, 03:19 AM
RE: new puzzle challenge - Claudio L. - 03-30-2015, 02:34 PM
RE: new puzzle challenge - Claudio L. - 03-30-2015, 04:58 PM
RE: new puzzle challenge - Paul Dale - 03-30-2015, 10:11 PM
RE: new puzzle challenge - Claudio L. - 03-31-2015, 12:40 PM
RE: new puzzle challenge - Claudio L. - 03-31-2015, 05:31 PM
RE: new puzzle challenge - Gilles - 03-31-2015, 06:00 PM
RE: new puzzle challenge - Claudio L. - 03-31-2015, 10:03 PM
RE: new puzzle challenge - Claudio L. - 04-01-2015, 12:25 PM
RE: new puzzle challenge - Gilles - 04-01-2015, 07:22 PM
RE: new puzzle challenge - Claudio L. - 04-02-2015, 10:53 PM
RE: new puzzle challenge - Paul Dale - 04-02-2015, 11:11 PM
RE: new puzzle challenge - Claudio L. - 04-04-2015, 07:02 PM
RE: new puzzle challenge - Paul Dale - 04-04-2015, 11:43 PM
RE: new puzzle challenge - Claudio L. - 04-05-2015, 02:29 AM
RE: new puzzle challenge - Paul Dale - 04-05-2015, 03:24 AM
RE: new puzzle challenge - Claudio L. - 04-03-2015, 11:31 AM
RE: new puzzle challenge - Claudio L. - 04-03-2015, 07:04 PM
RE: new puzzle challenge - rprosperi - 04-03-2015, 07:36 PM
RE: new puzzle challenge - Han - 04-03-2015, 08:09 PM
RE: new puzzle challenge - Claudio L. - 04-04-2015, 12:53 PM
RE: new puzzle challenge - Paul Dale - 03-30-2015, 04:00 AM
RE: new puzzle challenge - brouhaha - 03-30-2015, 04:35 AM
RE: new puzzle challenge - Paul Dale - 03-30-2015, 04:50 AM
RE: new puzzle challenge - Tugdual - 03-30-2015, 05:45 AM
RE: new puzzle challenge - Don Shepherd - 03-30-2015, 11:44 AM
RE: new puzzle challenge - Don Shepherd - 03-30-2015, 04:40 PM
RE: new puzzle challenge - RayAtHP - 04-02-2015, 07:32 PM
RE: new puzzle challenge - Don Shepherd - 04-02-2015, 08:30 PM
RE: new puzzle challenge - RayAtHP - 04-02-2015, 08:58 PM
RE: new puzzle challenge - Don Shepherd - 04-02-2015, 10:08 PM
RE: new puzzle challenge - PANAMATIK - 04-03-2015, 08:43 PM
RE: new puzzle challenge - Claudio L. - 04-04-2015 12:48 PM
RE: new puzzle challenge - Don Shepherd - 04-04-2015, 03:06 PM
RE: new puzzle challenge - Claudio L. - 04-04-2015, 06:44 PM



User(s) browsing this thread: 1 Guest(s)