using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace tfymAntikytheraPuzzleSolver { public class tfymAntikytheraPuzzleSolver { public static bool tfymBAbortProgram = false; public static bool tfymBSolved = false; public static int tfymILargestSolved = 0; public static int tfymIIterations = 0; public static int tfymIIterationsPhaser = 0; public static int tfymIColumnsAtSweetspot = 0; public static int tfymISweetspot = 42; public static int tfymILayer1ColPosMod = 0; public static int tfymILayer2ColPosMod = 0; public static int tfymILayer3ColPosMod = 0; public static int tfymILayer4ColPosMod = 0; public static int tfymILayer5ColPosMod = 0; public static tfymLayer1Class tfymLayer1 = new tfymLayer1Class(); public static tfymLayer2Class tfymLayer2 = new tfymLayer2Class(); public static tfymLayer3Class tfymLayer3 = new tfymLayer3Class(); public static tfymLayer4Class tfymLayer4 = new tfymLayer4Class(); public static tfymLayer5Class tfymLayer5 = new tfymLayer5Class(); static void Main(string[] tfymParamALArgs) { int tfymIColumnsLoop = 0; int tfymIRowsLoop = 0; int tfymISweetspotsLoop = 0; if (tfymBAbortProgram == false) { tfymFFillLayer("1", "16,8,7,8,8,3,4,12,2,5,10,7", tfymLayer1.tfymRows, 0); tfymFFillLayer("1", "21,21,9,9,4,4,6,6,3,3,14,14", tfymLayer1.tfymRows, 1); tfymFFillLayer("1", "12,13,14,15,4,5,6,7,8,9,10,11", tfymLayer1.tfymRows, 2); tfymFFillLayer("1", "11,14,11,14,11,11,14,11,14,11,14,14", tfymLayer1.tfymRows, 3); tfymFFillLayer("2", "12,0,6,0,10,0,10,0,1,0,9,0", tfymLayer2.tfymRows, 0); tfymFFillLayer("2", "2,13,9,0,17,19,3,12,3,26,6,0", tfymLayer2.tfymRows, 1); tfymFFillLayer("2", "6,0,14,12,3,8,9,0,9,20,12,3", tfymLayer2.tfymRows, 2); tfymFFillLayer("2", "7,14,11,0,8,0,16,2,7,0,9,0", tfymLayer2.tfymRows, 3); tfymFFillLayer("3", "22,0,16,0,9,0,5,0,10,0,8,0", tfymLayer3.tfymRows, 0); tfymFFillLayer("3", "11,26,14,1,12,0,21,6,15,4,9,18", tfymLayer3.tfymRows, 1); tfymFFillLayer("3", "17,4,5,0,7,8,9,13,9,7,13,21", tfymLayer3.tfymRows, 2); tfymFFillLayer("4", "15,0,0,14,0,9,0,12,0,4,0,7", tfymLayer4.tfymRows, 0); tfymFFillLayer("4", "6,0,11,11,6,11,0,6,17,7,3,0", tfymLayer4.tfymRows, 1); tfymFFillLayer("5", "15,0,8,0,3,0,6,0,10,0,7,0", tfymLayer5.tfymRows, 0); } if (tfymBAbortProgram == false) { //for (tfymISweetspotsLoop=0; tfymISweetspotsLoop<50; tfymISweetspotsLoop++) { //tfymISweetspot = tfymISweetspotsLoop; Console.WriteLine("Trying sweetspot: " + tfymISweetspot.ToString()); //Console.ReadLine(); do { tfymFAddColumns(); if (tfymBSolved == false) { tfymILayer5ColPosMod++; if (tfymILayer5ColPosMod > 11) { tfymILayer5ColPosMod = 0; tfymILayer4ColPosMod++; if (tfymILayer4ColPosMod > 11) { tfymILayer4ColPosMod = 0; tfymILayer3ColPosMod++; if (tfymILayer3ColPosMod > 11) { tfymILayer3ColPosMod = 0; tfymILayer2ColPosMod++; if (tfymILayer2ColPosMod > 11) { tfymILayer2ColPosMod = 0; tfymILayer1ColPosMod++; //Console.WriteLine("Incrementing Layer 1: " + tfymILayer1ColPosMod.ToString()); if (tfymILayer1ColPosMod > 11) { tfymBAbortProgram = true; Console.WriteLine("All layers tried. Iterations: " + tfymIIterations.ToString()); //Console.ReadLine(); } } } } } } if (tfymIColumnsAtSweetspot > tfymILargestSolved || tfymIColumnsAtSweetspot >= 12) { //Console.WriteLine("tfymIColumnsAtSweetspot [" + tfymIColumnsAtSweetspot.ToString() + "] greater than tfymILargestSolved [" + tfymILargestSolved.ToString() + "]"); tfymILargestSolved = tfymIColumnsAtSweetspot; for (tfymIRowsLoop = 0; tfymIRowsLoop < 4 && tfymBAbortProgram == false; tfymIRowsLoop++) { for (tfymIColumnsLoop = 0; tfymIColumnsLoop < 12 && tfymBAbortProgram == false; tfymIColumnsLoop++) { if (tfymIColumnsLoop > 0) { //Console.Write("\t"); } switch (tfymIRowsLoop) { case 0: //Console.Write(tfymLayer5.tfymRows.tfymALRows[0].tfymALColumns.tfymSlots[tfymFReturnColPosMod(tfymIColumnsLoop, tfymILayer5ColPosMod)].ToString()); break; case 1: //Console.Write(tfymLayer4.tfymRows.tfymALRows[0].tfymALColumns.tfymSlots[tfymFReturnColPosMod(tfymIColumnsLoop, tfymILayer5ColPosMod)].ToString()); break; case 2: //Console.Write(tfymLayer3.tfymRows.tfymALRows[0].tfymALColumns.tfymSlots[tfymFReturnColPosMod(tfymIColumnsLoop, tfymILayer5ColPosMod)].ToString()); break; case 3: //Console.Write(tfymLayer2.tfymRows.tfymALRows[0].tfymALColumns.tfymSlots[tfymFReturnColPosMod(tfymIColumnsLoop, tfymILayer5ColPosMod)].ToString()); break; } } //Console.Write("\r\n"); } //Console.Write("New Largest\r\n"); //Console.ReadLine(); } } while (tfymBSolved == false && tfymBAbortProgram == false); tfymBAbortProgram = false; } } Console.WriteLine("Completed. Press ENTER To Exit"); Console.ReadLine(); } static void tfymFAddColumns() { int tfymIColumnsLoop = 0; int tfymIRowsLoop = 0; int tfymISlotValue = 0; string tfymSLayerId = ""; int tfymIStage = 0; int[] tfymALColumnTotals = new int[12]; List> tfymALColumnSlotValue = new List>(); try { tfymIStage = 1; tfymIIterationsPhaser++; if (tfymIIterationsPhaser > 50000) { tfymIIterationsPhaser = 0; Console.WriteLine("Iterations heartbeat: " + tfymIIterations.ToString()); } tfymIColumnsAtSweetspot = 0; tfymIIterations++; for (tfymIRowsLoop = 0; tfymIRowsLoop < 4 && tfymBAbortProgram == false; tfymIRowsLoop++) { tfymALColumnSlotValue.Add(new List()); for (tfymIColumnsLoop = 0; tfymIColumnsLoop < 12; tfymIColumnsLoop++) { tfymALColumnSlotValue[tfymALColumnSlotValue.Count - 1].Add(0); } } tfymIStage = 2; for (tfymIRowsLoop = 0; tfymIRowsLoop < 4 && tfymBAbortProgram == false; tfymIRowsLoop++) { tfymIStage = 21; for (tfymIColumnsLoop = 0; tfymIColumnsLoop < 12 && tfymBAbortProgram == false; tfymIColumnsLoop++) { tfymIStage = 22; switch (tfymIRowsLoop) { case 0: tfymIStage = 23; tfymSLayerId = "5"; tfymISlotValue = tfymLayer5.tfymRows.tfymALRows[0].tfymALColumns.tfymSlots[tfymFReturnColPosMod(tfymIColumnsLoop, tfymILayer5ColPosMod)]; if (tfymISlotValue == 0) { tfymSLayerId = "4"; tfymISlotValue = tfymLayer4.tfymRows.tfymALRows[1].tfymALColumns.tfymSlots[tfymFReturnColPosMod(tfymIColumnsLoop, tfymILayer4ColPosMod)]; if (tfymISlotValue == 0) { tfymSLayerId = "3"; tfymISlotValue = tfymLayer3.tfymRows.tfymALRows[2].tfymALColumns.tfymSlots[tfymFReturnColPosMod(tfymIColumnsLoop, tfymILayer3ColPosMod)]; if (tfymISlotValue == 0) { tfymSLayerId = "2"; tfymISlotValue = tfymLayer2.tfymRows.tfymALRows[3].tfymALColumns.tfymSlots[tfymFReturnColPosMod(tfymIColumnsLoop, tfymILayer2ColPosMod)]; if (tfymISlotValue == 0) { tfymSLayerId = "1"; tfymISlotValue = tfymLayer1.tfymRows.tfymALRows[3].tfymALColumns.tfymSlots[tfymFReturnColPosMod(tfymIColumnsLoop, tfymILayer1ColPosMod)]; } } } } break; case 1: tfymIStage = 24; tfymSLayerId = "4"; tfymISlotValue = tfymLayer4.tfymRows.tfymALRows[0].tfymALColumns.tfymSlots[tfymFReturnColPosMod(tfymIColumnsLoop, tfymILayer4ColPosMod)]; if (tfymISlotValue == 0) { tfymSLayerId = "3"; tfymISlotValue = tfymLayer3.tfymRows.tfymALRows[1].tfymALColumns.tfymSlots[tfymFReturnColPosMod(tfymIColumnsLoop, tfymILayer3ColPosMod)]; if (tfymISlotValue == 0) { tfymSLayerId = "2"; tfymISlotValue = tfymLayer2.tfymRows.tfymALRows[1].tfymALColumns.tfymSlots[tfymFReturnColPosMod(tfymIColumnsLoop, tfymILayer2ColPosMod)]; if (tfymISlotValue == 0) { tfymSLayerId = "1"; tfymISlotValue = tfymLayer1.tfymRows.tfymALRows[1].tfymALColumns.tfymSlots[tfymFReturnColPosMod(tfymIColumnsLoop, tfymILayer1ColPosMod)]; } } } break; case 2: tfymIStage = 25; tfymSLayerId = "3"; tfymISlotValue = tfymLayer3.tfymRows.tfymALRows[0].tfymALColumns.tfymSlots[tfymFReturnColPosMod(tfymIColumnsLoop, tfymILayer3ColPosMod)]; tfymIStage = 251; if (tfymISlotValue == 0) { tfymIStage = 252; tfymSLayerId = "2"; tfymISlotValue = tfymLayer2.tfymRows.tfymALRows[1].tfymALColumns.tfymSlots[tfymFReturnColPosMod(tfymIColumnsLoop, tfymILayer2ColPosMod)]; tfymIStage = 253; if (tfymISlotValue == 0) { tfymSLayerId = "1"; tfymISlotValue = tfymLayer1.tfymRows.tfymALRows[1].tfymALColumns.tfymSlots[tfymFReturnColPosMod(tfymIColumnsLoop, tfymILayer1ColPosMod)]; tfymIStage = 254; } } break; case 3: tfymIStage = 26; tfymSLayerId = "2"; tfymISlotValue = tfymLayer2.tfymRows.tfymALRows[0].tfymALColumns.tfymSlots[tfymFReturnColPosMod(tfymIColumnsLoop, tfymILayer2ColPosMod)]; if (tfymISlotValue == 0) { tfymSLayerId = "1"; tfymISlotValue = tfymLayer1.tfymRows.tfymALRows[0].tfymALColumns.tfymSlots[tfymFReturnColPosMod(tfymIColumnsLoop, tfymILayer1ColPosMod)]; } break; } //Console.WriteLine("[tfymFAddColumns] Layer ["+ tfymSLayerId + "] Row [" + tfymIRowsLoop.ToString() + "] Column [" + tfymIColumnsLoop.ToString() + "]: " + tfymISlotValue.ToString()); tfymIStage = 27; tfymALColumnSlotValue[tfymIRowsLoop][tfymIColumnsLoop] += tfymISlotValue; } } tfymIStage = 3; for (tfymIRowsLoop = 0; tfymIRowsLoop < 4 && tfymBAbortProgram == false; tfymIRowsLoop++) { for (tfymIColumnsLoop = 0; tfymIColumnsLoop < 12 && tfymBAbortProgram == false; tfymIColumnsLoop++) { if (tfymIColumnsAtSweetspot > tfymILargestSolved || tfymIColumnsAtSweetspot >= 12) { if (tfymIColumnsLoop > 0) { //Console.Write("\t"); } //Console.Write(tfymALColumnSlotValue[tfymIRowsLoop][tfymIColumnsLoop]); } tfymALColumnTotals[tfymIColumnsLoop] += tfymALColumnSlotValue[tfymIRowsLoop][tfymIColumnsLoop]; } if (tfymIColumnsAtSweetspot > tfymILargestSolved || tfymIColumnsAtSweetspot >= 12) { //Console.Write("\r\n"); } } tfymIStage = 4; for (tfymIColumnsLoop = 0; tfymIColumnsLoop < 12 && tfymBAbortProgram == false; tfymIColumnsLoop++) { if (tfymIColumnsAtSweetspot > tfymILargestSolved || tfymIColumnsAtSweetspot >= 12) { if (tfymIColumnsLoop > 0) { //Console.Write("\t"); } //Console.Write(tfymALColumnTotals[tfymIColumnsLoop]); } if (tfymALColumnTotals[tfymIColumnsLoop] == tfymISweetspot) { tfymIColumnsAtSweetspot++; } } tfymIStage = 5; if (tfymIColumnsAtSweetspot > tfymILargestSolved || tfymIColumnsAtSweetspot>=12) { //Console.Write("\r\n"); } if (tfymIColumnsAtSweetspot >= 12) { //Console.WriteLine("Solved set to true."); tfymBSolved = true; tfymFShowStats(); } } catch (Exception tfymException) { Console.WriteLine("[tfymFAddColumns] ERROR: " + tfymException.Message); Console.WriteLine("[tfymFAddColumns] tfymIStage: " + tfymIStage.ToString()); Console.WriteLine("tfymALRows.Count: "+tfymLayer1.tfymRows.tfymALRows.Count.ToString()); Console.WriteLine("tfymSlots.Length: "+tfymLayer1.tfymRows.tfymALRows[1].tfymALColumns.tfymSlots.Length.ToString()); Console.WriteLine("Return Col Pos Mod: "+tfymFReturnColPosMod(tfymIColumnsLoop, tfymILayer1ColPosMod).ToString()); Console.WriteLine("Columns Loop: " + tfymIColumnsLoop.ToString()); Console.WriteLine("Layer1ColPosMod: "+tfymILayer1ColPosMod.ToString()); tfymBAbortProgram = true; } } static void tfymFShowStats() { //Console.WriteLine("tfymBAbortProgram: " + tfymBAbortProgram.ToString()); Console.WriteLine("Iterations: " + tfymIIterations.ToString() + "\tSolved Columns: " + tfymIColumnsAtSweetspot.ToString()); Console.WriteLine("Set-up for solution:"); Console.WriteLine("\tTop layer (5): 15 at top."); Console.WriteLine("\tLayer (4): 22 at top."); Console.WriteLine("\tLayer (3): 15 at top."); Console.WriteLine("\tLayer (2): 15 at top."); Console.WriteLine("\tBottom layer (1): 7 to left and 8 to right of Layer 2 '12'."); Console.WriteLine("Layer Movements"); Console.WriteLine("Note: each cut out spot is the number zero '0'."); if (tfymILayer5ColPosMod > 0) { Console.WriteLine("Move Top Layer (5) Counter-clockwise " + tfymILayer5ColPosMod.ToString() + " numbers."); } if (tfymILayer4ColPosMod > 0) { Console.WriteLine("Move Layer (4) Counter - clockwise " + tfymILayer4ColPosMod.ToString() + " numbers."); } if (tfymILayer3ColPosMod > 0) { Console.WriteLine("Move Layer (3) Counter-clockwise " + tfymILayer3ColPosMod.ToString() + " numbers."); } if (tfymILayer2ColPosMod > 0) { Console.WriteLine("Move Layer (2) Counter-clockwise " + tfymILayer2ColPosMod.ToString() + " numbers."); } if (tfymILayer1ColPosMod > 0) { Console.WriteLine("Move Bottom Layer (1) Counter-clockwise " + tfymILayer1ColPosMod.ToString() + " numbers."); } } static int tfymFReturnColPosMod(int tfymParamIColumnsLoop, int tfymParamILayerColPosMod) { int tfymReturn = 0; try { tfymReturn = tfymParamIColumnsLoop + tfymParamILayerColPosMod; while (tfymReturn > 11) { tfymReturn -= 12; } } catch (Exception tfymException) { tfymBAbortProgram = true; Console.WriteLine("[tfymFReturnColPosMod] ERROR: " + tfymException.Message); } return tfymReturn; } static void tfymFFillLayer(string tfymParamSLayerId, string tfymParamALValues, tfymRowsClass tfymParamRows, int tfymParamIRowPos) { int tfymILoop = 0; string[] tfymALValuesSplit = null; try { tfymALValuesSplit = tfymParamALValues.Split(','); for (tfymILoop = 0; tfymILoop < 12 && tfymBAbortProgram == false; tfymILoop++) { tfymParamRows.tfymALRows[tfymParamIRowPos].tfymALColumns.tfymSlots[tfymILoop] = int.Parse(tfymALValuesSplit[tfymILoop]); } //Console.WriteLine("[tfymFFillLayer] Layer [" + tfymParamSLayerId + "] Set Row " + tfymParamIRowPos.ToString() + ": " + tfymParamALValues); } catch (Exception tfymException) { tfymBAbortProgram = true; Console.WriteLine("[tfymFFillLayer] ERROR: " + tfymException.Message); } } } public class tfymLayer1Class { public tfymRowsClass tfymRows = null; public tfymLayer1Class() { tfymFClearValues(); } public void tfymFClearValues() { tfymRows = new tfymRowsClass(4); } } public class tfymLayer2Class { public tfymRowsClass tfymRows = null; public tfymLayer2Class() { tfymFClearValues(); } public void tfymFClearValues() { tfymRows = new tfymRowsClass(4); } } public class tfymLayer3Class { public tfymRowsClass tfymRows = null; public tfymLayer3Class() { tfymFClearValues(); } public void tfymFClearValues() { tfymRows = new tfymRowsClass(3); } } public class tfymLayer4Class { public tfymRowsClass tfymRows = null; public tfymLayer4Class() { tfymFClearValues(); } public void tfymFClearValues() { tfymRows = new tfymRowsClass(2); } } public class tfymLayer5Class { public tfymRowsClass tfymRows = null; public tfymLayer5Class() { tfymFClearValues(); } public void tfymFClearValues() { tfymRows = new tfymRowsClass(1); } } public class tfymRowsClass { public int tfymIRowsMax = 0; public List tfymALRows = new List(); public tfymRowsClass(int tfymParamIRowsMax) { tfymFClearValues(tfymParamIRowsMax); } public void tfymFClearValues(int tfymParamIRowsMax) { int tfymILoop = 0; tfymIRowsMax = tfymParamIRowsMax; for (tfymILoop = 0; tfymILoop < tfymIRowsMax; tfymILoop++) { tfymALRows.Add(new tfymRowClass()); } } } public class tfymRowClass { public tfym12SlotColumnsClass tfymALColumns = null; public tfymRowClass() { tfymVoidClearValues(); } public void tfymVoidClearValues() { tfymALColumns = new tfym12SlotColumnsClass(); } } public class tfym12SlotColumnsClass { public int[] tfymSlots = null; public tfym12SlotColumnsClass() { tfymVoidClearValues(); } public void tfymVoidClearValues() { tfymSlots = new int[12]; } } }