hp41programs

Mastermind

Mastermind for the HP-41


Overview
 

 1°) 6-digit numbers

  a)  Program#1
  b)  Program#2 ( faster )

 2°) From 1- to 10-digit numbers

  a)  Program#1
  b)  Program#2 ( faster )
  c)  M-Code Routine
  d)  Program#3
 

-A number is chosen by the HP-41 and you have to find it by several guesses
-The calculator tells you how many digits of your guess are in a right position and how many are in a wrong position
-The digits range from 1 to 9

  0 is not allowed in the following versions
 

1°)  6-digit numbers
 

     a)  Program#1
 
 

Data Registers:           •  R00 = pseudo-random numbers                                     ( This register is to be initialized before executing "MMD" )

                                          R01 thru R06 = +/- the digits of the hidden number          R10 = number of your guesses
                                          R07 to R09 = counters                                                    R11 thru R16 = the digits of your guess or 0
Flag:  F29
Subroutines: /

-Lines 02 thru 16 computes the 6 digits of the mystery number
-If, for instance, you want to use digits from 1 to 7 only, replace line 10 by  7
-The append character is denoted  >
 
 

 01 LBL "MMD"
 02 6
 03 STO 10
 04 LBL 00
 05 SIGN
 06 RCL 00
 07 R-D
 08 FRC
 09 STO 00
 10 9
 11 *
 12 +
 13 INT
 14 STO IND 10
 15 DSE 10
 16 GTO 00
 17 X<>Y
 18 FIX 0
 19 CF 29
 20 LBL 01
 21 " "
 22 ARCL X
 23 0
 24 STO 11
 25 17.011
 26 STO 07
 27 STO 08
 28 6
 29 STO 09       
 30 R^
 31 AVIEW
 32 ISG 10
 33 LBL 02
 34 ENTER
 35 INT
 36 10
 37 ST/ Z
 38 MOD
 39 STO IND 07
 40 RCL IND Z
 41 ABS
 42 STO IND T
 43 X=Y?
 44 DSE 11
 45 CLX
 46 R^
 47 DSE X
 48 R^
 49 DSE 07
 50 GTO 02
 51 RCL 11
 52 ABS
 53 RCL 09
 54 X=Y?
 55 GTO 05
 56 >" "
 57 ARCL Y
 58 LBL 03
 59 RCL 08
 60 STO 07
 61 LBL 04
 62 RCL IND 07
 63 RCL IND 09
 64 X#Y?
 65 GTO 04
 66 CHS
 67 ST+ IND 07
 68 STO IND 09
 69 ISG 11
 70 LBL 04
 71 DSE 07
 72 GTO 04
 73 DSE 09
 74 GTO 03
 75 >"-"
 76 ARCL 11
 77 PROMPT
 78 GTO 01
 79 LBL 05
 80 >"//"
 81 9
 82 RCL 10
 83 X<=Y?
 84 >"0"
 85 ARCL 10     
 86 FIX 4
 87 AVIEW
 88 END

 
   ( 143 bytes / SIZE 018 )
 
 

      STACK        INPUT      OUTPUT
           X             Nj    Nb of guesses

 
Example:     1  STO 00

   111111   XEQ "MMD"  >>>>  "111111"     "111111 1-0"                there is one "1"
   122222           R/S                    "122222"      "122222 1-0"               the "1" is in right position and there is no "2"
   133333           R/S                    "133333"      "133333 3-0"               the "1" & two "3"s are in right position
   133444           R/S                    "133444"      "133444 1-2"               the "1" is in right position but the two "3"s are  in a wrong location. There is no "4"
   155335"          R/S                    "155335"      "155335 2-1"               the "1" and one "3" are well placed. There is no "5"
   166363           R/S                    "166363"      "166363 4-0"               the "1" and the two "3"s are well placed and there is one "6"
   167373           R/S                    "167373"      "167373 3-1"               the "1" and the two "3"s are well placed, the "6" is in a wrong location and there is no "7"
   186383           R/S                    "186383"      "186383 4-0"               the "1" "6" "3" "3" are in right position. There is no "8"
   196393           R/S                    "196393"      "196393//09"                the hidden number was 196393
 

Notes:

-The above strategy is not the best one !
-You have to wait  for 13 or 14 seconds ( approximately )
-The hidden number is computed after your first guess but independently - of course !
 

     b)  Program#2
 

-Instead of only comparing all the digits, the following version also calculates the number of digits in each number.
-"MMD" becomes faster and just a little longer.
-However, more data registers are used.
 
 

Data Registers:           •  R00 = pseudo-random numbers                                     ( R00 is to be initialized before executing "MMD" )

                                          R01 to R06 = the digits of the hidden number          R07 = number of your guesses       R08 = number of correct digits
                                          R09 to R17 = number of 1 , ..... , number of 9 in the hidden number
                                          R18 to R27 = ............................................... in your guess
Flag:  F29
Subroutines: /

-If you don't have an HP41CX, replace line 03 by

  SIGN      STO IND L
  CLX        ISG L
  LBL 05    GTO 05
 
 

 01 LBL "MMD"
 02 9.026
 03 CLRGX
 04 CLX
 05 6
 06 STO 07
 07 LBL 00
 08 SIGN
 09 RCL 00
 10 R-D
 11 FRC
 12 STO 00
 13 9
 14 *
 15 +
 16 INT
 17 STO IND 07
 18 8
 19 +
 20 ISG IND X  
 21 CLX
 22 DSE 07
 23 GTO 00
 24 X<>Y
 25 FIX 0
 26 CF 29
 27 LBL 01
 28 " "
 29 ARCL X
 30 0
 31 STO 08
 32 6
 33 RCL Z
 34 AVIEW
 35 ISG 07
 36 LBL 02
 37 ENTER
 38 INT
 39 10
 40 ST/ Z
 41 MOD
 42 RCL IND Z
 43 X=Y?
 44 DSE 08
 45 CLX
 46 CLX
 47 17
 48 +
 49 ISG IND X
 50 CLX
 51 RDN
 52 DSE Y
 53 GTO 02
 54 RCL 08
 55 ABS
 56 6
 57 X=Y?
 58 GTO 04
 59 >" "
 60 26.017
 61 ARCL Z
 62 17
 63 LBL 03
 64 ENTER
 65 CLX
 66 X<> IND Z
 67 RCL IND Y
 68 X<Y?
 69 X<>Y
 70 RDN
 71 ST+ 08
 72 SIGN
 73 -
 74 DSE Y
 75 GTO 03
 76 >"-"
 77 ARCL 08
 78 PROMPT
 79 GTO 01
 80 LBL 04
 81 >"//"
 82 9
 83 RCL 07
 84 X<=Y?
 85 >"0"
 86 ARCL 07      
 87 FIX 4
 88 AVIEW
 89 END

 
    ( 146 bytes / SIZE 028 )
 
 

      STACK        INPUT      OUTPUT
           X             Nj    Nb of guesses

 
Note:

-Same usage but the execution time becomes about 7 or 8 seconds instead of 14 seconds.
 

2°)  From 1 to 10 digits
 

     a)  Program#1
 

-With this program, your first guess determines the number of digits of the hidden number ( from 1 to 10 ).
 
 

Data Registers:           •  R00 = r = random seed                                             ( Registers R00 is to be initialized before executing "MMD" )

                                          R01 to Rnn = the n digits of the hidden number     R17 = number of guesses
                                          R18 to R17+n: temp
