On Jan 9, 2008 9:10 PM, James Gray <james / grayproductions.net> wrote:
> On Jan 6, 2008, at 9:42 AM, Sander Land wrote:
>
> > class Array
> >  def score
> >    sort.inject(0){|s,c| s+c > 21 && c==11 ? s+1 : s+c }
> >  end
> > end
>
> That has the some bug Eric found in Dennis's code:
>
>  >> [10, 11, 11].score
> => 22

Thanks. I should have thought of this considering Dennis' results matched mine.
Here's my corrected solution. I renamed the ace to "1" for a more
elegant solution.  :)

class Array
  def score
    (s=inject(:+)) <= 11 && index(1) ? s+10 : s
  end
end

unless ARGV[0]
 (1..10).each{|n| puts `ruby1.9 #{__FILE__} #{n}`}
 exit
end

puts "upcard: #{upcard = ARGV[0].to_i}"
NDECKS = (ARGV[1]||2).to_i
CARDS = (((1..10).to_a+[10]*3)*4*NDECKS).tap{|c| c.delete_at c.index(upcard)}

score_count = [0]*27
cards = []
N=(ARGV[2]||1_000_000).to_i
N.times{
 cards = CARDS.dup.shuffle if cards.size < 17
 dealer = [upcard]
 dealer << cards.pop while dealer.score < 17
 score_count[dealer.score] += 1
}

puts %w[17 18 19 20 21 bust].join('     ')
puts (score_count[17..21] << score_count[22..-1].inject(:+)).map{|x|
'%-4.1f%%  ' % (100.0*x / N )}.join


Results match Eric's results now.

upcard: 1
17     18     19     20     21     bust
12.8%  13.1%  13.0%  13.1%  36.3%  11.6%
upcard: 2
17     18     19     20     21     bust
14.0%  13.4%  13.1%  12.3%  11.9%  35.3%
upcard: 3
17     18     19     20     21     bust
13.3%  13.2%  12.5%  12.2%  11.5%  37.3%
upcard: 4
17     18     19     20     21     bust
13.1%  12.1%  12.1%  11.6%  11.3%  39.8%
upcard: 5
17     18     19     20     21     bust
12.2%  12.3%  11.7%  10.8%  10.7%  42.2%
upcard: 6
17     18     19     20     21     bust
16.6%  10.7%  10.7%  10.1%  9.8 %  42.1%
upcard: 7
17     18     19     20     21     bust
36.9%  13.9%  7.8 %  7.9 %  7.4 %  26.0%
upcard: 8
17     18     19     20     21     bust
12.9%  36.0%  12.9%  6.9 %  7.0 %  24.3%
upcard: 9
17     18     19     20     21     bust
12.1%  11.2%  35.3%  12.1%  6.1 %  23.1%
upcard: 10
17     18     19     20     21     bust
11.2%  11.2%  11.3%  33.6%  11.3%  21.3%