Skip to content

Commit cf42eb2

Browse files
committed
Add 2017
1 parent 2900eab commit cf42eb2

File tree

25 files changed

+1189
-0
lines changed

25 files changed

+1189
-0
lines changed

2017/day01/day01.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
with open("input.txt") as f:
2+
s = f.read().strip()
3+
4+
print(sum(int(s[i]) for i in range(len(s)) if s[i] == s[i-1]))
5+
6+
n = len(s)
7+
8+
print(sum(int(s[i]) for i in range(len(s)) if s[i] == s[(i+n//2)%n]))

2017/day02/day02.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
with open("input.txt") as f:
2+
s = f.read().strip().split("\n")
3+
4+
import re
5+
6+
s = [re.sub("\\s+"," ",r).split(" ") for r in s]
7+
s = [[int(x) for x in r] for r in s]
8+
9+
print(sum(max(r)-min(r) for r in s))
10+
11+
ans = 0
12+
for r in s:
13+
for i in range(len(r)):
14+
for j in range(i+1,len(r)):
15+
if r[i] % r[j] == 0:
16+
ans += r[i] // r[j]
17+
elif r[j] % r[i] == 0:
18+
ans += r[j] // r[i]
19+
20+
print(ans)

2017/day03/day03.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
inp = 325489
2+
3+
s = 1
4+
while s*s < inp:
5+
s += 2
6+
s -= 2
7+
8+
v = s*s + 1
9+
loc = [(s//2)+1, -(s//2)]
10+
if v < inp:
11+
loc[1] += min(inp - v, s)
12+
v += min(inp - v, s)
13+
14+
if v < inp:
15+
loc[0] -= min(inp - v, s+1)
16+
v += min(inp - v, s+1)
17+
18+
if v < inp:
19+
loc[1] -= min(inp - v, s+1)
20+
v += min(inp - v, s+1)
21+
22+
if v < inp:
23+
loc[0] += min(inp - v, s+1)
24+
v += min(inp - v, s+1)
25+
26+
print(abs(loc[0])+abs(loc[1]))
27+
28+
from collections import defaultdict
29+
30+
grid = defaultdict(lambda : 0)
31+
grid[0,0] = 1
32+
loc = [0,0]
33+
34+
dirs = [(1,0),(0,1),(-1,0),(0,-1)]
35+
v = 0
36+
while v < inp:
37+
loc[0] += dirs[0][0]
38+
loc[1] += dirs[0][1]
39+
grid[tuple(loc)] = v = sum(grid[loc[0]+i,loc[1]+j] for i in range(-1,2) \
40+
for j in range(-1,2) if (i,j) != (0,0))
41+
if grid[loc[0]+dirs[1][0],loc[1]+dirs[1][1]] == 0:
42+
dirs.append(dirs.pop(0))
43+
44+
print(v)

2017/day04/day04.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
with open("input.txt") as f:
2+
s = f.read().strip().split("\n")
3+
4+
print(sum(1 for p in s if p.count(" ")+1 == len(set(p.split(" ")))))
5+
6+
print(sum(1 for p in s if p.count(" ")+1 == \
7+
len(set("".join(sorted(pp)) for pp in p.split(" ")))))

2017/day05/day05.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
with open("input.txt") as f:
2+
s = f.read().strip().split("\n")
3+
4+
v = [int(x) for x in s]
5+
idx = 0
6+
7+
steps = 0
8+
while idx in range(len(v)):
9+
v[idx] += 1
10+
idx += v[idx] - 1
11+
steps += 1
12+
13+
print(steps)
14+
15+
16+
v = [int(x) for x in s]
17+
idx = 0
18+
19+
steps = 0
20+
while idx in range(len(v)):
21+
j = v[idx]
22+
if j >= 3:
23+
v[idx] -= 1
24+
else:
25+
v[idx] += 1
26+
idx += j
27+
steps += 1
28+
29+
print(steps)

2017/day06/day06.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import re
2+
3+
with open("input.txt") as f:
4+
s = re.sub("\\s+"," ",f.read().strip()).split(" ")
5+
6+
s = [int(x) for x in s]
7+
8+
seen = {}
9+
10+
count = 0
11+
while tuple(s) not in seen:
12+
seen[tuple(s)] = count
13+
idx = max(range(len(s)), key = lambda i : (s[i], -i))
14+
value = s[idx]
15+
s[idx] = 0
16+
per, rem = value // len(s), value % len(s)
17+
for i in range(len(s)):
18+
s[i] += per
19+
if (i - idx - 1) % len(s) < rem:
20+
s[i] += 1
21+
count += 1
22+
23+
print(count)
24+
print(count - seen[tuple(s)])

2017/day07/day07.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
with open("input.txt") as f:
2+
s = f.read().strip().split("\n")
3+
4+
weights = {}
5+
children = {}
6+
7+
seen = set()
8+
9+
for p in s:
10+
pn = p[:p.find(" ")]
11+
pw = int(p[p.find("(")+1:p.find(")")])
12+
weights[pn] = pw
13+
if "->" in p:
14+
children[pn] = p[p.find("->")+3:].split(", ")
15+
seen.update(children[pn])
16+
17+
root = None
18+
for p in weights:
19+
if p not in seen:
20+
root = p
21+
print(root)
22+
23+
def find(c):
24+
w = weights[c]
25+
if c in children:
26+
cw = [find(n) for n in children[c]]
27+
if -1 in cw:
28+
return -1
29+
w += sum(cw)
30+
if len(set(cw)) != 1:
31+
for i in range(len(cw)):
32+
if cw[i] != cw[i-1] and cw[i] != cw[i-2]:
33+
print(weights[children[c][i]] - cw[i] + cw[i-1])
34+
return -1
35+
return w
36+
37+
find(root)

2017/day08/day08.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
with open("input.txt") as f:
2+
s = f.read().strip().split("\n")
3+
4+
from collections import defaultdict
5+
6+
reg = defaultdict(lambda : 0)
7+
8+
m = 0
9+
for ins in s:
10+
cmd, cnd = ins.split(" if ")
11+
cnd_r, cnd_op, cnd_cmp = cnd.split(" ")
12+
if eval(str(reg[cnd_r]) + cnd_op + cnd_cmp):
13+
cmd_r, cmd_op, cmd_arg = cmd.split(" ")
14+
if cmd_op == "inc":
15+
reg[cmd_r] += int(cmd_arg)
16+
elif cmd_op == "dec":
17+
reg[cmd_r] -= int(cmd_arg)
18+
m = max(m, reg[cmd_r])
19+
20+
print(max(reg.values()))
21+
print(m)

2017/day09/day09.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
with open("input.txt") as f:
2+
s = f.read().strip()
3+
4+
import re
5+
6+
s = re.sub("!.","",s)
7+
8+
in_g = False
9+
g_count = 0
10+
idx = 0
11+
while idx < len(s):
12+
if in_g:
13+
if s[idx] == ">":
14+
in_g = False
15+
else:
16+
g_count += 1
17+
else:
18+
if s[idx] == "<":
19+
in_g = True
20+
idx += 1
21+
22+
s = re.sub("\\<.*?\\>","",s)
23+
24+
scores = 0
25+
stack = []
26+
for c in s:
27+
if c == "{":
28+
stack.append(0)
29+
elif c == "}":
30+
stack.pop(-1)
31+
scores += len(stack) + 1
32+
33+
print(scores)
34+
print(g_count)

2017/day10/day10.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
with open("input.txt") as f:
2+
s = f.read().strip()
3+
4+
v = [int(x) for x in s.split(",")]
5+
6+
cur = list(range(256))
7+
8+
offset = 0
9+
skip = 0
10+
for length in v:
11+
cur = cur[length:] + cur[:length][::-1]
12+
cur = cur[skip:] + cur[:skip]
13+
offset += length + skip
14+
skip += 1
15+
16+
offset = (-offset) % len(cur)
17+
cur = cur[offset:] + cur[:offset]
18+
19+
print(cur[0]*cur[1])
20+
21+
lengths = [ord(c) for c in s] + [17,31,73,47,23]
22+
23+
cur = list(range(256))
24+
25+
offset = 0
26+
skip = 0
27+
for _ in range(64):
28+
for length in lengths:
29+
cur = cur[length:] + cur[:length][::-1]
30+
cur = cur[skip:] + cur[:skip]
31+
offset = (offset + length + skip) % len(cur)
32+
skip = (skip + 1) % len(cur)
33+
offset = (-offset) % len(cur)
34+
cur = cur[offset:] + cur[:offset]
35+
36+
def xor(vals):
37+
out = 0
38+
for val in vals:
39+
out ^= val
40+
return out
41+
42+
print("".join(hex(xor(cur[i:i+16])+256)[3:] for i in range(0,256,16)))

0 commit comments

Comments
 (0)