Flag:  F29
Subroutines: /
 
 
 

 01 LBL "MMD"
 02 ENTER
 03 LOG
 04 INT
 05 1
 06 +
 07 STO 11
 08 STO 16
 09 LBL 00
 10 SIGN
 11 RCL 00
 12 R-D
 13 FRC
 14 STO 00
 15 9
 16 *
 17 +
 18 INT
 19 STO IND 16
 20 DSE 16
 21 GTO 00
 22 X<>Y
 23 FIX 0
 24 CF 29
 25 LBL 01
 26 " "
 27 ARCL X
 28 0
 29 STO 12       
 30 16
 31 .1
 32 %
 33 +
 34 RCL 11
 35 STO 15
 36 +
 37 STO 13
 38 STO 14
 39 LASTX
 40 R^
 41 AVIEW
 42 ISG 16
 43 LBL 02
 44 ENTER
 45 INT
 46 10
 47 ST/ Z
 48 MOD
 49 STO IND 13
 50 RCL IND Z
 51 ABS
 52 STO IND T
 53 X=Y?
 54 DSE 12
 55 CLX
 56 R^
 57 DSE X
 58 R^
 59 DSE 13
 60 GTO 02
 61 RCL 12
 62 ABS
 63 RCL 11
 64 X=Y?
 65 GTO 05
 66 >" "
 67 ARCL Y
 68 LBL 03
 69 RCL 14
 70 STO 13
 71 LBL 04
 72 RCL IND 13
 73 RCL IND 15
 74 X#Y?
 75 GTO 04
 76 CHS
 77 ST+ IND 13
 78 STO IND 15
 79 ISG 12
 80 LBL 04
 81 DSE 13
 82 GTO 04
 83 DSE 15
 84 GTO 03
 85 >"-"
 86 ARCL 12     
 87 PROMPT
 88 GTO 01
 89 LBL 05
 90 >"//"
 91 9
 92 RCL 16
 93 X<=Y?
 94 >"0"
 95 ARCL 16
 96 FIX 4
 97 AVIEW
 98 END

 
    ( 153 bytes / SIZE 017+n )
 
 

      STACK        INPUT      OUTPUT
           X             Nj    Nb of guesses

 
Example:     1  STO 00  and suppose you want to play with 7-digit numbers
 

   1111111   XEQ "MMD"  >>>>      "1111111  1-0"
   1222222           R/S                        "1222222  0-1"
   3133333           R/S                        "3133333  3-0"
   3134444           R/S                        "3134444  1-3"
   4153355           R/S                        "4153355  3-1"
   4163636           R/S                        "4163636  2-3"
   4176373           R/S                        "4176373  5-0"
   4186383           R/S                        "4186383  5-0"
   4196393           R/S                        "4196393 / / 09"
 

Notes:

-Your first guess must be different from   999999999    if you play with 9-digit numbers
 and smaller than   9999999989  if you play with 10-digit numbers
-Otherwise, the number of digits would be miscalculated !

-With 10-digit numbers, execution time is about 30 seconds !
 

     b)  Program#2
 

-This variant employs the same method as the program listed in §1b)
 

Data Registers:           •  R00 = pseudo-random numbers                                     ( R00 is to be initialized before executing "MMD" )

                                          R01 to R10 = the digits of the hidden number          R11 = number of your guesses       R12 = number of correct digits

                                          R14 to R22 = number of 1 , ..... , number of 9 in the hidden number       R13 = number of digits of the hidden number
                                          R23 to R31 = ............................................... in your guess
Flag:  F29
Subroutines: /

