init = 5000
bet  = 100
on   = false
outp = nil

pass_bet      = 0
pass_odds_bet = 0
wage = []

rolls  = 200
rounds = 5000
debug  = false
results = []

def dice
	d1 = rand(6)+1
	d2 = rand(6)+1
	d1 + d2
end

def place_odds(val,bet)
	case val
	when 4,10
		bet * (9/5.0)
	when 5,9
		bet * (7/5.0)
	when 6,8
		bet * (7/6.0)
	end
end

def pass_odds(val,bet)
	case val
	when 4,10
		bet * (2/1.0)
	when 5,9
		bet * (3/2.0)
	when 6,8
		bet * (6/5.0)
	end
end

debug = false

rounds = 1 if debug

1.upto(rounds) do |round|

cash = init
cash_hi = cash
cash_lo = cash
cash_hi_roll = 0
cash_lo_roll = 0

roll = 0
while(true)

	break if roll > rolls
	roll += 1

	cash_hi = (cash > cash_hi ? (cash_hi_roll = roll; cash) : cash_hi)
	cash_lo = (cash < cash_lo ? (cash_lo_roll = roll; cash) : cash_lo)

	outp = dice

	puts "[#{"%.5d" % roll}] #{"%.2d" % outp} (#{on ? ("%.2d" % on) : "--"})\t\t#{cash.to_i}\t\t#{wage.map{|x| "#{x[0]}"}.join(", ")}" if debug

	if cash < (init * 0.25)

		puts "\t LOW CASH #{cash}" if debug
		break
	end

	if cash > (init * 3.0)
		puts "\t HIGH CASH #{cash}" if debug
		break
	end

	if not on
		pass_bet      = bet
		pass_odds_bet = 0
		cash -= pass_bet
		case outp
		when 7,11
			cash += (pass_bet * 2)
			puts "\t WIN" if debug
			next
		when 2,3,12
			puts "\t CRAP" if debug
			next
		else
			on = outp
			puts "\t ON #{on}" if debug
			if on == 6 or on == 8
				pass_odds_bet = pass_bet * 4
				cash -= pass_odds_bet
			else
				if wage.length == 0
					wage << [6, pass_bet * 1]
					wage << [8, pass_bet * 1]
					cash -= (pass_bet * wage.length * 1)
				end
			end
		end
	else

		wage.each do |w|
			num,amt = w
			if outp == num
				won = place_odds(num, amt)
				puts "\t WIN #{won}" if debug
				cash += won
			end
		end

		case outp
		when 7
			on = false
			puts "\t SEVEN" if debug
			wage = []
			next
		when 2,3,12
			next
		when on
			# cash += bet
			# won  = odds(on, bet)
			won  = pass_bet * 2
			won += pass_odds(on, pass_odds_bet)
			won += pass_odds_bet
			puts "\t WIN #{won}" if debug
			cash += won
			on = false
		end
	end
end

puts "[#{"%.5d" % roll}] #{"%.2d" % outp} (#{on ? ("%.2d" % on) : "--"})\t\t#{cash.to_i}" if debug

puts "Hi Cash: #{cash_hi} at roll #{cash_hi_roll}" if debug
puts "Lo Cash: #{cash_lo} at roll #{cash_lo_roll}" if debug

results << [cash, cash_hi, cash_lo, cash_hi_roll, cash_lo_roll]
end


hi_avg = 0
results.each {|r| hi_avg += r[1] }
hi_avg = hi_avg / results.length

lo_avg = 0
results.each {|r| lo_avg += r[2] }
lo_avg = lo_avg / results.length


hir_avg = 0
results.each {|r| hir_avg += r[3] }
hir_avg = hir_avg / results.length

lor_avg = 0
results.each {|r| lor_avg += r[4] }
lor_avg = lor_avg / results.length

puts "Average High: #{hi_avg}"
puts " Average Low: #{lo_avg}"
puts "Average High: #{hir_avg}"
puts " Average Low: #{lor_avg}"

wins = 0

results.each {|r| wins +=1 if r[0] > init }

puts "Wins: #{wins} (#{((wins / results.length.to_f) * 100.0)}%)"


