One-dimensional cellular automata: Difference between revisions

m
m (→‎{{header|Ring}}: Remove vanity tags)
Line 880:
 
=={{header|Ceylon}}==
<lang ceylon>shared voidabstract runclass Cell(character) of alive | dead {
shared Character character;
string => character.string;
shared formal Cell opposite;
}
 
shared object alive extends Cell('#') {
opposite => dead;
}
shared object dead extends Cell('_') {
opposite => alive;
}
 
shared Map<Character, Cell> cellsByCharacter = map { for (cell in `Cell`.caseValues) cell.character->cell };
 
shared class Automata1D({Cell*} initialCells) {
value imaginaryFirstCellpermanentFirstCell = datainitialCells.first else dead;
value imaginaryLastCellpermanentLastCell = datainitialCells.last else dead;
value cells = Array { *datainitialCells.rest.exceptLast };
shared Boolean evolve() {
class Automata1D<Cell>({Cell*} data, Cell alive, Cell dead)
given Cell satisfies Object {
value buffernewCells = Array {
assert(data.every((Cell element) => element == alive || element == dead));
valuefor (index->cell =in element;cells.indexed)
valuelet (left = cells[index - 1] else imaginaryFirstCell;permanentFirstCell,
value right = cells[index + 1] else imaginaryLastCell;permanentLastCell,
neighbours = [left, right],
bothAlive = neighbours.every(alive.equals),
bothDead = neighbours.every(dead.equals))
if (bothAlive)
then cell.opposite
else if (cell == alive && bothDead)
returnthen dead;
returnelse cell;
)};
if (newCells == cells) {
value imaginaryFirstCell = data.first else dead;
return changedfalse;
value imaginaryLastCell = data.last else dead;
 
value cells = Array {*data.rest.exceptLast};
function isAlive(Cell c) => c == alive;
function flipped(Cell c) => c == alive then dead else alive;
shared Boolean evolve() {
value buffer = Array {
*cells.indexed.map((Integer->Cell element) {
value index->cell = element;
value left = cells[index - 1] else imaginaryFirstCell;
value right = cells[index + 1] else imaginaryLastCell;
if(isAlive(left) && isAlive(right)) {
return flipped(cell);
}
if(isAlive(cell) && !isAlive(left) && !isAlive(right)) {
return dead;
}
return cell;
}
)};
value changed = buffer != cells;
buffer.copyTo(cells);
return changed;
}
buffernewCells.copyTo(cells);
string => imaginaryFirstCell.string + "".join(cells) + imaginaryLastCell.string;
return true;
}
string => imaginaryFirstCellpermanentFirstCell.string + "".join(cells) + imaginaryLastCellpermanentLastCell.string;
}
 
shared Automata1D? automata1d(String string) =>
value automata = Automata1D("_###_##_#_#_#_#__#__", '#', '_');
let (cells = string.map((Character element) => cellsByCharacter[element]))
assertif (datacells.every((Cell? element) => element == alive || element == deadexists));
then Automata1D(cells.coalesced)
else null;
 
shared void run() {
 
assert (exists automata = automata1d("__###__##_#_##_###__######_###_#####_#__##_____#_#_#######__"));
variable value generation = 0;
print("generation ``generation`` ``automata``");
while (automata.evolve() && generation < 10) {
print("generation `` ++generation `` ``automata``");
}
}</lang>
Anonymous user