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
R09 = 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 09 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 09 15 DSE 09 16 GTO 00 17 X<>Y 18 FIX 0 |
19 CF 29 20 LBL 01 21 " " 22 ARCL X 23 16.01 24 STO 07 25 STO 08 26 0 27 STO 10 28 6 29 R^ 30 AVIEW 31 ISG 09 32 LBL 02 33 ENTER 34 INT 35 10 36 ST/ Z |
37 MOD 38 STO IND 07 39 RCL IND Z 40 ABS 41 STO IND T 42 X=Y? 43 DSE 10 44 CLX 45 R^ 46 DSE X 47 R^ 48 DSE 07 49 GTO 02 50 RCL 10 51 ABS 52 6 53 X=Y? 54 GTO 05 |
55 >" " 56 ARCL Y 57 SIGN 58 LBL 03 59 RCL 08 60 STO 07 61 LBL 04 62 RCL IND 07 63 RCL IND L 64 X#Y? 65 GTO 04 66 CHS 67 ST+ IND 07 68 STO IND L 69 ISG 10 70 LBL 04 71 DSE 07 |
72 GTO 04 73 DSE L 74 GTO 03 75 >"-" 76 ARCL 10 77 PROMPT 78 GTO 01 79 LBL 05 80 >"//" 81 9 82 RCL 09 83 X<=Y? 84 >"0" 85 ARCL 09 86 FIX 4 87 AVIEW 88 END |
( 142 bytes / SIZE 017 )
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 R26 = ............................................... 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 SIGN 21 ST+ IND L 22 DSE 07 23 GTO 00 24 X<>Y 25 FIX 0 26 CF 29 27 LBL 01 28 " " 29 ARCL X 30 SIGN 31 ST+ 07 32 CLX 33 STO 08 34 6 35 LASTX 36 AVIEW |
37 LBL 02 38 ENTER 39 INT 40 10 41 ST/ Z 42 MOD 43 RCL IND Z 44 X=Y? 45 DSE 08 46 CLX 47 CLX 48 17 49 + 50 SIGN 51 ST+ IND L 52 RDN 53 DSE Y 54 GTO 02 |
55 RCL 08 56 ABS 57 6 58 X=Y? 59 GTO 04 60 >" " 61 26.017 62 ARCL Z 63 17 64 LBL 03 65 ENTER 66 CLX 67 X<> IND Z 68 RCL IND Y 69 X<Y? 70 X<>Y 71 RDN 72 ST+ 08 |
73 SIGN 74 - 75 DSE Y 76 GTO 03 77 >"-" 78 ARCL 08 79 PROMPT 80 GTO 01 81 LBL 04 82 >"//" 83 9 84 RCL 07 85 X<=Y? 86 >"0" 87 ARCL 07 88 FIX 4 89 AVIEW 90 END |
( 146 bytes / SIZE 027 )
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
R15 = number of guesses
R16 to R15+n: temp
Flag: F29
Subroutines: /
01 LBL "MMD" 02 ENTER 03 LOG 04 INT 05 1 06 + 07 STO 11 08 STO 15 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 15 20 DSE 15 |
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 15 31 .1 32 % 33 + 34 RCL 11 35 + 36 STO 13 37 STO 14 38 LASTX 39 R^ 40 AVIEW |
41 ISG 15 42 LBL 02 43 ENTER 44 INT 45 10 46 ST/ Z 47 MOD 48 STO IND 13 49 RCL IND Z 50 ABS 51 STO IND T 52 X=Y? 53 DSE 12 54 CLX 55 R^ 56 DSE X 57 R^ 58 DSE 13 59 GTO 02 60 RCL 12 |
61 ABS 62 RCL 11 63 X=Y? 64 GTO 05 65 >" " 66 ARCL Y 67 SIGN 68 LBL 03 69 RCL 14 70 STO 13 71 LBL 04 72 RCL IND 13 73 RCL IND L 74 X#Y? 75 GTO 04 76 CHS 77 ST+ IND 13 78 STO IND L 79 ISG 12 |
80 LBL 04 81 DSE 13 82 GTO 04 83 DSE L 84 GTO 03 85 >"-" 86 ARCL 12 87 PROMPT 88 GTO 01 89 LBL 05 90 >"//" 91 9 92 RCL 15 93 X<=Y? 94 >"0" 95 ARCL 15 96 FIX 4 97 AVIEW 98 END |
( 151 bytes / SIZE 016+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 SIGN 26 ST+ IND L 27 DSE 11 28 GTO 00 29 X<>Y 30 FIX 0 31 CF 29 32 LBL 01 33 " " 34 ARCL X 35 SIGN 36 ST+ 11 37 CLX 38 STO 12 |
39 RCL 13 40 LASTX 41 AVIEW 42 LBL 02 43 ENTER 44 INT 45 10 46 ST/ Z 47 MOD 48 RCL IND Z 49 X=Y? 50 DSE 12 51 CLX 52 CLX 53 22 54 + 55 SIGN 56 ST+ IND L 57 RDN |
58 DSE Y 59 GTO 02 60 RCL 12 61 ABS 62 RCL 13 63 X=Y? 64 GTO 04 65 >" " 66 31.022 67 ARCL Z 68 22 69 LBL 03 70 ENTER 71 CLX 72 X<> IND Z 73 RCL IND Y 74 X<Y? 75 X<>Y 76 RDN |
77 ST+ 12 78 SIGN 79 - 80 DSE Y 81 GTO 03 82 >"-" 83 ARCL 12 84 PROMPT 85 GTO 01 86 LBL 04 87 >"//" 88 9 89 RCL 11 90 X<=Y? 91 >"0" 92 ARCL 11 93 FIX 4 94 AVIEW 95 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 !