aboutsummaryrefslogtreecommitdiffstats
path: root/src/21
diff options
context:
space:
mode:
authorLouis Burda <quent.burda@gmail.com>2023-04-07 16:16:42 -0400
committerLouis Burda <quent.burda@gmail.com>2023-04-07 16:16:42 -0400
commit277e5d08e28b5fcab8b019f66211883d976efbad (patch)
treeb1e8ae3ae602edb98236ea79676f913d0328c798 /src/21
parent73b29dfa9d07c37e8d4db2136cd73fdd9f0650b8 (diff)
downloadaoc2018-python-277e5d08e28b5fcab8b019f66211883d976efbad.tar.gz
aoc2018-python-277e5d08e28b5fcab8b019f66211883d976efbad.zip
Add helper to check solutions and reorder to new layout
Diffstat (limited to 'src/21')
-rw-r--r--src/21/input.txt32
-rw-r--r--src/21/solve.py139
2 files changed, 0 insertions, 171 deletions
diff --git a/src/21/input.txt b/src/21/input.txt
deleted file mode 100644
index d60c037..0000000
--- a/src/21/input.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-#ip 3
-seti 123 0 1
-bani 1 456 1
-eqri 1 72 1
-addr 1 3 3
-seti 0 0 3
-seti 0 7 1
-bori 1 65536 4
-seti 3798839 3 1
-bani 4 255 5
-addr 1 5 1
-bani 1 16777215 1
-muli 1 65899 1
-bani 1 16777215 1
-gtir 256 4 5
-addr 5 3 3
-addi 3 1 3
-seti 27 6 3
-seti 0 2 5
-addi 5 1 2
-muli 2 256 2
-gtrr 2 4 2
-addr 2 3 3
-addi 3 1 3
-seti 25 3 3
-addi 5 1 5
-seti 17 1 3
-setr 5 6 4
-seti 7 8 3
-eqrr 1 0 5
-addr 5 3 3
-seti 5 6 3
diff --git a/src/21/solve.py b/src/21/solve.py
deleted file mode 100644
index 1261009..0000000
--- a/src/21/solve.py
+++ /dev/null
@@ -1,139 +0,0 @@
-from sys import argv as args
-from math import sqrt
-
-def parseCommand(l):
- s = l.split(" ")
- args = [s[0]]
- args = args + [int(v) for v in s[1:]]
- return args
-
-file = open("input.txt")
-sinput = file.read()
-file.close()
-
-ainput = """#ip 0
-seti 5 0 1
-seti 6 0 2
-addi 0 1 0
-addr 1 2 3
-setr 1 0 0
-seti 8 0 4
-seti 9 0 5"""
-
-sinput = sinput.split("\n")
-
-inspaddr = int(sinput[0][4:])
-
-instructs = [parseCommand(l) for l in sinput[1:] if len(l) != 0]
-
-register = [0 for x in range(inspaddr+1)]
-
-opmap = dict()
-opmap["addr"] = lambda a, b : register[a] + register[b]
-opmap["addi"] = lambda a, b : register[a] + b
-opmap["mulr"] = lambda a, b : register[a] * register[b]
-opmap["muli"] = lambda a, b : register[a] * b
-opmap["banr"] = lambda a, b : register[a] & register[b]
-opmap["bani"] = lambda a, b : register[a] & b
-opmap["borr"] = lambda a, b : register[a] | register[b]
-opmap["bori"] = lambda a, b : register[a] | b
-opmap["setr"] = lambda a, b : register[a]
-opmap["seti"] = lambda a, b : a
-opmap["gtir"] = lambda a, b : 1 * (a > register[b])
-opmap["gtri"] = lambda a, b : 1 * (register[a] > b)
-opmap["gtrr"] = lambda a, b : 1 * (register[a] > register[b])
-opmap["eqir"] = lambda a, b : 1 * (a == register[b])
-opmap["eqri"] = lambda a, b : 1 * (register[a] == b)
-opmap["eqrr"] = lambda a, b : 1 * (register[a] == register[b])
-
-def varname(v):
- return "R"+str(v)
-
-dismap = dict()
-dismap["addr"] = lambda a, b : "%s + %s" % (varname(a), varname(b))
-dismap["addi"] = lambda a, b : "%s + %d" % (varname(a), b)
-dismap["mulr"] = lambda a, b : "%s * %s" % (varname(a), varname(b))
-dismap["muli"] = lambda a, b : "%s * %d" % (varname(a), b)
-dismap["banr"] = lambda a, b : "%s & %s" % (varname(a), varname(b))
-dismap["bani"] = lambda a, b : "%s & %d" % (varname(a), b)
-dismap["borr"] = lambda a, b : "%s | %s" % (varname(a), varname(b))
-dismap["bori"] = lambda a, b : "%s | %d" % (varname(a), b)
-dismap["setr"] = lambda a, b : "%s" % (varname(a))
-dismap["seti"] = lambda a, b : "%d" % (a)
-dismap["gtir"] = lambda a, b : "(%d > %s)" % (a, varname(b))
-dismap["gtri"] = lambda a, b : "(%s > %d)" % (varname(a), b)
-dismap["gtrr"] = lambda a, b : "(%s > %s)" % (varname(a), varname(b))
-dismap["eqir"] = lambda a, b : "(%d == %s)" % (a, varname(b))
-dismap["eqri"] = lambda a, b : "(%s == %d)" % (varname(a), b)
-dismap["eqrr"] = lambda a, b : "(%s == %s)" % (varname(a), varname(b))
-
-def disassemble(s, e):
- for i in range(s, e):
- ins = instructs[i]
- print(i ,":",varname(ins[3]),"=", dismap[ins[0]](ins[1], ins[2]))
- print()
-
-def executeProgram():
- global register, insptr
- while register[inspaddr] < len(instructs):
- insptr = register[inspaddr]
- ins = instructs[insptr]
-
- # execute command
- if len(register) <= ins[3]:
- register += [0 for x in range(ins[3] - len(register) + 1)]
- register[ins[3]] = opmap[ins[0]](ins[1], ins[2])
-
- # part 1
- #if insptr == 13 and register[4] == 1:
- # print(register)
- # return
-
- # increment instruction pointer
- register[inspaddr] += 1
-
-### SETUP
-
-
-### PROGRAM CODE
-
-
-def solve1():
- r0 = 1797184 # (first opportunity for comparison r1 and r0)
-
- #disassemble(0, len(instructs))
- #executeProgram()
-
- print(r0)
- return
-
-def solve2():
- r1 = 0
- possibles = list()
- while True:
- r4 = r1 | 65536 # flip 9th bit
- r1 = 3798839
- while True: # scan bytes of r4 and add them to r1 and multiply
- r5 = r4 & 255
- r1 += r5
- r1 = r1 & 16777215
- r1 *= 65899 # equals 1 00000001 01101011
- r1 = r1 & 16777215
- if r4 < 256:
- break
- r4 = int(r4/256) # bit shift 8 to the right
- if r1 not in possibles:
- possibles.append(r1)
- #print("=>",r1)
- elif r1 == possibles[-1]:
- print(possibles[-1])
- break
-
-def main():
- if len(args) > 1:
- if args[1] == "1":
- solve1()
- elif args[1] == "2":
- solve2()
-
-main()