Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
A
adventofcode.com
Manage
Activity
Members
Code
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Deploy
Model registry
Analyze
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
mirabilos
adventofcode.com
Commits
ab6b1ea3
Verified
Commit
ab6b1ea3
authored
6 months ago
by
mirabilos
Committed by
mirabilos
6 months ago
Browse files
Options
Downloads
Patches
Plain Diff
now it’s fucking too low again, wtf is this even…
parent
4fcdee9e
No related branches found
Branches containing commit
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
2024/12/s2.c
+70
-242
70 additions, 242 deletions
2024/12/s2.c
2024/12/s2tu2.c
+161
-0
161 additions, 0 deletions
2024/12/s2tu2.c
with
231 additions
and
242 deletions
2024/12/s2.c
+
70
−
242
View file @
ab6b1ea3
...
...
@@ -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
(
F
2
(
y
+
1
,
x
)
==
xc
2
)
{
++
y
;
goto
fll
;
}
if
(
F
(
y
,
x
-
1
)
==
xc
)
{
if
(
F
2
(
y
,
x
-
1
)
==
xc
2
)
{
--
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
(
F
2
(
y
-
1
,
x
)
!=
xc
2
)
{
/* 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
(
F
2
(
y
,
x
+
1
)
!=
xc
2
)
{
/* 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
(
F
2
(
y
+
1
,
x
)
!=
xc
2
)
{
/* 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
(
F
2
(
y
,
x
-
1
)
!=
xc
2
)
{
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
(
"
\t
BEGIN '%c' @ (%d, %d)
\n
"
,
oc
,
y
,
x
);
reclvl
=
0
;
if
(
recurse2
(
y
,
x
,
xc2
))
{
printf
(
"
\t
NOPE
\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
;
}
This diff is collapsed.
Click to expand it.
2024/12/s2tu2.c
0 → 100644
+
161
−
0
View file @
ab6b1ea3
#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
(
"
\t
BEGIN '%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
);
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment