import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class f_four extends Applet implements Runnable{

   Thread th = null;
   Image os;
   Graphics og;
   String mf[] = {"{","{","|","|","~","","i","j","","I"};
   String form[] = {"S","S","S","S","","","","","",""};
   String fo[] = new String[10];
   String ca[] = new String[10];
   String cb[] = new String[10];
   String sf[] = new String[8];
   int msw[] = new int[10];
   int asw[] = new int[30];
   Font f1 = new Font("",Font.BOLD,30);
   Font f2 = new Font("",Font.BOLD,20);
   FontMetrics fm;
   int cs,sq=-1,aa;
   int px;
   int k1=-1,k2=-1;

   public void init(){
      os = createImage(360,260);
      og = os.getGraphics();

      d_set();

      addMouseListener(
         new MouseAdapter(){
            public void mousePressed(MouseEvent e){
               if((e.getY()>105)&&(e.getY()<135)){
                  cs = (e.getX() - 15)/30;
               }else if((e.getY()>30)&&(e.getY()<60)){
                  px = (e.getX() - 30)/30;
                  if(msw[px] == 0){
                     for(int rt = 0;rt<10-cs-1;rt ++){
                        fo[10-rt-1] = fo[10-rt-2];
                     }
                     fo[cs] = mf[px];
                     msw[px] = 1;
                     cs ++;
                  }
               }else if((e.getY()>75)&&(e.getY()<95)){
                  if((e.getX()>90)&&(e.getX()<150)){
                     d_set();
                  }else if((e.getX()>210)&&(e.getX()<270)){
                     for(int c1 = 0;c1 < 10;c1 ++){
                        ca[c1] = "";cb[c1] = "";cb[c1] = fo[c1];
                     }
                     k1 = -1;k2 = -1;
                     for(int ch = 0;ch < 10;ch ++){
                        if(cb[ch] == "i")k1 = ch;
                        if(cb[ch] == "j")k2 = ch;
                     }
                     if((k1 >= 0)&&(k2 > 0)&&(k1 < k2)){
                        for(int c1 = k1+1;c1 < k2;c1 ++){
                           ca[c1-k1-1] = cb[c1];
                        }
                        calc();
                        if(ca[1] == ""){
                           cb[k1] = ca[0];
                           for(int c1 = k1+1;c1 < 10;c1 ++){
                              if((c1-k1+k2)<10){
                                 cb[c1] = cb[c1-k1+k2];
                              }else{
                                 cb[c1] = "";
                              }
                           }

                        }
                     }
                     for(int c1 = 0;c1 < 10;c1 ++){
                        ca[c1] = cb[c1];
                     }
                     calc();
                     if(ca[1] ==""){
                        if((Integer.parseInt(ca[0])>0)&&(Integer.parseInt(ca[0])<31))asw[Integer.parseInt(ca[0])-1] = 1;
                        sq = Integer.parseInt(ca[0])-1;
                     }else{
                        sq = -1;
                     }
                  }
               }
               repaint();
            }
         } 
      );

   }

   public void paint(Graphics g){
      og.setColor(Color.white);
      og.fillRect(0,0,360,260);

      og.setFont(f1);
      fm = getFontMetrics(f1);

      for(int dr = 0;dr < 10;dr ++){
         if(msw[dr] == 0){
            og.setColor(Color.lightGray);
         }else{
            og.setColor(Color.gray);
         }
         og.fill3DRect(30*dr+30,30,30,30,true);
         og.setColor(Color.black);
         og.drawString(fo[dr],30*dr+30+(30-fm.stringWidth(fo[dr]))/2,135);
         og.drawString(mf[dr],30*dr+30+(30-fm.stringWidth(mf[dr]))/2,56);
      }

      og.setFont(f2);
      fm = getFontMetrics(f2);
      for(int dr = 0;dr < 30;dr ++){
         if(asw[dr] == 0){
            og.setColor(Color.lightGray);
         }else{
            og.setColor(Color.blue);
         }
         og.drawString(""+(dr+1),30*(dr%10)+30+(30-fm.stringWidth(Integer.toString(dr+1)))/2,176+(dr/10)*30);
      }

      og.setColor(Color.blue);
      og.drawRoundRect(90,75,60,20,5,5);
      if((sq >= 0)&&(sq < 30))og.drawRoundRect(sq%10*30+30,sq/10*30+153,30,30,10,10);
      og.setColor(Color.black);
      og.drawString("reset",90+(60-fm.stringWidth("reset"))/2,92);
      og.drawString("check",210+(60-fm.stringWidth("check"))/2,92);
      og.setColor(Color.gray);
      og.drawLine(cs*30+30,110,cs*30+30,140);
      og.setColor(Color.red);
      og.drawRoundRect(210,75,60,20,5,5);
      aa = 1;
      for(int c1 = 0;c1 < 30;c1 ++){
         aa = aa * asw[c1];
      }
      if(aa == 1){
         og.setFont(new Font("",Font.BOLD,60));
         og.setColor(Color.black);
         og.drawString("complete!!",50,220);
         og.setColor(Color.red);
         og.drawString("complete!!",45,215);
      }

      g.drawImage(os,0,0,this);

   }

   public void d_set(){
      for(int dr = 0;dr < 10;dr ++){
         fo[dr] = form[dr];
         msw[dr] = 0;
      }
      cs = 0;
   }

   public void calc(){
      for(int c1 = 0;c1 < 9;c1 ++){
         if((ca[c1] == "S")&&(ca[c1+1]) == "S"){
            if((c1 < 8)&&(ca[c1+2] == "S")){
               if((c1 < 7)&&(ca[c1+3] == "S")){
                  ca[c1] = "SSSS";
                  for(int c2 = c1+1;c2 < 10;c2 ++)ca[c2] = "";
               }else{
                  cs = c1;
                  ca[cs] = "SSS";
                  for(int c2 = cs+1;c2 < 8;c2 ++){
                     ca[c2] = ca[c2+2];
                  }
                  ca[8] = "";ca[9] = "";
               }
            }else{
               cs = c1;
               ca[cs] = "SS";
               for(int c2 = cs+1;c2 < 9;c2 ++){
                  ca[c2] = ca[c2+1];
               }
               ca[9] = "";
            }
         }
      }
      for(int c1 = 0;c1 < 9;c1 ++){
         if(ca[c1] == ""){
            if((ca[c1+1] == "S")||(Integer.parseInt(ca[c1+1]) == 16)){
               cs = c1;
               if(ca[c1+1] == "S")ca[cs] = "Q";
               if(Integer.parseInt(ca[c1+1]) == 16)ca[cs] = "S";
               for(int c2 = cs+1;c2 < 9;c2 ++){
                  ca[c2] = ca[c2+1];
               }
               ca[9] = "";
            }
         }
      }
      for(int c1 = 0;c1 < 10;c1 ++){
         if(ca[c1] == "I"){
            if((c1 > 0)&&(ca[c1-1] == "S")){
               cs = c1-1;
               ca[cs] = "QS";
               for(int c2 = cs+1;c2 < 9;c2 ++){
                  ca[c2] = ca[c2+1];
               }
               ca[9] = "";
            }
         }
      }
      for(int c1 = 0;c1 < 10;c1 ++){
         if((ca[c1] == "~")||(ca[c1] == "")){
            if((c1 > 0)&&(c1 < 9)){
               if((ca[c1-1] != "{")&&(ca[c1-1] != "|")&&(ca[c1-1] != "~")&&(ca[c1-1] != "")&&(ca[c1+1] != "{")&&(ca[c1+1] != "|")&&(ca[c1+1] != "~")&&(ca[c1+1] != "")){
                  cs = c1 - 1;
                  if(ca[c1] == "~"){
                     ca[cs] = Integer.toString(Integer.parseInt(ca[cs])*Integer.parseInt(ca[cs+2]));
                     for(int c2 = cs+1;c2 < 8;c2 ++){
                        ca[c2] = ca[c2+2];
                     }
                     ca[8]="";ca[9] = "";
                     c1 --;
                  }else{
                     if(Integer.parseInt(ca[cs])%Integer.parseInt(ca[cs+2]) == 0){
                        ca[cs] = Integer.toString(Integer.parseInt(ca[cs])/Integer.parseInt(ca[cs+2]));
                        for(int c2 = cs+1;c2 < 8;c2 ++){
                           ca[c2] = ca[c2+2];
                        }
                        ca[8]="";ca[9] = "";
                        c1 --;
                     }
                  }
               }
            }
         }
      }
      for(int c1 = 0;c1 < 10;c1 ++){
         if((ca[c1] == "{")||(ca[c1] == "|")){
            if((c1 > 0)&&(c1 < 9)){
               if((ca[c1-1] != "{")&&(ca[c1-1] != "|")&&(ca[c1+1] != "{")&&(ca[c1+1] != "|")){
                  cs = c1 - 1;
                  if(ca[c1] == "{"){
                     ca[cs] = Integer.toString(Integer.parseInt(ca[cs])+Integer.parseInt(ca[cs+2]));
                     for(int c2 = cs+1;c2 < 8;c2 ++){
                        ca[c2] = ca[c2+2];
                     }
                     ca[8]="";ca[9] = "";
                     c1 --;
                  }else{
                     ca[cs] = Integer.toString(Integer.parseInt(ca[cs])-Integer.parseInt(ca[cs+2]));
                     for(int c2 = cs+1;c2 < 8;c2 ++){
                        ca[c2] = ca[c2+2];
                     }
                     ca[8]="";ca[9] = "";
                     c1 --;
                  }
               }
            }
         }
      }
   }

   public void start(){
      if(th == null){
         th = new Thread(this);
         th.start();
      }
   }

   public void stop(){
      th = null;
   }

   public void run(){
      while(th != null){
         try{
            Thread.sleep(100);
         }
         catch (InterruptedException e){
         }
      }
   }

   public void update( Graphics g ){
      paint( g ) ;
   }
}