Compare commits
	
		
			2 Commits
		
	
	
		
			7e2e395314
			...
			484491426d
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 484491426d | |||
| f0eff608ae | 
							
								
								
									
										1
									
								
								day09/input
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								day09/input
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										85
									
								
								day09/sol.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								day09/sol.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,85 @@
 | 
				
			|||||||
 | 
					sample = "2333133121414131402"
 | 
				
			||||||
 | 
					input = open("input").read().strip()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def expand(s):
 | 
				
			||||||
 | 
					    disk = []
 | 
				
			||||||
 | 
					    id = 0
 | 
				
			||||||
 | 
					    for i in range(len(s)):
 | 
				
			||||||
 | 
					        d = int(s[i])
 | 
				
			||||||
 | 
					        if i % 2 == 0:
 | 
				
			||||||
 | 
					            disk.extend([id]*d)
 | 
				
			||||||
 | 
					            id += 1
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            disk.extend([-1] * d) # free space
 | 
				
			||||||
 | 
					    return disk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def solve(input):
 | 
				
			||||||
 | 
					    disk = expand(input)
 | 
				
			||||||
 | 
					    if len(disk) < 100:
 | 
				
			||||||
 | 
					        print(disk)
 | 
				
			||||||
 | 
					    while disk[-1] == -1:
 | 
				
			||||||
 | 
					        disk.pop()
 | 
				
			||||||
 | 
					    free = 0
 | 
				
			||||||
 | 
					    last = len(disk)-1
 | 
				
			||||||
 | 
					    while free < last:
 | 
				
			||||||
 | 
					        while disk[free] != -1:
 | 
				
			||||||
 | 
					            free += 1
 | 
				
			||||||
 | 
					        if free >= last:
 | 
				
			||||||
 | 
					            break
 | 
				
			||||||
 | 
					        disk[free] = disk[last]
 | 
				
			||||||
 | 
					        disk[last] = -1
 | 
				
			||||||
 | 
					        while free < last and disk[last] == -1:
 | 
				
			||||||
 | 
					            last -= 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if len(disk) < 100:
 | 
				
			||||||
 | 
					            print(free, last, disk)
 | 
				
			||||||
 | 
					    t = 0
 | 
				
			||||||
 | 
					    for i, x in enumerate(disk):
 | 
				
			||||||
 | 
					        if x == -1:
 | 
				
			||||||
 | 
					            continue
 | 
				
			||||||
 | 
					        t += i*x
 | 
				
			||||||
 | 
					    print(t)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def solve2(input):
 | 
				
			||||||
 | 
					    freelist = []
 | 
				
			||||||
 | 
					    blocks = {}
 | 
				
			||||||
 | 
					    pos = 0
 | 
				
			||||||
 | 
					    id = 0
 | 
				
			||||||
 | 
					    for i in range(len(input)):
 | 
				
			||||||
 | 
					        n = int(input[i])
 | 
				
			||||||
 | 
					        if i % 2 == 0:
 | 
				
			||||||
 | 
					            blocks[id] = (pos, n)
 | 
				
			||||||
 | 
					            id += 1
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            freelist.append((pos, n))
 | 
				
			||||||
 | 
					        pos += n
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    lastid = id
 | 
				
			||||||
 | 
					    for id in range(lastid-1,-1,-1):
 | 
				
			||||||
 | 
					        bpos, blen = blocks[id]
 | 
				
			||||||
 | 
					        for i in range(len(freelist)):
 | 
				
			||||||
 | 
					            fpos, flen = freelist[i]
 | 
				
			||||||
 | 
					            if bpos < fpos:
 | 
				
			||||||
 | 
					                break
 | 
				
			||||||
 | 
					            if blen <= flen:
 | 
				
			||||||
 | 
					                blocks[id] = (fpos, blen)
 | 
				
			||||||
 | 
					                if flen == blen:
 | 
				
			||||||
 | 
					                    del freelist[i]
 | 
				
			||||||
 | 
					                else:
 | 
				
			||||||
 | 
					                    freelist[i] = (fpos+blen, flen-blen)
 | 
				
			||||||
 | 
					                break
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    t = 0
 | 
				
			||||||
 | 
					    for id in blocks:
 | 
				
			||||||
 | 
					        i, n = blocks[id]
 | 
				
			||||||
 | 
					        for x in range(i,i+n):
 | 
				
			||||||
 | 
					            t += id*x
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    print(t)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					solve(sample)
 | 
				
			||||||
 | 
					solve(input)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					solve2(sample)
 | 
				
			||||||
 | 
					solve2(input)
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user