A modified game of Nim
Last Updated :
03 Aug, 2022
Given an array arr[] of integers, two players A and B are playing a game where A can remove any number of non-zero elements from the array that are multiples of 3. Similarly, B can remove multiples of 5. The player who can’t remove any element loses the game. The task is to find the winner of the game if A starts first and both play optimally.
Examples:
Input: arr[] = {1, 2, 3, 5, 6}
Output: A
3 and 6 are the elements that A can remove.
5 is the only element that B can remove.
A can remove 3 in his first move then B will have to remove 5. In the next turn, A will remove 6 and B will be left with no more moves to make.
Input: arr[] = {3, 5, 15, 20, 6, 9}
Output: A
Approach: Store the count of elements only divisible by 3 in movesA, count of elements only divisible by 5 in movesB and the elements divisible by both in movesBoth. Now,
- If movesBoth = 0 then both the players can remove only the elements which are divisible by their respective number and A will win the game only when movesA > movesB.
- If movesBoth > 0 then in order to play optimally, A will remove all the elements that are divisible by both 3 and 5 so that B is left with no elements to remove from the common elements then A will be the winner only if movesA + 1 > movesB
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
string getWinner( int arr[], int n)
{
int movesA = 0, movesB = 0, movesBoth = 0;
for ( int i = 0; i < n; i++) {
if (arr[i] % 3 == 0 && arr[i] % 5 == 0)
movesBoth++;
else if (arr[i] % 3 == 0)
movesA++;
else if (arr[i] % 5 == 0)
movesB++;
}
if (movesBoth == 0) {
if (movesA > movesB)
return "A" ;
return "B" ;
}
if (movesA + 1 > movesB)
return "A" ;
return "B" ;
}
int main()
{
int arr[] = { 1, 2, 3, 5, 6 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << getWinner(arr, n);
return 0;
}
|
Java
class GfG
{
static String getWinner( int arr[], int n)
{
int movesA = 0 , movesB = 0 , movesBoth = 0 ;
for ( int i = 0 ; i < n; i++)
{
if (arr[i] % 3 == 0 && arr[i] % 5 == 0 )
movesBoth++;
else if (arr[i] % 3 == 0 )
movesA++;
else if (arr[i] % 5 == 0 )
movesB++;
}
if (movesBoth == 0 )
{
if (movesA > movesB)
return "A" ;
return "B" ;
}
if (movesA + 1 > movesB)
return "A" ;
return "B" ;
}
public static void main(String []args)
{
int arr[] = { 1 , 2 , 3 , 5 , 6 };
int n = arr.length;
System.out.println(getWinner(arr, n));
}
}
|
Python3
def getWinner(arr, n):
movesA, movesB, movesBoth = 0 , 0 , 0
for i in range ( 0 , n):
if arr[i] % 3 = = 0 and arr[i] % 5 = = 0 :
movesBoth + = 1
elif arr[i] % 3 = = 0 :
movesA + = 1
elif arr[i] % 5 = = 0 :
movesB + = 1
if movesBoth = = 0 :
if movesA > movesB:
return "A"
return "B"
if movesA + 1 > movesB:
return "A"
return "B"
if __name__ = = "__main__" :
arr = [ 1 , 2 , 3 , 5 , 6 ]
n = len (arr)
print (getWinner(arr, n))
|
C#
using System;
class GfG
{
static String getWinner( int []arr, int n)
{
int movesA = 0, movesB = 0, movesBoth = 0;
for ( int i = 0; i < n; i++)
{
if (arr[i] % 3 == 0 && arr[i] % 5 == 0)
movesBoth++;
else if (arr[i] % 3 == 0)
movesA++;
else if (arr[i] % 5 == 0)
movesB++;
}
if (movesBoth == 0)
{
if (movesA > movesB)
return "A" ;
return "B" ;
}
if (movesA + 1 > movesB)
return "A" ;
return "B" ;
}
public static void Main(String []args)
{
int []arr = { 1, 2, 3, 5, 6 };
int n = arr.Length;
Console.WriteLine(getWinner(arr, n));
}
}
|
PHP
<?php
function getWinner( $arr , $n )
{
$movesA = 0;
$movesB = 0;
$movesBoth = 0;
for ( $i = 0; $i < $n ; $i ++)
{
if ( $arr [ $i ] % 3 == 0 && $arr [ $i ] % 5 == 0)
$movesBoth ++;
else if ( $arr [ $i ] % 3 == 0)
$movesA ++;
else if ( $arr [ $i ] % 5 == 0)
$movesB ++;
}
if ( $movesBoth == 0)
{
if ( $movesA > $movesB )
return "A" ;
return "B" ;
}
if ( $movesA + 1 > $movesB )
return "A" ;
return "B" ;
}
$arr = array ( 1, 2, 3, 5, 6 );
$n = sizeof( $arr ) / sizeof( $arr [0]);
echo getWinner( $arr , $n );
?>
|
Javascript
<script>
function getWinner(arr, n)
{
let movesA = 0, movesB = 0, movesBoth = 0;
for (let i = 0; i < n; i++) {
if (arr[i] % 3 == 0 && arr[i] % 5 == 0)
movesBoth++;
else if (arr[i] % 3 == 0)
movesA++;
else if (arr[i] % 5 == 0)
movesB++;
}
if (movesBoth == 0) {
if (movesA > movesB)
return "A" ;
return "B" ;
}
if (movesA + 1 > movesB)
return "A" ;
return "B" ;
}
let arr = [ 1, 2, 3, 5, 6 ];
let n = arr.length;
document.write(getWinner(arr, n));
</script>
|
Time Complexity: O(n)
Auxiliary Space: O(1)
Share your thoughts in the comments
Please Login to comment...