RosettaCodeData/Task/Wireworld/Elena/wireworld.elena
2019-09-12 10:33:56 -07:00

138 lines
3.2 KiB
Text

import system'routines.
import extensions.
import cellular.
const literal sample =
" tH......
. ......
...Ht... .
....
. .....
....
......tH .
. ......
...Ht...".
const literal conductorLabel = ".".
const literal headLabel = "H".
const literal tailLabel = "t".
const literal emptyLabel = " ".
const int empty = 0.
const int conductor = 1.
const int electronHead = 2.
const int electronTail = 3.
wireWorldRuleSet = RuleSet::
{
proceed(Space s, int x, int y, ref<int> retVal)
[
int cell := s getAt(x, y).
cell =>
conductor
[
int number := s getLiveCell(x, y, electronHead).
if ((number == 1)||(number == 2))
[
retVal value := electronHead
];
[
retVal value := conductor
]
];
electronHead
[
retVal value := electronTail
];
electronTail
[
retVal value := conductor
];
![
retVal value := cell
].
]
}.
sealed class Model
{
T<Space> theSpace.
constructor load(LiteralValue stateString,int maxX, int maxY)
[
var strings := stateString split(newLine); selectBy(:s)(s toArray); toArray.
theSpace := IntMatrixSpace new(maxX, maxY, RuleSet::
{
proceed(Space s, int x, int y, ref<int> retVal)
[
if (x < strings length)
[
var l := strings[x].
if (y < l length)
[
(l[y]) =>
conductorLabel [ retVal value := conductor ];
headLabel [ retVal value := electronHead ];
tailLabel [ retVal value := electronTail ];
emptyLabel [ retVal value := empty ].
];
[
retVal value := empty
]
];
[
retVal value := empty
]
]
}).
]
run
[
theSpace update(wireWorldRuleSet).
]
print
[
int columns := theSpace columns.
int rows := theSpace rows.
int i := 0.
int j := 0.
while (i < rows)
[
j := 0.
while (j < columns)
[
var label := emptyLabel.
int cell := theSpace getAt(i, j).
cell =>
conductor [ label := conductorLabel ];
electronHead [ label := headLabel ];
electronTail [ label := tailLabel ].
console write(label).
j := j + 1.
].
i := i + 1.
console writeLine.
].
]
}
public program
[
T<Model> model := Model load(sample,10,30).
0 to:10 do(:i)
[
console printLineFormatted("Iteration {0}",i).
model print; run.
]
]