#* http://rosettacode.org/wiki/Bulls_and_cows
  Implement "Bulls and Cows"  - http://en.wikipedia.org/wiki/Bulls_and_cows
*#

secret_length = 4

secret = [1 2 3 4 5 6 7 8 9].shuffle.pop secret_length

score = { guess |
  cows = 0
  bulls = 0
  
  guess.each_with_index { digit, index |
    true? digit == secret[index]
      { bulls = bulls + 1 }
      { true? secret.include?(digit)
        { cows = cows + 1 }
      }
  }

  [cows: cows, bulls: bulls]
}

won = false
guesses = 1

p "I have chosen a number with four unique digits from 1 through 9. Can you guess it?"

while { not won }
  {
    print "Guess #{guesses}: "
    guess = g.strip.dice.map { d | d.to_i }
    
    when { guess == secret }  { p "You won in #{guesses} guesses!"; won = true }
      { guess.include?(0) || guess.include?(null) } { p "Your guess should only include digits 1 through 9." }
      { guess.length != secret.length } { p "Your guess was not the correct length. The number has exactly #{secret.length} digits." }
      { guess.unique.length != secret.length } { p "Each digit should only appear once in your guess." }
      { true } { 
        result = score guess
        p "Score: #{result[:bulls]} bulls, #{result[:cows]} cows."
        guesses = guesses + 1
      }
  }