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 XY  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 XY  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
046    C=0 S&X
10E    A=C ALL
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 !