def part1(s, it=10): cups = mapl(int, s) min_val = min(cups) max_val = max(cups) for _ in range(it): curr_cup = cups.pop(0) picked_cups, rest = cups[:3],\ cups[3:] + [curr_cup] dest_cup = decr(curr_cup, min_val, max_val, picked_cups) # print(dest_cup) insert_idx = rest.index(dest_cup) + 1 cups = rest[:insert_idx] + picked_cups + rest[insert_idx:] index_1 = cups.index(1) return ''.join(mapl(str, cups[index_1+1:] + cups[:index_1]))
def conds(s): m = {} for c in s.strip().split('\n'): k, v = c.split(':') m[k] = mapl(lambda cn: mapl(int, cn.split('-')), v.split('or')) return m
def tickets(s): return mapl(lambda l: mapl(int, l.split(',')), s.strip().split('\n')[1:])
def decks(s): parse_deck = lambda d: mapl(int, (d.split('\n'))[1:]) return mapl(parse_deck, s.split('\n\n'))
def parse(s): return mapl(parse_img, s.split('\n\n'))
def _reduce(kv): if m[kv] in ['a', 'b']: return m[kv] else: return flatten([mapl(''.join, product(*[_reduce(p) for p in k.split(' ')])) for k in m[kv]])
max_val, min_val = 0, float('Infinity') prev_val= cups[-1] for c in cups: if max_val < c: max_val = c if min_val > c: min_val = c next_cup[prev_val] = c prev_val = c curr_cup = cups[0] for i in range(it): chosen = [next_cup[curr_cup],\ next_cup[next_cup[curr_cup]],\ next_cup[next_cup[next_cup[curr_cup]]]] move_to = decr(curr_cup, min_val, max_val, chosen) next_cup[curr_cup] = next_cup[chosen[2]] next_cup[chosen[2]] = next_cup[move_to] next_cup[move_to] = chosen[0] curr_cup = next_cup[curr_cup] # return stringify(1, next_cup).replace(', ', '')[1:] return next_cup[1] * next_cup[next_cup[1]] inp = '962713854' # print(part1(s, 100)) t = time() print(part2(mapl(int, inp) + list(range(10, 1000001)), 10000000)) print('time : ', time() - t) print('------------------')