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}}== |