Cleaned up code and added comments
This commit is contained in:
		
							parent
							
								
									fe69b46e68
								
							
						
					
					
						commit
						c757b89923
					
				| @ -53,6 +53,8 @@ namespace AdventOfCode._2023 | |||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             var finalizedSeedRanges = new List<SeedRange>(); |             var finalizedSeedRanges = new List<SeedRange>(); | ||||||
|  | 
 | ||||||
|  |             //Get our seed ranges | ||||||
|             var values = inputs.First().First().Split(":")[1].Trim().Split(" ").Select(x => long.Parse(x)).ToArray(); |             var values = inputs.First().First().Split(":")[1].Trim().Split(" ").Select(x => long.Parse(x)).ToArray(); | ||||||
|             for (int i = 0; i < values.Length; i += 2) |             for (int i = 0; i < values.Length; i += 2) | ||||||
|             { |             { | ||||||
| @ -60,6 +62,7 @@ namespace AdventOfCode._2023 | |||||||
|                 var endSeed = values[i] + values[i + 1]-1; //Minus one because it counts i |                 var endSeed = values[i] + values[i + 1]-1; //Minus one because it counts i | ||||||
| 
 | 
 | ||||||
|                 var seed = new SeedRange() { Start = startSeed, End = endSeed }; |                 var seed = new SeedRange() { Start = startSeed, End = endSeed }; | ||||||
|  |                 Log($"Transforming seed range {seed.Start} - {seed.End}"); | ||||||
| 
 | 
 | ||||||
|                 var prevType = MapType.SEED; |                 var prevType = MapType.SEED; | ||||||
|                 var seedRanges = new List<SeedRange>() { seed }; |                 var seedRanges = new List<SeedRange>() { seed }; | ||||||
| @ -68,20 +71,12 @@ namespace AdventOfCode._2023 | |||||||
|                     Log($"Mapping from {prevType} to {mapType}"); |                     Log($"Mapping from {prevType} to {mapType}"); | ||||||
|                     var activeMap = maps.First(x => x.From == prevType && x.To == mapType); |                     var activeMap = maps.First(x => x.From == prevType && x.To == mapType); | ||||||
|                     seedRanges = activeMap.GetSeedRanges(seedRanges); |                     seedRanges = activeMap.GetSeedRanges(seedRanges); | ||||||
|  |                     seedRanges.ForEach(x => Log($"Range: {x.Start} - {x.End}")); | ||||||
|                     prevType = mapType; //Denote our next mapping |                     prevType = mapType; //Denote our next mapping | ||||||
|                 } |                 } | ||||||
|                 finalizedSeedRanges = finalizedSeedRanges.Concat(seedRanges).ToList(); |  | ||||||
| 
 | 
 | ||||||
