-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBird_Mountain.cs
107 lines (87 loc) · 2.45 KB
/
Bird_Mountain.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
using System;
using System.Linq;
namespace CodingChallenges;
[TestClass]
public class Bird_Mountain {
/*
Bird Mountain
The Task
A bird flying high above a mountain range is able to estimate the height of the highest peak.
Can you?
Example
The birds-eye view
^^^^^^
^^^^^^^^
^^^^^^^
^^^^^
^^^^^^^^^^^
^^^^^^
^^^^
The bird-brain calculations
111111
1^^^^111
1^^^^11
1^^^1
1^^^^111111
1^^^11
1111
111111
12222111
12^^211
12^21
12^^2111111
122211
1111
111111
12222111
1233211
12321
12332111111
122211
1111
Height = 3
*/
[TestMethod]
public void Test() {
char[][] mountain =
{
"^^^^^^ ".ToCharArray(),
" ^^^^^^^^ ".ToCharArray(),
" ^^^^^^^ ".ToCharArray(),
" ^^^^^ ".ToCharArray(),
" ^^^^^^^^^^^ ".ToCharArray(),
" ^^^^^^ ".ToCharArray(),
" ^^^^ ".ToCharArray()
};
Assert.AreEqual(3, PeakHeight(mountain));
}
public static int PeakHeight(char[][] m) {
Console.WriteLine(string.Join("\n", m.Select(x => "|" + string.Concat(x) + "|")) + "\n");
int round = 0;
while (m.Any(x => x.Contains('^'))) {
round++;
// scan left-right
for (int y = 0; y < m.Length; y++) {
for (int x = 0; x < m[y].Length; x++) {
if (x == 0 || x == m[y].Length - 1) { if (m[y][x] != ' ') m[y][x] = '#'; }
else if ((m[y][x - 1] == ' ' || m[y][x + 1] == ' ') && m[y][x] != ' ') m[y][x] = '#';
}
}
// scan up-down
for (int x = 0; x < m[0].Length; x++) {
for (int y = 0; y < m.Length; y++) {
if (y == 0 || y == m.Length - 1) { if (m[y][x] != ' ') m[y][x] = '#'; }
else if ((m[y - 1][x] == ' ' || m[y + 1][x] == ' ') && m[y][x] != ' ') m[y][x] = '#';
}
}
Console.WriteLine(string.Join("\n", m.Select(x => "|" + string.Concat(x) + "|")) + "\n");
// remove edges
for (int y = 0; y < m.Length; y++) {
for (int x = 0; x < m[y].Length; x++) {
if (m[y][x] == '#') m[y][x] = ' ';
}
}
}
return round;
}
}