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

public class alphametics extends Applet implements Runnable{

   Thread th = null;
   Image os;
   Graphics og;
   String bua[][] = {{"E","N","O","S","U","Y","","","",""},
                     {"D","E","M","N","O","R","S","Y","",""},
                     {"A","E","H","I","R","S","T","V","Y",""},
                     {"E","F","I","N","O","R","S","T","X","Y"},
                     {"E","F","H","I","L","N","R","T","V","Y"},
                     {"E","H","I","N","R","S","T","V","Y",""},
                     {"A","E","F","H","I","N","R","T","U","W"},
                     {"A","E","L","N","O","P","R","S","T","U"}};
   int bnt[][] = {{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
                  { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}};
   int btd[][][] = {{{ 1, 2, 2, 3,-1,-1,-1,-1},{ 4, 2, 5,-1,-1,-1,-1,-1},{ 0, 0, 3,-1,-1,-1,-1,-1},{-1,-1,-1,-1,-1,-1,-1,-1},{-1,-1,-1,-1,-1,-1,-1,-1}},
                    {{ 7, 1, 3, 4, 2,-1,-1,-1},{ 1, 5, 4, 2,-1,-1,-1,-1},{ 0, 3, 1, 6,-1,-1,-1,-1},{-1,-1,-1,-1,-1,-1,-1,-1},{-1,-1,-1,-1,-1,-1,-1,-1}},
                    {{ 8, 5, 0, 1,-1,-1,-1,-1},{ 8, 4, 1, 7,-1,-1,-1,-1},{ 5, 3,-1,-1,-1,-1,-1,-1},{ 5, 3, 2, 6,-1,-1,-1,-1},{-1,-1,-1,-1,-1,-1,-1,-1}},
                    {{ 9, 7, 8, 2, 6,-1,-1,-1},{ 3, 0, 7,-1,-1,-1,-1,-1},{ 3, 0, 7,-1,-1,-1,-1,-1},{ 9, 7, 5, 4, 1,-1,-1,-1},{-1,-1,-1,-1,-1,-1,-1,-1}},
                    {{ 9, 7, 6, 3, 2, 7,-1,-1},{ 5, 0, 8, 0, 4, 0,-1,-1},{ 0, 5, 3, 5,-1,-1,-1,-1},{ 0, 8, 3, 1,-1,-1,-1,-1},{ 0, 8, 3, 1,-1,-1,-1,-1}},
                    {{ 8, 6, 4, 2, 1, 6,-1,-1},{ 3, 0, 7, 0, 5,-1,-1,-1},{ 3, 0, 7, 0, 5,-1,-1,-1},{ 3, 0, 7, 0, 5,-1,-1,-1},{ 0, 3, 2, 3,-1,-1,-1,-1}},
                    {{ 1, 6, 8, 7, 0, 5,-1,-1},{ 6, 1, 7, 0, 9,-1,-1,-1},{ 1, 6, 4, 2,-1,-1,-1,-1},{ 6, 4, 0,-1,-1,-1,-1,-1},{ 3, 7, 6, 0, 1,-1,-1,-1}},
                    {{ 7, 8, 1, 3, 0, 2, 5,-1},{ 4, 8, 9, 2, 5,-1,-1,-1},{ 1, 3, 9, 8, 5, 1, 3,-1},{ 7, 9, 3, 0, 6, 9,-1,-1},{ 3, 6, 9, 8, 0, 7,-1,-1}}};
   String ua[] = new String[10];
   int nt[][] = new int[2][10];
   int td[][] = new int[5][8];
   int px,py,sx,sy,pn = 0;
   int fg = 0,ch = 0,ps,as,sw;
   Font f = new Font("Century",Font.PLAIN,40);
   FontMetrics fm = getFontMetrics(f);
   int fw;
   int tr1x[] = {22,55,55,22},tr1y[] = {180,160,200,180},tr2x[] = {385,418,385,385},tr2y[] = {160,180,200,160};

   public void init(){
      setBackground(new Color(255,204,255));
      os = createImage(550,450);
      og = os.getGraphics();
      R_set();
      addMouseListener(
         new MouseAdapter(){
            public void mousePressed(MouseEvent e){
               px = (e.getX() - 20) / 40;
               py = (e.getY() - 280) / 40;
               if(fg == 0){
                  if((px>=0)&&(px<=9)&&(py>=0)&&(py<=1)){
                     sx = px ; sy = py ;
                     fg = 1 ;
                  }
               }else if(fg == 1){
                  if((px>=0)&&(px<=9)&&(py>=0)&&(py<=1)){
                     sw = nt[py][px] ; nt[py][px] = nt[sy][sx] ; nt[sy][sx] = sw ;
                     fg = 0; 
                  }
               }
               if((px==0)&&(py==-2)){
                  pn = pn - 1;
                  if(pn < 0){pn = 0;}
                  R_set();
               }
               if((px==9)&&(py==-2)){
                  pn = pn + 1;
                  if(pn > 7){pn = 7;}
                  R_set();
               }
               repaint();
            }
         }
      );
   }

   public void paint(Graphics g){
      og.setColor(new Color(255,204,255)); 
      og.fillRect(0,0,550,450);
      og.setColor(new Color(255,255,255)); 
      og.fillRect(58,18,324,204);
      og.setColor(new Color(0,0,0)); 
      og.drawRect(58,18,324,204);
      og.setColor(new Color(0,0,204)); 
      og.fillPolygon(tr1x,tr1y,4);
      og.fillPolygon(tr2x,tr2y,4);
      og.setColor(new Color(0,0,153)); 
      og.drawPolygon(tr1x,tr1y,4);
      og.drawPolygon(tr2x,tr2y,4);
      og.setColor(new Color(0,0,0));
      for(int i = 0 ; i < 10 ; i ++){
         for(int j = 0 ; j < 2 ; j ++){
            og.setColor(new Color(255,255,255));
            og.fillRect(20+i*40,240+j*40,39,39);
         }
      }
      for(int ix = 0 ; ix < 8 ; ix ++){
         for(int iy = 0 ; iy < 5 ; iy ++){
            if(td[iy][ix] != -1){
               og.setColor(new Color(0,0,0));
               if(nt[0][td[iy][ix]] != -1){
                  og.setColor(new Color(0,0,255));
                  og.setFont(new Font("Century",Font.BOLD,16));
                  og.drawString(""+ua[td[iy][ix]],340-ix*40,195-iy*40);
                  og.setColor(new Color(0,0,0));
                  og.setFont(f);
                  og.drawString(""+nt[0][td[iy][ix]],350-ix*40,215-iy*40);
               }else{
                  fw = fm.stringWidth(ua[td[iy][ix]]);
                  og.setColor(new Color(0,0,0));
                  og.setFont(f);
                  og.drawString(""+ua[td[iy][ix]],340-ix*40+((40-fw)/2),215-iy*40);
               }
            }
         }
      }
      for(int ix = 0 ; ix < 10 ; ix ++){
         for(int iy = 0 ; iy < 2 ; iy ++){
            if(nt[iy][ix] != -1){
               og.setColor(new Color(228,228,255));
               og.fill3DRect(21+40*ix,281+iy*40,36,36,true);
               og.setColor(new Color(24,24,102));
               og.setFont(f);
               og.drawString(""+nt[iy][ix],30+40*ix,312+iy*40);
            }
         }
      }
      for(int i = 0 ; i < 10 ; i ++){
         og.setColor(new Color(0,0,0));
         og.setFont(f);
         fw = fm.stringWidth(ua[i]);
         og.drawString(""+ua[i],20+i*40+((40-fw)/2),275);
      }
      ch = 1;
      for(int i = 0 ; i < 10 ; i ++){
         if((ua[i] != "") && (nt[0][i] == -1)){
            ch = 0;
         }
      }
      ps = 0 ; as = 0;
      if(ch == 1){
         for(int i = 0 ; i < 8 ; i ++){
            for(int j = 1 ; j < 5  ; j ++){
               if(td[j][i] != -1){
                  ps = ps + nt[0][td[j][i]]*(int)Math.pow(10,(double)i);
               }
            }
            if(td[0][i] != -1){
               as = as + nt[0][td[0][i]]*(int)Math.pow(10,(double)i);
            }
         }
      }
      if((ps == as) && (ps != 0)){
         og.setColor(new Color(0,0,255));
      }else{
         og.setColor(new Color(255,0,0));
      }
      og.drawLine(70,180,370,180);
      og.drawLine(70,181,370,181);
      og.drawRect(60,20,320,200);
      og.drawRect(61,21,318,198);
      og.drawLine(70,150,100,150);
      og.drawLine(70,151,100,151);
      og.drawLine(85,135,85,165);
      og.drawLine(86,135,86,165);
      if(fg == 1){
         og.setColor(new Color(255,0,0)); 
         og.drawRect(sx*40+21,sy*40+281,36,36);
      }
      og.setColor(new Color(228,228,250)); 
      og.fill3DRect(65,25,60,30,true);
      og.setColor(new Color(0,0,153)); 
      og.setFont(new Font("Century",Font.ITALIC,24));
      og.drawString("No."+(pn+1),70,49);
      g.drawImage(os,0,0,this );
   }

   public void R_set(){
      for(int i = 0 ; i < 10 ; i ++){
         for(int j = 0 ; j < 2 ; j ++){
            nt[j][i] = bnt[j][i];
         }
         ua[i] = bua[pn][i];
      }
      for(int i = 0 ; i < 8 ; i ++){
         for(int j = 0 ; j < 5 ; j ++){
            td[j][i] = btd[pn][j][i];
         }
      }
      return;
   }

   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(30);
         }
         catch (InterruptedException e){ }
      }
   }

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

}