diff options
| author | Sebastiano Tronto <sebastiano@tronto.net> | 2025-12-09 08:26:58 +0100 |
|---|---|---|
| committer | Sebastiano Tronto <sebastiano@tronto.net> | 2025-12-09 08:26:58 +0100 |
| commit | fa9375ef9a4ecb36b28cdffe70f2d48cf9bdb58f (patch) | |
| tree | 0a603ce20f9a72dcf9387bcc69102cc6886d543e /2025/09 | |
| parent | 739416b040965ef61492f07c1d0196fcd850ab54 (diff) | |
| download | aoc-fa9375ef9a4ecb36b28cdffe70f2d48cf9bdb58f.tar.gz aoc-fa9375ef9a4ecb36b28cdffe70f2d48cf9bdb58f.zip | |
Day 9 2025
Diffstat (limited to '')
| -rw-r--r-- | 2025/09/a.py | 9 | ||||
| -rw-r--r-- | 2025/09/b.py | 37 |
2 files changed, 44 insertions, 2 deletions
diff --git a/2025/09/a.py b/2025/09/a.py index 5fdb11b..8733737 100644 --- a/2025/09/a.py +++ b/2025/09/a.py | |||
| @@ -1,6 +1,11 @@ | |||
| 1 | import fileinput | 1 | import fileinput |
| 2 | 2 | ||
| 3 | with fileinput.input() as lines: | 3 | with fileinput.input() as lines: |
| 4 | for line in lines: | 4 | a = [tuple(int(x) for x in l[:-1].split(',')) for l in lines] |
| 5 | ... | ||
| 6 | 5 | ||
| 6 | s = 0 | ||
| 7 | for i in range(len(a)): | ||
| 8 | for j in range(i+1, len(a)): | ||
| 9 | s = max(s, (abs(a[i][0]-a[j][0])+1) * (abs(a[i][1]-a[j][1])+1)) | ||
| 10 | |||
| 11 | print(s) | ||
diff --git a/2025/09/b.py b/2025/09/b.py new file mode 100644 index 0000000..ad0095b --- /dev/null +++ b/2025/09/b.py | |||
| @@ -0,0 +1,37 @@ | |||
| 1 | import fileinput | ||
| 2 | |||
| 3 | with fileinput.input() as lines: | ||
| 4 | a = [tuple(int(x) for x in l[:-1].split(',')) for l in lines] | ||
| 5 | |||
| 6 | # Check if the border is turning clockwise or counter-clockwise | ||
| 7 | def dir(p, q): | ||
| 8 | return p[0]*q[1]-p[1]*q[0] | ||
| 9 | t = 0 | ||
| 10 | for i in range(len(a)): | ||
| 11 | p, q, r = a[i%len(a)], a[(i+1)%len(a)], a[(i+2)%len(a)] | ||
| 12 | t += 1 if dir((q[0]-p[0],q[1]-p[1]), (r[0]-q[0],r[1]-q[1])) > 0 else -1 | ||
| 13 | |||
| 14 | def lbreaks(p, q, tl, br): | ||
| 15 | # Adjust for horizontal or vertical | ||
| 16 | (tt, z) = (t, 0) if p[0] == q[0] else (-t, 1) | ||
| 17 | |||
| 18 | if min(p[1-z], q[1-z]) >= br[1-z] or max(p[1-z], q[1-z]) <= tl[1-z]: | ||
| 19 | return False | ||
| 20 | if p[z] == tl[z]: | ||
| 21 | return tt * (q[1-z]-p[1-z]) > 0 | ||
| 22 | if p[z] == br[z]: | ||
| 23 | return tt * (q[1-z]-p[1-z]) < 0 | ||
| 24 | |||
| 25 | return p[z] > tl[z] and p[z] < br[z] | ||
| 26 | |||
| 27 | def admissible(a, i, j): | ||
| 28 | tl = (min(a[i][0], a[j][0]), min(a[i][1], a[j][1])) | ||
| 29 | br = (max(a[i][0], a[j][0]), max(a[i][1], a[j][1])) | ||
| 30 | return not any(lbreaks(a[k], a[(k+1)%len(a)], tl, br) for k in range(len(a))) | ||
| 31 | |||
| 32 | s = 0 | ||
| 33 | for i in range(len(a)): | ||
| 34 | for j in range(i+1, len(a)): | ||
| 35 | if admissible(a, i, j): | ||
| 36 | s = max(s, (abs(a[i][0]-a[j][0])+1)*(abs(a[i][1]-a[j][1])+1)) | ||
| 37 | print(s) | ||
