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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top