/*
Online Java - IDE, Code Editor, Compiler
Online Java is a quick and easy tool that helps you to build, compile, test your programs online.
*/
import java.util.ArrayList;


public class Main
{
public static void main(String[] args) {
System.out.println("Welcome to Online IDE!! Happy Coding :)");
int[] nums = new int[]{1,1,12,1,0,3,0,0,1,1,3,0,0,1};
boolean moveForward=true;
String numbers = java.util.Arrays.toString(nums);
System.out.println(numbers+"\n");
boolean [] outcome = new boolean[nums.length];
int falseCount=0;
boolean forward;
boolean flag;
boolean zeroVerified=false;


for (int i=0; i<nums.length; i++)
{
    forward=false;
    flag=true;
    zeroVerified=false;
    
if (nums[i]>nums.length)
            {
                System.out.println("Index: " + i + " value: " + nums[i]+ " is greater than list size from its position: " + i + "  :FAIL");
                falseCount++;
                i++;
            }
            if (i+nums[i]>nums.length-1)
            {
                System.out.println("Index: " + i + " value: " + nums[i]+ " is greater than list size from its position: " + i + "  :FAIL");
                moveForward=false;
                outcome[i]=false;
                falseCount++;
                i++;
                
            }



moveForward=true;

if(i!=nums.length)
{
if (i==nums.length-1)
{
if (nums[i]==0 && forward==true)
{
System.out.println("Index3: " + (i) + ". No movement forward - 0 value" + "  :PASS");
zeroVerified=true;
break;

//System.out.println("FALSE");
//System.exit(0);
}

if (i!=nums.length-1 && zeroVerified==false)
{
System.out.println("Index: " + (i) + ". No movement forward - 0 value" + "  :FAIL");
}


}
if (i!=nums.length-1)
{
if (nums[i]==0 && forward==true)
{
    //System.out.println("What is value of i:" + i);
    
System.out.println("Index1: " + i + ". No movement forward - 0 value" + "  :PASS");
if (i==0)
{
falseCount++;
}
//System.out.println("FALSE");
//System.exit(0);
}




    
    
}
if (i!=nums.length-1)
{
if (nums[i]==1 && nums[i+1]>0 && i+nums[i]<nums.length)
{
System.out.println("Index: " + i + " moved forward to index: "+ (i+1) + "  :PASS");
outcome[i]=true;
forward=true;
}

if (nums[i]==1 && nums[i+1]==0 && i+1!=nums.length-1)
{
System.out.println("Index: " + i + " moved forward to index: "+ (i+1) + "  :PASS");
moveForward=false;
outcome[i]=false;
//break;
}
}

if (nums[i]==0 && i!=nums.length-1 /*&& zeroVerified==false*/)
{
System.out.println("Index1: " + i + " failed to move forward." + "  :FAIL");
moveForward=false;
outcome[i]=false;
//break;
}

if (nums[i]!=0 && i==nums.length-1)
{
System.out.println("Index: " + i + " incorrect last index value. Should be 0." + "  :FAIL");
falseCount++;
moveForward=false;
outcome[i]=false;
//break;
}
for (int j=1;j<nums[i];j++)
{
if (nums[i+j]>0  &&   nums[i]>0 /*&& zeroVerified==false*/)
{
System.out.println("Index2: " + i + " failed to move forward" + "  :FAIL");
moveForward=false;
outcome[i]=false;
falseCount++;
forward=false;
//break;
}


if (i+nums[i]<nums.length)
{
    for (int zeroCheck=1;zeroCheck<nums[i];zeroCheck++)
    {
        
        
        if (nums[zeroCheck+i]>0)
        {
            flag=false;
        }
        
        if (nums[zeroCheck+i]==0)
        {
            System.out.println("Index5: " + (i+zeroCheck) + ". No movement forward - 0 value" + "  :PASS" );
            //flag=false;
        }
        
    }

if (flag!=false)
{
System.out.println("Index: " + i + " moved forward to index: "+ (i+nums[i]) + "  :PASS");
}

if (flag==true)
{
forward=true;
outcome[i]=true;
System.out.println("Index2: " + (i+j) + ". No movement forward - 0 value" + "  :PASS" );
j=nums.length;
//zeroVerified=true;
}


}
}
if (nums[nums.length-1]==0)
{
if (nums[i+nums[i]]==0 && i+nums[i]==nums.length-1) // This works fine. It reaches end
// on two scenarios. Where the last element has a 0 value. It also ensures
{
if(moveForward)
{
System.out.println("Index: " + i + ". This will reach end. Value 0 detected at end" + "  :PASS");
outcome[i]=true;
}
}
}
}
}
for (boolean b: outcome)
{
if (falseCount==0)
{
System.out.println("TRUE");
break;
}
if (!b)
{
System.out.println("FALSE");
System.exit(0);
falseCount++;
}
}
}
}