Skip to content

Commit 2175e9b

Browse files
committed
frenki/refactor-intcode
1 parent 7eabbc7 commit 2175e9b

4 files changed

Lines changed: 197 additions & 268 deletions

File tree

day-05/part-1/frenki.py

Lines changed: 30 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,44 @@
11
from tool.runners.python import SubmissionPy
22

33
def get_optcode_param(n):
4-
L = list(str(n))
5-
c = (L[-1], L[:-2][::-1])
6-
while len(c[1]) < 3:
7-
c[1].append('0')
8-
return c
4+
return (n%100, [(n//100)%10, (n//1000)%10, n//10000])
95

10-
class FrenkiSubmission(SubmissionPy):
11-
def __init__(self):
12-
self.l = []
6+
class IntCode(object):
7+
def __init__(self, l):
8+
self.l = l
139

1410
def choose(self, v, m):
15-
if m == '0':
11+
if m == 0:
1612
return self.l[v]
1713
return v
1814

19-
def run(self, s):
20-
self.l = list(map(int, s.split(',')))
15+
def add(self, args):
16+
self.l[args[2]] = self.l[args[1]] + self.l[args[0]]
17+
18+
def mul(self, args):
19+
self.l[args[2]] = self.l[args[1]] * self.l[args[0]]
20+
21+
def ins(self, args):
22+
self.l[args[0]] = 1
23+
24+
def ret(self, args):
25+
return self.l[args[0]]
26+
27+
def run(self):
2128
i = 0
29+
opcodes = [0,(self.add, 3), (self.mul, 3), (self.ins,1), (self.ret, 1)]
2230
while self.l[i] != 99:
23-
c = get_optcode_param(self.l[i])
24-
if c[0] == '1':
25-
index1 = self.choose(i+1, c[1][0])
26-
index2 = self.choose(i+2, c[1][1])
27-
index3 = self.choose(i+3, c[1][2])
28-
self.l[index3] = self.l[index1] + self.l[index2]
29-
i+= 4
30-
elif c[0] == '2':
31-
index1 = self.choose(i+1, c[1][0])
32-
index2 = self.choose(i+2, c[1][1])
33-
index3 = self.choose(i+3, c[1][2])
34-
self.l[index3] = self.l[index1] * self.l[index2]
35-
i += 4
36-
elif c[0] == '3':
37-
index1 = self.l[i+1]
38-
self.l[index1] = 1
39-
i+= 2
40-
elif c[0] == '4':
41-
index1 = self.choose(i+1, c[1][0])
42-
if self.l[index1] != 0 :
43-
return(self.l[index1])
44-
i+= 2
45-
46-
31+
opcode, params = get_optcode_param(self.l[i])
32+
f,r = opcodes[opcode]
33+
l = [self.choose(i+k+1,params[k]) for k in range(r)]
34+
res = f(l)
35+
i += r+1
36+
if res:
37+
return res
4738

4839

40+
class FrenkiSubmission(SubmissionPy):
41+
def run(self, s):
42+
ic = IntCode([int(i) for i in s.split(',')])
43+
return ic.run()
4944

day-05/part-2/frenki.py

Lines changed: 50 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,61 @@
11
from tool.runners.python import SubmissionPy
22

33
def get_optcode_param(n):
4-
L = list(str(n))
5-
c = (L[-1], L[:-2][::-1])
6-
while len(c[1]) < 3:
7-
c[1].append('0')
8-
return c
4+
return (n%100, [(n//100)%10, (n//1000)%10, n//10000])
95

10-
class FrenkiSubmission(SubmissionPy):
11-
def __init__(self):
12-
self.l = []
6+
class IntCode(object):
7+
def __init__(self, l):
8+
self.l = l
9+
self.out = None
1310

1411
def choose(self, v, m):
15-
if m == '0':
12+
if m == 0:
1613
return self.l[v]
1714
return v
1815

19-
def run(self, s):
20-
self.l = list(map(int, s.split(',')))
16+
def add(self, args, i):
17+
self.l[args[2]] = self.l[args[1]] + self.l[args[0]]
18+
return i+4
19+
20+
def mul(self, args, i):
21+
self.l[args[2]] = self.l[args[1]] * self.l[args[0]]
22+
return i+4
23+
24+
def ins(self, args, i):
25+
self.l[args[0]] = 5
26+
return i+2
27+
28+
def ret(self, args, i):
29+
self.out = self.l[args[0]]
30+
return i+2
31+
32+
def jump_true(self, args, i):
33+
return self.l[args[1]] if self.l[args[0]] else i+3
34+
35+
def jump_false(self, args, i):
36+
return self.l[args[1]] if not self.l[args[0]] else i+3
37+
38+
def less_than(self, args, i):
39+
self.l[args[2]] = 1 if self.l[args[0]] < self.l[args[1]] else 0
40+
return i+4
41+
42+
def equals(self, args, i):
43+
self.l[args[2]] = 1 if self.l[args[0]] == self.l[args[1]] else 0
44+
return i+4
45+
46+
def run(self):
2147
i = 0
48+
opcodes = [0,(self.add, 3), (self.mul, 3), (self.ins,1), (self.ret, 1), (self.jump_true, 2), (self.jump_false, 2), (self.less_than, 3), (self.equals, 3)]
2249
while self.l[i] != 99:
23-
c = get_optcode_param(self.l[i])
24-
if c[0] == '1':
25-
index1 = self.choose(i+1, c[1][0])
26-
index2 = self.choose(i+2, c[1][1])
27-
index3 = self.choose(i+3, c[1][2])
28-
self.l[index3] = self.l[index1] + self.l[index2]
29-
i+= 4
30-
elif c[0] == '2':
31-
index1 = self.choose(i+1, c[1][0])
32-
index2 = self.choose(i+2, c[1][1])
33-
index3 = self.choose(i+3, c[1][2])
34-
self.l[index3] = self.l[index1] * self.l[index2]
35-
i += 4
36-
elif c[0] == '3':
37-
index1 = self.l[i+1]
38-
self.l[index1] = 5
39-
i+= 2
40-
elif c[0] == '4':
41-
index1 = self.choose(i+1, c[1][0])
42-
if self.l[index1] != 0 :
43-
return(self.l[index1])
44-
i+= 2
45-
elif c[0] == '5':
46-
index1 = self.choose(i+1, c[1][0])
47-
index2 = self.choose(i+2, c[1][1])
48-
if self.l[index1]:
49-
i = self.l[index2]
50-
else :
51-
i += 3
52-
elif c[0] == '6':
53-
index1 = self.choose(i+1, c[1][0])
54-
index2 = self.choose(i+2, c[1][1])
55-
if not self.l[index1]:
56-
i = self.l[index2]
57-
else :
58-
i += 3
59-
elif c[0] == '7':
60-
index1 = self.choose(i+1, c[1][0])
61-
index2 = self.choose(i+2, c[1][1])
62-
index3 = self.choose(i+3, c[1][2])
63-
if self.l[index1] < self.l[index2]:
64-
self.l[index3] = 1
65-
else :
66-
self.l[index3] = 0
67-
i += 4
68-
elif c[0] == '8':
69-
index1 = self.choose(i+1, c[1][0])
70-
index2 = self.choose(i+2, c[1][1])
71-
index3 = self.choose(i+3, c[1][2])
72-
if self.l[index1] == self.l[index2]:
73-
self.l[index3] = 1
74-
else :
75-
self.l[index3] = 0
76-
i += 4
50+
opcode, params = get_optcode_param(self.l[i])
51+
f,r = opcodes[opcode]
52+
l = [self.choose(i+k+1,params[k]) for k in range(r)]
53+
i = f(l, i)
54+
if self.out:
55+
return self.out
56+
57+
58+
class FrenkiSubmission(SubmissionPy):
59+
def run(self, s):
60+
ic = IntCode([int(i) for i in s.split(',')])
61+
return ic.run()

day-07/part-1/frenki.py

Lines changed: 54 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -2,92 +2,68 @@
22
from itertools import permutations
33

44
def get_optcode_param(n):
5-
L = list(str(n))
6-
c = (L[-1], L[:-2][::-1])
7-
while len(c[1]) < 3:
8-
c[1].append('0')
9-
return c
5+
return (n%100, [(n//100)%10, (n//1000)%10, n//10000])
106

11-
class FrenkiSubmission(SubmissionPy):
12-
def __init__(self):
13-
self.l = []
7+
class IntCode(object):
8+
def __init__(self, l, inp):
9+
self.l = l
10+
self.out = None
11+
self.inp = inp
1412

1513
def choose(self, v, m):
16-
if m == '0':
14+
if m == 0:
1715
return self.l[v]
1816
return v
1917

18+
def add(self, args, i):
19+
self.l[args[2]] = self.l[args[1]] + self.l[args[0]]
20+
return i+4
21+
22+
def mul(self, args, i):
23+
self.l[args[2]] = self.l[args[1]] * self.l[args[0]]
24+
return i+4
25+
26+
def ins(self, args, i):
27+
self.l[args[0]] = self.inp.pop()
28+
return i+2
29+
30+
def ret(self, args, i):
31+
self.out = self.l[args[0]]
32+
return i+2
33+
34+
def jump_true(self, args, i):
35+
return self.l[args[1]] if self.l[args[0]] else i+3
36+
37+
def jump_false(self, args, i):
38+
return self.l[args[1]] if not self.l[args[0]] else i+3
39+
40+
def less_than(self, args, i):
41+
self.l[args[2]] = 1 if self.l[args[0]] < self.l[args[1]] else 0
42+
return i+4
43+
44+
def equals(self, args, i):
45+
self.l[args[2]] = 1 if self.l[args[0]] == self.l[args[1]] else 0
46+
return i+4
47+
48+
def run(self):
49+
i = 0
50+
opcodes = [0,(self.add, 3), (self.mul, 3), (self.ins,1), (self.ret, 1), (self.jump_true, 2), (self.jump_false, 2), (self.less_than, 3), (self.equals, 3)]
51+
while self.l[i] != 99:
52+
opcode, params = get_optcode_param(self.l[i])
53+
f,r = opcodes[opcode]
54+
l = [self.choose(i+k+1,params[k]) for k in range(r)]
55+
i = f(l, i)
56+
if self.out != None:
57+
return self.out
58+
59+
class FrenkiSubmission(SubmissionPy):
2060
def run(self, s):
61+
l = [int(i) for i in s.split(',')]
2162
res = 0
22-
dic = {}
2363
for i in list(permutations([0,1,2,3,4])):
24-
input_value = 0
64+
inp = 0
2565
for k in range(5):
26-
self.l = list(map(int, s.split(',')))
27-
if (i[k], input_value) in dic.keys():
28-
input_value = dic[(i[k], input_value)]
29-
else :
30-
v = input_value
31-
input_value = self.run_intcode(i[k], input_value)
32-
dic[(i[k], v)] = input_value
33-
if input_value > res:
34-
res = input_value
66+
c = IntCode(l, [inp, i[k]])
67+
inp = c.run()
68+
res = max(res, inp)
3569
return res
36-
37-
38-
def run_intcode(self, index, input_value):
39-
l = [input_value, index]
40-
i = 0
41-
while self.l[i] != 99:
42-
c = get_optcode_param(self.l[i])
43-
if c[0] == '1':
44-
index1 = self.choose(i+1, c[1][0])
45-
index2 = self.choose(i+2, c[1][1])
46-
index3 = self.choose(i+3, c[1][2])
47-
self.l[index3] = self.l[index1] + self.l[index2]
48-
i+= 4
49-
elif c[0] == '2':
50-
index1 = self.choose(i+1, c[1][0])
51-
index2 = self.choose(i+2, c[1][1])
52-
index3 = self.choose(i+3, c[1][2])
53-
self.l[index3] = self.l[index1] * self.l[index2]
54-
i += 4
55-
elif c[0] == '3':
56-
index1 = self.l[i+1]
57-
self.l[index1] = l.pop()
58-
i+= 2
59-
elif c[0] == '4':
60-
index1 = self.choose(i+1, c[1][0])
61-
return(self.l[index1])
62-
elif c[0] == '5':
63-
index1 = self.choose(i+1, c[1][0])
64-
index2 = self.choose(i+2, c[1][1])
65-
if self.l[index1]:
66-
i = self.l[index2]
67-
else :
68-
i += 3
69-
elif c[0] == '6':
70-
index1 = self.choose(i+1, c[1][0])
71-
index2 = self.choose(i+2, c[1][1])
72-
if not self.l[index1]:
73-
i = self.l[index2]
74-
else :
75-
i += 3
76-
elif c[0] == '7':
77-
index1 = self.choose(i+1, c[1][0])
78-
index2 = self.choose(i+2, c[1][1])
79-
index3 = self.choose(i+3, c[1][2])
80-
if self.l[index1] < self.l[index2]:
81-
self.l[index3] = 1
82-
else :
83-
self.l[index3] = 0
84-
i += 4
85-
elif c[0] == '8':
86-
index1 = self.choose(i+1, c[1][0])
87-
index2 = self.choose(i+2, c[1][1])
88-
index3 = self.choose(i+3, c[1][2])
89-
if self.l[index1] == self.l[index2]:
90-
self.l[index3] = 1
91-
else :
92-
self.l[index3] = 0
93-
i += 4

0 commit comments

Comments
 (0)