Comment trouver un minimum et un maximum de coordonnées cartésiennes à Scala
-
29-10-2019 - |
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.
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.