public void ReturnCorrectIndexGivenIndexInRange(char alphabetLetter, int expectedIndex)
		{
			// Arrange
			IAlphabetProvider provider = new EnglishAlphabetProvider();

			// Act
			int result = provider.GetLetterIndex(alphabetLetter);

			// Assert
			Assert.AreEqual(expectedIndex, result);
		}
예제 #2
0
        // Day7a acts also as a method of providing data to Day7b and thus has a return value.
        public static Day7aPackage Day7a()
        {
            List <string>           steps = new List <string>();
            string                  line;
            string                  order    = String.Empty;
            EnglishAlphabetProvider provider = new EnglishAlphabetProvider();
            int onStepNumber = 0;
            HashSet <Tuple <char, char> > hash       = new HashSet <Tuple <char, char> >();
            HashSet <Tuple <char, char> > hashreturn = new HashSet <Tuple <char, char> >();
            HashSet <char> chash = new HashSet <char>();
            List <char>    result;
            Stopwatch      sw = new Stopwatch();

            try
            {
                foreach (char c in provider.GetAlphabet())
                {
                    order += c.ToString();
                    chash.Add(c);
                }
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return(null);
            }

            using (Stream stream = thisExe.GetManifestResourceStream("AdventOfCode2018._data.AdventOfCode_Day7.txt"))
                using (StreamReader reader = new StreamReader(stream))
                {
                    while ((line = reader.ReadLine()) != null)
                    {
                        steps.Add(line);
                    }
                }
            sw.Start();
            while (onStepNumber < steps.Count)
            {
                line = steps[onStepNumber];
                char letter;
                char before;
                ReadDay7Step(line, out letter, out before);

                hash.Add(Tuple.Create(letter, before));
                hashreturn.Add(Tuple.Create(letter, before));

                onStepNumber++;
            }

            result = Sorting.TopologicalSort(
                chash,
                hash,
                true);

            return(new Day7aPackage(hashreturn, chash, result));
        }
        public void ReturnCorrectIndexGivenIndexInRange(char alphabetLetter, int expectedIndex)
        {
            // Arrange
            IAlphabetProvider provider = new EnglishAlphabetProvider();

            // Act
            int result = provider.GetLetterIndex(alphabetLetter);

            // Assert
            Assert.AreEqual(expectedIndex, result);
        }
예제 #4
0
        public void ReturnFullAlphabet()
        {
            // Arrange
            const string      ExpectedCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            IAlphabetProvider provider           = new EnglishAlphabetProvider();

            // Act
            var result = new string(provider.GetAlphabet().ToArray());

            // Assert
            Assert.AreEqual(ExpectedCharacters, result);
        }
예제 #5
0
		public void ReturnFullAlphabet()
		{
			// Arrange
			const string ExpectedCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
			IAlphabetProvider provider = new EnglishAlphabetProvider();

			// Act
			var result = new string(provider.GetAlphabet().ToArray());

			// Assert
			Assert.AreEqual(ExpectedCharacters, result);
		}
		public void ReturnAllCharactersBeforeSpecifiedCharacterGivenValidCharacter(
			char specifiedCharacter, string expectedCharacters)
		{
			// Arrange
			IAlphabetProvider provider = new EnglishAlphabetProvider();

			// Act
			var result = new string(provider.GetAlphabetBefore(specifiedCharacter).ToArray());

			// Assert
			Assert.AreEqual(expectedCharacters, result);
		}
        public void ReturnAllCharactersAfterSpecifiedCharacterGivenValidCharacter(
            char specifiedCharacter, string expectedCharacters)
        {
            // Arrange
            IAlphabetProvider provider = new EnglishAlphabetProvider();

            // Act
            var result = new string(provider.GetAlphabetAfter(specifiedCharacter).ToArray());

            // Assert
            Assert.AreEqual(expectedCharacters, result);
        }
		public void ReturnExtendedCharacters()
		{
			// Arrange
			var expectedCharacters = new List<char> { Convert.ToChar(176), Convert.ToChar(177) };

			IAlphabetProvider provider = new EnglishAlphabetProvider();

			// Act
			var result = new string(provider.GetExtendedCharacters().ToArray());

			// Assert
			Assert.AreEqual(expectedCharacters, result);
		}
