Bulls and cows/Player: Difference between revisions

Content added Content deleted
(Added Wren)
No edit summary
Line 3,528: Line 3,528:
end repeat
end repeat
end repeat</lang>
end repeat</lang>

=={{header|Shale}}==

<lang Shale>#!/usr/local/bin/shale

maths library
file library
string library

lista var
listb var
firstTimeThrough var
guess var
guess0 var
guess1 var
guess2 var
guess3 var
bulls var
cows var

init dup var {
count a:: var
count b:: var
} =

randomDigit dup var {
random maths::() 18 >> 9 % 1 +
} =

makeGuess dup var {
firstTimeThrough {
guess0 randomDigit() =
guess1 randomDigit() =
{ guess1 guess0 == } { guess1 randomDigit() = } while
guess2 randomDigit() =
{ guess2 guess0 == guess2 guess1 == or } { guess2 randomDigit() = } while
guess3 randomDigit() =
{ guess3 guess0 == guess3 guess1 == guess3 guess2 == or or } { guess3 randomDigit() = } while
guess guess3 1000 * guess2 100 * guess1 10 * guess0 + + + =
} {
i var

i random maths::() count lista->:: % =
guess i.value lista->:: value =
guess0 guess 10 % =
guess1 guess 10 / 10 % =
guess2 guess 100 / 10 % =
guess3 guess 1000 / =
} if
} =

getAnswer dup var {
stdin file:: fgets file::() {
atoi string::()
} {
0 exit
} if
} =

getScore dup var {
haveBulls dup var false =
haveCows dup var false =
ans var

{ haveBulls not } {
"Bulls: " print
ans getAnswer() =
ans 0 < ans 4 > and {
"Please try again" println
} {
bulls ans =
haveBulls true =
} if
} while

{ haveCows not } {
"Cows: " print
ans getAnswer() =
ans 0 < ans 4 > and {
"Please try again" println
} {
cows ans =
haveCows true =
} if
} while
} =

check dup var {
d0 dup var swap = // units
d1 dup var swap =
d2 dup var swap =
d3 dup var swap = // thousands
b dup var 0 =
c dup var 0 =

d0 guess0 == { b++ } { d0 guess1 == { d0 guess2 == { d0 guess3 == } or } or { c++ } ifthen } if
d1 guess1 == { b++ } { d1 guess0 == { d1 guess2 == { d1 guess3 == } or } or { c++ } ifthen } if
d2 guess2 == { b++ } { d2 guess0 == { d2 guess1 == { d2 guess3 == } or } or { c++ } ifthen } if
d3 guess3 == { b++ } { d3 guess0 == { d3 guess1 == { d3 guess2 == } or } or { c++ } ifthen } if

b bulls >= c cows >= and
} =

add dup var {
n dup var swap =

n guess != { // never put our own guess back in the list.
i var

i count listb->:: =
i.value listb->:: defined not {
i.value listb->:: var
} ifthen

i.value listb->:: n =
count listb->::++
} ifthen
} =

filterList dup var {
firstTimeThrough {
a var
b var
c var
d var

a 1 =
{ a 10 < } {
b 1 =
{ b 10 < } {
b a != {
c 1 =
{ c 10 < } {
c a != c b != and {
d 1 =
{ d 10 < } {
d a != { d b != d c != and } and {
a b c d check() {
a 1000 * b 100 * c 10 * d + + + add()
} ifthen
} ifthen
d++
} while
} ifthen
c++
} while
} ifthen
b++
} while
a++
} while
} {
i var
j var
n var

count listb->:: 0 =
i 0 =
{ i count lista->:: < } {
n i.value lista->:: =
n 1000 / n 100 / 10 % n 10 / 10 % n 10 % check() {
n.value add()
} ifthen
i++
} while
} if
} =

solve dup var {
t var
f var
n var

lista a &=
listb b &=
firstTimeThrough true =
count a:: 0 =
count b:: 0 =

n 1 =
f 1 =
{ f } {
makeGuess()
guess0 guess1 guess2 guess3 n "\nGuess %d: %d %d %d %d\n" printf
getScore()
bulls 4 == {
"WooHoo, I won!" println
break
} ifthen
filterList()
f count listb->:: =

t lista =
lista listb =
listb t =
firstTimeThrough false =
n++
} while

count lista->:: 0 == {
"I've run out of numbers to choose from." println
} ifthen
} =

init()
{ true } {
solve()
} while</lang>

{{out}}

<pre>Guess 1: 4 2 3 5
Bulls: 2
Cows: 1

Guess 2: 4 1 2 5
Bulls: 0
Cows: 3

Guess 3: 5 2 3 1
Bulls: 2
Cows: 1

Guess 4: 1 2 3 4
Bulls: 4
Cows: 0
WooHoo, I won!</pre>


=={{header|Sidef}}==
=={{header|Sidef}}==