Wireworld: Difference between revisions
Content added Content deleted
m (command_line[$]) |
(added ceylon) |
||
Line 959: | Line 959: | ||
=={{header|C sharp}}== |
=={{header|C sharp}}== |
||
See: [[Wireworld/C sharp]] |
See: [[Wireworld/C sharp]] |
||
=={{header|Ceylon}}== |
|||
<lang ceylon>abstract class Cell(shared Character char) of emptyCell | head | tail | conductor { |
|||
shared Cell output({Cell*} neighbors) => |
|||
switch (this) |
|||
case (emptyCell) emptyCell |
|||
case (head) tail |
|||
case (tail) conductor |
|||
case (conductor) (neighbors.count(head.equals) in 1..2 then head else conductor); |
|||
string => char.string; |
|||
} |
|||
object emptyCell extends Cell(' ') {} |
|||
object head extends Cell('H') {} |
|||
object tail extends Cell('t') {} |
|||
object conductor extends Cell('.') {} |
|||
Map<Character,Cell> cellsByChar = map { for (cell in `Cell`.caseValues) cell.char->cell }; |
|||
class Wireworld(String data) { |
|||
value lines = data.lines; |
|||
value width = max(lines*.size); |
|||
value height = lines.size; |
|||
function toIndex(Integer x, Integer y) => x + y * width; |
|||
variable value currentState = Array.ofSize(width * height, emptyCell); |
|||
variable value nextState = Array.ofSize(width * height, emptyCell); |
|||
for (j->line in lines.indexed) { |
|||
for (i->char in line.indexed) { |
|||
currentState[toIndex(i, j)] = cellsByChar[char] else emptyCell; |
|||
} |
|||
} |
|||
value emptyGrid = Array.ofSize(width * height, emptyCell); |
|||
void clear(Array<Cell> cells) => emptyGrid.copyTo(cells); |
|||
shared void update() { |
|||
clear(nextState); |
|||
for(j in 0:height) { |
|||
for(i in 0:width) { |
|||
if(exists cell = currentState[toIndex(i, j)]) { |
|||
value nextCell = cell.output(neighborhood(currentState, i, j)); |
|||
nextState[toIndex(i, j)] = nextCell; |
|||
} |
|||
} |
|||
} |
|||
value temp = currentState; |
|||
currentState = nextState; |
|||
nextState = temp; |
|||
} |
|||
shared void display() { |
|||
for (row in currentState.partition(width)) { |
|||
print("".join(row)); |
|||
} |
|||
} |
|||
shared {Cell*} neighborhood(Array<Cell> grid, Integer x, Integer y) => { |
|||
for (j in y - 1..y + 1) |
|||
for (i in x - 1..x + 1) |
|||
if(i in 0:width && j in 0:height) |
|||
grid[toIndex(i, j)] |
|||
}.coalesced; |
|||
} |
|||
shared void run() { |
|||
value data = "tH......... |
|||
. . |
|||
... |
|||
. . |
|||
Ht.. ......"; |
|||
value world = Wireworld(data); |
|||
variable value generation = 0; |
|||
void display() { |
|||
print("generation: ``generation``"); |
|||
world.display(); |
|||
} |
|||
display(); |
|||
while (true) { |
|||
if (exists input = process.readLine(), input.lowercased == "q") { |
|||
return; |
|||
} |
|||
world.update(); |
|||
generation++; |
|||
display(); |
|||
} |
|||
} |
|||
</lang> |
|||
=={{header|Common Lisp}}== |
=={{header|Common Lisp}}== |