예제 #9
0
        public void ReturnExtendedCharacters()
        {
            // Arrange
            var expectedCharacters = new List <char> {
                Convert.ToChar(176), Convert.ToChar(177)
            };

            IAlphabetProvider provider = new EnglishAlphabetProvider();

            // Act
            var result = new string(provider.GetExtendedCharacters().ToArray());

            // Assert
            Assert.AreEqual(expectedCharacters, result);
        }
예제 #10
0
        /// <summary>
        /// Determines whether a string contains only printable characters.
        /// </summary>
        /// <param name="stringToCheck">The string to check.</param>
        /// <returns>
        /// <c>true</c> if the string contains only printable characters; otherwise, <c>false</c>.
        /// </returns>
        public static bool IsPrintableCharacter(this string stringToCheck)
        {
            if (string.IsNullOrEmpty(stringToCheck))
            {
                return(false);
            }

            // get the alphabet provider
            IAlphabetProvider provider = new EnglishAlphabetProvider();

            // get the printable character set
            var result = provider.GetPrintableCharacters().ToArray();

            // return false if the character in the string is not found in printable character set
            return(stringToCheck.All(result.Contains));
        }
예제 #11
0
        // 32436ms before threading
        // 17138ms with Parallel.ForEach
        public static void Day5b()
        {
            Stopwatch   sw = new Stopwatch();
            List <char> line;
            Dictionary <char, List <char> > results = new Dictionary <char, List <char> >();
            IAlphabetProvider provider = new EnglishAlphabetProvider();

            sw.Start();
            using (Stream stream = thisExe.GetManifestResourceStream("AdventOfCode2018._data.AdventOfCode_Day5.txt"))
                using (StreamReader reader = new StreamReader(stream))
                {
                    line = reader.ReadToEnd().ToList();
                }

            /*
             * foreach (char c in provider.GetAlphabet())
             * {
             *  List<char> templine = new List<char>(line);
             *  templine.RemoveAll(l => l == c);
             *  templine.RemoveAll(l => l == Char.ToLower(c));
             *  templine = Day5a(templine, true);
             *  results.Add(c, templine);
             * }
             */

            Parallel.ForEach(provider.GetAlphabet(), c =>
            {
                List <char> templine = new List <char>(line);
                templine.RemoveAll(l => l == c);
                templine.RemoveAll(l => l == Char.ToLower(c));
                templine = Day5a(templine, true);
                results.Add(c, templine);
            });
            sw.Stop();

            StringBuilder sb = new StringBuilder();

            sb.Append("Day5b completed in " + sw.ElapsedMilliseconds + "ms (" + sw.ElapsedTicks + " ticks).").Append(Environment.NewLine).Append(Environment.NewLine);
            foreach (var kvp in results.OrderBy(v => v.Value.Count()))
            {
                sb.Append(kvp.Value.Count()).Append(" for letter ").Append(kvp.Key.ToString()).Append(Environment.NewLine);
            }

            MessageBox.Show(sb.ToString());
        }
