Question

J'essaie de résoudre Gameoflife à Scala où j'ai une grille Infinte. J'essaie de représenter la grille comme un ensemble de cellules (x, y). Quand j'ai lu de Say String, je commence à (0,0). Mais à cause des lois de Gameoflife et puisque j'envisage une grille infinie après avoir appliqué des règles à ma classe de génération, je souhaite imprimer la génération actuelle.

Ici, je ne sais pas comment calculer la position minimale (lire x, y itérateurs) d'où commencer à itération et à imprimer «X» pour Alive Cell et '-' pour Dead Cell dans Gameoflife pour cette génération. Je fournis mon naïf Solution de la méthode TOSTRING de la classe de génération. Mais je n'en suis pas du tout satisfait. Quelqu'un peut-il suggérer une meilleure solution successive?

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 voici un ensemble [cellule] où la cellule est la cellule (x, y) une classe de cas.

Était-ce utile?

La solution

Je propose le code suivant:

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")
}

Vous voudrez peut-être séparer la colonne et la ligne MIN / MAX si vous ne voulez pas spécifiquement une grille carrée:

val minC = aliveCells.iterator.map(_.column).min

etc.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top