Bulls and cows: Difference between revisions

m (syntax highlighting fixup automation)
 
(27 intermediate revisions by 17 users not shown)
Line 1:
{{task|Games}}
[[Category:Puzzles]]
[[Category:Games]]
{{task|Games}}
 
[[wp:Bulls and Cows|Bulls and Cows]]   is an old game played with pencil and paper that was later implemented using computers.
Line 27:
*   [[Mastermind]]
<br><br>
 
=={{header|8080 Assembly}}==
 
This is written to run under CP/M and includes an RNG to generate the secret.
 
<syntaxhighlight lang="8080asm">bdos equ 5
putchar equ 2
rawio equ 6
Line 238 ⟶ 237:
bufdef: db 4,0 ; User input buffer
buf: ds 4</syntaxhighlight>
=={{header|ABC}}==
<syntaxhighlight lang="ABC">HOW TO RETURN random.digit:
RETURN choice "123456789"
 
HOW TO MAKE SECRET secret:
PUT "" IN secret
FOR i IN {1..4}:
PUT random.digit IN digit
WHILE SOME j IN {1..i-1} HAS secret item j = digit:
PUT random.digit IN digit
PUT secret^digit IN secret
 
HOW TO RETURN guess count.bulls secret:
PUT 0 IN bulls
FOR i IN {1..4}:
IF secret item i = guess item i: PUT bulls+1 IN bulls
RETURN bulls
 
HOW TO RETURN guess count.cows secret:
PUT -(guess count.bulls secret) IN cows
FOR c IN guess:
IF c in secret: PUT cows+1 IN cows
RETURN cows
 
HOW TO REPORT has.duplicates guess:
FOR i IN {1..3}:
FOR j IN {i+1..4}:
IF guess item i = guess item j: SUCCEED
FAIL
 
HOW TO REPORT is.valid guess:
IF SOME digit IN guess HAS digit not.in "123456789":
WRITE "Invalid digit: ", digit/
FAIL
IF #guess <> 4:
WRITE "Guess must contain 4 digits."/
FAIL
IF has.duplicates guess:
WRITE "No duplicates allowed"/
FAIL
SUCCEED
 
HOW TO READ GUESS guess:
WHILE 1=1:
WRITE "Guess? "
READ guess RAW
IF is.valid guess: QUIT
 
HOW TO PLAY BULLS AND COWS:
PUT 0, 0, 0 IN tries, bulls, cows
MAKE SECRET secret
WRITE "Bulls and cows"/
WRITE "--------------"/
WRITE /
WHILE bulls<>4:
READ GUESS guess
PUT guess count.bulls secret IN bulls
PUT guess count.cows secret IN cows
WRITE "Bulls:",bulls,"- Cows:",cows/
PUT tries+1 IN tries
WRITE "You win! Tries:", tries
 
PLAY BULLS AND COWS</syntaxhighlight>
{{out}}
<pre>Bulls and cows
--------------
 
Guess? 1234
Bulls: 0 - Cows: 1
Guess? 5678
Bulls: 0 - Cows: 2
Guess? 1679
Bulls: 0 - Cows: 2
Guess? 1689
Bulls: 0 - Cows: 2
Guess? 1659
Bulls: 1 - Cows: 2
Guess? 2659
Bulls: 1 - Cows: 2
Guess? 3659
Bulls: 1 - Cows: 3
Guess? 9356
Bulls: 4 - Cows: 0
You win! Tries: 8</pre>
 
=={{header|Action!}}==
<syntaxhighlight lang=Action"action!">DEFINE DIGNUM="4"
 
TYPE Score=[BYTE bulls,cows,err]
Line 338 ⟶ 421:
 
=={{header|Ada}}==
<syntaxhighlight lang=Ada"ada">with Ada.Text_IO; use Ada.Text_IO;
with Ada.Numerics.Discrete_Random;
 
Line 391 ⟶ 474:
end loop;
end Bulls_And_Cows;</syntaxhighlight>
 
=={{header|ALGOL 68}}==
{{trans|Python}}
Line 400 ⟶ 482:
 
{{works with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release [http://sourceforge.net/projects/algol68/files/algol68toc/algol68toc-1.8.8d/algol68toc-1.8-8d.fc9.i386.rpm/download 1.8-8d]}}
<syntaxhighlight lang="algol68">STRING digits = "123456789";
 
[4]CHAR chosen;
Line 462 ⟶ 544:
Next guess [1]:
</pre>
 
=={{header|APL}}==
{{works with|Dyalog APL}}
Line 469 ⟶ 550:
Bulls and Cows in the APL session.
 
<syntaxhighlight lang=APL"apl">input ← {⍞←'Guess: ' ⋄ 7↓⍞}
output ← {⎕←(↑'Bulls: ' 'Cows: '),⍕⍪⍵ ⋄ ⍵}
isdigits← ∧/⎕D∊⍨⊢
Line 486 ⟶ 567:
referred to twice. The following definition of <code>moo</code> is exactly equivalent to the above:
 
<syntaxhighlight lang=APL"apl">moo←'You win!'⊣((4∘⊣?9∘⊣)(({⎕←(↑'Bulls: ' 'Cows: '),⍕⍪⍵⋄⍵}⊣((+/=),(+/∊∧≠))(⍎¨{⍞←'Guess: '⋄7↓⍞}⍣(((∧/⎕D∊⍨⊢)∧4=≢)⊣)))⍣(4 0≡⊣))⊢)</syntaxhighlight>
 
 
=={{header|AppleScript}}==
 
GUI implementation; the prompt for a guess includes a list of all past guesses and their scores.
 
<syntaxhighlight lang="applescript">on pickNumber()
set theNumber to ""
repeat 4 times
Line 551 ⟶ 630:
end repeat
end run</syntaxhighlight>
 
=={{header|Arturo}}==
 
<syntaxhighlight lang="rebol">rand: first.n: 4 unique map 1..10 => [sample 0..9]
bulls: 0
 
Line 575 ⟶ 653:
]
print color #green "** Well done! You made the right guess!!"</syntaxhighlight>
 
=={{header|AutoHotkey}}==
<syntaxhighlight lang="autohotkey">length:=4, Code:="" ; settings
 
While StrLen(Code) < length {
Line 629 ⟶ 706:
Return Bulls "," Cows
}</syntaxhighlight>
 
=={{header|AWK}}==
<syntaxhighlight lang=AWK"awk"># Usage: GAWK -f BULLS_AND_COWS.AWK
BEGIN {
srand()
Line 706 ⟶ 782:
Congratulations, you win!
</pre>
 
=={{header|BASIC}}==
{{works with|QBasic}}
<syntaxhighlight lang="qbasic">DEFINT A-Z
 
DIM secret AS STRING
Line 752 ⟶ 827:
 
==={{header|Applesoft BASIC}}===
<syntaxhighlight lang=ApplesoftBasic"applesoftbasic">100 D$ = "123456789"
110 FOR I = 1 TO 4
120 P = INT(RND(1) * LEN(D$)) + 1
Line 789 ⟶ 864:
* Other formatting (clear screen, etc.) unique to Commodore BASIC.
 
<syntaxhighlight lang=FreeBasic"freebasic">100 D$="123456789"
110 FOR I=1 TO 4
120 P=INT(RND(1)*LEN(D$))+1
Line 830 ⟶ 905:
 
==={{header|IS-BASIC}}===
<syntaxhighlight lang=IS"is-BASICbasic">100 PROGRAM "Bulls.bas"
110 RANDOMIZE
120 STRING C$*4
Line 864 ⟶ 939:
==={{header|ZX Spectrum Basic}}===
{{trans|QBasic}}
<syntaxhighlight lang="zxbasic">10 DIM n(10): LET c$=""
20 FOR i=1 TO 4
30 LET d=INT (RND*9+1)
Line 884 ⟶ 959:
190 GO TO 90
</syntaxhighlight>
 
=={{header|Batch File}}==
<syntaxhighlight lang="dos">:: Bulls and Cows Task from Rosetta Code
:: Batch File Implementation
Line 1,031 ⟶ 1,105:
 
Play again? </pre>
 
=={{header|BBC BASIC}}==
<syntaxhighlight lang="bbcbasic"> secret$ = ""
REPEAT
c$ = CHR$(&30 + RND(9))
Line 1,066 ⟶ 1,139:
UNTIL FALSE
</syntaxhighlight>
 
=={{header|BCPL}}==
<syntaxhighlight lang="bcpl">get "libhdr"
 
static $( randstate = ? $)
Line 1,163 ⟶ 1,235:
You win in 9 tries.</pre>
=={{header|Brat}}==
<syntaxhighlight lang="brat">secret_length = 4
 
secret = [1 2 3 4 5 6 7 8 9].shuffle.pop secret_length
Line 1,202 ⟶ 1,274:
}
}</syntaxhighlight>
 
=={{header|C}}==
{{libheader|ncurses}}
<syntaxhighlight lang="c">#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
Line 1,268 ⟶ 1,339:
The following function contains the code to check how many bulls and cows there are.
 
<syntaxhighlight lang="c">bool take_it_or_not()
{
int i;
Line 1,353 ⟶ 1,424:
return EXIT_SUCCESS;
}</syntaxhighlight>
 
=={{header|C sharp|C#}}==
<syntaxhighlight lang="csharp">using System;
 
namespace BullsnCows
Line 1,435 ⟶ 1,505:
}
</syntaxhighlight>
 
=={{header|C++}}==
<syntaxhighlight lang="cpp">#include <iostream>
#include <string>
#include <algorithm>
Line 1,515 ⟶ 1,584:
}
}</syntaxhighlight>
 
