// 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); } }