Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public static void Solve()
- {
- var input = File.ReadAllLines("AdventOfCode/2022/08/Input.txt")
- .Select(l => l.Chunk(1).Select(c => int.Parse(c)).ToArray()).ToArray();
- int result1 = input.Select((row, x) => row.Select((_, y) => VisibleFromOutside(input, x, y)))
- .SelectMany(v => v).Count(v => v);
- int result2 = input.Select((row, x) => row.Select((_, y) => ScenicScore(input, x, y)))
- .SelectMany(s => s).Max(s => s);
- Console.WriteLine($"Part 1: {result1}, Part 2: {result2}");
- }
- private static bool VisibleFromOutside(this int[][] data, int x, int y) =>
- Enumerable.Range(0, x).Select(i => data[i][y])
- .All(t => t < data[x][y]) ||
- Enumerable.Range(0, y).Select(i => data[x][i])
- .All(t => t < data[x][y]) ||
- Enumerable.Range(x, data.Length - x).Select(i => data[i][y]).Skip(1)
- .All(t => t < data[x][y]) ||
- Enumerable.Range(y, data[0].Length - y).Select(i => data[x][i]).Skip(1)
- .All(t => t < data[x][y]);
- private static int ScenicScore(int[][] data, int x, int y) =>
- Enumerable.Range(0, x).Select(i => data[i][y]).Reverse()
- .TakeUntil(t => t >= data[x][y]).Count() *
- Enumerable.Range(0, y).Select(i => data[x][i]).Reverse()
- .TakeUntil(t => t >= data[x][y]).Count() *
- Enumerable.Range(x, data.Length - x).Select(i => data[i][y]).Skip(1)
- .TakeUntil(t => t >= data[x][y]).Count() *
- Enumerable.Range(y, data[0].Length - y).Select(i => data[x][i]).Skip(1)
- .TakeUntil(t => t >= data[x][y]).Count();
- private static IEnumerable<T> TakeUntil<T>(this IEnumerable<T> source, Func<T, bool> predicate)
- {
- foreach (T item in source)
- {
- if (!predicate(item)) { yield return item; }
- else { yield return item; yield break; }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement