Solve day 25 and AoC 2022. Cool.

This commit is contained in:
2024-01-13 13:21:19 -05:00
parent 8d97abb44f
commit bac2144c17
2 changed files with 92 additions and 2 deletions

View File

@@ -1,4 +1,11 @@
# Times Done with this. Overall everything is solvable. It's more about consistency
and focus. Of course, learning more algorithms and techniques helps.
Possible to-dos:
- [ ] Optimize day 19 because it is terrible.
# Times (and comments)
- Day 1: 7:52 ... so slow brah :/ top 100 required 2:05... - Day 1: 7:52 ... so slow brah :/ top 100 required 2:05...
- Day 2: 22:30 ... I mistyped the first and second was just bad top 100 would - Day 2: 22:30 ... I mistyped the first and second was just bad top 100 would
@@ -33,4 +40,5 @@
because I loose focus and make silly errors. Like back in Middleschool. because I loose focus and make silly errors. Like back in Middleschool.
- Day 24: Easy. Should have been faster, but no crazy mistakes. Still way too - Day 24: Easy. Should have been faster, but no crazy mistakes. Still way too
slow for something easy like this. slow for something easy like this.
- Day 25: - Day 25: Quickly solved via constraint solver. Actual solution much simpler. Don't know
if I would have been able to figure it out.

82
d25.py Normal file
View File

@@ -0,0 +1,82 @@
from lib import *
EXAMPLE = """1=-0-2
12111
2=0=
21
2=01
111
20012
112
1=-1=
1-12
12
1=
122
"""
def snafu_to_dec(n: str) -> int:
r = 0
for i, c in enumerate(reversed(n)):
c = "=-012".index(c) - 2
r += c * 5**i
return r
def dec_to_snafu(n: int) -> str:
r = ""
while n != 0:
rem = n % 5
n //= 5
if rem <= 2:
r = str(rem) + r
else:
r = " =-"[rem] + r
n += 1
return r
def dec_to_snafu_cs(n: int) -> str:
import cpmpy as cp
import numpy as np
size = 20
xs = cp.intvar(-2, 2, shape=size, name="xs")
ns = np.array([5**i for i in range(size)])
m = cp.Model(cp.sum(ns * xs) == n)
m.solve()
value = xs.value()
assert value is not None
# print(value)
r = ""
for v in value:
if v >= 0:
r += str(v)
elif v == -1:
r += "-"
elif v == -2:
r += "="
else:
assert False
r = "".join(reversed(r))
r = r.lstrip("0")
return r
def solve(input: Input):
res = 0
for s in input.lines():
d = snafu_to_dec(s)
res += d
try:
assert dec_to_snafu_cs(res) == dec_to_snafu(res)
except ModuleNotFoundError:
print("Install 'cpmpy' to solve with constraint solver.")
return dec_to_snafu(res)
def main():
DAY_INPUT = "i25.txt"
print("Example 1:", solve(Input(EXAMPLE)))
print("Solution 1:", solve(Input(DAY_INPUT)))
if __name__ == "__main__":
main()