public void ReturnCorrectIndexGivenIndexInRange(char alphabetLetter, int expectedIndex) { // Arrange IAlphabetProvider provider = new EnglishAlphabetProvider(); // Act int result = provider.GetLetterIndex(alphabetLetter); // Assert Assert.AreEqual(expectedIndex, result); }
// 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 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); }
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); }
/// <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)); }
// 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()); }
/// <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); }
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); } }
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()); */ }
/// <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); }
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); * } */ }