In this HackerRank The Minion Game problem-solution, Kevin and Stuart want to play the ‘The Minion Game’.
Game Rules
Both players are given the same string, S.
Both players have to make substrings using the letters of the string S.
Stuart has to make words starting with consonants.
Kevin has to make words starting with vowels.
The game ends when both players have made all possible substrings.
Scoring
A player gets +1 point for each occurrence of the substring in the string S.
Your task is to determine the winner of the game and their score.
Problem solution in Python 2 programming.
# Enter your code here. Read input from STDIN. Print output to STDOUT vowels = ['A', 'E', 'I', 'O', 'U'] s = raw_input() a = 0 b = 0 for i, c in enumerate(s): if c in vowels: b += len(s) - i else: a += len(s) - i if a == b: print "Draw" elif a > b: print 'Stuart {}'.format(a) else: print 'Kevin {}'.format(b)
Problem solution in Python 3 programming.
def minion_game(string): vowels = 'AEIOU' Stuart_score, Kevin_score = 0, 0 length = len(string) for start_idx in range(length): score = length - start_idx if string[start_idx] in vowels: Kevin_score += score else: Stuart_score += score if Stuart_score == Kevin_score: print('Draw') if Stuart_score > Kevin_score: print('Stuart {}'.format(Stuart_score)) if Stuart_score < Kevin_score: print('Kevin {}'.format(Kevin_score))
Problem solution in pypy programming.
# Enter your code here. Read input from STDIN. Print output to STDOUT input_string = raw_input() vowels = ['A','E','I','O','U'] Kevin_score = 0 Stuart_score = 0 for i in range(len(input_string)): if input_string[i] in vowels: Kevin_score = Kevin_score + (len(input_string) - i) if input_string[i] not in vowels: Stuart_score = Stuart_score + (len(input_string) - i) if Kevin_score == Stuart_score: print "Draw" if Kevin_score > Stuart_score: print "Kevin",Kevin_score if Kevin_score < Stuart_score: print "Stuart",Stuart_score
Problem solution in pypy3 programming.
# Enter your code here. Read input from STDIN. Print output to STDOUT s=input() vv='AEIOU' l=len(s) c=0 v=0 for i in range(l): if s[i] in vv: v+=l-i else: c+=l-i if c>v: print ('Stuart',c) elif c==v: print ("Draw") else: print ('Kevin',v)
what is the logic behind "score = length – start_idx"
Consider the example given in hacker rank itself: string = 'BANANA'
len(string) = 6
so,
for start_idx in range(length):
score = length – start_idx
if string[start_idx] in vowels:
Kevin_score += score
else:
Stuart_score += score
When start_idx = 0
score = len(string) – start_idx which means score = 6-0, implies the we can make total of 6 words with the starting letter "B" such as "B", "BA", "BAN", "BANA", "BANAN" and "BANANA" . The score value will be moved to Stuart_SCORE.
when start_idx = 1
score = len(string) – start_idx which means score = 6-1, implies the we can make total of 5 words with the starting letter "A" such as "A", "AN", "ANA", "ANAN" and "ANANA" . here ieh score will be moved to KEVIN_SCORE.
Thank you for explaining it this way! I was so confused trying to understand why this algorithm worked, not realizing logic worked in reverse from how I was trying to visualize it.
So when index is 0, you're essentially giving the player credit for possibilities of:
BANANA
BANAN
BANA
BAN
BA
B
and NOT
BANANA
_ANANA
__NANA
___ANA
____NA
_____A
Which is how I was trying to step through and understand it and thus why it confused the heck out of me as to why it not only worked, but also handled duplicate sub strings. Bravo, JITHESH944!