예제 #12
0
        /// <summary>
        /// Validates the specified value with respect to the current validation attribute.
        /// </summary>
        /// <param name="value">
        /// The value to validate.
        /// </param>
        /// <param name="validationContext">
        /// The context information about the validation operation.
        /// </param>
        /// <returns>
        /// An instance of the <see cref="T:System.ComponentModel.DataAnnotations.ValidationResult"/> class.
        /// </returns>
        protected override ValidationResult PerformCustomValidation(object value, ValidationContext validationContext)
        {
            if (value.IsNull())
            {
                return(ValidationResult.Success);
            }

            string convertedValue;

            if (validationContext.IsNull())
            {
                validationContext = new ValidationContext(value, null, null)
                {
                    DisplayName = "The value"
                };
            }

            var memberNames = new[] { validationContext.MemberName };

            try
            {
                convertedValue = Convert.ToString(value);
            }
            catch (FormatException)
            {
                this.ErrorMessage = validationContext.DisplayName.FormattedWith(ValidationMessages.ValueMustBeString);

                return(new ValidationResult(this.ErrorMessage));
            }

            if (!convertedValue.IsExtendedCharacter())
            {
                var    englishAlphabetProvider = new EnglishAlphabetProvider();
                string extendedCharacters      = string.Join(string.Empty, englishAlphabetProvider.GetExtendedCharacters());

                this.ErrorMessage = string.Format(ValidationMessages.CanOnlyContainSpecialCharacters, validationContext.DisplayName, extendedCharacters);

                return(new ValidationResult(this.ErrorMessage, memberNames));
            }

            return(ValidationResult.Success);
        }
		/// <summary>
		/// Validates the specified value with respect to the current validation attribute.
		/// </summary>
		/// <param name="value">
		/// The value to validate.
		/// </param>
		/// <param name="validationContext">
		/// The context information about the validation operation.
		/// </param>
		/// <returns>
		/// An instance of the <see cref="T:System.ComponentModel.DataAnnotations.ValidationResult"/> class.
		/// </returns>
		protected override ValidationResult PerformCustomValidation(object value, ValidationContext validationContext)
		{
			if (value.IsNull())
			{
				return ValidationResult.Success;
			}

			string convertedValue;
			if (validationContext.IsNull())
			{
				validationContext = new ValidationContext(value, null, null) { DisplayName = "The value" };
			}

			var memberNames = new[] { validationContext.MemberName };

			try
			{
				convertedValue = Convert.ToString(value);
			}
			catch (FormatException)
			{
				this.ErrorMessage = validationContext.DisplayName.FormattedWith(ValidationMessages.ValueMustBeString);

				return new ValidationResult(this.ErrorMessage);
			}

			if (!convertedValue.IsPrintableCharacter())
			{
				var englishAlphabetProvider = new EnglishAlphabetProvider();
				string extendedCharacters = string.Join(string.Empty, englishAlphabetProvider.GetPrintableCharacters());

				this.ErrorMessage = string.Format(ValidationMessages.CanOnlyContainPrintableCharacters, validationContext.DisplayName, extendedCharacters);

				return new ValidationResult(this.ErrorMessage, memberNames);
			}

			return ValidationResult.Success;
		}
		public void ReturnPrintableCharacters()
		{
			// Arrange
			var expectedCharacters = new List<char>();

			// Ascii values of all upper and lower case alphabets, numbers 0 - 9 and special characters till the max ascii value of 126 
			for (int i = 32; i <= 126; i++)
			{
				// convert to a character
				char c = Convert.ToChar(i);

				// add to the list
				expectedCharacters.Add(c);
			}

			IAlphabetProvider provider = new EnglishAlphabetProvider();

			// Act
			var result = new string(provider.GetPrintableCharacters().ToArray());

			// Assert
			Assert.AreEqual(expectedCharacters, result);
		}
        public void ReturnPrintableCharacters()
        {
            // Arrange
            var expectedCharacters = new List <char>();

            // Ascii values of all upper and lower case alphabets, numbers 0 - 9 and special characters till the max ascii value of 126
            for (int i = 32; i <= 126; i++)
            {
                // convert to a character
                char c = Convert.ToChar(i);

                // add to the list
                expectedCharacters.Add(c);
            }

            IAlphabetProvider provider = new EnglishAlphabetProvider();

            // Act
            var result = new string(provider.GetPrintableCharacters().ToArray());

            // Assert
            Assert.AreEqual(expectedCharacters, result);
        }
예제 #16
0
        static void ProcessWorkers(Day7Worker[] workers, ref HashSet <char> S, int timebase)
        {
            IAlphabetProvider provider = new EnglishAlphabetProvider();

            int freeWorkers = 0;

            foreach (Day7Worker worker in workers)
            {
                if (!worker.Working)
                {
                    freeWorkers++;
                }
            }

            if (freeWorkers > 0)
            {
                int w = Math.Abs(freeWorkers - workers.Length - 1);
                freeWorkers--;
                workers[w].WorkingOnChar = S.OrderBy(s => s).First();
                S.Remove(workers[w].WorkingOnChar);
                workers[w].TimeLeft = timebase + provider.CharValue(workers[w].WorkingOnChar);
            }
        }
