/*
  Interpreter of the Turing Machine.
  An initial CURRENT_STATE of the Turing Machine is coded by 1,
  final CURRENT_STATE - by 99.
  The shift of the head to the right is designated through 1,
  to the left - through -1 .
*/

class tmmul2 {

    public static final int ltape=4400;  /* Length of a tape  */
    public static final int nunits=2000; /* Quantity of units, not of zero */
    public static int head;
    public static int state;

                 /* Indexes in array of the instructions,   */
                 /* an example - at the end of the program  */
    public static final int CURRENT_STATE  = 0;
    public static final int CURRENT_SYMBOL = 1;
    public static final int NEXT_SYMBOL    = 2;
    public static final int NEXT_STATE     = 3;
    public static final int MOVE           = 4;

    public static int[] tape = new int [ltape];

    public static void main (String args[])
        {
        head = ltape/2;     /* the head in the middle of a tape  */

        for (int i = 0; i < ltape; i++)      /* filling of zero  */
            tape[i] = 0;

        for (int i = head; i < head+nunits; i++)
            tape[i] = 1;

        long start = System.currentTimeMillis();

        test();

        long end = System.currentTimeMillis();
        System.out.println("Total time = "+ (end-start)*0.001);
        System.out.println("Instructions : " );
        System.out.println(" " );
        System.out.println("Final Tape : " );
        for (int i = 0; i < ltape; i++)
            System.out.print(tape[i]) ;
    }

    public static void test()
        {
        final int[][] instruction = {
        { 1  ,   0 ,    0 ,    99 ,   1     },
        { 1  ,   2 ,    2 ,     1 ,   1     },
        { 1  ,   1 ,    2 ,     2 ,  -1     },
        { 2  ,   2 ,    2 ,     2 ,  -1     },
        { 2  ,   0 ,    2 ,     1 ,   1     }
        };
    
       final int ninstr = instruction.length;
       state = 1;

       while (state != 99)
           {
           int   tapehead = tape[head];
           for (int iinstr = 0; iinstr < ninstr; iinstr++)
               {
               int[] instr = instruction[iinstr];
               if (state    == instr[CURRENT_STATE] )
               {
               if (tapehead == instr[CURRENT_SYMBOL])
                   {
                   state=instr[NEXT_STATE];
                   tape[head]=instr[NEXT_SYMBOL];
                   head+=instr[MOVE];
                   };
               };
               };
           }
        }


}