using System; using System.Collections.Generic; using System.Linq; namespace ConsoleApp7 { class Program { static void Main(string[] args) { string ish = Console.ReadLine(); char[] Road = ish.ToCharArray(); int N = 0 , S = 0, W= 0, E = 0; int CCount = 0; while (CCount < Road.Length) { if (Convert.ToString(Road[CCount + 1]) =="N") { N += Convert.ToInt32(Convert.ToString(Road[CCount])); } if (Convert.ToString(Road[CCount + 1]) == "S") { S += Convert.ToInt32(Convert.ToString(Road[CCount])); } if (Convert.ToString(Road[CCount + 1]) == "W") { W += Convert.ToInt32(Convert.ToString(Road[CCount])); } if (Convert.ToString(Road[CCount + 1]) == "E") { E += Convert.ToInt32(Convert.ToString(Road[CCount])); } CCount += 2; } List<roadlean> road = new List<roadlean>(4); var ones = new roadlean { Count = N, Type = "N", }; road.Add(ones); var sec = new roadlean { Count = S, Type = "S", }; road.Add(sec); var th = new roadlean { Count = W, Type = "W", }; road.Add(th); var frt = new roadlean { Count = E, Type = "E", }; road.Add(frt); string answer = ""; if (Math.Max(road[0].Count,road[1].Count) - Math.Min(road[0].Count, road[1].Count) != 0) { string Name = road[0].Count > road[1].Count ? "N" : "S"; answer += Convert.ToString(Math.Max(road[0].Count, road[1].Count) - Math.Min(road[0].Count, road[1].Count)) + Name; } if (Math.Max(road[2].Count, road[3].Count) - Math.Min(road[2].Count, road[3].Count) != 0) { string Name = road[2].Count > road[3].Count ? "W" : "E"; answer += Convert.ToString(Math.Max(road[2].Count, road[3].Count) - Math.Min(road[2].Count, road[3].Count)) + Name; } Console.WriteLine("{0}", answer); Console.ReadKey(); } class roadlean { public int Count { get; set; } public string Type { get; set; } } } } 

I definitely do not like my solution and cannot handle numbers greater than 9, I will be glad to any help, but only in C # enter image description here

    1 answer 1

    Not much delved into your decision, just thought how he would solve such a problem. I got the following

     public string Shorter(string input) { int dx = 0; int dy = 0; int ind = 0; while(ind < input.Length) { var start = ind; var end = ind; while(char.IsDigit(input[end])) end++; var number = int.Parse(input.Substring(start, end-start)); var c = input[end]; if (c == 'N') dy-=number; if (c == 'S') dy += number; if (c == 'W') dx -= number; if (c == 'E') dx += number; ind = end+1; } var sb = new StringBuilder(); if (dx < 0) sb.Append($"{-dx}W"); if (dx > 0) sb.Append($"{dx}E"); if (dy < 0) sb.Append($"{-dy}N"); if (dy > 0) sb.Append($"{dy}S"); return sb.ToString(); } 

    Tested like this

     Console.WriteLine(Shorter("7N5E2S3E")); Console.WriteLine(Shorter("10N30W20N")); 

    Got out

     8E5N 30W30N