|                     //var mapType = MapType.SOIL; |                 //Add the output ranges to our total list to be minimized later | ||||||
|                     //var prevType = MapType.SEED; |                 finalizedSeedRanges = finalizedSeedRanges.Concat(seedRanges).ToList(); | ||||||
|                     //Log($"Mapping from {prevType} to {mapType}"); |  | ||||||
|                     //var activeMap = maps.First(x => x.From == prevType && x.To == mapType); |  | ||||||
|                     //var postMapSeedRanges = activeMap.GetSeedRanges(seed); |  | ||||||
|                     //for (long x = startSeed ; x < endSeed; x++) |  | ||||||
|                     //{ |  | ||||||
|                     //    Console.WriteLine($"Seed {x} has a soil value of {activeMap.Transform(x)}"); |  | ||||||
|                     //} |  | ||||||
|                     //activeMap.GetSeedRanges(seed); |  | ||||||
|             } |             } | ||||||
|             this.Answer = finalizedSeedRanges.Min(x => x.Start); |             this.Answer = finalizedSeedRanges.Min(x => x.Start); | ||||||
|             return this._response; |             return this._response; | ||||||
| @ -136,24 +131,21 @@ namespace AdventOfCode._2023 | |||||||
|             return result; |             return result; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         /// <summary> | ||||||
|  |         /// Generate the given seed ranges for Part B with the large dataset | ||||||
|  |         /// </summary> | ||||||
|  |         /// <param name="ranges"></param> | ||||||
|  |         /// <returns></returns> | ||||||
|         public List<SeedRange> GetSeedRanges(List<SeedRange> ranges) |         public List<SeedRange> GetSeedRanges(List<SeedRange> ranges) | ||||||
|         { |         { | ||||||
|  |             //All valid return ranges for the given input seed range | ||||||
|             var totalRanges = new List<SeedRange>(); |             var totalRanges = new List<SeedRange>(); | ||||||
|             Console.WriteLine("###############"); | 
 | ||||||
|             foreach (var range in ranges) |             foreach (var range in ranges) | ||||||
|             { |             { | ||||||
|                 var seedRanges = new List<SeedRange>(); |                 var seedRanges = new List<SeedRange>(); | ||||||
|                 var originalSeedRanges = new List<SeedRange>(); |                 var originalSeedRanges = new List<SeedRange>(); | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
|                 //DEBUG |  | ||||||
|                 Console.WriteLine("\n"); |  | ||||||
|                 //for (long i = range.Start; i <= range.End; i++) |  | ||||||
|                 //{ |  | ||||||
|                 //    Console.WriteLine($"Seed {i} has value of {Transform(i)}"); |  | ||||||
|                 //} |  | ||||||
| 
 |  | ||||||
|                 //Ex) Range 55-67 |  | ||||||
|                 foreach (var mapData in _mapData) |                 foreach (var mapData in _mapData) | ||||||
|                 { |                 { | ||||||
|                     // Check if any part of rangeA is within rangeB, or vice versa |                     // Check if any part of rangeA is within rangeB, or vice versa | ||||||
| @ -161,25 +153,25 @@ namespace AdventOfCode._2023 | |||||||
|                                      (range.End >= mapData.Source && range.End <= mapData.SourceEnd) || |                                      (range.End >= mapData.Source && range.End <= mapData.SourceEnd) || | ||||||
|                                      (mapData.Source >= range.Start && mapData.Source <= range.End) || |                                      (mapData.Source >= range.Start && mapData.Source <= range.End) || | ||||||
|                                      (mapData.SourceEnd >= range.Start && mapData.SourceEnd <= range.End); |                                      (mapData.SourceEnd >= range.Start && mapData.SourceEnd <= range.End); | ||||||
|                     //EX) MapData: 50-98  with a range of 48 and a start of 52 |  | ||||||
|                     //if (range.Start >= mapData.Source || range.End <= mapData.SourceEnd) |  | ||||||
|                     if (isRangeWithinMapData) |                     if (isRangeWithinMapData) | ||||||
|                     { |                     { | ||||||
|                         var localizedRange = new SeedRange(Math.Max(0, range.Start - mapData.Source), Math.Min(mapData.Range - 1, range.End - mapData.Source) /* - 1 Since we count the start number minus 1 */); |                         //Calculate the localized range in relation to the given range and the given map data | ||||||
| 
 |                         //Math.Max(0, range.Start - mapData.Source) - In the event the range start is below the start of the mapData, take 0 as that is within the range | ||||||
|                         //For the end range, 92 - 50 = 42  but we do a -1 so why its 41 which is wrong |                         // Math.Min(mapData.Range - 1, range.End - mapData.Source) - if the range extends past the bounds of mapData, take mapData -1. -1 is because we count the initial starting source in range | ||||||
| 
 |                         var localizedRange = new SeedRange(Math.Max(0, range.Start - mapData.Source), Math.Min(mapData.Range - 1, range.End - mapData.Source) ); | ||||||
|                         var inputStart = mapData.Source + localizedRange.Start; //50 + 5 = 55 |  | ||||||
|                         var inputEnd = mapData.Source + localizedRange.End; //50 + 17 = 67 |  | ||||||
| 
 | 
 | ||||||
|  |                         //Calculate the Source values (we need this to track any values that aren't within our output bounds) | ||||||
|  |                         var inputStart = mapData.Source + localizedRange.Start; | ||||||
|  |                         var inputEnd = mapData.Source + localizedRange.End; | ||||||
|                         originalSeedRanges.Add(new SeedRange() |                         originalSeedRanges.Add(new SeedRange() | ||||||
|                         { |                         { | ||||||
|                             Start = inputStart, |                             Start = inputStart, | ||||||
|                             End = inputEnd |                             End = inputEnd | ||||||
|                         }); |                         }); | ||||||
| 
 | 
 | ||||||
|                         var outputStart = mapData.Destination + localizedRange.Start; //52 + 5 = 57 |                         //Calculate the valid output ranges for the given mapData (this is the actual transformation for the given ranges) | ||||||
|                         var outputEnd = mapData.Destination + localizedRange.End; //52 + 17 = 69 |                         var outputStart = mapData.Destination + localizedRange.Start; | ||||||
|  |                         var outputEnd = mapData.Destination + localizedRange.End; | ||||||
| 
 | 
 | ||||||
|                         seedRanges.Add(new SeedRange() |                         seedRanges.Add(new SeedRange() | ||||||
|                         { |                         { | ||||||
| @ -189,11 +181,12 @@ namespace AdventOfCode._2023 | |||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|                 //For any of the seed ranges created that doesn't cover seed range, create a 1-1 mapping |                 //FOr all the ranges NOT covered by the original seed range, create a 1-1 mapping. | ||||||
|                 var validRangesNotFound = GetNonOverlappingRanges(range, originalSeedRanges.OrderBy(x => x.Start).ToList()); |                 var validRangesNotFound = GetNonOverlappingRanges(range, originalSeedRanges.OrderBy(x => x.Start).ToList()); | ||||||
|  | 
 | ||||||
|  |                 //Concat all of the seed ranges together | ||||||
|                 totalRanges = totalRanges.Concat(seedRanges.Concat(validRangesNotFound)).OrderBy(x => x.Start).ToList(); |                 totalRanges = totalRanges.Concat(seedRanges.Concat(validRangesNotFound)).OrderBy(x => x.Start).ToList(); | ||||||
|             } |             } | ||||||
|             totalRanges.ForEach(x => Console.WriteLine($"Range of: {x.Start} to {x.End}")); |  | ||||||
|             return totalRanges; |             return totalRanges; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user