// Posita - a connection game by William S
//
// The objective is to form fewer connected groups than your opponent

import java.io.*;
// import java.util.*;


public class Posita {

static int[] a, d;
static int[][] f;
static byte[] x;
static char[] q;

   public static String lesTekst()
     {
    	String s = null;
     	BufferedReader inn= new BufferedReader(new InputStreamReader (System.in));
      	try
      	      {	s = inn.readLine(); }
	catch(IOException e){} 
      	return s;}

   public static int lesInt()
      {
      	int tall = 0;
      	String s = null; 
      	boolean done = false;

      	do
             {	s = lesTekst();   
         	try
         	    {	tall = Integer.parseInt(s);
            		done = true;   }     
         	catch(NumberFormatException e)
                    {   System.out.print("Illegal format! Enter an integer: ");
            		System.out.flush();}}
	while(!done);
        return tall;}


public static void main(String args[])
   {
      int b, c, e, g, h, i, j, m, n;
      x = new byte[14348907];
      a = new int[16];
      d = new int[16];
      f = new int[16][16];
      q = new char[3];

      System.out.println("\nOracle for Posita on a 15-triangle by J K Haugland");
      System.out.println("\nCounting positions...");

      for (b = 1; b <= 15; b++)
      for (c = 1; c <= 15; c++) f[b][c] = 0;

      f[1][2] = 1; f[1][3] = 1; f[2][3] = 1; f[2][4] = 1; f[2][5] = 1;
      f[3][5] = 1; f[3][6] = 1; f[4][5] = 1; f[4][7] = 1; f[4][8] = 1;
      f[5][6] = 1; f[5][8] = 1; f[5][9] = 1; f[6][9] = 1;

      f[6][10] = 1; f[7][8] = 1; f[7][11] = 1; f[7][12] = 1; f[8][9] = 1;
      f[8][12] = 1; f[8][13] = 1; f[9][10] = 1; f[9][13] = 1; f[9][14] = 1;
      f[10][14] = 1; f[10][15] = 1; f[11][12] = 1; f[12][13] = 1;

      f[13][14] = 1; f[14][15] = 1;

      for (b = 1; b <= 14; b++)
      for (c = b + 1; c <= 15; c++) f[c][b] = f[b][c];

      for (m = 0; m < 14348907; m++)
         {
            a[1] = (m /   4782969) % 3;
            a[2] = (m /   1594323) % 3;
            a[3] = (m /    531441) % 3;
            a[4] = (m /    177147) % 3;
            a[5] = (m /     59049) % 3;
            a[6] = (m /     19683) % 3;
            a[7] = (m /      6561) % 3;
            a[8] = (m /      2187) % 3;
            a[9] = (m /       729) % 3;
            a[10] = (m /      243) % 3;
            a[11] = (m /       81) % 3;
            a[12] = (m /       27) % 3;
            a[13] = (m /        9) % 3;
            a[14] = (m /        3) % 3;
            a[15] =  m % 3;

            b = 0;
            if (a[1] * a[2] * a[3] * a[4] * a[5] * a[6] * a[7] 
              * a[8] * a[9] * a[10] * a[11] * a[12] * a[13] *
              a[14] * a[15] > 0)
               {
                  for (c = 1; c <= 15; c++) d[c] = a[c];
                  c = 0;
                  for (e = 1; e <= 15; e++)
                  if (d[e] == 1)
                     {
                        d[e] = e + 2;
                        g = 1;
                        while (g > 0)
                           {
                              g = 0;
                              for (h = e; h <= 15; h++)
                                 if (d[h] == 1)
                                    {
                                       i = 0;
                                       for (j = e; j <= 15; j++)
                                          if (d[j] == e + 2 && f[h][j] == 1)
                                             i++;
                                       if (i > 0)
                                          {
                                             d[h] = e + 2;
                                             g++;
                                          }
                                    }
                           }
                        c++;
                     }
                  b = c;
                  c = 0;
                  for (e = 1; e <= 15; e++)
                  if (d[e] == 2)
                     {
                        d[e] = e + 2;
                        g = 1;
                        while (g > 0)
                           {
                              g = 0;
                              for (h = e; h <= 15; h++)
                                 if (d[h] == 2)
                                    {
                                       i = 0;
                                       for (j = e; j <= 15; j++)
                                          if (d[j] == e + 2 && f[h][j] == 1)
                                             i++;
                                       if (i > 0)
                                          {
                                             d[h] = e + 2;
                                             g++;
                                          }
                                    }
                           }
                        c++;
                     }
                  b = c - b;
               }
            x[m] = (byte)b;
         }
      System.out.print("\n0");

      for (c = 1; c <= 14; c++)
      {
      for (m = 0; m < 14348907; m++)
         {
            a[1] = (m /   4782969) % 3;
            a[2] = (m /   1594323) % 3;
            a[3] = (m /    531441) % 3;
            a[4] = (m /    177147) % 3;
            a[5] = (m /     59049) % 3;
            a[6] = (m /     19683) % 3;
            a[7] = (m /      6561) % 3;
            a[8] = (m /      2187) % 3;
            a[9] = (m /       729) % 3;
            a[10] = (m /      243) % 3;
            a[11] = (m /       81) % 3;
            a[12] = (m /       27) % 3;
            a[13] = (m /        9) % 3;
            a[14] = (m /        3) % 3;
            a[15] =  m % 3;
            b = 0;
            for (e = 1; e <= 15; e++) if (a[e] == 0) b++;
            if (b == c)
               {
                  for (e = 1; e <= 15; e++) d[e] = (3 - a[e]) % 3;
                  n = d[4] + 3 * (d[3] + 3 * (d[2] + 3 * d[1]));
                  n = d[7] + 3 * (d[6] + 3 * (d[5] + 3 * n));
                  n = d[10] + 3 * (d[9] + 3 * (d[8] + 3 * n));
                  n = d[13] + 3 * (d[12] + 3 * (d[11] + 3 * n));
                  n = d[15] + 3 * (d[14] + 3 * n);
                  g = 8; h = 1;
                  for (e = 1; e <= 15; e++)
                     {
                        if (d[16 - e] == 0)
                           {
                              i = -x[n + h];
                              if (i < g) g = i;
                           }
                        h = h * 3;
                     }
                  x[m] = (byte)g;
               }
          }
      System.out.print(" "+c);
      }
      System.out.println("");
      do
      {
      q[0] = '-'; q[1] = 'o'; q[2] = 'x';
      n = 0;
      for (b = 1; b <= 15; b++) a[b] = 0;
      for (c = 1; c <= 15; c++)
      {
         System.out.println("\n    "+q[a[1]]+"              01");
         System.out.println("   "+q[a[2]]+" "+q[a[3]]+"           02  03");
         System.out.println("  "+q[a[4]]+" "+q[a[5]]+" "+q[a[6]]+"        04  05  06");
         System.out.println(" "+q[a[7]]+" "+q[a[8]]+" "+q[a[9]]+" "+q[a[10]]+"     07  08  09  10");
         System.out.println(q[a[11]]+" "+q[a[12]]+" "+q[a[13]]+" "+q[a[14]]+" "+q[a[15]]+"  11  12  13  14  15");
         System.out.println("");
         for (b = 1; b <= 15; b++)
            if (a[b] == 0)
               {
                  for (e = 1; e <= 15; e++) d[e] = (3 - a[e]) % 3;
                  d[b] = 1;
                  n = d[4] + 3 * (d[3] + 3 * (d[2] + 3 * d[1]));
                  n = d[7] + 3 * (d[6] + 3 * (d[5] + 3 * n));
                  n = d[10] + 3 * (d[9] + 3 * (d[8] + 3 * n));
                  n = d[13] + 3 * (d[12] + 3 * (d[11] + 3 * n));
                  n = d[15] + 3 * (d[14] + 3 * n);
                  System.out.println("Value of "+b+": "+x[n]);
               }
         System.out.println("\nEnter next move (1-15)");
         do {
               b = lesInt();
            }
         while (b < 1 || b > 15 || a[b] != 0);
         for (e = 1; e <= 15; e++) a[e] = (3 - a[e]) % 3;
         a[b] = 1;
         q[0] = q[1]; q[1] = q[2]; q[2] = q[0]; q[0] = '-';
      }
      System.out.println("\n    "+q[a[1]]);
      System.out.println("   "+q[a[2]]+" "+q[a[3]]);
      System.out.println("  "+q[a[4]]+" "+q[a[5]]+" "+q[a[6]]);
      System.out.println(" "+q[a[7]]+" "+q[a[8]]+" "+q[a[9]]+" "+q[a[10]]);
      System.out.println(q[a[11]]+" "+q[a[12]]+" "+q[a[13]]+" "+q[a[14]]+" "+q[a[15]]);
      if (x[n] > 0) System.out.println("\nx wins by "+x[n]+" points");
      if (x[n] == 0) 
         {
            System.out.println("\nDraw");
            System.out.println("(This is sometimes considered a win for o)");
         }
      if (x[n] < 0) System.out.println("\no wins by "+(-x[n])+" points");
      System.out.println("\nEnter 0 to quit or any other integer to play again");
      i = lesInt();
      } while (i != 0);
   }
}
