Hackerrank - Gaming Array Solution
Andy wants to play a game with his little brother, Bob. The game starts with an array of distinct integers and the rules are as follows:
- Bob always plays first and the two players move in alternating turns.
- In a single move, a player chooses the maximum element currently present in the array and removes it as well as all the other elements to its right. For example, if the starting array , then it becomes after the first move because we remove the maximum element (i.e., ) and all elements to its right (i.e., and ).
- The modifications made to the array during each turn are permanent, so the next player continues the game with the remaining array. The first player who is unable to make a move loses the game.
Andy and Bob play games. Given the initial array for each game, find and print the name of the winner on a new line. If Andy wins, print ANDY
; if Bob wins, print BOB
.
To continue the example above, in the next move Andy will remove . Bob will then remove and win because there are no more integers to remove.
Function Description
Complete the gamingArray function in the editor below. It should return a string that represents the winner, either ANDY
or BOB
.
gamingArray has the following parameter(s):
- arr: an array of integers
Input Format
The first line contains a single integer , the number of games.
Each of the next pairs of lines is as follows:
- The first line contains a single integer, , the number of elements in .
- The second line contains distinct space-separated integers where .
Constraints
- Array contains distinct integers.
For of the maximum score:
- The sum of over all games does not exceed .
For of the maximum score:
- The sum of over all games does not exceed .
Output Format
For each game, print the name of the winner on a new line (i.e., either BOB
or ANDY
).
Sample Input 0
2
5
5 2 6 3 4
2
3 1
Sample Output 0
ANDY
BOB
Explanation 0
Andy and Bob play the following two games:
Initially, the array looks like this:
In the first move, Bob removes and all the elements to its right, resulting in :
In the second move, Andy removes and all the elements to its right, resulting in :
At this point, the array is empty and Bob cannot make any more moves. This means Andy wins, so we print ANDY
on a new line.
- In the first move, Bob removes and all the elements to its right, resulting in . As there are no elements left in the array for Andy to make a move, Bob wins and we print
BOB
on a new line.
Sample Input 1
2
5
1 3 5 7 9
5
7 4 6 5 9
Sample Output 1
BOB
ANDY
Explanation 1
In the first test, they alternate choosing the rightmost element until the end. Bob, Andy, Bob, Andy, Bob.
In the second case, Bob takes , Andy takes .
Solution in Python
def gamingArray(arr):
maxval = 0
maxarr = {}
newarr = {}
for index,value in enumerate(arr):
maxval = max(value,maxval)
maxarr[index] = maxval
newarr[value] = index
bobwin = False
while index >= 0:
maxval = maxarr[index]
index = newarr[maxval]-1
bobwin = not bobwin
return "BOB" if bobwin else "ANDY"
for _ in range(int(input())):
n = int(input())
arr = list(map(int,input().split()))
print(gamingArray(arr))