LeetCode in Kotlin

299. Bulls and Cows

Medium

You are playing the Bulls and Cows game with your friend.

You write down a secret number and ask your friend to guess what the number is. When your friend makes a guess, you provide a hint with the following info:

Given the secret number secret and your friend’s guess guess, return the hint for your friend’s guess.

The hint should be formatted as "xAyB", where x is the number of bulls and y is the number of cows. Note that both secret and guess may contain duplicate digits.

Example 1:

Input: secret = “1807”, guess = “7810”

Output: “1A3B”

Explanation:

Bulls are connected with a '|' and cows are underlined:
"1807"
  |
"7810"

Example 2:

Input: secret = “1123”, guess = “0111”

Output: “1A1B”

Explanation:

Bulls are connected with a '|' and cows are underlined:
"1123"       "1123"
  |      or    |
"0111"       "0111"
Note that only one of the two unmatched 1s is counted as a cow since the non-bull digits can only be rearranged to allow one 1 to be a bull. 

Example 3:

Input: secret = “1”, guess = “0”

Output: “0A0B”

Example 4:

Input: secret = “1”, guess = “1”

Output: “1A0B”

Constraints:

Solution

class Solution {
    fun getHint(secret: String, guess: String): String {
        val ans = IntArray(10)
        var bulls = 0
        var cows = 0
        for (i in 0 until secret.length) {
            val s = Character.getNumericValue(secret[i])
            val g = Character.getNumericValue(guess[i])
            if (s == g) {
                bulls++
            } else {
                // digit s was already seen in guess, is being seen again in secret
                if (ans[s] < 0) {
                    cows++
                }
                // digit was already seen in secret, now being seen again in guess
                if (ans[g] > 0) {
                    cows++
                }
                ans[s]++
                ans[g]--
            }
        }
        return bulls.toString() + "A" + cows + "B"
    }
}