mirror of
https://github.com/peter-tanner/advent-of-code-2020.git
synced 2024-11-30 10:50:17 +08:00
attempts for day 23 (unfinish) and 1.5 solutions for day 24
This commit is contained in:
parent
71ba10a786
commit
5bcca706c8
65
23/a.py
Normal file
65
23/a.py
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
import itertools
|
||||||
|
from copy import deepcopy
|
||||||
|
|
||||||
|
cups = [ int(x) for x in list(str(389125467)) ]
|
||||||
|
|
||||||
|
size = len(cups)
|
||||||
|
|
||||||
|
def showcursor(cups, idx):
|
||||||
|
cups_ = deepcopy(cups)
|
||||||
|
cups_[idx] = '('+str(cups_[idx])+')'
|
||||||
|
return cups_
|
||||||
|
|
||||||
|
maxv = max(cups)
|
||||||
|
|
||||||
|
def getdest(cups, value):
|
||||||
|
idx_ = value - 1
|
||||||
|
while True:
|
||||||
|
if idx_ in cups:
|
||||||
|
return cups.index(idx_)
|
||||||
|
else:
|
||||||
|
idx_ -= 1
|
||||||
|
if idx_ < 0:
|
||||||
|
idx_ = maxv
|
||||||
|
|
||||||
|
def pick(cups, idx):
|
||||||
|
buf = []
|
||||||
|
d = 0
|
||||||
|
for i in range(0,3):
|
||||||
|
if idx in range(len(cups)):
|
||||||
|
buf.append(cups.pop(idx))
|
||||||
|
else:
|
||||||
|
buf.append(cups.pop(0))
|
||||||
|
d += 1
|
||||||
|
return [buf,d]
|
||||||
|
|
||||||
|
pointer = 0
|
||||||
|
i = 0
|
||||||
|
# while i < 100:
|
||||||
|
while i < 10^6:
|
||||||
|
# print(showcursor(cups, pointer))
|
||||||
|
val = cups[pointer]
|
||||||
|
buf = pick(cups,pointer+1)
|
||||||
|
if pointer+1 in range(len(cups)):
|
||||||
|
next_ptr_value = cups[pointer+1]
|
||||||
|
else:
|
||||||
|
next_ptr_value = cups[0]
|
||||||
|
|
||||||
|
dest = getdest(cups,val)+1
|
||||||
|
# print('dest:', dest, cups[dest-1])
|
||||||
|
# print(next_ptr_value)
|
||||||
|
# print('buf:', buf)
|
||||||
|
if dest < len(cups):
|
||||||
|
[cups.insert(dest,x) for x in buf[0][::-1]]
|
||||||
|
else:
|
||||||
|
# print('alt')
|
||||||
|
[cups.append(x) for x in buf[0]]
|
||||||
|
i += 1
|
||||||
|
pointer = cups.index(next_ptr_value)
|
||||||
|
# print('nextptr', pointer, next_ptr_value)
|
||||||
|
# print(showcursor(cups, pointer))
|
||||||
|
# print()
|
||||||
|
|
||||||
|
print(cups)
|
||||||
|
pointer = cups.index(1)
|
||||||
|
print(int(''.join([ str(cups[x%len(cups)]) for x in range(pointer,pointer+len(cups)) ][1:])))
|
64
23/b.py
Normal file
64
23/b.py
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
import itertools
|
||||||
|
from copy import deepcopy
|
||||||
|
|
||||||
|
def convert_to_list(lpt,start): #For research purposes
|
||||||
|
next_v = lpt[start][1]
|
||||||
|
li = [start,next_v]
|
||||||
|
c = 0
|
||||||
|
while next_v != start:
|
||||||
|
c += 1
|
||||||
|
next_v = lpt[next_v][1]
|
||||||
|
li.append(next_v)
|
||||||
|
if c > 15:
|
||||||
|
break
|
||||||
|
return li[:-1]
|
||||||
|
|
||||||
|
cups_l = [ int(x) for x in list(str(389125467)) ]
|
||||||
|
cups = { cups_l[i]:[cups_l[i-1],cups_l[i+1]] for i in range(len(cups_l)-1) }
|
||||||
|
cups.update({cups_l[-1]:[cups_l[-2],cups_l[0]]}) # Let's make a linked list! Today I learned : linked lists are pretty cool!
|
||||||
|
next_cursor = cups_l[0] # Initialize cursor at cursor of tape.
|
||||||
|
|
||||||
|
def relink(cups, idx1, idx2): # Make link from idx1 to idx2
|
||||||
|
cups[idx1][1] = idx2
|
||||||
|
cups[idx2][0] = idx1
|
||||||
|
return cups
|
||||||
|
|
||||||
|
def next(cups,cursor,n):
|
||||||
|
for i in range(0,n+1):
|
||||||
|
cursor = cups[cursor][1]
|
||||||
|
return cursor
|
||||||
|
|
||||||
|
max_val = max(cups.keys())
|
||||||
|
def get_destination(idx,picked):
|
||||||
|
idx -= 1
|
||||||
|
while True:
|
||||||
|
if idx > 0 and idx not in picked:
|
||||||
|
return idx
|
||||||
|
else:
|
||||||
|
idx -= 1
|
||||||
|
if idx <= 0:
|
||||||
|
idx = max_val
|
||||||
|
|
||||||
|
z = 0
|
||||||
|
while z < 3:
|
||||||
|
cursor = next_cursor
|
||||||
|
next_cursor = next(cups,cursor,3)
|
||||||
|
picked = [ next(cups,cursor,n) for n in range(0,3) ]
|
||||||
|
dest = get_destination(cursor,picked)
|
||||||
|
after_picked = next(cups, cursor, 3)
|
||||||
|
after_dest = next(cups,dest,1)
|
||||||
|
after_picked_dest = next(cups, dest, 3)
|
||||||
|
print()
|
||||||
|
print('CURSOR',cursor,'NEXT_CURSOR',next_cursor, 'PICK', picked, 'DEST', dest)
|
||||||
|
print(after_picked, after_dest, after_picked_dest)
|
||||||
|
print(convert_to_list(cups,cups_l[0]))
|
||||||
|
|
||||||
|
print(cups, cursor, after_picked)
|
||||||
|
cups = relink(cups, cursor, after_picked) # after picked
|
||||||
|
# print(cups, dest, picked[0])
|
||||||
|
# cups = relink(cups, dest, after_dest)
|
||||||
|
cups = relink(cups, dest, picked[0])
|
||||||
|
# print(cups, picked[2], after_picked_dest)
|
||||||
|
cups = relink(cups, picked[2], after_picked_dest)
|
||||||
|
z += 1
|
||||||
|
print(cups)
|
41
24/a.py
Normal file
41
24/a.py
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
# This isn't working... knew something was wrong with just using basic +/-1 translations, you would expect something with irrational numbers by exressing a hex grid as a 2d vector (square grid)
|
||||||
|
|
||||||
|
# directions = [x.replace('e','e ').replace('w','w ')[:-1].split(' ') for x in open('input').read().splitlines()]
|
||||||
|
|
||||||
|
# D = {
|
||||||
|
# 'ne': 0+1j,
|
||||||
|
# 'se': 0-1j,
|
||||||
|
# 'sw': -1-1j,
|
||||||
|
# 'nw': -1+1j,
|
||||||
|
# 'e': 1+0j,
|
||||||
|
# 'w': -1+0j
|
||||||
|
# }
|
||||||
|
# # print(directions)
|
||||||
|
|
||||||
|
# #So a bit of a problem: NWSW != N+S+W+W. So we need to use the identity NWSW = W, NESE = E, ...
|
||||||
|
# vectors = []
|
||||||
|
# for direction in directions:
|
||||||
|
# count = {x:direction.count(x) for x in D }
|
||||||
|
# vector = 0+0j
|
||||||
|
# print(direction,count)
|
||||||
|
# de = count['ne'] - count['se']
|
||||||
|
# vector += min(count['ne'],count['se'])*D['e']
|
||||||
|
# if de > 0:
|
||||||
|
# vector += de*D['ne']
|
||||||
|
# else:
|
||||||
|
# vector += de*D['se']
|
||||||
|
# dw = count['nw'] - count['sw']
|
||||||
|
# vector += min(count['nw'],count['sw'])*D['w']
|
||||||
|
# if dw > 0:
|
||||||
|
# vector += dw*D['nw']
|
||||||
|
# else:
|
||||||
|
# vector += dw*D['sw']
|
||||||
|
# vector += (count['e']*D['e'] + count['w']*D['w'])
|
||||||
|
# # print(vector)
|
||||||
|
# vectors.append(vector)
|
||||||
|
# # vectors.append(sum([ D[x] for x in direction ]))
|
||||||
|
|
||||||
|
# print({x:vectors.count(x) for x in vectors})
|
||||||
|
# print()
|
||||||
|
# print({x:vectors.count(x) for x in vectors if (vectors.count(x)%2 == 1)}) #196 too low, 181 too low
|
||||||
|
# print(len([x for x in vectors if (vectors.count(x)%2 == 1)])) #196 too low, 181 too low
|
22
24/b.py
Normal file
22
24/b.py
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
directions = [x.replace('e','e ').replace('w','w ')[:-1].split(' ') for x in open('input').read().splitlines()]
|
||||||
|
|
||||||
|
import math
|
||||||
|
import cmath
|
||||||
|
|
||||||
|
def cround(z,n):
|
||||||
|
return round(z.real, n)+1j*round(z.imag, n)
|
||||||
|
|
||||||
|
D = {
|
||||||
|
'ne': math.sqrt(5)*cmath.exp(1j*math.pi/3),
|
||||||
|
'se': math.sqrt(5)*cmath.exp(-1j*math.pi/3),
|
||||||
|
'sw': math.sqrt(5)*cmath.exp(-1j*2*math.pi/3),
|
||||||
|
'nw': math.sqrt(5)*cmath.exp(1j*2*math.pi/3),
|
||||||
|
'e': math.sqrt(5)+0j,
|
||||||
|
'w': -math.sqrt(5)+0j
|
||||||
|
}
|
||||||
|
|
||||||
|
vectors = []
|
||||||
|
for direction in directions:
|
||||||
|
vectors.append(cround(sum([ D[x] for x in direction ]),6))
|
||||||
|
|
||||||
|
print(len([x for x in vectors if (vectors.count(x)%2 == 1)]))
|
81
24/c.py
Normal file
81
24/c.py
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
from operator import add, sub
|
||||||
|
from copy import deepcopy
|
||||||
|
|
||||||
|
directions = [x.replace('e','e ').replace('w','w ')[:-1].split(' ') for x in open('input').read().splitlines()]
|
||||||
|
|
||||||
|
def getHexAdjacent(vec):
|
||||||
|
adj = {}
|
||||||
|
di,dj,dk = (0,1,1)
|
||||||
|
adj.update({
|
||||||
|
'sw': (vec[0]+di,vec[1]+dj,vec[2]+dk),
|
||||||
|
'ne': (vec[0]-di,vec[1]-dj,vec[2]-dk)
|
||||||
|
})
|
||||||
|
di,dj,dk = (1,-1,0)
|
||||||
|
adj.update({
|
||||||
|
'e': (vec[0]+di,vec[1]+dj,vec[2]+dk),
|
||||||
|
'w': (vec[0]-di,vec[1]-dj,vec[2]-dk)
|
||||||
|
})
|
||||||
|
di,dj,dk = (1,0,1)
|
||||||
|
adj.update({
|
||||||
|
'se': (vec[0]+di,vec[1]+dj,vec[2]+dk),
|
||||||
|
'nw': (vec[0]-di,vec[1]-dj,vec[2]-dk)
|
||||||
|
})
|
||||||
|
return adj
|
||||||
|
|
||||||
|
def getHexAdjacentState(vec):
|
||||||
|
getHexAdjacent
|
||||||
|
return True
|
||||||
|
|
||||||
|
def toggle(boolean):
|
||||||
|
return (False if boolean else True)
|
||||||
|
|
||||||
|
grid = {(0,0,0):{'state':False}}#'adj':getHexAdjacent((0,0,0)),
|
||||||
|
|
||||||
|
vectors = []
|
||||||
|
for direction in directions:
|
||||||
|
# print(direction)
|
||||||
|
vec = (0,0,0)
|
||||||
|
for dir_ in direction:
|
||||||
|
vec = getHexAdjacent(vec)[dir_]
|
||||||
|
grid.update({vec:{'state':toggle(grid[vec]['state'] if vec in grid else False)}})
|
||||||
|
vectors.append(vec)
|
||||||
|
# print({x:vectors.count(x) for x in vectors})
|
||||||
|
# print(len([vectors.count(x) for x in vectors if (vectors.count(x) % 2 == 1)]))
|
||||||
|
|
||||||
|
#Part 1
|
||||||
|
print(len([ x for x in grid if (grid[x]['state'] == True)])) # Black => True, white => false
|
||||||
|
|
||||||
|
grid_ = deepcopy(grid) #expand our space by one hextile in each direction
|
||||||
|
for cell in grid:
|
||||||
|
adj = getHexAdjacent(cell)
|
||||||
|
for cell_ in adj:
|
||||||
|
cell_ = adj[cell_]
|
||||||
|
if cell_ not in grid:
|
||||||
|
grid_.update({cell_:{'state':False}})
|
||||||
|
|
||||||
|
i = 0
|
||||||
|
while i < 100:
|
||||||
|
grid = grid_
|
||||||
|
grid_ = deepcopy(grid)
|
||||||
|
for cell in grid:
|
||||||
|
adj = getHexAdjacent(cell)
|
||||||
|
c = 0
|
||||||
|
for cell_ in adj:
|
||||||
|
cell_ = adj[cell_]
|
||||||
|
if cell_ in grid:
|
||||||
|
if grid[cell_]['state'] == True:
|
||||||
|
c+=1
|
||||||
|
else:
|
||||||
|
# print(len(grid_))
|
||||||
|
grid_.update({cell_:{'state':False}})
|
||||||
|
|
||||||
|
if grid[cell]['state'] == True and (c == 0 or c > 2):
|
||||||
|
# print('false')
|
||||||
|
grid_[cell]['state'] = False
|
||||||
|
elif grid[cell]['state'] == False and c == 2:
|
||||||
|
# print('true')
|
||||||
|
grid_[cell]['state'] = True
|
||||||
|
# print(len(grid))
|
||||||
|
# print(len(grid_))
|
||||||
|
i+=1
|
||||||
|
print(len([ x for x in grid_ if (grid_[x]['state'] == True)]))
|
Loading…
Reference in New Issue
Block a user