Skip to content
Snippets Groups Projects
Verified Commit ab6b1ea3 authored by mirabilos's avatar mirabilos Committed by mirabilos
Browse files

now it’s fucking too low again, wtf is this even…

parent 4fcdee9e
No related branches found
No related tags found
No related merge requests found
......@@ -7,7 +7,7 @@
#include "inputs.h"
static unsigned char FF[H][W];
static unsigned char FF2[H][W];
unsigned char FF2[H][W];
#define F(y,x) FF[y][x]
#define F2w(y,x) FF2[y][x]
#define F2(y,x) (FF2[y][x] & 0x7FU)
......@@ -15,7 +15,6 @@ static unsigned char FF2[H][W];
static unsigned long long total = 0;
static void getfield(int y, int x);
static unsigned int getfield2(int y, int x, unsigned char xc2);
int
main(void)
......@@ -37,6 +36,8 @@ static unsigned long long area;
static unsigned long long sides;
static unsigned int reclvl;
extern unsigned int getfield2(int y, int x, unsigned char xc2);
static void
recurse(int y, int x)
{
......@@ -44,6 +45,7 @@ recurse(int y, int x)
++reclvl;
F(y, x) |= 0x80U;
F2w(y, x) |= 0x80U | 0x20U;
++area;
#define try(Y,X,dir) do { \
......@@ -66,32 +68,38 @@ static void
getfield(int y, int x)
{
int y0, x0, yl, xl;
int extent[H][2];
unsigned char xc2;
for (yl = 0; yl < H; ++yl) {
extent[yl][0] = INT_MAX;
extent[yl][1] = -1;
}
oc = F(y, x);
xc = oc | 0x80U;
xc2 = xc & 0x7FU;
xc2 = (xc & 0x7FU) | 0x20U;
area = 0;
printf("BEGIN '%c' @ (%d, %d)\n", oc, y, x);
reclvl = 0;
memcpy(FF2, FF, sizeof(FF));
recurse(y, x);
for (yl = 0; yl < H; ++yl) {
putchar('<');
for (xl = 0; xl < W; ++xl)
putchar(F2(yl,xl));
printf(">\n");
}
if (area == 1) {
/* this uncomplicates the loop below */
sides = 4;
goto walk_finished;
//goto walk_finished;
printf("└─END '%c' @ (%d, %d) → area %llu, sides %llu\n",
oc, y, x, area, sides);
total += area * sides;
return;
}
fll: /* find a lower left corner */
if (F(y + 1, x) == xc) {
if (F2(y + 1, x) == xc2) {
++y;
goto fll;
}
if (F(y, x - 1) == xc) {
if (F2(y, x - 1) == xc2) {
--x;
goto fll;
}
......@@ -99,30 +107,22 @@ getfield(int y, int x)
y0 = y;
x0 = x;
sides = 1;
printf("ll(%u,%u)\n",y,x);
walk_north:
if (x < extent[y][0])
extent[y][0] = x;
if (x > extent[y][1])
extent[y][1] = x;
F2w(y, x - 1) = '*';
printf("│↑(%d, %d) ", y, x);
if (F(y - 1, x) != xc) {
if (F2(y - 1, x) != xc2) {
/* west side ended, north side begins */
printf("┌→\n");
++sides;
goto walk_east;
}
--y;
// if (y == y0 && x == x0) {
// printf("---> (%d, %d) fin\n", y, x);
// goto walk_finished;
// }
if (F(y, x - 1) == xc) {
if (F2(y, x - 1) == xc2) {
/* west side ended */
/* turn left, go forward (W), south side begins */
printf("\033[1m←┐\033[0m\n");
--x;
// if (y == y0 && x == x0)
// goto walk_finished;
++sides;
goto walk_west;
}
......@@ -133,23 +133,16 @@ getfield(int y, int x)
printf("↑\n");
goto walk_north;
walk_east:
if (x < extent[y][0])
extent[y][0] = x;
if (x > extent[y][1])
extent[y][1] = x;
F2w(y - 1, x) = '*';
printf("│→(%d, %d) ", y, x);
if (F(y, x + 1) != xc) {
if (F2(y, x + 1) != xc2) {
/* north side ended, east side begins */
printf("─┐̬\n");
++sides;
goto walk_south;
}
++x;
// if (y == y0 && x == x0) {
// printf("---> (%d, %d) fin\n", y, x);
// goto walk_finished;
// }
if (F(y - 1, x) == xc) {
if (F2(y - 1, x) == xc2) {
/* north side ended */
/* turn left, go forward (N), west side begins */
printf("\033[1m─┘̂\033[0m\n");
......@@ -162,41 +155,29 @@ getfield(int y, int x)
printf("→\n");
goto walk_east;
walk_south:
if (x < extent[y][0])
extent[y][0] = x;
if (x > extent[y][1])
extent[y][1] = x;
F2w(y, x + 1) = '*';
printf("│↓(%d, %d) ", y, x);
if (F(y + 1, x) != xc) {
if (F2(y + 1, x) != xc2) {
/* east side ended, south side begins */
printf("←┘\n");
++sides;
goto walk_west;
}
++y;
// if (y == y0 && x == x0) {
// printf("---> (%d, %d) fin\n", y, x);
// goto walk_finished;
// }
if (F(y, x + 1) == xc) {
if (F2(y, x + 1) == xc2) {
/* east side ended */
/* turn left, go forward (E), north side begins */
printf("\033[1m└→\033[0m\n");
++x;
// if (y == y0 && x == x0)
// goto walk_finished;
++sides;
goto walk_east;
}
printf("↓\n");
goto walk_south;
walk_west:
if (x < extent[y][0])
extent[y][0] = x;
if (x > extent[y][1])
extent[y][1] = x;
F2w(y + 1, x) = '*';
printf("│←(%d, %d) ", y, x);
if (F(y, x - 1) != xc) {
if (F2(y, x - 1) != xc2) {
if (y == y0 && x == x0) {
printf("---> (%d, %d) fin\n", y, x);
goto walk_finished;
......@@ -207,17 +188,11 @@ getfield(int y, int x)
goto walk_north;
}
--x;
// if (y == y0 && x == x0) {
// printf("---> (%d, %d) fin\n", y, x);
// goto walk_finished;
// }
if (F(y + 1, x) == xc) {
if (F2(y + 1, x) == xc2) {
/* south side ended */
/* turn left, go forward (S), east side begins */
printf("\033[1m┌̬─\033[0m\n");
++y;
// if (y == y0 && x == x0)
// goto walk_finished;
++sides;
goto walk_south;
}
......@@ -226,193 +201,46 @@ getfield(int y, int x)
walk_finished:
printf("└─END '%c' @ (%d, %d) → area %llu, sides %llu\n",
oc, y, x, area, sides);
memcpy(FF2, FF, sizeof(FF));
for (yl = 0; yl < H; ++yl) {
if (!(extent[yl][0] < extent[yl][1]))
continue;
for (xl = extent[yl][0]; xl <= extent[yl][1]; ++xl)
if (F2(yl,xl) != xc2 && !(F2(yl,xl) & 0x20U))
sides += getfield2(yl, xl, xc2);
}
printf("→ area %llu, sides %llu\n", area, sides);
total += area * sides;
}
static unsigned long long area2;
static unsigned long long sides2;
static int
recurse2(int y, int x, unsigned char xc2)
{
unsigned char c;
++reclvl;
F2w(y, x) |= 0x20U;
++area2;
#undef try
#define try(Y,X,dir) do { \
if ((c = F2(Y, X)) == oc) { \
printf("\t│%*s" dir " recursing @ (%d, %d)\n", \
reclvl, "", Y, X); \
if (recurse2(Y, X, xc2)) \
return (1); \
} else if (c != xc2) \
return (1); \
} while (/* CONSTCOND */ 0)
try(y - 1, x, "up");
try(y, x + 1, "right");
try(y + 1, x, "down");
try(y, x - 1, "left");
--reclvl;
return (0);
}
static unsigned int
getfield2(int y, int x, unsigned char xc2)
{
int y0, x0;
oc = F2(y, x);
xc = oc | 0x20U;
area2 = 0;
printf("\tBEGIN '%c' @ (%d, %d)\n", oc, y, x);
reclvl = 0;
if (recurse2(y, x, xc2)) {
printf("\tNOPE\n");
return (0);
}
if (area2 == 1) {
/* this uncomplicates the loop below */
sides2 = 4;
goto walk_finished;
}
fll: /* find a lower left corner */
if (F2(y + 1, x) == xc) {
++y;
goto fll;
}
if (F2(y, x - 1) == xc) {
--x;
goto fll;
}
/* now we know a side begins at our left (west) */
y0 = y;
x0 = x;
sides2 = 1;
walk_north:
printf("\t│↑(%d, %d) ", y, x);
if (F2(y - 1, x) != xc) {
/* west side ended, north side begins */
printf("┌→\n");
++sides2;
goto walk_east;
}
--y;
// if (y == y0 && x == x0) {
// printf("---> (%d, %d) fin\n", y, x);
// goto walk_finished;
// }
if (F2(y, x - 1) == xc) {
/* west side ended */
/* turn left, go forward (W), south side begins */
printf("\033[1m←┐\033[0m\n");
--x;
// if (y == y0 && x == x0)
// goto walk_finished;
++sides2;
goto walk_west;
}
if (y == y0 && x == x0) {
printf("---> (%d, %d) fin\n", y, x);
goto walk_finished;
}
printf("↑\n");
goto walk_north;
walk_east:
printf("\t│→(%d, %d) ", y, x);
if (F2(y, x + 1) != xc) {
/* north side ended, east side begins */
printf("─┐̬\n");
++sides2;
goto walk_south;
}
++x;
// if (y == y0 && x == x0) {
// printf("---> (%d, %d) fin\n", y, x);
// goto walk_finished;
// }
if (F2(y - 1, x) == xc) {
/* north side ended */
/* turn left, go forward (N), west side begins */
printf("\033[1m─┘̂\033[0m\n");
--y;
if (y == y0 && x == x0)
goto walk_finished;
++sides2;
goto walk_north;
}
printf("→\n");
goto walk_east;
walk_south:
printf("\t│↓(%d, %d) ", y, x);
if (F2(y + 1, x) != xc) {
/* east side ended, south side begins */
printf("←┘\n");
++sides2;
goto walk_west;
}
++y;
// if (y == y0 && x == x0) {
// printf("---> (%d, %d) fin\n", y, x);
// goto walk_finished;
// }
if (F2(y, x + 1) == xc) {
/* east side ended */
/* turn left, go forward (E), north side begins */
printf("\033[1m└→\033[0m\n");
++x;
// if (y == y0 && x == x0)
// goto walk_finished;
++sides2;
goto walk_east;
}
printf("↓\n");
goto walk_south;
walk_west:
printf("\t│←(%d, %d) ", y, x);
if (F2(y, x - 1) != xc) {
if (y == y0 && x == x0) {
printf("---> (%d, %d) fin\n", y, x);
goto walk_finished;
unsigned inside = 0;
for (xl = 0; xl < W; ++xl) {
if (!inside && F2(yl,xl) == '*' && xl < W-1 && F2(yl,xl+1) == xc2)
inside = 1;
else if (!inside)
F2w(yl,xl) = '*';
else if (F2(yl,xl) == '*')
inside = 0;
}
/* south side ended, west side begins */
printf("└̂─\n");
++sides2;
goto walk_north;
}
--x;
// if (y == y0 && x == x0) {
// printf("---> (%d, %d) fin\n", y, x);
// goto walk_finished;
// }
if (F2(y + 1, x) == xc) {
/* south side ended */
/* turn left, go forward (S), east side begins */
printf("\033[1m┌̬─\033[0m\n");
++y;
// if (y == y0 && x == x0)
// goto walk_finished;
++sides2;
goto walk_south;
for (yl = 0; yl < H; ++yl) {
putchar('<');
for (xl = 0; xl < W; ++xl)
putchar(F2(yl,xl));
printf(">\n");
}
printf("←\n");
goto walk_west;
walk_finished:
printf("\t└─END '%c' @ (%d, %d) → area %llu, sides %llu\n",
oc, y, x, area2, sides2);
return (sides2);
rerun:
for (yl = 1; yl < H - 1; ++yl)
for (xl = 1; xl < W - 1; ++xl)
if (F2(yl,xl) != xc2 && F2(yl,xl) != '*') {
unsigned char *cp, *ep;
sides += getfield2(yl, xl, xc2);
for (yl = 0; yl < H; ++yl) {
putchar('\t');
putchar('<');
for (xl = 0; xl < W; ++xl)
putchar(F2(yl,xl));
printf(">\n");
}
cp = &(FF2[0][0]);
ep = cp + sizeof(FF2);
while (cp < ep) {
if (*cp == '#')
*cp = '*';
++cp;
}
goto rerun;
}
printf("→ area %llu, sides %llu\n", area, sides);
total += area * sides;
}
#include <stdio.h>
#include "inputs.h"
extern unsigned char FF2[H][W];
#define F2w(y,x) FF2[y][x]
#define F2(y,x) (FF2[y][x] & 0x7FU)
static unsigned long long area2;
static unsigned long long sides2;
static unsigned int reclvl;
static void
recurse2(int y, int x, unsigned char xc2)
{
unsigned char c;
++reclvl;
F2w(y, x) = '#';
++area2;
#undef try
#define try(Y,X,dir) do { \
if ((c = F2(Y, X)) != xc2 && c != '*' && c != '#') { \
printf("\t│%*s" dir " recursing @ (%d, %d)\n", \
reclvl, "", Y, X); \
recurse2(Y, X, xc2); \
} \
} while (/* CONSTCOND */ 0)
try(y - 1, x, "up");
try(y, x + 1, "right");
try(y + 1, x, "down");
try(y, x - 1, "left");
--reclvl;
}
unsigned int
getfield2(int y, int x, unsigned char xc2)
{
int y0, x0;
unsigned char oc = F2(y,x);
area2 = 0;
printf("\tBEGIN '%c' @ (%d, %d)\n", oc, y, x);
reclvl = 0;
recurse2(y, x, xc2);
if (area2 == 1) {
/* this uncomplicates the loop below */
sides2 = 4;
//goto walk_finished;
printf("\t└─END '%c' @ (%d, %d) → area %llu, sides %llu\n",
oc, y, x, area2, sides2);
return (sides2);
}
fll: /* find a lower left corner */
#define NN(x) ((x) != xc2 && (x) != '*')
if (NN(F2(y + 1, x))) {
++y;
goto fll;
}
if (NN(F2(y, x - 1))) {
--x;
goto fll;
}
/* now we know a side begins at our left (west) */
y0 = y;
x0 = x;
sides2 = 1;
walk_north:
printf("\t│↑(%d, %d) ", y, x);
if (!NN(F2(y - 1, x))) {
/* west side ended, north side begins */
printf("┌→\n");
++sides2;
goto walk_east;
}
--y;
if (NN(F2(y, x - 1))) {
/* west side ended */
/* turn left, go forward (W), south side begins */
printf("\033[1m←┐\033[0m\n");
--x;
++sides2;
goto walk_west;
}
if (y == y0 && x == x0) {
printf("---> (%d, %d) fin\n", y, x);
goto walk_finished;
}
printf("↑\n");
goto walk_north;
walk_east:
printf("\t│→(%d, %d) ", y, x);
if (!NN(F2(y, x + 1))) {
/* north side ended, east side begins */
printf("─┐̬\n");
++sides2;
goto walk_south;
}
++x;
if (NN(F2(y - 1, x))) {
/* north side ended */
/* turn left, go forward (N), west side begins */
printf("\033[1m─┘̂\033[0m\n");
--y;
if (y == y0 && x == x0)
goto walk_finished;
++sides2;
goto walk_north;
}
printf("→\n");
goto walk_east;
walk_south:
printf("\t│↓(%d, %d) ", y, x);
if (!NN(F2(y + 1, x))) {
/* east side ended, south side begins */
printf("←┘\n");
++sides2;
goto walk_west;
}
++y;
if (NN(F2(y, x + 1))) {
/* east side ended */
/* turn left, go forward (E), north side begins */
printf("\033[1m└→\033[0m\n");
++x;
++sides2;
goto walk_east;
}
printf("↓\n");
goto walk_south;
walk_west:
printf("\t│←(%d, %d) ", y, x);
if (!NN(F2(y, x - 1))) {
if (y == y0 && x == x0) {
printf("---> (%d, %d) fin\n", y, x);
goto walk_finished;
}
/* south side ended, west side begins */
printf("└̂─\n");
++sides2;
goto walk_north;
}
--x;
if (NN(F2(y + 1, x))) {
/* south side ended */
/* turn left, go forward (S), east side begins */
printf("\033[1m┌̬─\033[0m\n");
++y;
++sides2;
goto walk_south;
}
printf("←\n");
goto walk_west;
walk_finished:
printf("\t└─END '%c' @ (%d, %d) → area %llu, sides %llu\n",
oc, y, x, area2, sides2);
return (sides2);
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment