170 tokens in Python for part 2 by dbasden
Download solution
importsys
pos=0
files={}
free={}
fori,blocksinenumerate(map(int,sys.stdin.read().strip())):
ifi&1:
free[pos]=blocks
else:
files[pos]=blocks,i//2
pos+=blocks
forfilepos,(fileblocks,fileid)inlist(reversed(files.items())):
forholepos,holeleninsorted(free.items()):
ifholepos+fileblocks<=fileposandholelen>=fileblocks:
files[holepos]=files.pop(filepos)
delfree[holepos]
free[holepos+fileblocks]=holelen-fileblocks
break
print(sum(fileid*sum(range(filepos,filepos+fileblocks))forfilepos,(fileblocks,fileid)infiles.items()))