Come trovare il minimo e il massimo delle coordinate cartesiane in Scala
-
29-10-2019 - |
Domanda
Sto cercando di risolvere GameOfLife in Scala dove ho una griglia interna.Sto cercando di rappresentare la griglia come un insieme di celle (x, y).Quando leggo da say String comincio da (0,0). Ma a causa delle leggi di GameOfLife e poiché sto prendendo in considerazione Infinite Grid dopo aver applicato le regole alla mia classe Generation, voglio stampare la generazione corrente.
Qui non sono sicuro di come calcolare la posizione minima (leggi x, y iteratori) da dove iniziare a iterare e stampare "X" per cella viva e "-" per cella morta in GameOfLife per quella generazione.fornendo la mia soluzione ingenua del metodo toString della classe Generation. Ma non ne sono affatto contento.Qualcuno può suggerire una soluzione migliore?
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 qui è un Set [Cell] dove Cell è Cell (x, y) una classe case.
Soluzione
Propongo il seguente codice:
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")
}
Potresti voler separare colonna e riga min / max se non desideri specificamente una griglia quadrata:
val minC = aliveCells.iterator.map(_.column).min
e così via.