=={{header|Ceylon}}==
<syntaxhighlight lang="ceylon">import ceylon.random {
DefaultRandom
}
Line 1,587 ⟶ 1,655:
}
}</syntaxhighlight>
 
=={{header|Clojure}}==
<syntaxhighlight lang="clojure">
(ns bulls-and-cows)
Line 1,629 ⟶ 1,696:
(bulls-and-cows)
</syntaxhighlight>
 
=={{header|CLU}}==
<syntaxhighlight lang="clu">% This program needs to be merged with PCLU's "misc" library
% to use the random number generator.
%
Line 1,778 ⟶ 1,844:
Bulls: 4, cows: 0
Congratulations! You won in 5 tries.</pre>
 
=={{header|Coco}}==
 
Line 1,785 ⟶ 1,850:
To handle I/O, we use functions named <code>say</code> (which simply outputs a string) and <code>prompt</code> (which takes a prompt string to display to the user and returns a line of input, without a trailing newline). These require platform-specific implementations. Here's how they can be implemented for the SpiderMonkey shell:
 
<syntaxhighlight lang="coco">say = print
prompt = (str) ->
putstr str
Line 1,792 ⟶ 1,857:
We can now solve the task using <code>say</code> and <code>prompt</code>:
 
<syntaxhighlight lang="coco">const SIZE = 4
 
secret = _.sample ['1' to '9'], SIZE
Line 1,814 ⟶ 1,879:
 
say 'A winner is you!'</syntaxhighlight>
 
=={{header|Common Lisp}}==
<syntaxhighlight lang="lisp">(defun get-number ()
(do ((digits '()))
((>= (length digits) 4) digits)
Line 1,858 ⟶ 1,922:
(format stream "~&Score: ~a cows, ~a bulls."
cows bulls)))))))</syntaxhighlight>
 
=={{header|Crystal}}==
{{trans|Ruby}}
<syntaxhighlight lang=Ruby"ruby">size = 4
secret = ('1'..'9').to_a.sample(size)
guess = [] of Char
Line 1,896 ⟶ 1,959:
puts "Bulls: #{bulls}; Cows: #{cows}"
end</syntaxhighlight>
 
