Advent of Code 2020 day 15. Part one was simple but too slow for part two, so part two uses dictionary lookups. Couldn’t see a way of doing this without storing the last two times each number had been seen.
defpart_one(input,turns):memory=list(input)forturninrange(len(input),turns):ifmemory[-1]notinmemory[0:-1]:memory.append(0)else:memory.append((len(memory)+1)-(len(memory)-list(reversed(memory[0:-1])).index(memory[-1])))returnmemory[-1]defpart_two(input,turns):memory={n:[t]fort,ninenumerate(INPUT)}last_number=input[-1]forturninrange(len(input),turns):iflen(memory[last_number])==1:# Number not seen beforethis_number=0else:this_number=memory[last_number][1]-memory[last_number][0]ifthis_numberinmemory:memory[this_number]=[memory[this_number][-1]]+[turn]else:memory[this_number]=[turn]last_number=this_numberreturnlast_numberif__name__=='__main__':print(f'Part one: {part_one(INPUT, 2020)}')print(f'Part two: {part_two(INPUT, 30000000)}')