我正试图在Scala中解决GameOfLife,因为我有一个中篇网格。我试图将网格表示为一组单元格(x,y)。当我读say字符串时,我从(0,0)开始。但由于GameOfLife的法律,以及在将规则应用于我的Generation类后我正在考虑无限网格,我想打印当前一代。
在这里,我不知道如何计算最小位置(读取x,y迭代器),从哪里开始迭代并打印该世代的GameOfLife中活细胞的"x"和死细胞的"-"。我提供了Generation类的toString方法的天真解决方案。但我一点也不满意。有人能提出一个更有效的解决方案吗?
override def toString:String =
{
val output:StringBuilder = new StringBuilder();
val minOfRowColumn = for
{
cell <- aliveCells
row = cell.row
column = cell.column
} yield if( row < column ) row else column
val min = minOfRowColumn.min
val maxOfRowColumn = for
{
cell <- aliveCells
row = cell.row
column = cell.column
} yield if( row > column ) row else column
val max = maxOfRowColumn.max
var row = min;
var column = min;
while(row <= max)
{
while(column <= max)
{
if(aliveCells.contains(Cell(row,column)))
{
output.append('X')
}
else
output.append('-')
column = column + 1
}
output.append("n");
column = min
row = row + 1
}
//remove the last new line addded.
val indexOfNewLine = output.lastIndexOf("n");
if( -1 != indexOfNewLine )
output.delete(indexOfNewLine,output.length());
return output.toString();
}
aliveCells这里是一个集[Cell],其中Cell是Cell(x,y)一个case类。
我提出以下代码:
override def toString = {
val min = aliveCells.iterator.flatMap(c => Seq(c.row, c.column)).min
val max = aliveCells.iterator.flatMap(c => Seq(c.row, c.column)).max
(min to max) map { row =>
(min to max) map (col => if (aliveCells(Cell(row, col))) "X" else "-") mkString
} mkString ("n")
}
如果您不特别想要正方形网格,您可能需要将最小/最大列和行分开:
val minC = aliveCells.iterator.map(_.column).min
等等。