##.mmind ⎕A[?4⍴6] ⍝ Mastermind or "cows and bulls".
Reima Naumanen provides this one-liner to play Mastermind (or "cows and bulls").
The rules of the game are:
- The machine chooses a 4-letter code at random from characters A B C D E F.
Letters in the code may be repeated, so examples might be: ABDF, FFAB, BBBB,··
- You try to guess the combination by suggesting a 4-letter code.
- The machine responds to your guess by reporting a "hint" of how many "cows"
and "bulls" you scored:
A bull (*) is a correct letter in its correct position.
A cow (+) is a correct letter in the wrong position.
Note that the order and position of the *s and +s in the hint has no signif-
icance; for example, **+ means that two of the letters (not necessarily the
first two) are in the correct position and that a further one is present but
in the wrong position.
For example, if the code is ABBA, then the following guesses would elicit
hints:
code: ABBA ABBA ABBA ABBA ABBA ABBA ABBA ABBA
guess: EACD CDEF BACD AAAD BAAB BABA AAAA ABBA
hint: + ++ *+ ++++ **++ ** ****
- Based on the hints, you try repeated guesses until you score 4 bulls (****)
and the game finishes.
- The aim of the game is to guess the hidden code in as few moves as possible.
For example, if the code were ADEA, a game might look like this:
ADEA (hidden code)
mmind ⎕A[?4⍴6]
FECF 1st guess
+ 0 bulls 1 cow
BABC 2nd guess
+ 1 cow
EBDB 3rd guess
++ 2 cows
DDFB 4th guess
* 1 bull
ADEA 5th guess
**** 4 bulls! (osuu oikein)
Note that while "official" Mastermind uses 4 letters chosen from 6, Reima's
version works with any number chosen from any number. Try: mmind ⎕a[5?9], etc.
Technical notes:
Remarkably, the game can be both programmed and invoked by entering just 77 key-
strokes (including the terminating _Return_) into a clear session!
{'*'∨.≠(⍴⍵)↑⎕←'*+'/⍨⍵{(⍺+.=⍵),⍺{+/⊃⌊/+/¨(⊂∪⍺)∘.=¨(⍺≠⍵)∘/¨⍺ ⍵}⍵}⍞:∇⍵}⎕A[?4⍴6]
If we eschew codes with repeated letters, this number drops to 55!
{'*'∨.≠(⍴⍵)↑⎕←'*+'/⍨⍵{(⍺+.=⍵),+/(⍺∊⍵)>⍺=⍵}⍞:∇⍵}⎕A[5?6]
Veli-Matti Jantunen suggests this version, which copes with wrong-length ans-
wers:
{⍵{⎕←(+/¨<\(⍵=⍺)(⍵∊⍺))/'*+' ⋄ ⍺≢⍵}(⍴⍵)↑⍞~' ':∇ ⍵}⎕A[?4⍴6]
Alternatively, as Reima says, you can make a human opponent sweat by using the
computer to help in guessing:
At first 1296 possible codes:
p←4{⎕IO←0⋄ ↓⎕a[⍉(⍺⍴⍵)⊤⍳⍵*⍺]}6
Say ABCC and hint is 1+1, then there are about 230 codes left:
{⍵⊃⍨?⍴⍵}p←p/⍨11=p{10⊥(⍺+.=⍵),⍺{+/⊃⌊/+/¨(⊂∪⍺)∘.=¨(⍺≠⍵)∘/¨⍺ ⍵}⍵}¨⊂'ABCC'
CBBF
Say CBBF and there'll be 46 left
{⍵⊃⍨?⍴⍵}p←p/⍨ 1=p{10⊥(⍺+.=⍵),⍺{+/⊃⌊/+/¨(⊂∪⍺)∘.=¨(⍺≠⍵)∘/¨⍺ ⍵}⍵}¨⊂'CBBF'
ACAA
Say ACAA and get 3+0 so
{⍵⊃⍨?⍴⍵}p←p/⍨30=p{10⊥(⍺+.=⍵),⍺{+/⊃⌊/+/¨(⊂∪⍺)∘.=¨(⍺≠⍵)∘/¨⍺ ⍵}⍵}¨⊂'ACAA'
There will be 4 codes left. A Lucky quess ends the game:
ACAE
References:
Mayer,A., "Cows and Bulls", Vector 10.1, July 1993.
http://www.vector.org.uk/archive/v101/mayer101_39.htm
Back to: contents
Back to: Workspaces