-If you don't have an HP41CX, replace line 11 by

  SIGN      STO IND L
  CLX        ISG L
  LBL 05    GTO 05
 
 

 01 LBL "MMD"
 02 ENTER
 03 LOG
 04 INT
 05 1
 06 +
 07 STO 11
 08 STO 13
 09 CLX
 10 14.031
 11 CLRGX
 12 LBL 00
 13 SIGN
 14 RCL 00
 15 R-D
 16 FRC
 17 STO 00
 18 9
 19 *
 20 +
 21 INT
 22 STO IND 11
 23 13
 24 +
 25 ISG IND X
 26 CLX
 27 DSE 11
 28 GTO 00
 29 X<>Y
 30 FIX 0
 31 CF 29
 32 LBL 01
 33 " "
 34 ARCL X
 35 0
 36 STO 12
 37 RCL 13
 38 RCL Z
 39 AVIEW
 40 ISG 11
 41 LBL 02
 42 ENTER
 43 INT
 44 10
 45 ST/ Z
 46 MOD
 47 RCL IND Z 
 48 X=Y?
 49 DSE 12
 50 CLX
 51 CLX
 52 22
 53 +
 54 ISG IND X
 55 CLX
 56 RDN
 57 DSE Y
 58 GTO 02
 59 RCL 12
 60 ABS
 61 RCL 13
 62 X=Y?
 63 GTO 04
 64 >" "
 65 31.022
 66 ARCL Z
 67 22
 68 LBL 03
 69 ENTER
 70 CLX
 71 X<> IND Z
 72 RCL IND Y 
 73 X<Y?
 74 X<>Y
 75 RDN
 76 ST+ 12
 77 SIGN
 78 -
 79 DSE Y
 80 GTO 03
 81 >"-"
 82 ARCL 12
 83 PROMPT
 84 GTO 01
 85 LBL 04
 86 >"//"
 87 9
 88 RCL 11
 89 X<=Y?
 90 >"0"
 91 ARCL 11    
 92 FIX 4
 93 AVIEW
 94 END

 
    ( 153 bytes / SIZE 032 )
 
 

      STACK        INPUT      OUTPUT
           X             Nj   Nb of guesses

 
Notes:

-Same usage but with 10-digit numbers, the execution time becomes 10 seconds instead of 30 seconds !
-Of course, an M-code routine will be even faster:
 

     c)  M-Code Routine
 

Code   Mnemonic

0BF    "?"                             I've called this routine "MN?"
00E    "N"
00D    "M"
2A0    SETDEC                   the first executable word
0F8    READ  3(X)
046    C=0 S&X
10E    A=C ALL
0B8    READ 2(Y)
046    C=0 S&X
02E    B=0 ALL
35C   PT=12
362    ?A#C @PT
057    JC +0A
310    LD@PT- C
3DC   PT=PT+1
0BA   A<>C M
350    LD@PT- D
3DC   PT=PT+1
0BA   A<>C M
0FA   C<>B M
23A   C=C+1 M
0FA   C<>B M
3D4   PT=PT-1
2E2   ?C#0 @PT
39F   JC -0D
0EE   C<>B ALL
0BC   RCR 5
2DC   PT=13
2E2   ?C#0 @PT
01B   JNC +03
33C   RCR 1
226   C=C+1 S&X
0E8   WRIT 3(X)                   here, X-register = the number of well-placed digits
04E   C=0 ALL
0EE   C<>B ALL
130    LDI S&X
013    CON: 19
3D4   PT=PT-1
2E2   ?C#0 @PT
04F   JC +09
0EE   C<>B ALL
0BC   RCR 5
2FE   ?C#0? MS
01B   JNC +03
33C   RCR 1
226    C=C+1 S&X
0A8   WRIT 2(Y)                  here, Y-register = the number of digits in a wrong position
3E0    RTN                            the routine always stops here
362    ?A#C @PT
057    JC +0A
310    LD@PT- C
3DC   PT=PT+1
0BA   A<>C M
350    LD@PT- D
3DC   PT=PT+1
0BA   A<>C M
0EE    C<>B ALL
23A    C=C+1 M
0EE    C<>B ALL
0AE   A<>C ALL
2FC   RCR 13
0AE   A<>C ALL
266    C=C-1 S&X
327    JC -1C
383    JNC -10
 
 

      STACK        INPUTS      OUTPUTS
           Y             y             N
           X             x             M

  where

     M = number of well placed digits
     N  = number of digits in a wrong location

