import java.io.*;
import java.util.*;
import java.math.*;
//_____________________________________________________________
public class find
{ 
   boolean show = false;
   String out = "";
//_____________________________________________________________
public static final void main(String[] args) throws Exception
{
   find bnk = new find();
   bnk.start(args);
}
//___________________________________________________________________________
void start(String[] args)
{
   saveFile("find.htm","",false);
   if (args.length == 1)
   {
      if (args[0].equals("help"))
      {
         System.out.println("java e (name) (look) (english/hebrew/greek) (words)");
         return;
      }
   }   
   String name = "genesis_1_1";
   if (args.length > 0) name = args[0];
   String look = "31415";
   if (args.length > 1) look = args[1];
   String type = "hebrew";
   if (args.length > 2) type = args[2];
   int length = 7;
   if (args.length > 3) length = Integer.parseInt(args[3]);
   StringBuffer buf1 = new StringBuffer();
   String filestr = "";
   if (name.equals("genesis_1_1")) filestr = "BRAJYO BRA ALHYM AO HJMYM VAO HARE";
   else if (name.equals("john_1_1")) filestr = "EN ARCJI JN O LOGOS KAI O LOGOS JN PROS TON HEON KAI HEOS JN O LOGOS";
   else filestr= getFile(name + ".txt");
   String[] file = filestr.split(" ");
   if (length == 0) length = file.length;
   int tlen = file.length - length + 1;
   int pwr = (int)Math.pow(10.0, look.length());
   int expect = tlen / pwr;
   System.out.println(tlen + " / " + pwr + " = " + expect + " expected by chance");
   
   int count = 0;
   for (int i = 0; i <= file.length - length; i++)
   {
      count++;
      buf1 = new StringBuffer();
      if (count > 10000)
      {
         System.out.print(".");
         count = 0;
      }
      for (int j = 0; j < length; j++)
      {
         if (j > 0) buf1.append(" ");
         String st = file[i+j];
         buf1.append(clean(st,type));
      }
      String val1 = calc(buf1.toString(),type,i,false);
      if (val1.length() >= look.length())
      {
         if (val1.substring(0,look.length()).equals(look))
         {
            System.out.print("\r\n" + i + " ");
            System.out.print(buf1.toString() + " ");
            System.out.print(val1 + " ");
            System.out.println(digits(val1));
            calc(buf1.toString(),type,i,true);
         }
      }
   }
}
//___________________________________________________________________________
String calc(String out, String type,int ii, boolean show)
{
   boolean first = false;
   if (type.equals("hebrew")) first = true;
   StringBuffer buf1 = new StringBuffer();
   StringBuffer buf2 = new StringBuffer();
   StringBuffer buf3 = new StringBuffer();
   BigInteger wrd = new BigInteger("1");
   BigInteger ltr = new BigInteger("1");
   String[] words = out.split(" ");
   if (show) buf1.append("<table>\r\n");
   if (show) buf2.append("<table>\r\n");
   String math = "";
   if (show) buf1.append("<tr><th>letter</th><th>value</th><th>cumulative</th></tr>\r\n");
   if (show) buf2.append("<tr><th>word</th><th>value</th><th>cumulative</th></tr>\r\n");
   for (int i = 0; i < words.length; i++)
   {
      for (int j = 0; j < words[i].length(); j++)
      {
         String s = words[i].substring(j,j+1);
         int ltr2 = 1;
         if (first) ltr2 = value(s);
         else ltr2 = valuegreek(s);
         String ltr2s = Integer.toString(ltr2);
         BigInteger ltr2b = new BigInteger(ltr2s);
         math = "<a href='mathematics.php?type=multiply&num1=" + ltr.toString();
         math += "&num2=" + ltr2b.toString() + "'>" + ltr2b.toString();
         math += "</a>";
         ltr = ltr.multiply(ltr2b);
         if (first) buf1.append("<tr><td>" + convert(s) + "</td><td>" + math + "</td><td>" + ltr + "</td></tr>\r\n");
         else buf1.append("<tr><td>" + convertgreek(s) + "</td><td>" + math + "</td><td>" + ltr + "</td></tr>\r\n");
      }
      int wrd2 = 1;
      if (first) wrd2 = value(words[i]);
      else wrd2 = valuegreek(words[i]);
      String wrd2s = Integer.toString(wrd2);
      BigInteger wrd2b = new BigInteger(wrd2s);
      math = "<a href='mathematics.php?type=multiply&num1=" + wrd.toString();
      math += "&num2=" + wrd2b.toString() + "'>" + wrd2b.toString();
      math += "</a>";
      wrd = wrd.multiply(wrd2b);
      if (first) buf2.append("<tr><td>" + convert(words[i]) + "</td><td>" + math + "</td><td>" + wrd + "</td></tr>\r\n");
      else buf2.append("<tr><td>" + convertgreek(words[i]) + "</td><td>" + math + "</td><td>" + wrd + "</td></tr>\r\n");
   }
   if (show) buf1.append("</table><hr>\r\n");
   if (show) buf2.append("</table><hr>\r\n");
   if (show) buf3.append(buf1.toString());
   if (show)buf3.append(buf2.toString());
   int numwords = words.length;
   int numletters = out.replace(" ","").length();
   String numwordss = Integer.toString(numwords);
   String numletterss = Integer.toString(numletters);
   BigInteger numwordsb = new BigInteger(numwordss);
   BigInteger numlettersb = new BigInteger(numletterss);
   if (show) buf3.append("(" + ltr + " x " + numletters + ") / (" + wrd + " x " + numwords + ") = <br>\r\n");
   BigInteger numerator = ltr.multiply(numlettersb);
   BigInteger denominator = wrd.multiply(numwordsb);
   BigInteger zero = new BigInteger("0");
   BigInteger one = new BigInteger("1");
   if (denominator.equals(zero)) denominator = one;
   BigInteger answer = numerator.divide(denominator);
   String math1 = "";
   String math2 = "";
   String math3 = "";
   if (show) math1 = "<a href='mathematics.php?type=multiply&num1=" + ltr.toString();
   if (show) math1 += "&num2=" + numlettersb.toString() + "'>" + numerator.toString();
   if (show) math1 += "</a>";
   if (show) math2 = "<a href='mathematics.php?type=multiply&num1=" + wrd.toString();
   if (show) math2 += "&num2=" + numwordsb.toString() + "'>" + denominator.toString();
   if (show) math2 += "</a>";
   if (show) math3 = "<a href='mathematics.php?type=divide&num1=" + numerator.toString();
   if (show) math3 += "&num2=" + denominator.toString() + "'>" + answer.toString();
   if (show) math3 += "</a>";
   if (show) buf3.append(math1 + " / " + math2 + " = <br>\r\n");
   if (show) buf3.append("answer = " + math3 + "<br>\r\n");
   if (show) buf3.append("<br>\r\n");
   if (show) buf3.append(getdigits(ltr.toString()));
   if (show) buf3.append(getdigits(numerator.toString()));
   if (show) buf3.append(getdigits(wrd.toString()));
   if (show) buf3.append(getdigits(denominator.toString()));
   if (show) buf3.append(getdigits(answer.toString()));
   if (show) saveFile("find.htm",buf3.toString(),true);
   String ans = answer.toString();
   return(ans);
}
//___________________________________________________________________________
String getdigits(String ltr)
{
   int dig = Integer.parseInt(digits(ltr));
   int zer = Integer.parseInt(zeros(ltr));
   String out = Integer.toString(dig);
   if (zer > 3)
   {
      out += " x 1e" + Integer.toString(zer);
      dig += zer;
      dig++;
   }
   out += " digits = " + Integer.toString(dig) + "<br>\r\n";
   return(out);
}
//___________________________________________________________________________
String clean(String str,String type)
{
   String st = str;
   if (type.equals("english")) st = st.toLowerCase();
   else st.toUpperCase();
   byte[] str2 = str.getBytes();
   StringBuffer buf = new StringBuffer();
   for (int i = 0; i < str2.length; i++)
   {
      if ((str2[i] >= 'a') & (str2[i] <= 'z') | (str2[i] >= 'A') & (str2[i] <= 'Z'))
      {
         buf.append((char)str2[i]);
      }
   }
   String out = buf.toString();
   if (out.length() > 7) out = out.substring(0,7);
   return(out);
}
//___________________________________________________________________________
String digits(String str)
{
   int total = 0;
   for (int i = 0; i < str.length(); i++)
   {
      String s = str.substring(i,i+1);
      int ii = Integer.parseInt(s);
      total += ii;
   }
   return(Integer.toString(total));
}
//___________________________________________________________________________
String zeros(String str)
{
   int total = 0;
   for (int i = str.length() - 1; i >= 0; i--)
   {
      String s = str.substring(i,i+1);
      if (s.equals("0")) total ++;
      else break;
   }
   return(Integer.toString(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());
}
//___________________________________________________________________________
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);
  }
}
//__________________________________________________
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 = 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 == 'R') v = 100;
      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 convert(String tr)
{
   String out = "";
   byte[] bb = tr.getBytes();
   for (int i = 0; i < bb.length; i++)
   {
      int val = bb[i];
      if (val < 0) val += 256;
      if (val == 65) out += "&#x05d0";
      else if (val == 66) out += "&#x05d1";
      else if (val == 71) out += "&#x05d2";
      else if (val == 68) out += "&#x05d3";
      else if (val == 72) out += "&#x05d4";
      else if (val == 86) out += "&#x05d5";
      else if (val == 90) out += "&#x05d6";
      else if (val == 67) out += "&#x05d7";
      else if (val == 84) out += "&#x05d8";
      else if (val == 89) out += "&#x05d9";
      else if (val == 75) out += "&#x05da";
      else if (val == 75) out += "&#x05db";
      else if (val == 76) out += "&#x05dc";
      else if (val == 77) out += "&#x05dd";
      else if (val == 77) out += "&#x05de";
      else if (val == 78) out += "&#x05df";
      else if (val == 78) out += "&#x05e0";
      else if (val == 83) out += "&#x05e1";
      else if (val == 73) out += "&#x05e2";
      else if (val == 70) out += "&#x05e3";
      else if (val == 70) out += "&#x05e4";
      else if (val == 69) out += "&#x05e5";
      else if (val == 69) out += "&#x05e6";
      else if (val == 81) out += "&#x05e7";
      else if (val == 82) out += "&#x05e8";
      else if (val == 74) out += "&#x05e9";
      else if (val == 79) out += "&#x05ea";
      else out += (char)val;
   }
   return(out);
}
//_____________________________________________________
String convertgreek(String tr)
{
   String out = "";
   String v = "";
   for (int i = 0; i < tr.length(); i++)
   {
      String st = tr.substring(i,i+1);
      if (st.equals("A")) v = "&#x0391";
      else if (st.equals("B")) v = "&#x0392";
      else if (st.equals("G")) v = "&#x0393";
      else if (st.equals("D")) v = "&#x0394";
      else if (st.equals("E")) v = "&#x0395";
      else if (st.equals("S")) v = "&#x03A3";
      else if (st.equals("Z")) v = "&#x0396";
      else if (st.equals("J")) v = "&#x0397";
      else if (st.equals("H")) v = "&#x0398";
      else if (st.equals("I")) v = "&#x0399";
      else if (st.equals("K")) v = "&#x039A";
      else if (st.equals("L")) v = "&#x039B";
      else if (st.equals("M")) v = "&#x039C";
      else if (st.equals("N")) v = "&#x039D";
      else if (st.equals("X")) v = "&#x039E";
      else if (st.equals("O")) v = "&#x039F";
      else if (st.equals("P")) v = "&#x03A0";
      else if (st.equals("R")) v = "&#x03A1";
      else if (st.equals("T")) v = "&#x03A4";
      else if (st.equals("U")) v = "&#x03A5";
      else if (st.equals("F")) v = "&#x03A6";
      else if (st.equals("C")) v = "&#x03A7";
      else if (st.equals("Q")) v = "&#x03A8";
      else if (st.equals("V")) v = "&#x03A9";

      else v = st;
      out += v;
   }
   return(out);
}
}//__________________________________________________________________________
