package com.thebibleinthebible;
import java.io.*;
import java.util.*;
import java.net.*;
import java.math.*;
//_____________________________________________________________
public class mycbrt
{ 
   String look = "27013627";
   boolean show = false;
   String out = "";
//_____________________________________________________________
public static final void main(String[] args) throws Exception
{
   if (args.length == 0)
   {
      args = "BRAJYO BRA ALHYM AO HJMYM VAO HARE".split(" ");
   }
   long t1 = System.nanoTime();
   mycbrt bnk = new mycbrt();
   if (bnk.start(args) == -1) System.out.println("WORKS");
   else System.out.println("FAILS");
   long t2 = System.nanoTime();
   System.out.println("seconds = " + ((t2-t1)/1e9));
}
//_____________________________________________________________
mycbrt() throws Exception 
{
}
//___________________________________________________________________________
int start(String[] args)
{
   String val = "777";
   int val2 = value(args[2]) + value(args[4]) + value(args[6]);
   val = Integer.toString(val2);
   int tot1 = 0;
   for (int i = 0; i < args.length; i++)
   {
      tot1 += value(args[i]);
   }
   String[] sent2 = getFile("sentence2.txt").split("\r\n");
   String[] sentence2 = sent2[0].split(" ");
   int tot2 = 0;
   for (int i = 0; i < sentence2.length; i++)
   {
      tot2 += valuegreek(sentence2[i]);
   }
   look = Integer.toString(tot1) + Integer.toString(tot2);
   if (show) System.out.println(val + " " + look);
   //if (args.length > 0) val = args[0];
   String itrn = "2000";
   //if (args.length > 1) itrn = args[1];
   //if (args.length > 2) look = args[2];
  //for (int i = 777; i < 778; i++)
   {
      //val = Integer.toString(i);
      //if (i % 1 == 0) System.out.print(".");
      return(cbrt(val,itrn));
   }
}
//___________________________________________________________________________
int cbrt(String input,String itrn)
{
        if (input == null || input.isEmpty()) {
            return 0;
        }

        // Ignore decimal point and anything not a digit
        String str = input.replace(".", "").replaceAll("[^0-9]", "");

        // Remove leading zeros
        str = str.replaceFirst("^0+", "");
        if (str.isEmpty()) {
            return 0;
        }

        // Number of cube-root digits to produce.
        // If caller passes 0 or blank, compute just enough digits for integer cube root.
        int itr = 0;
        if (itrn != null && !itrn.trim().isEmpty()) {
            itr = Integer.parseInt(itrn.trim());
        }

        // Pad on the left so length is a multiple of 3
        int pad = (3 - (str.length() % 3)) % 3;
        str = "0".repeat(pad) + str;

        int groups = str.length() / 3;

        // If itr not supplied, produce integer cube root digits only
        if (itr <= 0) {
            itr = groups;
        }

        BigInteger root = BigInteger.ZERO;
        BigInteger remainder = BigInteger.ZERO;

        int groupIndex = 0;

        for (int i = 0; i < itr; i++) {


            if (i % 1000 == 0) System.out.print(".");
            BigInteger nextGroup;

            if (groupIndex < groups) {
                String g = str.substring(groupIndex * 3, groupIndex * 3 + 3);
                nextGroup = new BigInteger(g);
                groupIndex++;
            } else {
                // After integer part is exhausted, bring down 000 groups
                nextGroup = BigInteger.ZERO;
            }

            // Bring down next 3-digit group
            BigInteger current = remainder.multiply(BigInteger.valueOf(1000)).add(nextGroup);

            int bestDigit = 0;
            BigInteger bestSub = BigInteger.ZERO;

            // Find largest x in 0..9 such that
            // 300*root^2*x + 30*root*x^2 + x^3 <= current
            for (int x = 9; x >= 0; x--) {
                BigInteger bx = BigInteger.valueOf(x);

                BigInteger term1 = BigInteger.valueOf(300)
                        .multiply(root.pow(2))
                        .multiply(bx);

                BigInteger term2 = BigInteger.valueOf(30)
                        .multiply(root)
                        .multiply(bx.pow(2));

                BigInteger term3 = bx.pow(3);

                BigInteger sub = term1.add(term2).add(term3);

                if (sub.compareTo(current) <= 0) {
                    bestDigit = x;
                    bestSub = sub;
                    break;
                }
            }

            current = current.subtract(bestSub);
            root = root.multiply(BigInteger.TEN).add(BigInteger.valueOf(bestDigit));
            remainder = current;
        }
        BigInteger ans = root.multiply(root.multiply(root));
        //System.out.println("--------------------------------");
        //System.out.println(input);
        //System.out.println(ans);
        //System.out.println(root);
        //return root.toString();
   String out = root.toString();


   BigInteger bgout = new BigInteger(out);
   BigInteger bgout2 = bgout.multiply(bgout);
   bgout = bgout.multiply(bgout2);
//System.out.println(bgout);
   String newout = bgout.toString();
   if (str.length() > newout.length())
   {
   }
   else
   {
//System.out.println(newout);
//System.out.println(str);
    if (str.substring(0,2).equals("00")) str = str.substring(2);
    if (str.substring(0,1).equals("0")) str = str.substring(1);
    if (newout.substring(0,str.length()).equals(str))
    {
    }
    else
    {
      String str23 = Integer.toString(Integer.parseInt(str)-1);
      if (newout.substring(0,str23.length()).equals(str23))
      {
         String newout2 = newout.substring(str23.length());
         for (int i = 0; i < Integer.parseInt(itrn) - 20; i++)
         {
            String s = newout2.substring(i,i+1);
            if (!s.equals("9"))
            {
//System.out.println("newout2 =" + newout2);
               System.out.println("ERROR B");
               break;
           } 
        }
      }
      else
      {
         System.out.println("ERROR");
         System.out.println("numout=[" + newout + "]");
         System.out.println("str23=[" + str23 + "]");
      }
    }
   }
   if (lookfor(look,out)>0) 
   {
      if (show) System.out.println("found " + input  );
      return(-1);
   }
   //saveFile("cbrt/cbrt" + input + ".txt",out,false);
   return(1);
}
//_________________________________________________________________
int lookfor(String look, String str)
{
   for (int i = 0; i < str.length() - look.length() - 2; i++)
   {
      int pos = 0;
      for (int j = 0; j < look.length() + 2; j++)
      {
         String s1 = str.substring(i + j,i+j+1);
         String s2 = look.substring(pos,pos+1);
         if (s1.equals(s2))
         {
            pos++;
         }     
      }
      if (pos >= look.length()) 
      {
         String ss = str.substring(i, i+look.length() + 2);
         if (show) System.out.println("\r\n" + (i+5) + " " + ss);
         return(i);
      }
   }
   return(-1);
}
//__________________________________________________
int value(String str)
{
   int total = 0;
   out = "";
   for (int i = 0; i < str.length(); i++)
   {
      int v = 0;
      String st2 = str.substring(i,i+1);
      byte[] st3 = st2.getBytes();
      byte st = st3[0];
      if (st == 'a') v = 1;
      else if (st == 'b') v = 2;
      else if (st == 'c') v = 3;
      else if (st == 'd') v = 4;
      else if (st == 'e') v = 5;
      else if (st == 'f') v = 6;
      else if (st == 'g') v = 7;
      else if (st == 'h') v = 8;
      else if (st == 'i') v = 9;
      else if (st == 'j') v = 10;
      else if (st == 'k') v = 20;
      else if (st == 'l') v = 30;    
      else if (st == 'm') v = 40;
      else if (st == 'n') v = 50;
      else if (st == 'o') v = 60;
      else if (st == 'p') v = 70;
      else if (st == 'q') v = 80;
      else if (st == 'r') v = 90;
      else if (st == 's') v = 100;
      else if (st == 't') v = 200;
      else if (st == 'u') v = 300;
      else if (st == 'v') v = 400;
      else if (st == 'w') v = 500;
      else if (st == 'x') v = 600;
      else if (st == 'y') v = 700;
      else if (st == 'z') v = 800;
      else if (st == 'A') v = 1;
      else if (st == 'B') v = 2;
      else if (st == 'G') v = 3;
      else if (st == 'D') v = 4;
      else if (st == 'H') v = 5;
      else if (st == 'V') v = 6;
      else if (st == 'Z') v = 7;
      else if (st == 'C') v = 8;
      else if (st == 'T') v = 9;
      else if (st == 'Y') v = 10;
      else if (st == 'K') v = 20;
      else if (st == 'L') v = 30;
      else if (st == 'M') v = 40;
      else if (st == 'N') v = 50;
      else if (st == 'S') v = 60;
      else if (st == 'I') v = 70;
      else if (st == 'F') v = 80;
      else if (st == 'E') v = 90;
      else if (st == 'Q') v = 100;
      else if (st == 'R') v = 200;
      else if (st == 'J') v = 300;
      else if (st == 'O') v = 400;
      total += v;
      if (i > 0) out += " + ";
      out += Integer.toString(v);
   }
   return(total);
}
//__________________________________________________
int valuegreek(String str)
{
   int total = 0;
   out = "";
   for (int i = 0; i < str.length(); i++)
   {
      int v = 0;
      String st2 = str.substring(i,i+1);
      byte[] st3 = st2.getBytes();
      byte st = st3[0];
      if (st == 'a') v = 1;
      else if (st == 'b') v = 2;
      else if (st == 'c') v = 3;
      else if (st == 'd') v = 4;
      else if (st == 'e') v = 5;
      else if (st == 'f') v = 6;
      else if (st == 'g') v = 7;
      else if (st == 'h') v = 8;
      else if (st == 'i') v = 9;
      else if (st == 'j') v = 10;
      else if (st == 'k') v = 20;
      else if (st == 'l') v = 30;    
      else if (st == 'm') v = 40;
      else if (st == 'n') v = 50;
      else if (st == 'o') v = 60;
      else if (st == 'p') v = 70;
      else if (st == 'q') v = 80;
      else if (st == 'r') v = 90;
      else if (st == 's') v = 100;
      else if (st == 't') v = 200;
      else if (st == 'u') v = 300;
      else if (st == 'v') v = 400;
      else if (st == 'w') v = 500;
      else if (st == 'x') v = 600;
      else if (st == 'y') v = 700;
      else if (st == 'z') v = 800;
      else if (st == 'A') v = 1;
      else if (st == 'B') v = 2;
      else if (st == 'G') v = 3;
      else if (st == 'D') v = 4;
      else if (st == 'E') v = 5;
      else if (st == 'S') 
      {
         if (i == str.length() - 1)
         {
            v = 200;
         }
         else
         {
            v = 6;
         }
      }
      else if (st == 'Z') v = 7;
      else if (st == 'J') v = 8;
      else if (st == 'H') v = 9;
      else if (st == 'I') v = 10;
      else if (st == 'K') v = 20;
      else if (st == 'L') v = 30;
      else if (st == 'M') v = 40;
      else if (st == 'N') v = 50;
      else if (st == 'X') v = 60;
      else if (st == 'O') v = 70;
      else if (st == 'P') v = 80;
      //else if (st == 'E') v = 90;
      else if (st == 'R') v = 100;
      //else if (st == 'R') v = 200;
      else if (st == 'T') v = 300;
      else if (st == 'U') v = 400;
      else if (st == 'F') v = 500;
      else if (st == 'C') v = 600;
      else if (st == 'Q') v = 700;
      else if (st == 'V') v = 800;
      total += v;
      if (i > 0) out += " + ";
      out += Integer.toString(v);
   }
   return(total);
}
//___________________________________________________________________________
String getFile(String file) 
{
   StringBuffer buf=new StringBuffer();String str;
  try
  {
   BufferedReader in = new BufferedReader (new FileReader (file));
   while((str=in.readLine())!=null)
   {
      buf.append(str+"\r\n");
   }
   in.close();
  }
  catch (Exception e)
  {
   System.out.println(e);
  }
   return (buf.toString());
}
//___________________________________________________________________________
public static void saveFile(String file, String str, boolean append) 
{
  try
  {
   BufferedWriter out = new BufferedWriter(new FileWriter(file, append));
   out.write(str);
   out.close();
  }
  catch (Exception e)
  {
   System.out.println(e);
  }
}
}//__________________________________________________________________________
