我有一串布尔值,代表一个正方形网格。
0100001110000100
字符串
的数据
我试图写验证例程,检查网格对角线,以确保没有对角线中有一个以上的'1'值。
的
从这个例子中可以看出,第五组有两个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
型
我一直在试图找出弦的位置和它属于哪一组之间的数学关系。我试过各种公式,但我不擅长数学,所以我被难倒了。
作为参考,下面的方法是我用来水平验证字符串的方法。我想提出的解决方案需要像这样,使用LINQ和基于集合的操作,而不是大量笨拙的循环。我正在做的练习是关于风电场中涡轮机放置的代码kata。
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;
}
型
这里有一个链接,如果有人感兴趣:Windfarm Kata
2条答案
按热度按时间vi4fp9gy1#
如果你正在寻找从左下到右上的对角线,你可以利用对角线上的所有元素都有恒定的
column + row
值的事实:字符串
如果你想查询字符串
windfarm
,表示 square grid,你可以这样做:型
Fiddle
如果是从左上到右下的对角线,我们应该使用
row - column
而不是row + column
(或者index / n - index % n
而不是index / n + index % n
)2jcobegt2#
我认为,尽管我更喜欢@Dmitry的解决方案,但值得展示的是,一种枯燥的、带有过程味道的方法可以用相对较少的代码来实现。
我的解决方案是用Ruby编写的。不熟悉Ruby的读者如果认为我写的代码是伪代码,他们应该很容易理解。
我们有一个
n x n
数组arr
,其中包含的元素arr[i][j]
等于'1'
或'0'
。例如,字符串
首先,我们需要一种方法来确定一个给定的对角线是否至多包含一个
'1'
,我们可以将其写成如下:型
row
和col
分别是对角线左下角的偏移量。row = 0
和0 <= col <= n-2
或col = 0
和0 <= row <= n-2
。范围的上限是n-2
而不是n-1
,因为不需要检查长度为1的对角线。可以看出,
n-row-col
是对角线的长度。我们现在可以编写主例程,检查所有对角线,直到找到无效对角线,如果找到无效对角线,则返回
false
,否则返回true
。的字符串
返回
false
,因为arr[1][3]
和arr[3][1]
在同一对角线上,并且两个值都等于'1'
。如果给我们的是一个字符串而不是一个数组,比如
型
我们有两个选择。
第一种方法是从字符串构造一个数组,然后应用
arr_valid?(arr)
:的字符串
第二种方法是首先构造一个将数组偏移量Map到字符串偏移量的方法:
型
比如说,
型
然后相应地更改方法。例如,在
diag_valid?
中,型
将改为
型