@@ 7,22 7,36 @@ typedef struct Grid {
} Grid;
int
-error(char *name)
+cint(char c)
{
- printf("Error: %s\n", name);
+ if(c == '.')
+ return 0;
+ if(c >= '0' && c <= '9')
+ return c - '0';
+ if(c >= 'a' && c <= 'z')
+ return c - 'a' + 10;
+ if(c >= 'A' && c <= 'Z')
+ return c - 'A' + 10;
return 0;
}
-void
-lock(Grid *g, int x, int y, int b)
+char
+cchr(int v, int cap)
{
- g->lock[x + (y * g->w)] = b;
+ v %= 36;
+ v *= v < 0 ? -1 : 1;
+ if(v >= 0 && v <= 9)
+ return '0' + v;
+ if(cap)
+ return 'A' + (v - 10);
+ return 'a' + (v - 10);
}
int
-busy(Grid *g, int x, int y)
+error(char *name)
{
- return g->lock[x + (y * g->w)];
+ printf("Error: %s\n", name);
+ return 0;
}
char
@@ 40,7 54,32 @@ set(Grid *g, int x, int y, char c)
int
getint(Grid *g, int x, int y)
{
- return get(g, x, y) - '0';
+ return cint(get(g, x, y));
+}
+
+void
+setint(Grid *g, int x, int y, int v)
+{
+ g->data[x + (y * g->w)] = cchr(v, 0);
+}
+
+void
+lock(Grid *g, int x, int y)
+{
+ g->lock[x + (y * g->w)] = 1;
+}
+
+int
+busy(Grid *g, int x, int y)
+{
+ return g->lock[x + (y * g->w)];
+}
+
+int
+caps(Grid *g, int x, int y)
+{
+ char c = get(g, x, y);
+ return c >= 'A' && c <= 'Z';
}
void
@@ 59,14 98,20 @@ parse(Grid *g)
if(busy(g, x, y))
continue;
if(c == 'A') {
- set(g, x, y + 1, '0');
+ set(g, x, y + 1, cchr(getint(g, x - 1, y) + getint(g, x + 1, y), caps(g, x + 1, y)));
+ lock(g, x + 1, y);
+ lock(g, x, y + 1);
+ } else if(c == 'B') {
+ set(g, x, y + 1, cchr(getint(g, x - 1, y) - getint(g, x + 1, y), caps(g, x + 1, y)));
+ lock(g, x + 1, y);
+ lock(g, x, y + 1);
} else if(c == 'E') {
if(x == g->w || get(g, x + 1, y) != '.')
set(g, x, y, '*');
else {
set(g, x, y, '.');
set(g, x + 1, y, 'E');
- lock(g, x + 1, y, 1);
+ lock(g, x + 1, y);
}
} else if(c == 'N') {
if(y == 0 || get(g, x, y - 1) != '.')
@@ 74,7 119,7 @@ parse(Grid *g)
else {
set(g, x, y, '.');
set(g, x, y - 1, 'N');
- lock(g, x, y - 1, 1);
+ lock(g, x, y - 1);
}
} else if(c == 'S') {
if(y == g->h || get(g, x, y + 1) != '.')
@@ 82,7 127,7 @@ parse(Grid *g)
else {
set(g, x, y, '.');
set(g, x, y + 1, 'S');
- lock(g, x, y + 1, 1);
+ lock(g, x, y + 1);
}
} else if(c == 'W') {
if(x == 0 || get(g, x - 1, y) != '.')
@@ 90,7 135,7 @@ parse(Grid *g)
else {
set(g, x, y, '.');
set(g, x - 1, y, 'W');
- lock(g, x - 1, y, 1);
+ lock(g, x - 1, y);
}
}
}