Как найти минимум и максимум декартовых координат в Scala - PullRequest
0 голосов
/ 17 января 2012

Я пытаюсь решить GameOfLife в Scala, где у меня есть бесконечная сетка.Я пытаюсь представить сетку в виде набора ячеек (х, у).Когда я читаю со слова String, я начинаю с (0,0).Но из-за законов GameOfLife и поскольку я рассматриваю Infinite Grid после применения правил к моему классу Generation, я хочу напечатать текущее поколение.

Здесь я не уверен, как рассчитать минимальную позицию (читай x,y итераторы) откуда начинать итерацию и печатать 'X' для живой ячейки и '-' для мертвой ячейки в GameOfLife для этого поколения. Я предоставляю свое наивное решение метода toString класса Generation.Но я совсем не доволен этим.Кто-нибудь может предложить лучшее решение?

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 - это Set [Cell], где Cell - Cell (x, y) - класс case.

1 Ответ

1 голос
/ 17 января 2012

Я предлагаю следующий код:

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

и т. Д.на.

...