import java.util.Random;
import java.util.*; 

public class Main 
{
    static int n=15;
    static int[] coins = new int[n];
    
    public static void main(String[] args) 
    {
        
        System.out.println("Program to test flipping coins multiple times.");
        System.out.println("All heads to remain. All tails to be removed.");
        System.out.println("Execution ends when one HEAD left");
        System.out.println("");
         
        FlipCoin fc= new FlipCoin(n, coins);
	System.out.println("The number rounds: " + fc.getRounds());
        } 
    } 

class FlipCoin 
{
    private int numberCoins;
    private int coins[];
    
    enum Coins
    {
        HEAD (1), TAIL(2);
        
        int value;
        
        Coins (int value)
        {
            this.value=value;
        }
    }
     
    static int executions=0;
    
    public FlipCoin(int numberCoins, int[] coins) 
    {
        this.numberCoins=numberCoins;
        this.coins=coins;
    
        System.out.println("number coins right now is:" + numberCoins); 
        
        if (numberCoins==0)
        {
            System.out.println("Enter valid number coins greater than 0 ");
            System.exit(0);
        }
        
        int heads=0;
        int tails=0;
         
        for (int i=0; i<numberCoins;i++)
        {
            Random random = new Random();
           
            int rand = random.nextInt(2) + 1; 
           
            coins[i]=rand;
           
            if (coins[i]==Coins.HEAD.value)
            { 
                System.out.println (Coins.HEAD.name());
                heads++;
            } 
            
            if (coins[i]==Coins.TAIL.value)
            {
                System.out.println(Coins.TAIL.name());
                tails++;
            }
        } 
        
        if (tails==numberCoins) 
        {
            executions++;
            
            System.out.println("All tossed coins are tails");
            System.out.println("All coins to be re-thrown");
            System.out.println("Number executions:" +  executions);
        
            flipCoinsAgain(numberCoins,heads,tails); 
        }
        
        else
        {
            do 
            {
                numberCoins=numberCoins-tails; 
            
                if (heads>1) 
                {
                    System.out.println("New number of coins: " + numberCoins);
                    System.out.println("Number heads remaining: " + (heads));
                    executions++;
                    flipCoinsAgain(numberCoins, heads, tails);
                }
        
                if (heads==1) 
                {
                    System.out.println("One head left: " + numberCoins);
            
                    executions++;
            
                    System.out.println("Number executions:" +  (executions));
                    System.exit(0);
                }
        
            }while(numberCoins>1);
        }    
    }
       
    void flipCoinsAgain(int numberCoins, int heads, int tails) 
    {
        System.out.println("\nFlipping ALL coins again");
        System.out.println("Number executions so far:" +  executions);
            
        heads=0;
        tails=0;
            
        new FlipCoin(numberCoins, coins);
    }
    
    int getRounds() 
    {
        return executions; 
            
    } 
}