예제 #17
0
        public static void Day6a()
        {
            Stopwatch         sw           = new Stopwatch();
            List <Core.Point> destinations = new List <Core.Point>();
            int    maxX = 0;
            int    maxY = 0;
            string line;

            string[]                   lineSplit;
            IAlphabetProvider          provider = null;
            string                     alpha    = String.Empty;
            Dictionary <char, int[, ]> overlays = new Dictionary <char, int[, ]>();

            //Dictionary<int[,], Day6Spot> heatmap = new Dictionary<int[,], Day6Spot>();
            char[,] heatmap      = null;
            int[,] heatmapvalues = null;
            List <Day6Spot> d6s = new List <Day6Spot>();


            using (Stream stream = thisExe.GetManifestResourceStream("AdventOfCode2018._data.AdventOfCode_Day6.txt"))
                using (StreamReader reader = new StreamReader(stream))
                {
                    while ((line = reader.ReadLine()) != null)
                    {
                        lineSplit = line.RemoveWhitespace().Split(',');
                        Core.Point point = new Core.Point(Convert.ToInt32(lineSplit[0]), Convert.ToInt32(lineSplit[1]));
                        destinations.Add(point);
                    }
                }

            if (destinations.Count <= 26)
            {
                provider = new EnglishAlphabetProvider();
            }

            else if (destinations.Count <= 61)
            {
                provider = new LargerUniqueAlphabetProvider();
            }

            else
            {
                throw new Exception("Are you serious?  Too many elements!  ?: " + destinations.Count);
            }

            foreach (char c in provider.GetAlphabet(destinations.Count))
            {
                alpha += c;
            }

            maxX = (destinations.OrderBy(d => d.X).LastOrDefault()).X + 1;
            maxY = (destinations.OrderBy(d => d.Y).LastOrDefault()).Y + 1;

            int[,] coordMap = new int[maxX, maxY];

            Parallel.ForEach(destinations, p =>
            {
                char c;
                lock (alpha)
                {
                    c     = alpha[0];
                    alpha = alpha.Remove(alpha.IndexOf(c), 1);
                }
                overlays.Add(c, GetRotaryValues(coordMap, p));
            });

            /*
             * for (int i = 0; i < coordMap.GetLength(0); i++)
             *  for (int ii = 0; ii < coordMap.GetLength(1); ii++)
             *  {
             *      heatmap.Add(new int[i, ii]);
             *  }
             */

            heatmap       = new char[maxX, maxY];
            heatmapvalues = new int[maxX, maxY];

            for (int i = 0; i < coordMap.GetLength(0); i++)
            {
                for (int ii = 0; ii < coordMap.GetLength(1); ii++)
                {
                    heatmapvalues[i, ii] = 99;
                }
            }

            foreach (KeyValuePair <char, int[, ]> kvp in overlays)
            {
                for (int i = 0; i < heatmap.GetLength(0); i++)
                {
                    for (int ii = 0; ii < heatmap.GetLength(1); ii++)
                    {
                        if (kvp.Value[i, ii] < heatmapvalues[i, ii])
                        {
                            heatmap[i, ii]       = kvp.Key;
                            heatmapvalues[i, ii] = kvp.Value[i, ii];
                        }

                        else if (kvp.Value[i, ii] == heatmapvalues[i, ii])
                        {
                            heatmap[i, ii] = '*';
                        }
                    }
                }
            }

            /*
             * StringBuilder sb = new StringBuilder();
             * StringBuilder sb2 = new StringBuilder();
             *
             * for (int i = 0; i < heatmap.GetLength(0); i++)
             * {
             *  for (int ii = 0; ii < heatmap.GetLength(1); ii++)
             *  {
             *      sb.Append(heatmap[i, ii].ToString().PadLeft(2));
             *      sb2.Append(heatmapvalues[i, ii].ToString().PadLeft(2));
             *  }
             *
             *  sb.Append(Environment.NewLine);
             *  sb2.Append(Environment.NewLine);
             * }
             *
             * File.WriteAllText("heatmap.txt", sb.ToString());
             * File.WriteAllText("heatmapvalues.txt", sb2.ToString());
             */

            foreach (var v in heatmap)
            {
                Day6Spot d6;

                d6 = d6s.FirstOrDefault(x => x.c == v);

                if (d6 != null)
                {
                    d6.count++;
                }
                else
                {
                    d6s.Add(new Day6Spot(v, 1));
                }
            }

            /*
             * sb = new StringBuilder();
             *
             * foreach (var v in d6s)
             * {
             *  sb.Append("Char: " + v.c + "   Count:" + v.count.ToString().PadLeft(6));
             *  sb.Append(Environment.NewLine);
             * }
             *
             * File.WriteAllText("countsPerChar.txt", sb.ToString());
             */
        }
예제 #18
0
        /// <summary>
        /// Determines whether a string contains only printable characters.
        /// </summary>
        /// <param name="stringToCheck">The string to check.</param>
        /// <returns>
        /// <c>true</c> if the string contains only printable characters; otherwise, <c>false</c>.
        /// </returns>
        public static bool IsPrintableCharacter(this string stringToCheck)
        {
            if (string.IsNullOrEmpty(stringToCheck))
            {
                return false;
            }

            // get the alphabet provider
            IAlphabetProvider provider = new EnglishAlphabetProvider();

            // get the printable character set
            var result = provider.GetPrintableCharacters().ToArray();

            // return false if the character in the string is not found in printable character set
            return stringToCheck.All(result.Contains);
        }
