This is the CodeEval problem #235 and here I am giving a Python 3 solution.
Cards are represented by their value, a number or the first letter in case of Jack, Queen, King, Ace, and the suit (Clubs, Diamonds, Hearts, Spades) initial. I have converted the sample provided in python test cases:
def test_provided_1(self): self.assertEqual('2H', solution('AD 2H | H')) def test_provided_2(self): self.assertEqual('KD KH', solution('KD KH | C')) def test_provided_3(self): self.assertEqual('JH', solution('JH 10S | C'))The problem is so easy that I went for the fastest solution jumped to my mind, without caring much of anything possibly more refined.
Splitting the input line I get the facial description of the card, for instance KD for the King of Diamonds, and the current trump, as C for Club.
Then I wrote a puny, unsophisticated function that takes in input as a two-element list the cards, and the trump. I trivially converted the values in integers and then used the trump as a x10 multiplier. The idea is that even the lowest value card, a deuce (2), when is a trump has a value higher than the highest non-trump card.
def values(cards, trump): result = [0, 0] for i in [0, 1]: suit = cards[i][-1] # 1 value = cards[i][:-1] # 2 if value == 'J': result[i] = 11 elif value == 'Q': result[i] = 12 elif value == 'K': result[i] = 13 elif value == 'A': result[i] = 14 else: result[i] = int(value) if suit == trump: result[i] *= 10 return result1. Suit is the last character in the card description.
2. Value is the card description stripped of its last character.
Finally, it is just a matter of returning the face description of the highest card, or both, if they have the same value.
CodeEval accepted this solution, and I pushed test cases and python script.