From 0cb031d410a4510bf664da268420db9c76b5c6bc Mon Sep 17 00:00:00 2001 From: StrangeAmjad <75653453+StrangeAmjad@users.noreply.github.com> Date: Mon, 13 Jun 2022 17:58:17 +0300 Subject: [PATCH 1/3] Add files via upload --- med.cs | 269 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 269 insertions(+) create mode 100644 med.cs diff --git a/med.cs b/med.cs new file mode 100644 index 0000000..99f34fe --- /dev/null +++ b/med.cs @@ -0,0 +1,269 @@ + +namespace Bishop +{ + class med + { + /* my monkey brain brute forced this code, haven't checked it but it worked for the provided case + * so i would like to see it break for other cases too if possible + */ + public static void Main(String[] args) + { + String start; + String dest; + String[] path; + start = "F1"; + dest = "K14"; + path = getBishopPath(16,14,start, dest); + + Console.Write("{"); + foreach (String move in path) + { + if (move != path[path.Length - 1]) + { + Console.Write(move + ","); + } + else + { + Console.Write(move); + } + } + Console.Write("}"); + } + + public static String[] getBishopPath(int n, int m, String start, String dest) + { + if (dest == start) + { + String[] outList = { start }; + return outList; + } + String[] pathList = AllPossiblePaths(n,m,start,dest); + if (pathList != null && pathList.Contains(dest)) + { + String[] outList = { start, dest }; + return outList; + + } + if (pathList != null && !pathList.Contains(dest)) + { + List checkedP = new List(); + foreach (String path in pathList) + { + String[] startPath = { start }; + checkedP.Add(getBishopPathRec(n, m, path, dest, startPath)); + + if (!checkedP.Contains(getBishopPathRec(n, m, path, dest, startPath))) + { + checkedP.Add(getBishopPathRec(n, m, path, dest, startPath)); + } + + } + checkedP.Reverse(); + return checkedP.MinBy(p => p.Length); + } + return null; + + } + public static String[] getBishopPathRec(int n, int m, String start, String dest, String[] prevpath) + { + String[] pathList = AllPossiblePaths(n,m,start,dest); + if (pathList != null && pathList.Contains(dest)) + { + String[] prevpathRec = new string[prevpath.Length + 2]; + for (int i = 0; i < prevpath.Length; i++) + { + prevpathRec[i] = prevpath[i]; + } + prevpathRec[prevpathRec.Length - 2] = start; + prevpathRec[prevpathRec.Length - 1] = dest; + return prevpathRec; + } + if (pathList != null && !pathList.Contains(dest)) + { + String[] prevpathRec = new string[prevpath.Length + 1]; + for (int i = 0; i < prevpath.Length; i++) + { + + prevpathRec[i] = prevpath[i]; + } + prevpathRec[prevpathRec.Length - 1] = start; + foreach (String path in pathList) + { + if (!prevpathRec.Contains(path)) + { + return getBishopPathRec(n, m, path, dest, prevpathRec); + + } + } + + } + return null; + + } + + private static String[] AllPossiblePaths(int n, int m,String start, String dest) + { + List solvedLetters = new List(); + int[] encodedStart = Encoder(start); + int currentColunm = encodedStart[0]; + + int currentRow = encodedStart[1]; + + int[] encodeddest = Encoder(dest); + int destColunm = encodeddest[0]; + + int destRow = encodeddest[1]; + + + // if they have the same slope, then a bishop can move in it's direction + if (currentRow-currentColunm == destRow - destColunm) return new string[] {start,dest}; + if (currentRow + currentColunm == destRow + destColunm) return new string[] { start, dest }; + + // diagonal movement is done by switching the letter and the number by increments and decrements of 1 + int j = currentRow; + int k = currentRow; + int l = currentRow; + int c = currentRow; + int listIterator = 0; + for (int i = currentColunm + 1; i <= n && j < m; i++) //bottom right + { + j++; + solvedLetters.Add( decoder(i) + "" + j + ""); + listIterator++; + } + for (int i = currentColunm - 1; i>0 && k>1; i--) // top left + { + k--; + + solvedLetters.Add(decoder(i) + "" + k + ""); + listIterator++; + + } + + for (int i = currentColunm + 1; i <= n && l >1; i++) //top right + { + l--; + + solvedLetters.Add(decoder(i) + "" + l + "") ; + listIterator++; + } + + for (int i = currentColunm - 1; i >0 && c < m; i--)// bottom left + { + c++; + solvedLetters.Add(decoder(i) + "" + c + ""); + listIterator++; + + } + return solvedLetters.ToArray(); + + + } + public static int[] Encoder(String s) + { + int colunm; + int row; + if (s.Length == 2) + { + + colunm = s[0]-64; + row = int.Parse(s[1] + ""); + + } + else + { + colunm = s[0] - 64; + row = int.Parse( s.Substring(1)+ ""); + } + int[] returner = { colunm, row }; + return returner; + } + public static String decoder (int i) + { + switch (i) { + case (1): + return "A"; + break; + case (2): + return "B"; + break; + case (3): + return "C"; + break; + case (4): + return "D"; + break; + case (5): + return "E"; + break; + case (6): + return "F"; + break; + case (7): + return "G"; + break; + case (8): + return "H"; + break; + case (9): + return "I"; + break; + case (10): + return "J"; + break; + case (11): + return "K"; + break; + case (12): + return "L"; + break; + case (13): + return "M"; + break; + case (14): + return "N"; + break; + case (15): + return "O"; + break; + case (16): + return "P"; + break; + case (17): + return "Q"; + break; + case (18): + return "R"; + break; + case (19): + return "S"; + break; + case (20): + return "T"; + break; + case (21): + return "U"; + break; + case (22): + return "V"; + break; + case (23): + return "W"; + break; + case (24): + return "X"; + break; + case (25): + return "Y"; + break; + case (26): + return "Z"; + break; + default: + return "invalid"; + } + return "invalid"; + } + } +} + From dc1db15845b89b4f99c680e2edb4d60a43991b14 Mon Sep 17 00:00:00 2001 From: StrangeAmjad <75653453+StrangeAmjad@users.noreply.github.com> Date: Sat, 18 Jun 2022 09:17:56 +0300 Subject: [PATCH 2/3] Update med.cs --- med.cs | 191 ++++++++++++++++++++++++++++++--------------------------- 1 file changed, 99 insertions(+), 92 deletions(-) diff --git a/med.cs b/med.cs index 99f34fe..f1b8447 100644 --- a/med.cs +++ b/med.cs @@ -1,11 +1,10 @@ - + +using System; +using System.Collections.Generic; namespace Bishop { class med { - /* my monkey brain brute forced this code, haven't checked it but it worked for the provided case - * so i would like to see it break for other cases too if possible - */ public static void Main(String[] args) { String start; @@ -13,12 +12,11 @@ public static void Main(String[] args) String[] path; start = "F1"; dest = "K14"; - path = getBishopPath(16,14,start, dest); - + path = getBishopPath(16, 14, start, dest); Console.Write("{"); foreach (String move in path) { - if (move != path[path.Length - 1]) + if (move != path[path.Length-1]) { Console.Write(move + ","); } @@ -32,132 +30,104 @@ public static void Main(String[] args) public static String[] getBishopPath(int n, int m, String start, String dest) { - if (dest == start) - { - String[] outList = { start }; - return outList; - } - String[] pathList = AllPossiblePaths(n,m,start,dest); - if (pathList != null && pathList.Contains(dest)) - { - String[] outList = { start, dest }; - return outList; + var previous = new Dictionary(); + var visited = new List(); + bool[,] adj = AdjList(n, m); + var queue = new Queue(); + int[] destEncode = Encoder(dest); - } - if (pathList != null && !pathList.Contains(dest)) - { - List checkedP = new List(); - foreach (String path in pathList) + List paths = new List(); + queue.Enqueue(start); + while (queue.Count > 0) { - String[] startPath = { start }; - checkedP.Add(getBishopPathRec(n, m, path, dest, startPath)); - if (!checkedP.Contains(getBishopPathRec(n, m, path, dest, startPath))) + var vx = queue.Dequeue(); + + var evx = Encoder(vx); + if (adj[evx[0], evx[1]] == true) + { + continue; + } + adj[evx[0], evx[1]] = true; + visited.Add(vx); + String[] neigbhors = pMoves(n, m, vx); + foreach (String neigbhor in neigbhors) + { + var evx2 = Encoder(neigbhor); + if (previous.ContainsKey(neigbhor)) { - checkedP.Add(getBishopPathRec(n, m, path, dest, startPath)); + continue; } - - } - checkedP.Reverse(); - return checkedP.MinBy(p => p.Length); - } - return null; - - } - public static String[] getBishopPathRec(int n, int m, String start, String dest, String[] prevpath) - { - String[] pathList = AllPossiblePaths(n,m,start,dest); - if (pathList != null && pathList.Contains(dest)) - { - String[] prevpathRec = new string[prevpath.Length + 2]; - for (int i = 0; i < prevpath.Length; i++) - { - prevpathRec[i] = prevpath[i]; + if (adj[evx2[0], evx2[1]] == false) + { + previous[neigbhor] = vx; + queue.Enqueue(neigbhor); + } + } } - prevpathRec[prevpathRec.Length - 2] = start; - prevpathRec[prevpathRec.Length - 1] = dest; - return prevpathRec; - } - if (pathList != null && !pathList.Contains(dest)) - { - String[] prevpathRec = new string[prevpath.Length + 1]; - for (int i = 0; i < prevpath.Length; i++) - { + var path = new List { }; - prevpathRec[i] = prevpath[i]; - } - prevpathRec[prevpathRec.Length - 1] = start; - foreach (String path in pathList) - { - if (!prevpathRec.Contains(path)) + var current = dest; + while (!current.Equals(start)) { - return getBishopPathRec(n, m, path, dest, prevpathRec); - + path.Add(current); + current = previous[current]; } - } - } - return null; + path.Add(start); + path.Reverse(); + + return path.ToArray(); + + } - private static String[] AllPossiblePaths(int n, int m,String start, String dest) + + public static String[] pMoves (int n, int m, String s) { - List solvedLetters = new List(); - int[] encodedStart = Encoder(start); + int[] encodedStart = Encoder(s); int currentColunm = encodedStart[0]; int currentRow = encodedStart[1]; - - int[] encodeddest = Encoder(dest); - int destColunm = encodeddest[0]; - - int destRow = encodeddest[1]; - - - // if they have the same slope, then a bishop can move in it's direction - if (currentRow-currentColunm == destRow - destColunm) return new string[] {start,dest}; - if (currentRow + currentColunm == destRow + destColunm) return new string[] { start, dest }; - - // diagonal movement is done by switching the letter and the number by increments and decrements of 1 + List solvedLetters = new List(); int j = currentRow; int k = currentRow; int l = currentRow; int c = currentRow; - int listIterator = 0; + for (int i = currentColunm + 1; i <= n && j < m; i++) //bottom right { j++; - solvedLetters.Add( decoder(i) + "" + j + ""); - listIterator++; + solvedLetters.Add(decoder(i) + "" + j + ""); + } - for (int i = currentColunm - 1; i>0 && k>1; i--) // top left + for (int i = currentColunm - 1; i > 0 && k > 1; i--) // top left { k--; solvedLetters.Add(decoder(i) + "" + k + ""); - listIterator++; + } - for (int i = currentColunm + 1; i <= n && l >1; i++) //top right - { + for (int i = currentColunm + 1; i <= n && l > 1; i++) //top right + { l--; - solvedLetters.Add(decoder(i) + "" + l + "") ; - listIterator++; + solvedLetters.Add(decoder(i) + "" + l + ""); + } - for (int i = currentColunm - 1; i >0 && c < m; i--)// bottom left - { + for (int i = currentColunm - 1; i > 0 && c < m; i--)// bottom left + { c++; solvedLetters.Add(decoder(i) + "" + c + ""); - listIterator++; - + + } return solvedLetters.ToArray(); - } public static int[] Encoder(String s) { @@ -264,6 +234,43 @@ public static String decoder (int i) } return "invalid"; } + public static Boolean contains(String[] list,String item) + { + foreach (String item2 in list) + { + if (item2.Equals(item)) + return true; + } + return false; + } + public static String[] MinByLen(List l) + { + String[] returner=l[0]; + foreach(String[] l2 in l) + { + if (l2.Length < returner.Length) + { + returner = l2; + } + } + return returner; + } + public static bool[,] AdjList(int n,int m) + { + bool[,] List = new bool[n+1,m+1]; + + for (int i=1; i Date: Sat, 18 Jun 2022 09:18:32 +0300 Subject: [PATCH 3/3] Update med.cs --- med.cs | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/med.cs b/med.cs index f1b8447..17d4202 100644 --- a/med.cs +++ b/med.cs @@ -234,27 +234,6 @@ public static String decoder (int i) } return "invalid"; } - public static Boolean contains(String[] list,String item) - { - foreach (String item2 in list) - { - if (item2.Equals(item)) - return true; - } - return false; - } - public static String[] MinByLen(List l) - { - String[] returner=l[0]; - foreach(String[] l2 in l) - { - if (l2.Length < returner.Length) - { - returner = l2; - } - } - return returner; - } public static bool[,] AdjList(int n,int m) { bool[,] List = new bool[n+1,m+1];