예제 #19
0
        public static void Day7b()
        {
            EnglishAlphabetProvider       provider = new EnglishAlphabetProvider();
            Day7aPackage                  d7ap     = Day7a();
            Day7WorkManager               _mgr     = Day7WorkManager.Instance;
            HashSet <Tuple <char, char> > hash     = d7ap.hash;
            HashSet <char>                chash    = d7ap.chash;
            List <List <char> >           result;
            List <char> done       = new List <char>();
            int         second     = 0;
            int         maxWorkers = 5;
            int         timebase   = 60;
            int         totalTime  = 0;

            /*
             * result = Sorting.TopologicalSortGroups(
             *  chash,
             *  hash,
             *  true);
             *
             * foreach (var v in result)
             * {
             *  char c = Convert.ToChar(0);
             *
             *  foreach (var _c in v)
             *  {
             *      if (_c > c)
             *          c = _c;
             *  }
             *
             *  totalTime += 60 + provider.CharValue(c);
             * }
             */

            Dictionary <char, string> dependencies = new Dictionary <char, string>();

            foreach (var v in chash)
            {
                dependencies.Add(v, String.Empty);
            }

            foreach (var v in hash)
            {
                dependencies[v.Item2] += v.Item1.ToString();
            }

            Dictionary <int, List <Day7Worker> > workList;

            StringBuilder sb = new StringBuilder();

            foreach (var v in dependencies)
            {
                sb.Append(v.Key.ToString() + "   " + v.Value + Environment.NewLine);
            }
            Form messagedep = new GridDisplayDay3a(sb.ToString(), 0);

            messagedep.Show();


            _mgr.Setup(maxWorkers, timebase);
            _mgr.Dependencies = dependencies;
            _mgr.Chash        = chash;
            totalTime         = _mgr.RunWork(out workList);

            sb = new StringBuilder();

            sb.Append("Second |");

            for (int i = 1; i <= _mgr.MaxWorkers; i++)
            {
                sb.Append(" Worker " + i + " |");
            }

            int headerLength = sb.Length;

            sb.Append(Environment.NewLine);

            sb.Append(new string('-', headerLength));
            sb.Append(Environment.NewLine);

            foreach (var v in workList)
            {
                sb.Append(v.Key.ToString().PadLeft(6));

                foreach (var vv in v.Value)
                {
                    sb.Append(" | ");
                    sb.Append(vv.WorkingOnChar.ToString().PadCenter(8));
                }

                sb.Append(" |");

                sb.Append(Environment.NewLine);
            }

            //Incorrect Answer: 1070 (too high)
            //Incorrect Answer: 1041 (too high)
            //Incorrect Answer: 1027 (too low)
            //MessageBox.Show(totalTime.ToString());
            Form message = new GridDisplayDay3a(sb.ToString(), totalTime);

            message.Show();

            /*
             * DataTable dt = new DataTable("Assembly Order and Time");
             * DataColumn c;
             * DataRow r;
             *
             * c = new DataColumn();
             * c.DataType = System.Type.GetType("System.Int32");
             * c.ColumnName = "Second";
             * c.ReadOnly = false;
             * c.Unique = false;
             * dt.Columns.Add(c);
             *
             * for (int i = 1; i <= maxWorkers; i++)
             * {
             *  c = new DataColumn();
             *  c.DataType = System.Type.GetType("System.Char");
             *  c.ColumnName = "Worker " + i;
             *  c.ReadOnly = false;
             *  c.Unique = false;
             *  dt.Columns.Add(c);
             * }
             *
             * DataSet dataSet = new DataSet();
             * dataSet.Tables.Add(dt);
             *
             * HashSet<char> S = new HashSet<char>(chash.Where(n => hash.All(e => e.Item2.Equals(n) == false)));
             *
             * Day7Worker[] workers = new Day7Worker[maxWorkers];
             *
             * for (int i = 1; i <= maxWorkers; i++)
             * {
             *  workers[i] = new Day7Worker(i);
             * }
             *
             * while (done.Count < 26)
             * {
             *  ProcessWorkers(workers, ref S, timebase);
             * }
             */
        }