Bulls and cows/Player: Difference between revisions
Content added Content deleted
m (disambiguate link) |
(→Tcl: Added implementation) |
||
Line 80: | Line 80: | ||
1549 -> (0, 0) |
1549 -> (0, 0) |
||
3627 -> (1, 0)</pre> |
3627 -> (1, 0)</pre> |
||
=={{header|Tcl}}== |
|||
{{libheader|tcllib}} |
|||
<lang tcl>package require struct::list |
|||
package require struct::set |
|||
proc scorecalc {guess chosen} { |
|||
set bulls 0 |
|||
set cows 0 |
|||
foreach g $guess c $chosen { |
|||
if {$g eq $c} { |
|||
incr bulls |
|||
} elseif {$g in $chosen} { |
|||
incr cows |
|||
} |
|||
} |
|||
return [list $bulls $cows] |
|||
} |
|||
# Allow override on command line |
|||
set size [expr {$argc ? int($argv) : 4}] |
|||
set choices {} |
|||
struct::list foreachperm p [split 123456789 ""] { |
|||
struct::set include choices [lrange $p 1 $size] |
|||
} |
|||
set answers {} |
|||
set scores {} |
|||
puts "Playing Bulls & Cows with $size unique digits\n" |
|||
fconfigure stdout -buffering none |
|||
while 1 { |
|||
set ans [lindex $choices [expr {int(rand()*[llength $choices])}]] |
|||
lappend answers $ans |
|||
puts -nonewline \ |
|||
"Guess [llength $answers] is [join $ans {}]. Answer (Bulls, cows)? " |
|||
set score [scan [gets stdin] %d,%d] |
|||
lappend scores $score |
|||
if {$score eq {4 0}} { |
|||
puts "Ye-haw!" |
|||
break |
|||
} |
|||
foreach c $choices[set choices {}] { |
|||
if {[scorecalc $c $ans] eq $score} { |
|||
lappend choices $c |
|||
} |
|||
} |
|||
if {![llength $choices]} { |
|||
puts "Bad scoring? nothing fits those scores you gave:" |
|||
foreach a $answers s $scores { |
|||
puts " [join $a {}] -> ([lindex $s 0], [lindex $s 1])" |
|||
} |
|||
break |
|||
} |
|||
}</lang> |
|||
'''Sample Output''' |
|||
<pre> |
|||
Playing Bulls & Cows with 4 unique digits |
|||
Guess 1 is 8527. Answer (Bulls, cows)? 0,1 |
|||
Guess 2 is 5143. Answer (Bulls, cows)? 0,2 |
|||
Guess 3 is 9456. Answer (Bulls, cows)? 2,0 |
|||
Guess 4 is 9412. Answer (Bulls, cows)? 2,1 |
|||
Guess 5 is 9481. Answer (Bulls, cows)? 3,0 |
|||
Guess 6 is 9471. Answer (Bulls, cows)? 4,0 |
|||
Ye-haw! |
|||
</pre> |
|||
'''Sample Bad Output''' |
|||
<pre> |
|||
Playing Bulls & Cows with 4 unique digits |
|||
Guess 1 is 6578. Answer (Bulls, cows)? 0,0 |
|||
Guess 2 is 3241. Answer (Bulls, cows)? 1,0 |
|||
Bad scoring? nothing fits those scores you gave: |
|||
6578 -> (0, 0) |
|||
3241 -> (1, 0) |
|||
</pre> |