Eva*_*val 6 c# linq algorithm diagonal
我有一串代表方形网格的布尔值。
0100001110000100
Run Code Online (Sandbox Code Playgroud)
我正在尝试编写验证例程,该例程对角线检查网格,以确保其中不存在具有多个“1”值的对角线。
从这个例子中可以看出,第五组有两个。
为了做到这一点,我想将网格排列成集合,然后检查每个集合以查看它是否具有多个“1”值。
下面显示的是排列为集合的值,以及每个值在原始字符串中的位置。
0 0
01 4 1
100 8 5 2
0010 12 9 6 3
101 13 10 7
00 14 11
0 15
Run Code Online (Sandbox Code Playgroud)
我一直在试图找出字符串位置和它属于哪个组之间的数学关系。我尝试过各种公式,但我数学不太好,所以我被难住了。
作为参考,下面的方法是我用来水平验证字符串的方法。我想要提出的解决方案需要像这样,使用 LINQ 和基于集合的操作,而不是使用许多尴尬的循环。我正在进行的练习是关于在风电场中放置涡轮机的代码套路。
public bool HorizontalValidate(string windfarm)
{
var farmSize = (int) Math.Sqrt(windfarm.Length);
var rows = Enumerable.Range(0, farmSize)
.Select(x => windfarm.Substring(x * farmSize, farmSize))
.ToList();
if (rows.Select(x => x.Count(y => y == '+')).Max() > 1)
return false;
return true;
}
Run Code Online (Sandbox Code Playgroud)
如果有人感兴趣,这里有一个链接: Windfarm Kata
如果您正在寻找从左下到右上的对角线,您可以利用对角线上的所有项目都具有恒定column + row值的事实:
var int[][] grid = ...
bool result = grid
.SelectMany((line, row) => line
.Select((item, column) => (item, diag : row + column)))
.Where(pair => pair.item == 1) // Let's keep 1's only
.GroupBy(pair => pair.diag) // required GroupBy
.Any(group => group.Count() > 1);
Run Code Online (Sandbox Code Playgroud)
如果你想查询windfarm代表方格网格的字符串,你可以这样做:
string windfarm = "0100110010000100";
int n = (int)Math.Sqrt(windfarm.Length);
bool result = windfarm
.Select((c, index) => (item : c - '0', diag : index / n + index % n))
.Where(pair => pair.item == 1)
.GroupBy(pair => pair.diag)
.Any(group => group.Count() > 1);
Run Code Online (Sandbox Code Playgroud)
如果是从左上到右下的对角线,我们应该使用row - column代替row + column(或index / n - index % n代替index / n + index % n)