RosettaCodeData/Task/Wireworld/Elena/wireworld.elena

139 lines
3.2 KiB
Text
Raw Permalink Normal View History

2019-09-12 10:33:56 -07:00
import system'routines.
2018-06-22 20:57:24 +00:00
import extensions.
import cellular.
2019-09-12 10:33:56 -07:00
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::
2018-06-22 20:57:24 +00:00
{
2019-09-12 10:33:56 -07:00
proceed(Space s, int x, int y, ref<int> retVal)
2018-06-22 20:57:24 +00:00
[
2019-09-12 10:33:56 -07:00
int cell := s getAt(x, y).
2018-06-22 20:57:24 +00:00
2019-09-12 10:33:56 -07:00
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
].
2018-06-22 20:57:24 +00:00
]
2019-09-12 10:33:56 -07:00
}.
2018-06-22 20:57:24 +00:00
2019-09-12 10:33:56 -07:00
sealed class Model
{
T<Space> theSpace.
2018-06-22 20:57:24 +00:00
2019-09-12 10:33:56 -07:00
constructor load(LiteralValue stateString,int maxX, int maxY)
2018-06-22 20:57:24 +00:00
[
2019-09-12 10:33:56 -07:00
var strings := stateString split(newLine); selectBy(:s)(s toArray); toArray.
2018-06-22 20:57:24 +00:00
2019-09-12 10:33:56 -07:00
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
]
]
}).
2018-06-22 20:57:24 +00:00
]
run
[
2019-09-12 10:33:56 -07:00
theSpace update(wireWorldRuleSet).
2018-06-22 20:57:24 +00:00
]
print
[
2019-09-12 10:33:56 -07:00
int columns := theSpace columns.
int rows := theSpace rows.
2018-06-22 20:57:24 +00:00
int i := 0.
int j := 0.
while (i < rows)
[
j := 0.
while (j < columns)
[
2019-09-12 10:33:56 -07:00
var label := emptyLabel.
int cell := theSpace getAt(i, j).
cell =>
conductor [ label := conductorLabel ];
electronHead [ label := headLabel ];
electronTail [ label := tailLabel ].
2018-06-22 20:57:24 +00:00
2019-09-12 10:33:56 -07:00
console write(label).
2018-06-22 20:57:24 +00:00
j := j + 1.
].
i := i + 1.
console writeLine.
].
]
}
2019-09-12 10:33:56 -07:00
public program
2018-06-22 20:57:24 +00:00
[
2019-09-12 10:33:56 -07:00
T<Model> model := Model load(sample,10,30).
0 to:10 do(:i)
2018-06-22 20:57:24 +00:00
[
2019-09-12 10:33:56 -07:00
console printLineFormatted("Iteration {0}",i).
model print; run.
]
]