day 5
This commit is contained in:
		
							parent
							
								
									46a84ac476
								
							
						
					
					
						commit
						a5ecc18f10
					
				| 
						 | 
				
			
			@ -0,0 +1,44 @@
 | 
			
		|||
import aocd
 | 
			
		||||
import collections
 | 
			
		||||
 | 
			
		||||
def parse_rules(orders):
 | 
			
		||||
    """
 | 
			
		||||
    Return a dictionary mapping page numbers to lists of page numbers
 | 
			
		||||
    For any given key, each page of the value must come after it
 | 
			
		||||
    """
 | 
			
		||||
    rules = collections.defaultdict(list)
 | 
			
		||||
 | 
			
		||||
    for order in orders:
 | 
			
		||||
        k,v = order.split('|')
 | 
			
		||||
        rules[k].append(v)
 | 
			
		||||
 | 
			
		||||
    return rules
 | 
			
		||||
 | 
			
		||||
def verify_update(update, rules):
 | 
			
		||||
    """
 | 
			
		||||
    Ensure that an update is valid using an O(n^2) approach that will
 | 
			
		||||
    bite me in the ass in part B somehow
 | 
			
		||||
    """
 | 
			
		||||
    update = update.split(',')
 | 
			
		||||
    for n, page in enumerate(update):
 | 
			
		||||
        for prev_page in update[:n]:
 | 
			
		||||
            if prev_page in rules[page]:
 | 
			
		||||
                return 0
 | 
			
		||||
    return int(update[len(update)//2])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def solve(data):
 | 
			
		||||
    orders, updates = data.split('\n\n')
 | 
			
		||||
    rules = parse_rules(orders.split('\n'))
 | 
			
		||||
    return sum(verify_update(u, rules) for u in updates.split('\n'))
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    puz = aocd.models.Puzzle(year=2024, day=5)
 | 
			
		||||
 | 
			
		||||
    # data = puz.examples[0].input_data
 | 
			
		||||
    data = puz.input_data
 | 
			
		||||
 | 
			
		||||
    solution = solve(data)
 | 
			
		||||
 | 
			
		||||
    print(solution)
 | 
			
		||||
    aocd.submit(solution, year=2024, day=5, part='a')
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,56 @@
 | 
			
		|||
import aocd
 | 
			
		||||
import collections
 | 
			
		||||
 | 
			
		||||
def parse_rules(orders):
 | 
			
		||||
    """
 | 
			
		||||
    Return a dictionary mapping page numbers to lists of page numbers
 | 
			
		||||
    For any given key, each page of the value must come after it
 | 
			
		||||
    """
 | 
			
		||||
    rules = collections.defaultdict(list)
 | 
			
		||||
 | 
			
		||||
    for order in orders:
 | 
			
		||||
        k,v = order.split('|')
 | 
			
		||||
        rules[k].append(v)
 | 
			
		||||
 | 
			
		||||
    return rules
 | 
			
		||||
 | 
			
		||||
def update_is_incorrect(update, rules):
 | 
			
		||||
    for n, page in enumerate(update):
 | 
			
		||||
        for prev_n, prev_page in enumerate(update[:n]):
 | 
			
		||||
            if prev_page in rules[page]:
 | 
			
		||||
                return (n, prev_n)
 | 
			
		||||
    return False
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def fix_update(update, rules):
 | 
			
		||||
    def insert_before(l, a, b):
 | 
			
		||||
        """
 | 
			
		||||
        Mutate l with the bth element moved to just before the ath
 | 
			
		||||
        """
 | 
			
		||||
        l.insert(a, l.pop(b))
 | 
			
		||||
 | 
			
		||||
    while (indices := update_is_incorrect(update, rules)):
 | 
			
		||||
        insert_before(update, *indices)
 | 
			
		||||
 | 
			
		||||
    return int(update[len(update)//2])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def solve(data):
 | 
			
		||||
    orders, updates = data.split('\n\n')
 | 
			
		||||
    updates = (u.split(',') for u in updates.split('\n'))
 | 
			
		||||
    rules = parse_rules(orders.split('\n'))
 | 
			
		||||
 | 
			
		||||
    incorrect = (u for u in updates if update_is_incorrect(u, rules))
 | 
			
		||||
    return sum(fix_update(u, rules) for u in incorrect)
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    print('Warning: This is horrifically slow but I do not feel like spending time on a sorting problem', file=__import__('sys').stderr)
 | 
			
		||||
    puz = aocd.models.Puzzle(year=2024, day=5)
 | 
			
		||||
 | 
			
		||||
    # data = puz.examples[0].input_data
 | 
			
		||||
    data = puz.input_data
 | 
			
		||||
 | 
			
		||||
    solution = solve(data)
 | 
			
		||||
 | 
			
		||||
    print(solution)
 | 
			
		||||
    aocd.submit(solution, year=2024, day=5, part='b')
 | 
			
		||||
		Loading…
	
		Reference in New Issue