=={{header|D}}==
<syntaxhighlight lang="d">void main() {
import std.stdio, std.random, std.string, std.algorithm,
std.range, std.ascii;
Line 1,938 ⟶ 2,000:
=={{header|Delphi}}==
See [[#Pascal]].
=={{header|Draco}}==
<syntaxhighlight lang="draco">union {
ulong state;
struct {
byte x;
byte a;
byte b;
byte c;
} fields;
} rng;
 
proc rand() byte:
rng.fields.x := rng.fields.x + 1;
rng.fields.a := rng.fields.a >< rng.fields.c >< rng.fields.x;
rng.fields.b := rng.fields.b + rng.fields.a;
rng.fields.c := rng.fields.c + (rng.fields.b >> 1) >< rng.fields.a;
rng.fields.c
corp
 
proc rand_digit() byte:
byte digit;
while
digit := rand() & 15;
digit < 1 or digit >= 10
do od;
digit
corp
 
proc make_secret([4]byte secret) void:
int i, j;
bool ok;
for i from 0 upto 3 do
while
secret[i] := rand_digit();
ok := true;
for j from 0 upto i-1 do
ok := ok and secret[i] /= secret[j]
od;
not ok
do od
od
corp
 
proc bulls([4]byte secret, guess) byte:
byte i, count;
count := 0;
for i from 0 upto 3 do
if secret[i] = guess[i] then count := count + 1 fi
od;
count
corp
 
proc cows([4]byte secret, guess) byte:
byte i, j, count;
count := 0;
for i from 0 upto 3 do
for j from 0 upto 3 do
if i /= j and secret[i] = guess[j] then count := count + 1 fi
od
od;
count
corp
 
proc read_guess([4]byte guess) void:
word guessNo;
byte i;
 
while
write("Guess? ");
readln(guessNo);
if guessNo<1111 or guessNo>9999 then true
else
for i from 3 downto 0 do
guess[i] := guessNo % 10;
guessNo := guessNo / 10;
od;
guess[0]*guess[1]*guess[2]*guess[3] = 0
fi
do
writeln("A guess must be a four-digit number not containing zeroes.")
od
corp
 
proc play_game([4]byte secret) word:
[4]byte guess;
word tries;
tries := 1;
while
read_guess(guess);
writeln("Bulls: ", bulls(secret, guess), ", cows: ", cows(secret, guess));
bulls(secret, guess) /= 4
do
tries := tries + 1
od;
tries
corp
 
proc main() void:
[4]byte secret;
word tries;
 
write("Please enter a random seed: ");
readln(rng.state);
make_secret(secret);
tries := play_game(secret);
writeln();
writeln("You got it in ", tries, " tries.")
corp</syntaxhighlight>
{{out}}
<pre>Please enter a random seed: 123456
Guess? 1234
Bulls: 2, cows: 1
Guess? 5678
Bulls: 0, cows: 0
Guess? 9234
Bulls: 1, cows: 2
Guess? 1934
Bulls: 3, cows: 0
Guess? 1294
Bulls: 2, cows: 2
Guess? 1924
Bulls: 4, cows: 0
 
You got it in 6 tries.</pre>
 
=={{header|E}}==
 
Note: This example was deliberately written in an abstracted style, separating out the algorithms, game logic, and UI.
 
<syntaxhighlight lang="e">def Digit := 1..9
def Number := Tuple[Digit,Digit,Digit,Digit]
 
Line 2,045 ⟶ 2,233:
{{works with|E-on-Java}} (Java Swing)
 
<syntaxhighlight lang="e">def guiBullsAndCows() {
var lastGuess := ""
def op := <unsafe:javax.swing.makeJOptionPane>
Line 2,062 ⟶ 2,250:
 
=={{header|EasyLang}}==
<syntaxhighlight lang=text>dig[] = [ 1 2 3 4 5 6 7 8 9 ]
dig[] = [ 1 2 3 4 5 6 7 8 9 ]
for i range 4
for hi = i1 +to random (9 - i)4
h = i - 1 + randint (10 - i)
swap dig[i] dig[h]
swap dig[i] dig[h]
.
# print dig[]
Line 2,071 ⟶ 2,260:
attempts = 0
repeat
repeat
ok = 0
s$[] = strchars input
if len s$[] = 4
ok = 1
for i range= 1 to 4
g[i] = number s$[i]
if g[i] = 0
ok = 0
.
.
.
. until ok = 1
.
until ok = 1
print g[]
.
attempts += 1
print g[]
attempts +bulls = 10
bulls cows = 0
cows for i = 01 to 4
for if g[i] range= 4dig[i]
if g[i] bulls += dig[i]1
bulls += 1else
for j = 1 to 4
else
for if dig[j] range= 4g[i]
if dig[j] cows += g[i]1
cows += 1.
.
.
.
print "bulls:" & bulls & " cows:" & cows
.
print "bulls:" &until bulls & " cows:" &= cows4
until bulls = 4
.
print "Well done! " & attempts & " attempts needed."</syntaxhighlight>
 
=={{header|Eiffel}}==
<syntaxhighlight lang=Eiffel"eiffel">
class
BULLS_AND_COWS
Line 2,246 ⟶ 2,435:
Congratulations! You won with 6 guesses.
</pre>
 
=={{header|Elena}}==
ELENA 56.0x :
<syntaxhighlight lang="elena">import system'routines;
import extensions;
 
class GameMaster
{
field _numbers;
object theNumbers;
field _attempt;
object theAttempt;
 
constructor()
{
// generate secret number
var randomNumbers := new int[]{1,2,3,4,5,6,7,8,9}.randomize(9);
 
theNumbers_numbers := randomNumbers.Subarray(0, 4);
theAttempt_attempt := new Integer(1);
}
 
ask()
{
var row := console.print("Your Guess #",theAttempt_attempt," ?").readLine();
^ row.toArray()
}
 
proceed(guess)
{
int cows := 0;
int bulls := 0;
 
if (guess.Length != 4)
{
bulls := -1
}
else
{
try
{
for (int i := 0,; i < 4,; i+=1) {
var ch := guess[i];
var number := ch.toString().toInt();
// check range
ifnot (number > 0 && number < 10)
{ InvalidArgumentException.raise() };
// check duplicates
var duplicate := guess.seekEach::(x => (x == ch)&&(x.equalReference(ch).Inverted));
if (nil != duplicate)
{
InvalidArgumentException.raise()
};
if (number == theNumbers_numbers[i])
{
bulls += 1
}
else
{
if (theNumbers_numbers.ifExists(number))
{ cows += 1 }
}
}
}
catch(Exception e)}
catch(Exception {e)
bulls := -1{
}bulls := -1
};
};
 
bulls =>
-1 { console.printLine:("Not a valid guess."); ^ true }
4 { console.printLine:("Congratulations! You have won!"); ^ false }
:! {
theAttempt_attempt.append(1);
console.printLine("Your Score is ",bulls," bulls and ",cows," cows");
^ true
}
}
}
 
public program()
{
var gameMaster := new GameMaster();
 
var process := $lazy gameMaster.proceed(gameMaster.ask());
 
(lazy:gameMaster.proceed(gameMaster.ask()))process.doWhile();
console.readChar()
}</syntaxhighlight>
{{out}}
Line 2,357 ⟶ 2,547:
=={{header|Elixir}}==
{{works with|Elixir|1.2}}
<syntaxhighlight lang="elixir">defmodule Bulls_and_cows do
def play(size \\ 4) do
secret = Enum.take_random(1..9, size) |> Enum.map(&to_string/1)
Line 2,413 ⟶ 2,603:
You win!
</pre>
 
=={{header|Erlang}}==
Module:
<syntaxhighlight lang="erlang">-module(bulls_and_cows).
-export([generate_secret/0, score_guess/2, play/0]).
 
Line 2,463 ⟶ 2,652:
 
Script:
<syntaxhighlight lang="erlang">#!/usr/bin/escript
% Play Bulls and Cows
main(_) -> random:seed(now()), bulls_and_cows:play().</syntaxhighlight>
Line 2,478 ⟶ 2,667:
Correct!
</pre>
 
=={{header|Euphoria}}==
{{works with|Euphoria|4.0.3, 4.0.0 RC1 and later}}
<syntaxhighlight lang="euphoria">include std\text.e
include std\os.e
include std\sequence.e
Line 2,609 ⟶ 2,797:
Press Any Key to continue...
</pre>
=={{header|F Sharp|F#}}==
<syntaxhighlight lang="fsharp">
open System
 
let generate_number targetSize =
let rnd = Random()
let initial = Seq.initInfinite (fun _ -> rnd.Next(1,9))
initial |> Seq.distinct |> Seq.take(targetSize) |> Seq.toList
 
let countBulls guess target =
let hits = List.map2 (fun g t -> if g = t then true else false) guess target
List.filter (fun x -> x = true) hits |> List.length
 
let countCows guess target =
let mutable score = 0
for g in guess do
for t in target do
if g = t then
score <- score + 1
else
score <- score
score
 
let countScore guess target =
let bulls = countBulls guess target
let cows = countCows guess target
(bulls, cows)
 
let playRound guess target =
countScore guess target
 
let inline ctoi c : int =
int c - int '0'
 
let lineToList (line: string) =
let listc = Seq.map(fun c -> c |> string) line |> Seq.toList
let conv = List.map(fun x -> Int32.Parse x) listc
conv
 
let readLine() =
let line = Console.ReadLine()
if line <> null then
if line.Length = 4 then
Ok (lineToList line)
else
Error("Input guess must be 4 characters!")
else
Error("Input guess cannot be empty!")
 
let rec handleInput() =
let line = readLine()
match line with
| Ok x -> x
| Error s ->
printfn "%A" s
handleInput()
 
[<EntryPoint>]
let main argv =
let target = generate_number 4
let mutable shouldEnd = false
while shouldEnd = false do
let guess = handleInput()
let (b, c) = playRound guess target
printfn "Bulls: %i | Cows: %i" b c
if b = 4 then
shouldEnd <- true
else
shouldEnd <- false
0
</syntaxhighlight>
 
=={{Header|FreeBASIC}}==
<syntaxhighlight lang="text">function get_digit( num as uinteger, ps as uinteger ) as uinteger
return (num mod 10^(ps+1))\10^ps
end function
 
function is_malformed( num as uinteger ) as boolean
if num > 9876 then return true
dim as uinteger i, j
for i = 0 to 2
for j = i+1 to 3
if get_digit( num, j ) = get_digit( num, i ) then return true
next j
next i
return false
end function
 
function make_number() as uinteger
dim as uinteger num = 0
while is_malformed(num)
num = int(rnd*9877)
wend
return num
end function
 
randomize timer
 
dim as uinteger count=0, num=make_number(), guess=0
dim as uinteger cows, bulls, i, j
 
while guess <> num
count += 1
do
print "Guess a number. "
input guess
loop while is_malformed(guess)
cows = 0
bulls = 0
for i = 0 to 3
for j = 0 to 3
if get_digit( num, i ) = get_digit( guess, j ) then
if i= j then bulls += 1
if i<>j then cows += 1
end if
next j
next i
print using "You scored # bulls and # cows."; bulls; cows
wend
 
print using "Correct. That took you ### guesses."; count</syntaxhighlight>
=={{header|Factor}}==
<syntaxhighlight lang=Factor"factor">USING: accessors assocs combinators fry grouping hashtables kernel
locals math math.parser math.ranges random sequences strings
io ascii ;
Line 2,675 ⟶ 2,985:
 
: main ( -- ) new-number drop narr>nhash main-loop ;</syntaxhighlight>
 
=={{header|Fan}}==
<syntaxhighlight lang=Fan"fan">**
** Bulls and cows. A game pre-dating, and similar to, Mastermind.
**
Line 2,727 ⟶ 3,036:
}
}</syntaxhighlight>
 
=={{header|FOCAL}}==
<syntaxhighlight lang=FOCAL"focal">01.10 T %1,"BULLS AND COWS"!"----- --- ----"!!
01.20 S T=0;D 3
01.30 D 2;D 5;S T=T+1;T "BULLS",B," COWS",C,!!
Line 2,794 ⟶ 3,102:
 
YOU WON! GUESSES= 8</pre>
 
=={{header|Forth}}==
{{works with|GNU Forth}}
<syntaxhighlight lang="forth">include random.fs
 
create hidden 4 allot
Line 2,841 ⟶ 3,148:
guess: 1879 4 bulls, 0 cows
You guessed it! ok</pre>
 
=={{header|Fortran}}==
{{works with|Fortran|90 and later}}
<syntaxhighlight lang="fortran">module bac
implicit none
 
Line 2,928 ⟶ 3,234:
 
end program Bulls_and_Cows</syntaxhighlight>
 
=={{header|F Sharp|F#}}==
<syntaxhighlight lang=fsharp>
open System
 
let generate_number targetSize =
let rnd = Random()
let initial = Seq.initInfinite (fun _ -> rnd.Next(1,9))
initial |> Seq.distinct |> Seq.take(targetSize) |> Seq.toList
 
let countBulls guess target =
let hits = List.map2 (fun g t -> if g = t then true else false) guess target
List.filter (fun x -> x = true) hits |> List.length
 
let countCows guess target =
let mutable score = 0
for g in guess do
for t in target do
if g = t then
score <- score + 1
else
score <- score
score
 
let countScore guess target =
let bulls = countBulls guess target
let cows = countCows guess target
(bulls, cows)
 
let playRound guess target =
countScore guess target
 
let inline ctoi c : int =
int c - int '0'
 
let lineToList (line: string) =
let listc = Seq.map(fun c -> c |> string) line |> Seq.toList
let conv = List.map(fun x -> Int32.Parse x) listc
conv
 
let readLine() =
let line = Console.ReadLine()
if line <> null then
if line.Length = 4 then
Ok (lineToList line)
else
Error("Input guess must be 4 characters!")
else
Error("Input guess cannot be empty!")
 
let rec handleInput() =
let line = readLine()
match line with
| Ok x -> x
| Error s ->
printfn "%A" s
handleInput()
 
[<EntryPoint>]
let main argv =
let target = generate_number 4
let mutable shouldEnd = false
while shouldEnd = false do
let guess = handleInput()
let (b, c) = playRound guess target
printfn "Bulls: %i | Cows: %i" b c
if b = 4 then
shouldEnd <- true
else
shouldEnd <- false
0
</syntaxhighlight>
 
=={{Header|FreeBASIC}}==
<syntaxhighlight lang=text>function get_digit( num as uinteger, ps as uinteger ) as uinteger
return (num mod 10^(ps+1))\10^ps
end function
 
function is_malformed( num as uinteger ) as boolean
if num > 9876 then return true
dim as uinteger i, j
for i = 0 to 2
for j = i+1 to 3
if get_digit( num, j ) = get_digit( num, i ) then return true
next j
next i
return false
end function
 
function make_number() as uinteger
dim as uinteger num = 0
while is_malformed(num)
num = int(rnd*9877)
wend
return num
end function
 
randomize timer
 
dim as uinteger count=0, num=make_number(), guess=0
dim as uinteger cows, bulls, i, j
 
while guess <> num
count += 1
do
print "Guess a number. "
input guess
loop while is_malformed(guess)
cows = 0
bulls = 0
for i = 0 to 3
for j = 0 to 3
if get_digit( num, i ) = get_digit( guess, j ) then
if i= j then bulls += 1
if i<>j then cows += 1
end if
next j
next i
print using "You scored # bulls and # cows."; bulls; cows
wend
 
print using "Correct. That took you ### guesses."; count</syntaxhighlight>
 
=={{header|Frink}}==
<syntaxhighlight lang="frink">
// Bulls and Cows - Written in Frink
println["Welcome to Bulls and Cows!"]
Line 3,152 ⟶ 3,333:
Congratulations! Your guess of 6431 was correct! You solved this in 9 guesses.
</pre>
 
=={{header|FutureBasic}}==
<syntaxhighlight lang="futurebasic">
 
include "NSLog.incl"
str15 guess, goal
short x, y
cgRect wndrect
 
begin enum 1
_window
_bullLabel
_cowLabel
_horzLine
_vertLine
_newGameBtn
_alert = 101
end enum
 
void local fn showStr( string as str15 )
short r
x = 20
for r = 1 to string[0]
print %(x,y)chr$( string[r] );
x += 39
next
end fn
 
void local fn NewGame
str15 ch
goal = "" : guess = "" :y = 20
window _window,,wndRect
text ,,fn colorRed
cls
fn showStr( "????" )
do
ch = chr$(rnd(9) or _"0")
if instr$(0, goal, ch) == 0 then goal += ch
until goal[0] == 4
nslog(@"%u",val&(goal)) //unrem for testing
y += 48
end fn
 
local fn SetWindowFrame
CGRect r = fn WindowContentRect( _window )
r.size.height += 32
r.origin.y -= 32
window _window,,r
if ( r.origin.y < 150 )
alert _alert,, @"Too many guesses!",, @"Give up", YES
fn newGame
end if
end fn
 
local fn play( ch as str15 )
short r, bulls = 0, cows = 0
if instr$(0, guess, ch) then exit fn
guess += ch
text,,fn colorDarkGray
fn showStr( guess )
if guess[0] < 4 then exit fn
for r = 1 to 4
if goal[r] == guess[r] then bulls++ : continue
if instr$(0, goal, chr$(guess[r]) ) then cows++
next
select
case bulls == 4
text ,,fn colorRed
print %(x + 31, y)("W I N!")
y = 20 : fn showStr( goal )
case else : print %(x + 35, y)bulls;" "; cows
y += 32 : guess = ""
end select
fn SetWindowFrame
end fn
 
 
void local fn BuildWindow
subclass window _window, @"Bulls and cows", (0,0,311,114), NSWindowStyleMaskTitled + NSWindowStyleMaskClosable
wndrect = = fn WindowContentRect( _window )
textlabel _bullLabel, @"🐂", (198,59,38,40)
textlabel _cowLabel, @"🐄", (255,59,38,40)
ControlSetFontWithName( _bullLabel, NULL, 30 )
ControlSetFontWithName( _cowLabel, NULL, 30 )
box _horzLine,, (12,50,287,5), NSBoxSeparator
box _vertLine,, (180,12,5,90), NSBoxSeparator
ViewSetAutoresizingMask( _vertLine, NSViewHeightSizable )
button _newGameBtn,,, @"New Game", (198,13,100,32)
ViewSetAutoresizingMask( _newGameBtn, NSViewMaxYMargin )
text @"menlo bold",24,,fn ColorWindowBackground
end fn
 
void local fn DoDialog( evt as long, tag as long )
select ( evt )
case _windowKeyDown //: stop
short ch = intval( fn EventCharacters )
if ch then fn play( chr$( ch or _"0" ) ):DialogEventSetBool(YES)
case _btnClick : fn NewGame
case _windowWillClose : end
end select
end fn
 
on dialog fn DoDialog
fn buildWindow
fn newGame
 
HandleEvents
</syntaxhighlight>
{{out}}
[[File:Bulls and Cows in FutureBasic.png]]
 
=={{header|Go}}==
<syntaxhighlight lang="go">package main
 
import (
Line 3,222 ⟶ 3,517:
}
}</syntaxhighlight>
 
=={{header|Golo}}==
<syntaxhighlight lang="golo">#!/usr/bin/env golosh
----
This module is the Bulls and Cows game.
Line 3,324 ⟶ 3,618:
}
</syntaxhighlight>
 
=={{header|Groovy}}==
<syntaxhighlight lang=Groovy"groovy">class BullsAndCows {
static void main(args) {
def inputReader = System.in.newReader()
Line 3,373 ⟶ 3,666:
 
</syntaxhighlight>
 
=={{header|Haskell}}==
<syntaxhighlight lang="haskell">import Data.List (partition, intersect, nub)
import Control.Monad
import System.Random (StdGen, getStdRandom, randomR)
Line 3,425 ⟶ 3,717:
where (i, g') = randomR (0, max) g
(left, picked : right) = splitAt i l</syntaxhighlight>
 
=={{header|Hy}}==
 
<syntaxhighlight lang="lisp">(import random)
 
(def +size+ 4)
Line 3,454 ⟶ 3,745:
(print "A winner is you!")</syntaxhighlight>
 
=={{header|Icon}} and {{header|Unicon}}==
 
The following works in both Icon and Unicon.
 
<syntaxhighlight lang=Unicon"unicon">procedure main()
digits := "123456789"
every !digits :=: ?digits
Line 3,483 ⟶ 3,773:
return (bulls = *num)
end</syntaxhighlight>
 
=={{header|J}}==
<syntaxhighlight lang="j">require 'misc'
plural=: conjunction define
Line 3,512 ⟶ 3,801:
For example:
 
<syntaxhighlight lang="j"> bullcow''
Guess my number: 1234
0 bulls and 1 cow.
Line 3,528 ⟶ 3,817:
4 bulls and 0 cows.
you win</syntaxhighlight>
 
=={{header|Java}}==
<syntaxhighlight lang="java5">import java.util.InputMismatchException;
import java.util.Random;
import java.util.Scanner;
Line 3,603 ⟶ 3,891:
Guess a 4-digit number with no duplicate digits: 3957
You won after 10 guesses!</pre>
 
=={{header|JavaScript}}==
=== Spidermonkey version ===
<syntaxhighlight lang="javascript">#!/usr/bin/env js
 
function main() {
Line 3,724 ⟶ 4,011:
Bulls: 4, cows: 0
You win! Guesses needed: 8
=={{header|jq}}==
{{works with|jq}}
'''Also works with gojq, the Go implementation of jq.'''
 
'''Adapted from [[#Wren|Wren]]'''
 
The following program reads the user's input from STDIN, and reads
random digits from /dev/random using the --slurpfile command-line
option. This makes the program more convoluted than would have been
the case had the generation of the initial four-digit pseudo-random
integer been done in a separate step, but it does illustrate how
the limitations of jq's I/O can be circumvented
in this case.
 
In a bash or bash-like environment, a suitable invocation
would be as follows:
<pre>
jq -nrR --slurpfile raw <(< /dev/random tr -cd '0-9' | fold -w 1 | head -n 100) -f bc.jq
</pre>
 
'''bc.jq'''
<syntaxhighlight lang=jq>
# A PRNG for generating a pseudo-random integer in range(0; .).
# $array must be a sufficiently large array of pseudo-random integers in range(0;10).
# $start specifies the position in $array to begin searching.
# Output: {prn, start) where .prn is a PRN in range(0; .) and .start is the corresponding position in $array.
def prn($array; $start):
def a2n: map(tostring) | join("") | tonumber;
if . == 1 then 0
else . as $n
| (($n-1)|tostring|length) as $w
| {$start}
| until( $array[.start: .start + $w] | a2n < $n; .start+=1 )
| {start, prn: ($raw[.start: .start + $w] | a2n)}
end;
 
# Generate a 4-digit PRN from 1234 to 9876 inclusive, with no zeros or repeated digits.
# Global variable: $raw (see documentation for $array above)
def num:
def _num($start):
(8643|prn($raw; $start)) as $prn
| (1234 + $prn.prn)
| . as $n
| tostring
| if (test("0")|not) and ((explode|unique|length) == 4)
then $n
else _num($prn.start+4)
end;
_num(0);
 
def MAX_GUESSES: 20; # say
 
def instructions:
"All guesses should have exactly 4 distinct digits excluding zero.",
"Keep guessing until you guess the chosen number (maximum \(MAX_GUESSES) valid guesses).\n";
 
def play:
num as $num
| ($num|tostring|explode) as $numArray
| { guesses: 0 }
| instructions, "Enter your guess:",
(label $out
| foreach range(0; infinite) as $i (.;
if .bulls == 4 or .guesses == MAX_GUESSES then break $out
else .guess = input
| if .guess == $num then .emit = "You have won with \(.guesses+1) valid guesses!"
else .n = (.guess | try tonumber catch null)
| if .n == null then .emit = "Not a valid number"
elif .guess|test("[+-.]") then .emit = "The guess should not contain a sign or decimal point."
elif .guess|test("0") then .emit = "The guess cannot contain zero."
elif .guess|length != 4 then .emit = "The guess must have exactly 4 digits."
else .guessArray = (.guess | explode )
| if .guessArray | unique | length < 4 then .emit = "All digits must be distinct."
else . + {bulls: 0, cows: 0 }
| reduce range(0; .guessArray|length) as $i ( .;
if $numArray[$i] == .guessArray[$i] then .bulls += 1
elif (.guessArray[$i] | IN($numArray[])) then .cows += 1
else .
end)
| .emit = "Your score for this guess: Bulls = \(.bulls) Cows = \(.cows)"
| .guesses += 1
end
end
end
end;
 
select(.emit).emit,
if .bulls == 4 then "Congratulations!"
elif .guesses == MAX_GUESSES
then "\nYou have now had \(.guesses) valid guesses, the maximum allowed. Bye!"
else "Enter your next guess:"
end ) );
 
play
</syntaxhighlight>
 
=={{header|Julia}}==
<syntaxhighlight lang="julia">function cowsbulls()
print("Welcome to Cows & Bulls! I've picked a number with unique digits between 1 and 9, go ahead and type your guess.\n
You get one bull for every right number in the right position.\n
Line 3,759 ⟶ 4,141:
end</syntaxhighlight>
The following version checks thoroughly that the input of the player is constituted of four distincts digits.
<syntaxhighlight lang="julia">function bullsandcows ()
bulls = cows = turns = 0
result = (s = [] ; while length(unique(s))<4 push!(s,rand('1':'9')) end; unique(s))
Line 3,794 ⟶ 4,176:
 
=={{header|Kotlin}}==
<syntaxhighlight lang=scala"kotlin">// version 1.1.2
 
import java.util.Random
 
const val MAX_GUESSES = 20 // say
 
fun main(args: Array<String>) {
val num = ('1'..'9').shuffled().take(4).joinToString("")
val r = Random()
var num: String
// generate a 4 digit random number from 1234 to 9876 with no zeros or repeated digits
do {
num = (1234 + r.nextInt(8643)).toString()
} while ('0' in num || num.toSet().size < 4)
 
println("All guesses should have exactly 4 distinct digits excluding zero.")
Line 3,813 ⟶ 4,188:
while (true) {
print("Enter your guess : ")
val guess = readLinereadln().trim()!!
if (guess == num) {
println("You've won with ${++guesses} valid guesses!")
returnbreak
}
val n = guess.toIntOrNull()
Line 3,868 ⟶ 4,243:
=={{header|Lasso}}==
This game uses an HTML form to submit the answer. The random number and history are stored in a session using Lasso's built in session management.
<syntaxhighlight lang=Lasso"lasso">[
define randomizer() => {
local(n = string)
Line 3,981 ⟶ 4,356:
5493: Bulls: 4, Cows: 0 - YOU WIN!
Restart</pre>
 
=={{header|Liberty BASIC}}==
<syntaxhighlight lang="lb">
 
do while len( secret$) <4
Line 4,047 ⟶ 4,421:
end
</syntaxhighlight>
 
=={{header|Logo}}==
{{works with|UCB Logo}}
<syntaxhighlight lang="logo">to ok? :n
output (and [number? :n] [4 = count :n] [4 = count remdup :n] [not member? 0 :n])
end
Line 4,069 ⟶ 4,442:
if :bulls = 4 [print [You guessed it!]]
end</syntaxhighlight>
 
=={{header|Lua}}==
<syntaxhighlight lang=Lua"lua">function ShuffleArray(array)
for i=1,#array-1 do
local t = math.random(i, #array)
Line 4,175 ⟶ 4,547:
 
Another version:
<syntaxhighlight lang=Lua"lua">function createNewNumber ()
math.randomseed(os.time())
local numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9}
Line 4,238 ⟶ 4,610:
end
end</syntaxhighlight>
 
=={{header|M2000 Interpreter}}==
<syntaxhighlight lang=M2000"m2000 Interpreterinterpreter">
Module Game {
Malformed=lambda (a$)->{
Line 4,290 ⟶ 4,661:
Game
</syntaxhighlight>
 
=={{header|Maple}}==
<syntaxhighlight lang="maple">BC := proc(n) #where n is the number of turns the user wishes to play before they quit
local target, win, numGuesses, guess, bulls, cows, i, err;
target := [0, 0, 0, 0]:
Line 4,359 ⟶ 4,729:
...
</pre>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<syntaxhighlight lang=Mathematica"mathematica">digits=Last@FixedPointList[If[Length@Union@#==4,#,Table[Random[Integer,{1,9}],{4}]]&,{}]
codes=ToCharacterCode[StringJoin[ToString/@digits]];
Module[{r,bulls,cows},
Line 4,378 ⟶ 4,747:
Illegal input.
8261: You got it!</pre>
 
=={{header|MATLAB}}==
<syntaxhighlight lang=MATLAB"matlab">function BullsAndCows
% Plays the game Bulls and Cows as the "game master"
Line 4,471 ⟶ 4,839:
Try again: 4368
You win! Bully for you! Only 8 guesses.</pre>
 
=={{header|MAXScript}}==
<syntaxhighlight lang=MAXScript"maxscript">
numCount = 4 -- number of digits to use
 
Line 4,544 ⟶ 4,911:
)</syntaxhighlight>
{{out}}
<syntaxhighlight lang="text">
OK
Rules:
Line 4,566 ⟶ 4,933:
Bulls: 0 Cows: 1
</syntaxhighlight>
 
=={{header|MiniScript}}==
<syntaxhighlight lang=MiniScript"miniscript">secret = range(1,9)
secret.shuffle
secret = secret[:4].join("")
Line 4,606 ⟶ 4,972:
Your guess? 8642
You got it! Great job!</pre>
 
=={{header|MUMPS}}==
<syntaxhighlight lang=MUMPS"mumps">BullCow New bull,cow,guess,guessed,ii,number,pos,x
Set number="",x=1234567890
For ii=1:1:4 Do
Line 4,673 ⟶ 5,038:
You guessed 2907. That earns you 4 bulls.
That's a perfect score.</syntaxhighlight>
 
=={{header|Nanoquery}}==
{{trans|Python}}
<syntaxhighlight lang=Nanoquery"nanoquery">import Nanoquery.Util; random = new(Random)
 
// a function to verify the user's input
Line 4,764 ⟶ 5,128:
 
Congratulations you guess correctly in 11 attempts</pre>
 
=={{header|Nim}}==
{{trans|Python}}
<syntaxhighlight lang="nim">import random, strutils, strformat, sequtils
randomize()
 
Line 4,828 ⟶ 5,191:
 
Congratulations! You guessed correctly in 4 attempts.</pre>
 
=={{header|OCaml}}==
<syntaxhighlight lang="ocaml">let rec input () =
let s = read_line () in
try
Line 4,880 ⟶ 5,242:
print_endline "Congratulations you guessed correctly";
;;</syntaxhighlight>
 
=={{header|Oforth}}==
 
<syntaxhighlight lang=Oforth"oforth">: bullsAndCows
| numbers guess digits bulls cows |
 
Line 4,901 ⟶ 5,262:
System.Out "Bulls = " << bulls << ", cows = " << cows << cr
] ;</syntaxhighlight>
 
=={{header|ooRexx}}==
The solution at [[#Version_2|Rexx Version 2]] is a valid ooRexx program.
 
=={{header|Oz}}==
<syntaxhighlight lang="oz">declare
proc {Main}
Solution = {PickNUnique 4 {List.number 1 9 1}}
Line 4,975 ⟶ 5,334:
in
{Main}</syntaxhighlight>
 
=={{header|PARI/GP}}==
This simple implementation expects guesses in the form [a,b,c,d].
<syntaxhighlight lang="parigp">bc()={
my(u,v,bulls,cows);
while(#vecsort(v=vector(4,i,random(9)+1),,8)<4,);
Line 4,989 ⟶ 5,347:
)
};</syntaxhighlight>
 
=={{header|Pascal}}==
<syntaxhighlight lang="pascal">Program BullCow;
 
{$mode objFPC}
Line 5,180 ⟶ 5,537:
end.
</syntaxhighlight>
 
=={{header|Perl}}==
<syntaxhighlight lang="perl">use Data::Random qw(rand_set);
use List::MoreUtils qw(uniq);
 
Line 5,221 ⟶ 5,577:
return uniq(split //, $g) == $size && $g =~ /^[1-9]{$size}$/;
}</syntaxhighlight>
 
=={{header|Phix}}==
<!--<syntaxhighlight lang=Phix"phix">(phixonline)-->
<span style="color: #000080;font-style:italic;">--
-- demo\rosetta\BullsAndCows.exw
Line 5,311 ⟶ 5,666:
Well done!
</pre>
 
=={{header|PHP}}==
<syntaxhighlight lang="php"><?php
$size = 4;
 
Line 5,353 ⟶ 5,707:
}
?></syntaxhighlight>
 
=={{header|Picat}}==
{{trans|Python}}
<syntaxhighlight lang=Picat"picat">main =>
Digits = to_array("123456789"),
Size = 4,
Line 5,389 ⟶ 5,742:
).
</syntaxhighlight>
 
=={{header|PicoLisp}}==
<syntaxhighlight lang="lisp">(de ok? (N)
(let D (mapcar 'format (chop N))
(and (num? N)
Line 5,412 ⟶ 5,764:
" Bad guess! (4 unique digits, 1-9)" ) ) )
</syntaxhighlight>
 
=={{header|PowerShell}}==
<syntaxhighlight lang=PowerShell"powershell">
[int]$guesses = $bulls = $cows = 0
[string]$guess = "none"
Line 5,478 ⟶ 5,829:
You won after 7 guesses.
</pre>
 
=={{header|Processing}}==
Produces both a console transcript and a GUI interface to the game.
Creates a new game each time the guess is correct; tracks number of games won.
<syntaxhighlight lang="processing">IntDict score;
StringList choices;
StringList guess;
Line 5,544 ⟶ 5,894:
return result;
}</syntaxhighlight>
 
=={{header|Prolog}}==
Works with SWI-Prolog 6.1.8 (for predicate '''foldl'''), module lambda, written by '''Ulrich Neumerkel''' found there http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/lambda.pl and module clpfd written by '''Markus Triska'''.
<syntaxhighlight lang=Prolog"prolog">:- use_module(library(lambda)).
:- use_module(library(clpfd)).
 
Line 5,604 ⟶ 5,953:
Cows is TT - Bulls.
</syntaxhighlight>
 
=={{header|PureBasic}}==
<syntaxhighlight lang=PureBasic"purebasic">Define.s secret, guess, c
Define.i bulls, cows, guesses, i
 
Line 5,676 ⟶ 6,024:
CloseConsole()
EndIf</syntaxhighlight>
 
=={{header|Python}}==
<syntaxhighlight lang="python">'''
Bulls and cows. A game pre-dating, and similar to, Mastermind.
'''
Line 5,725 ⟶ 6,072:
 
Congratulations you guessed correctly in 2 attempts</pre>
 
=={{header|QB64}}==
<syntaxhighlight lang=QB64"qb64">
Const MaxDigit = 4, Min = 1, Max = 9
Dim As String NumberToGuess, NumberToTest, Newdigit, Result
Line 5,758 ⟶ 6,104:
</syntaxhighlight>
 
=={{header|Quackery}}==
 
<code>transpose</code> is defined at [[Matrix transposition#Quackery]].
 
<syntaxhighlight lang="Quackery"> [ size 4 = dup not if
[ say "Must be four digits." cr ] ] is 4chars ( $ --> b )
 
[ true swap witheach
[ char 1 char 9 1+ within not if
[ say "Must be 1-9 only." cr
not conclude ] ] ] is 1-9 ( $ --> b )
 
[ 0 9 of
swap witheach
[ 1 unrot char 1 - poke ]
0 swap witheach +
4 = dup not if
[ say "Must all be different." cr ] ] is all-diff ( $ --> b )
 
 
[ $ "Guess four digits, 1-9, no duplicates: "
input
dup 4chars not iff drop again
dup 1-9 not iff drop again
dup all-diff not iff drop again ] is guess ( $ --> $ )
 
[ $ "123456789" shuffle 4 split drop ] is rand$ ( --> $ )
 
[ 2 pack transpose
[] swap witheach
[ dup unpack != iff
[ nested join ]
else drop ]
dup [] != if
[ transpose unpack ]
4 over size - ] is -bulls ( $ $ --> $ $ n )
 
[ join sort
0 swap
behead swap witheach
[ tuck = if [ dip 1+ ] ]
drop ] is cows ( $ $ --> n )
 
[ say "Guess the four numbers." cr cr
say "They are all different and"
say " between 1 and 9 inclusive." cr cr
randomise rand$
[ guess
over -bulls
dup 4 = iff say "Correct." done
dup echo 1 = iff
[ say " bull." cr ]
else
[ say " bulls." cr ]
cows
dup echo 1 = iff
[ say " cow." cr ]
else
[ say " cows." cr ]
again ]
cr drop 2drop ] is play ( --> )</syntaxhighlight>
 
{{out}}
 
<pre>Guess the four numbers.
 
They are all different and between 1 and 9 inclusive.
 
Guess four digits, 1-9, no duplicates: 1234
0 bulls.
0 cows.
Guess four digits, 1-9, no duplicates: 5678
1 bull.
3 cows.
Guess four digits, 1-9, no duplicates: 5786
1 bull.
3 cows.
Guess four digits, 1-9, no duplicates: 5867
0 bulls.
4 cows.
Guess four digits, 1-9, no duplicates: 7658
2 bulls.
2 cows.
Guess four digits, 1-9, no duplicates: 7685
0 bulls.
4 cows.
Guess four digits, 1-9, no duplicates: 6758
Correct.
</pre>
 
=={{header|R}}==
{{works with|R|2.8.1}}
<syntaxhighlight lang=R"r">target <- sample(1:9,4)
bulls <- 0
cows <- 0
Line 5,780 ⟶ 6,215:
}
print(paste("You won in",attempts,"attempt(s)!"))</syntaxhighlight>
 
=={{header|Racket}}==
 
<syntaxhighlight lang="racket">
#lang racket
 
Line 5,864 ⟶ 6,298:
You won after 8 guesses.
</pre>
 
=={{header|Raku}}==
(formerly Perl 6)
Line 5,871 ⟶ 6,304:
{{works with|Rakudo|2015.12}}
 
<syntaxhighlight lang="raku" line>my $size = 4;
my @secret = pick $size, '1' .. '9';
 
Line 5,892 ⟶ 6,325:
 
say 'A winner is you!';</syntaxhighlight>
 
=={{header|Red}}==
<syntaxhighlight lang=Red"red">
Red[]
a: "0123456789"
Line 5,912 ⟶ 6,344:
print "You won!"
</syntaxhighlight>
 
=={{header|REXX}}==
This game is also known as:
Line 5,920 ⟶ 6,351:
:::::::* Master Mind
===version 1===
'''See version 2 for a better formatted progtam that also runs on ooRexx.'''<br>
This REXX version of Bulls and Cows doesn't allow repeated digits (in the computer-generated number),
<br>nor the use of the zero digit.
Line 5,926 ⟶ 6,358:
<br>and also change the prompt message.
<br>The REXX statement that contains the &nbsp; '''translate''' &nbsp; statement can be removed if repeated digits aren't allowed.
<syntaxhighlight lang="rexx">/*REXX program scores the Bulls & Cows game with CBLFs (Carbon Based Life Forms). */
?=; do until length(?)==4; r= random(1, 9) /*generate a unique four-digit number. */
if pos(r,?)\==0 then iterate; ?= ? || r /*don't allow a repeated digit/numeral. */
Line 5,955 ⟶ 6,387:
 
===Version 2===
<syntaxhighlight lang="rexx">
/*REXX program to play the game of "Bulls & Cows". *******************
* Changes from Version 1:
Line 6,060 ⟶ 6,492:
 
=={{header|Ring}}==
<syntaxhighlight lang="ring">
# Project : Bulls and cows
 
Line 6,101 ⟶ 6,533:
end
</syntaxhighlight>
=={{header|RPL}}==
{{works with|HP|49}}
« CLEAR 0 ""
1 4 '''START'''
'''WHILE''' RAND 9 * CEIL R→I →STR DUP2 POS '''REPEAT''' '''DROP''' END +
'''NEXT'''
→ count solution
« '''DO''' 1 CF
'''DO''' "Guess? [CONT]" PROMPT →STR
'''CASE'''
DUP SIZE 4 ≠ '''THEN''' DROP "Not 4 characters" 1 DISP 0.5 WAIT '''END'''
{ 9 } 0 CON
1 4 '''FOR''' j
OVER j DUP SUB STR→
'''IFERR''' 1 PUT '''THEN''' 3 DROPN "Invalid character" 1 DISP 0.5 WAIT '''END'''
'''NEXT'''
DUP 1 CON DOT 4 ≠ '''THEN''' DROP "Repeated digits" 1 DISP 0.5 WAIT '''END'''
1 SF
'''END'''
'''UNTIL''' 1 FS? '''END'''
" → " + 0
1 4 '''FOR''' j
solution PICK3 j DUP SUB POS
'''IF''' DUP '''THEN''' IF j == '''THEN''' 1 '''ELSE''' .1 '''END END''' +
'''NEXT'''
SWAP OVER + 'count' INCR DROP
'''UNTIL''' SWAP 4 == '''END'''
count "guess" →TAG
» » '<span style="color:blue">BU&CO</span>' ST0
 
=={{header|Ruby}}==
Inspired by Tcl
{{works with|Ruby|1.8.7+}}
<syntaxhighlight lang="ruby">def generate_word(len)
[*"1".."9"].shuffle.first(len) # [*"1".."9"].sample(len) ver 1.9+
end
Line 6,149 ⟶ 6,610:
Inspired by Python
{{works with|Ruby|2.0+}}
<syntaxhighlight lang="ruby">size = 4
secret = [*'1' .. '9'].sample(size)
guess = nil
Line 6,187 ⟶ 6,648:
=={{header|Rust}}==
{{libheader|rand}}
<syntaxhighlight lang="rust">use std::io;
use rand::{Rng,thread_rng};
 
Line 6,269 ⟶ 6,730:
}
}</syntaxhighlight>
 
=={{header|Scala}}==
<syntaxhighlight lang="scala">import scala.util.Random
 
object BullCow {
Line 6,313 ⟶ 6,773:
def hasDups(input:List[Int])=input.size!=input.distinct.size
}</syntaxhighlight>
 
=={{header|Scheme}}==
{{works with|any R6RS Scheme}}
 
<syntaxhighlight lang="scheme">
 
;generate a random non-repeating list of 4 digits, 1-9 inclusive
Line 6,411 ⟶ 6,870:
You win!
</pre>
 
=={{header|Scratch}}==
Scratch is a graphical programming language. Follow the link to see an example solution for Bulls and Cows<br>
Line 6,423 ⟶ 6,881:
<br>
Since Scratch is an educational language, I've included comments in the code to explain what the program is doing.<br>
 
=={{header|Seed7}}==
<syntaxhighlight lang="seed7">$ include "seed7_05.s7i";
 
const proc: main is func
Line 6,491 ⟶ 6,948:
Congratulations you guessed correctly in 4 attempts
</pre>
 
=={{header|SenseTalk}}==
<syntaxhighlight lang="sensetalk">repeat forever
repeat forever
put random(1111,9999) into num
Line 6,570 ⟶ 7,026:
end repeat
end repeat</syntaxhighlight>
=={{header|SETL}}==
<syntaxhighlight lang="setl">program bulls_and_cows;
setrandom(0);
 
print("Bulls and cows");
print("--------------");
print;
 
secret := make_secret();
 
loop do
guess := read_guess();
tries +:= 1;
bulls := count_bulls(guess, secret);
cows := count_cows(guess, secret);
print(bulls, "bulls,", cows, "cows.");
if bulls = 4 then
print("You win! Tries:", tries);
exit;
end if;
end loop;
 
proc make_secret();
digits := [];
loop for i in [1..4] do
loop until not digit in digits do
digit := 1 + random(8);
end loop;
digits with:= digit;
end loop;
return digits;
end proc;
 
proc read_guess();
loop do
putchar("Guess? ");
flush(stdout);
guess := getline(stdin);
if exists d in guess | not d in "123456789" then
print("invalid input:", d);
elseif #guess /= #{d : d in guess} then
print("no duplicates allowed");
elseif #guess /= 4 then
print("need 4 digits");
else
exit;
end if;
end loop;
return [val d : d in guess];
end proc;
 
proc count_bulls(guess, secret);
return #[i : i in [1..4] | guess(i) = secret(i)];
end proc;
 
proc count_cows(guess, secret);
return #[d : d in guess | d in secret] - count_bulls(guess, secret);
end proc;
end program;</syntaxhighlight>
{{out}}
<pre>Bulls and cows
--------------
 
Guess? 1234
0 bulls, 1 cows.
Guess? 5678
2 bulls, 1 cows.
Guess? 5978
2 bulls, 0 cows.
Guess? 5968
1 bulls, 1 cows.
Guess? 5976
1 bulls, 1 cows.
Guess? 6978
3 bulls, 0 cows.
Guess? 6971
2 bulls, 0 cows.
Guess? 6918
2 bulls, 0 cows.
Guess? 1978
2 bulls, 0 cows.
Guess? 6178
3 bulls, 0 cows.
Guess? 6278
3 bulls, 0 cows.
Guess? 6378
4 bulls, 0 cows.
You win! Tries: 12</pre>
=={{header|Shale}}==
 
<syntaxhighlight lang=Shale"shale">#!/usr/local/bin/shale
 
maths library
Line 6,743 ⟶ 7,286:
 
=={{header|Sidef}}==
<syntaxhighlight lang="ruby">var size = 4
var num = @(1..9).shuffle.first(size)
 
Line 6,790 ⟶ 7,333:
You did it in 4 attempts!
</pre>
 
=={{header|Smalltalk}}==
{{works with|GNU Smalltalk}}
<syntaxhighlight lang="smalltalk">Object subclass: BullsCows [
|number|
BullsCows class >> new: secretNum [ |i|
Line 6,851 ⟶ 7,393:
( (stdin nextLine) = 'y' )
] whileTrue: [ Character nl displayNl ].</syntaxhighlight>
 
=={{header|Smart BASIC}}==
<syntaxhighlight lang="smart BASICbasic">
'by rbytes, January 2017
OPTION BASE 1
Line 6,942 ⟶ 7,483:
END
</syntaxhighlight>
 
=={{header|Swift}}==
{{works with|Swift|5.7}}
 
This is the same as the original solution but takes advantage of Swift 5's richer standard library to clean things up a bit.
 
<syntaxhighlight lang="swift">func generateRandomNumArray(numDigits: Int = 4) -> [Character]
{
guard (1 ... 9).contains(numDigits) else { fatalError("number out of range") }
 
return Array("123456789".shuffled()[0 ..< numDigits])
}
 
func parseGuess(_ guess: String, numDigits: Int = 4) -> String?
{
guard guess.count == numDigits else { return nil }
// Only digits 0 to 9 allowed, no Unicode fractions or numbers from other languages
let guessArray = guess.filter{ $0.isASCII && $0.isWholeNumber }
 
guard Set(guessArray).count == numDigits else { return nil }
 
return guessArray
}
 
func pluralIfNeeded(_ count: Int, _ units: String) -> String
{
return "\(count) " + units + (count == 1 ? "" : "s")
}
 
var guessAgain = "y"
while guessAgain == "y"
{
let num = generateRandomNumArray()
var bulls = 0
var cows = 0
 
print("Please enter a 4 digit number with digits between 1-9, no repetitions: ")
 
if let guessStr = readLine(strippingNewline: true), let guess = parseGuess(guessStr)
{
for (guess, actual) in zip(guess, num)
{
if guess == actual
{
bulls += 1
}
else if num.contains(guess)
{
cows += 1
}
}
 
print("Actual number: " + num)
print("Your score: \(pluralIfNeeded(bulls, "bull")) and \(pluralIfNeeded(cows, "cow"))\n")
print("Would you like to play again? (y): ")
 
guessAgain = readLine(strippingNewline: true)?.lowercased() ?? "n"
}
else
{
print("Invalid input")
}
}
</syntaxhighlight>
 
<syntaxhighlight lang="swift">import Foundation
 
func generateRandomNumArray(numDigits: Int = 4) -> [Int] {
Line 7,021 ⟶ 7,623:
 
=={{header|Tcl}}==
<syntaxhighlight lang="tcl">proc main {} {
fconfigure stdout -buffering none
set length 4
Line 7,106 ⟶ 7,708:
 
main</syntaxhighlight>
 
=={{header|Transd}}==
{{trans|C++}}
<syntaxhighlight lang="scheme">#lang transd
#lang transd
 
MainModule: {
Line 7,119 ⟶ 7,719:
),
 
play: (λ locals:
syms "0123456789"
len 4
Line 7,139 ⟶ 7,739:
(with bulls 0 cows 0 pl 0
(for i in Range(len) do
(= pl (findindex-of thenum (subn guess i)))
(if (eq pl i) (+= bulls 1)
elsif (neq pl -1) (+= cows 1))
Line 7,153 ⟶ 7,753:
),
 
_start: (λ locals: s String()
(lout "Welcome to \"Bulls and cows\"!")
(while true
(while true
(textout "Do you want to play? (yes|no) : ")
(textingetline s 3)
(if (not (size s))
(lout "Didn't receive an answer. Exiting.") (exit)
Line 7,167 ⟶ 7,767:
(play)
(lout "Another game?")
)
)
}</syntaxhighlight>
}
</syntaxhighlight>
 
=={{header|TUSCRIPT}}==
<syntaxhighlight lang="tuscript">
$$ MODE tuscript
SET nr1=RANDOM_NUMBERS (1,9,1)
Line 7,227 ⟶ 7,826:
BINGO
</pre>
 
=={{header|uBasic/4tH}}==
<syntaxhighlight lang="text">Local(2) ' Let's use no globals
 
Proc _Initialize ' Get our secret number
Line 7,308 ⟶ 7,906:
Return (c@) ' Return number of valid digits</syntaxhighlight>
The addition of strings allows for much simpler code.
<syntaxhighlight lang="text">Do
s = Str(1234 + RND(8643))
Until FUNC(_Check(s))
Line 7,352 ⟶ 7,950:
Next
Return (1)</syntaxhighlight>
 
=={{header|UNIX Shell}}==
{{works with|bash|3}}
 
<syntaxhighlight lang="bash">#!/bin/bash
 
rand() {
Line 7,506 ⟶ 8,103:
echo "Score: $( bulls "${secret}" "${guess}" ) Bulls, $( cows "${secret}" "${guess}" ) Cows"
done</syntaxhighlight>
 
=={{header|VBA}}==
 
<syntaxhighlight lang="vb">
Option Explicit
 
Line 7,584 ⟶ 8,180:
End Function
</syntaxhighlight>
 
=={{header|VBScript}}==
VBS functions return variants. I use t to return a single error value or a pair bulls, cows on result<br />
VBS does'nt have a continue so i used the classic do loop inside do loop in the main program
<syntaxhighlight lang="vb">
randomize timer
fail=array("Wrong number of chars","Only figures 0 to 9 allowed","Two or more figures are the same")
Line 7,633 ⟶ 8,228:
end function
</syntaxhighlight>
 
=={{header|Vedit macro language}}==
<syntaxhighlight lang="vedit">Buf_Switch(Buf_Free)
#90 = Time_Tick // seed for random number generator
#91 = 10 // random numbers in range 0 to 9
Line 7,682 ⟶ 8,276:
#90 = (48271 * (#90 % #92) - #93 * (#90 / #92)) & 0x7fffffff
Return ((#90 & 0xffff) * #91 / 0x10000)</syntaxhighlight>
 
=={{header|Visual Basic .NET}}==
 
<syntaxhighlight lang="vbnet">Imports System
Imports System.Text.RegularExpressions
 
Line 7,741 ⟶ 8,334:
End Sub
End Module</syntaxhighlight>
 
=={{header|V (Vlang)}}==
<syntaxhighlight lang="v (vlang)">
import rand
import os
 
fn main() {
valid := ['1','2','3','4','5','6','7','8','9']
mut value := []string{}
mut guess, mut elem := '', ''
mut cows, mut bulls := 0, 0
println('Cows and Bulls')
println('Guess four digit numbers of unique digits in the range 1 to 9.')
println('A correct digit, but not in the correct place is a cow.')
println('A correct digit, and in the correct place is a bull.')
// generate pattern
for value.len < 4 {
elem = rand.string_from_set('123456789', 1)
if value.any(it == elem) == false {
value << elem
}
}
// start game
input: for _ in 0..3 {
guess = os.input('Guess: ').str()
// deal with malformed guesses
if guess.len != 4 {println('Please input a four digit number.') continue input}
for val in guess {
if valid.contains(val.ascii_str()) == false {
{println('Please input a number between 1 to 9.') continue input}
}
if guess.count(val.ascii_str()) > 1 {
{println('Please do not repeat the same digit.') continue input}
}
}
// score guesses
for idx, gval in guess {
match true {
gval.ascii_str() == value[idx] {
bulls++
println('${gval.ascii_str()} was correctly guessed, and in the correct location! ')
 
}
gval.ascii_str() in value {
cows++
println('${gval.ascii_str()} was correctly quessed, but not in the exact location! ')
}
else {}
}
if bulls == 4 {println('You are correct and have won!!! Congratulations!!!') exit(0)}
}
println('score: bulls: $bulls cows: $cows')
}
println('Only 3 guesses allowed. The correct value was: $value')
println('Sorry, you lost this time, try again.')
}
</syntaxhighlight>
 
{{out}}
<pre>
Cows and Bulls
Guess four digit numbers of unique digits in the range 1 to 9.
A correct digit, but not in the correct place is a cow.
A correct digit, and in the correct place is a bull.
Guess: 2673
6 was correctly quessed, but not in the exact location!
score: bulls: 0 cows: 1
Guess: 1658
6 was correctly quessed, but not in the exact location!
5 was correctly quessed, but not in the exact location!
8 was correctly quessed, but not in the exact location!
score: bulls: 0 cows: 4
Guess: 6859
6 was correctly quessed, but not in the exact location!
8 was correctly guessed, and in the correct location!
5 was correctly quessed, but not in the exact location!
score: bulls: 1 cows: 6
Only 3 guesses allowed. The correct value was: ['5', '8', '4', '6']
Sorry, you lost this time, try again.
</pre>
 
=={{header|VTL-2}}==
<syntaxhighlight lang="VTL2">10 I=1
20 J=1
30 :I)='/10*0+%
40 #=:I)=0*30+(0<:I)*70
50 #=:I)=:J)*20
60 J=J+1
70 #=J<I*50
80 I=I+1
90 #=4>I*20
100 ?="BULLS AND COWS"
110 ?="--------------"
120 ?=""
125 T=0
130 T=T+1
140 ?="GUESS? ";
150 G=?
160 #=G<1234+(G>9877)*510
170 I=8
180 G=G/10
190 :I)=%
200 I=I-1
210 #=4<I*180
220 #=:5)*:6)*:7)*:8)=0*510
230 I=6
240 J=5
250 #=:I)=:J)*510
260 J=J+1
270 #=J<I*250
280 I=I+1
290 #=I<9*240
300 B=0
310 C=0
320 I=1
330 B=:I)=:I+4)+B
340 J=1
350 C=(I=J=0)*(:I)=:J+4))+C
360 J=J+1
370 #=4>J*350
380 I=I+1
390 #=4>I*330
400 ?="BULLS: ";
410 ?=B
420 ?=", COWS: ";
430 ?=C
440 ?=""
450 #=B<4*130
460 ?=""
470 ?="YOU GOT IT IN ";
480 ?=T
490 ?=" TRIES!"
500 #=1000
510 ?="BAD GUESS - GUESS NEEDS TO BE 4 UNIQUE DIGITS WITHOUT ZEROES"
520 #=140</syntaxhighlight>
{{out}}
<pre>BULLS AND COWS
--------------
 
GUESS? 1234
BULLS: 0, COWS: 1
GUESS? 5678
BULLS: 0, COWS: 2
GUESS? 1978
BULLS: 1, COWS: 2
GUESS? 2978
BULLS: 1, COWS: 2
GUESS? 3978
BULLS: 1, COWS: 2
GUESS? 4978
BULLS: 1, COWS: 3
GUESS? 7984
BULLS: 1, COWS: 3
GUESS? 8947
BULLS: 4, COWS: 0
 
YOU GOT IT IN 8 TRIES!</pre>
 
=={{header|Wren}}==
Line 7,746 ⟶ 8,496:
{{libheader|Wren-set}}
{{libheader|Wren-ioutil}}
<syntaxhighlight lang=ecmascript"wren">import "random" for Random
import "./set" for Set
import "./ioutil" for Input
 
var MAX_GUESSES = 20 // say
Line 7,771 ⟶ 8,521:
if (!n) {
System.print("Not a valid number")
} else if (guess.contains("-") || guess.contains("+") || guess.contains(".")) {
System.print("Can't contain a sign or decimal point")
} else if (guess.contains("e") || guess.contains("E")) {
System.print("Can't contain an exponent")
} else if (guess.contains("0")) {
System.print("Can't contain zero")
Line 7,824 ⟶ 8,576:
Enter your guess : 8253
You've won with 9 valid guesses!
</pre>
 
=={{header|XPL0}}==
<syntaxhighlight lang "XPL0">int Bulls, Cows, Secret(4), Guess(4), Guesses, Used, I, J, Done, Digit, Okay;
[Used:= 0; \generate secret random number using digits
for I:= 0 to 3 do \ 1 to 9 without any repeated digits
[repeat Digit:= Ran(9)+1;
until (Used & 1<<Digit) = 0;
Used:= Used ! 1<<Digit;
Secret(I):= Digit + ^0;
];
Text(0, "Guess the secret number.^m^j");
Text(0, "Guesses must be four different digits, 1 to 9.^m^j");
Guesses:= 0;
loop [Done:= false; \main game loop
repeat Text(0, "Enter your guess: "); \get valid 4-digits from player
OpenI(0); Used:= 0; I:= 0;
loop [Digit:= ChIn(0);
Okay:= Digit>=^1 and Digit<=^9;
Digit:= Digit & $0F; \convert ASCII to binary
if not Okay or Used & 1<<Digit then
[Text(0,
"Please enter four distinct digits, 1 thru 9.^m^j");
quit;
];
Guess(I):= Digit + ^0;
Used:= Used ! 1<<Digit;
I:= I+1;
if I = 4 then [Done:= true; quit];
];
until Done;
Guesses:= Guesses+1;
Bulls:= 0; Cows:= 0;
for I:= 0 to 3 do
for J:= 0 to 3 do
if Guess(I) = Secret(J) then
if I=J then Bulls:= Bulls+1
else Cows:= Cows+1;
Text(0, "Bulls: "); IntOut(0, Bulls);
Text(0, " Cows: "); IntOut(0, Cows);
CrLf(0);
if Bulls = 4 then quit;
];
Text(0, "Congratulations! You won in "); IntOut(0, Guesses);
Text(0, " guesses.^m^j");
]</syntaxhighlight>
{{out}}
<pre>
Guess the secret number.
Guesses must be four different digits, 1 to 9.
Enter your guess: 1234
Bulls: 1 Cows: 1
Enter your guess: 3345
Please enter four distinct digits, 1 thru 9.
Enter your guess: 0987
Please enter four distinct digits, 1 thru 9.
Enter your guess: 1357
Bulls: 1 Cows: 0
Enter your guess:
</pre>
 
=={{header|zkl}}==
Play one game:
<syntaxhighlight lang="zkl">d:=Dictionary(); do{ d[(1).random(10)]=True }while(d.len()<4);
abcd:=d.keys.shuffle();
while(1){
44

edits