-Registers  L Z T and synthetic registers are unchanged

Example:

   1234567791  ENTER^
   2134567891  XEQ "MN?"  gives    7       3 4 5 6 7 9 1 ( the last "1" )  are well placed
                                             X<>Y   2       2 1  ( the 2 first digits ) are in a wrong location

Notes:

-This routine gives exact results if all the digits are different from 0
-But whatever the inputs - any real number , alpha data or even non-standard bit patterns - there is no risk of "crash"
-In this case, however, the outputs ( which are always integers between 0 and 10 ) may be wrong.
-The execution time is at most 0.25 second.
 

     d)  Program#3
 

-With the M-code routine above, "MMD" becomes much faster.
 

Data Registers:           •  R00 = pseudo-random numbers                     ( This register is to be initialized before executing "MMD" )

                                         R01 = hidden number
                                         R02 = number of guesses     R03 = number of digits

Flag:  F29
Subroutine:  "MN?"  the M-code routine listed in §2c)

-If you don't have a X-Functions module, replace lines 04 to 06 by       ENTER^   LOG   INT   1   +
 but in this case, your first guess must be different from   999999999    if you play with 9-digit numbers
 and smaller than   9999999989  if you play with 10-digit numbers
-Otherwise, the number of digits would be miscalculated !
 
 

01  LBL "MMD"
02  FIX 0
03  CF 29
04  CLA 
05  ARCL X 
06  ALENG
07  STO 02 
08  STO 03
09  CLX
10  LBL 00 
11  10
12  *
13  RCL 00       
14  R-D
15  FRC
16  STO 00
17  9 
18  *
19  INT
20  1
21  +
22  +
23  DSE 02
24  GTO 00 
25  STO 01       
26  X<>Y
27  LBL 01
28  CLA
29  ARCL X
30  ISG 02
31  CLX
32  RCL 01
33  MN? 
34  RCL 03 
35  X=Y?
36  GTO 02      
37  >": " 
38  ARCL Y
39  >"-" 
40  ARCL Z
41  PROMPT
42  GTO 01 
43  LBL 02
44  >"//" 
45  ARCL 02     
46  FIX 4
47  SF 29
48  AVIEW
49  END

 
    ( 82 bytes / SIZE 004 )
 
 

      STACK        INPUT      OUTPUT
           X             N             /

 
Example:     1  STO 00  and suppose you want to play with 7-digit numbers
 

   1111111   XEQ "MMD"  >>>>      "1111111:  1-0"               there is one "1"
   1222222           R/S                        "1222222:  0-1"               the "1" is in wrong position and there is no "2"
   3133333           R/S                        "3133333:  2-1"               2 digits are in right positions 1 digit is in a wrong position. There are two "3"s
   3413444           R/S                        "3413444:  2-2"               2 digits are in right positions 2 digits are in a wrong position there is one "4"
   3451355           R/S                        "3451355:  1-3"               1 digit  is  in right position   3 digits are in a wrong position there is no "5"
   3314666           R/S                        "3314666:  1-4"               1 digit  is  in right position    4 digits are in a wrong position there is one "6"
   4613377           R/S                        "4613377:  0-5"               4 6 1 3 3 are in a wrong location. There is no "7"
   3866431           R/S                        "3866431:  2-3"              2 digits are in a right position, 3 in a wrong position. There is no "8"
   3936149           R/S                        "3936149:  4-3"               4 digits are in a right position, 3 in a wrong position.  There are two "9"s
   3936914           R/S                        "3936914 / / 10"               you've found the hidden number in 10 guesses.
 

Notes:

-"MMD" displays  "M-N" after your guess to mean that M digits are in right positions and N digits are in wrong positions.
-The hidden number is computed after your first guess but - of course - independently, except for the number of its digits.
-After your first guess, all your guesses must have the same number of digits: these programs do not check !