2012-01-17 66 views
0

我正在嘗試解決Scala中的GameOfLife問題,我有一個infinte網格。我試圖將網格表示爲一組單元(x,y)。當我讀從說字符串我開始在(0,0)。 但由於GameOfLife的規律,並且因爲我在應用規則到我的Generation類後正在考慮無限網格,所以我想要打印當前代。如何在Scala中查找笛卡爾座標的最小值和最大值

在這裏,我不知道如何計算最小位置(讀取x,y迭代器)從哪裏開始迭代並打印'X'的活細胞和' - '死亡細胞在GameOfLife那一代。我正在爲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 here是一個Set [Cell]其中Cell是Cell(x,y)的一個case類。

回答

1

我提出以下代碼:

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 

等。

相關問題