Bulls and cows: Difference between revisions
Content added Content deleted
Line 3,808: | Line 3,808: | ||
Bulls: 4, cows: 0 |
Bulls: 4, cows: 0 |
||
You win! Guesses needed: 8 |
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}}== |
=={{header|Julia}}== |
||
<syntaxhighlight lang="julia">function cowsbulls() |
<syntaxhighlight lang="julia">function cowsbulls() |
||
Line 3,875: | Line 3,971: | ||
please, enter four distincts digits |
please, enter four distincts digits |
||
Your guess? </pre> |
Your guess? </pre> |
||
=={{header|Kotlin}}== |
=={{header|Kotlin}}== |
||
<syntaxhighlight lang="scala">// version 1.1.2 |
<syntaxhighlight lang="scala">// version 1.1.2 |