Advent of code

 5 décembre 2024 

  Print Queue : Remettre des valeurs dans un certain ordre en fonction de règles de précédences (globalement contradictoires…).
56|54
   
94|55
   
94|11
   
   ⋮   
11|37
   
  
   
38,33,35,91,
   
46,62,56,61,35,88,74
   
          
Le code viendra, pas eu le temps de faire une version au propre.
  1. escalierPenrose.jpg
  2. code_initial_pasPropre.py
import re
f = open("input.txt", 'r', encoding='utf-8')
lines = [line[:-1] for line in f.readlines()]

def parse_ints(line: str) -> list[int]:
    return [ int(token) for token in re.split('[^-0-9]+', line) if token ]

#print(len(lines))

nb = 0

rules = []
updates = []
section_rule = True

for line in lines:
    values = parse_ints(line)
    if not values:
        section_rule = False
        continue
    if section_rule:
        rules.append(values)
    else:
        updates.append(values)
        

def verify(a, b):
    global rules
    for x,y in rules:
        if a==y and b==x:
            return False
    return True

        
def verify2(vals):
    for i in range(len(vals) - 1):
        for j in range(i+1, len(vals)):
            if not verify(vals[i], vals[j]):
                return False
    return True
    

def sort_from_rules(a, b):
    if a == b:
        print("XXXX")
        exit()
    global rules
    for x,y in rules:
        if x==a and y == b:
            return -1
        if x==b and y == a:
            return 1
    print("Non.")
    exit()
            

all_n = set()
graph = {}
for a,b in rules:
  all_n.add(a)
  all_n.add(b)
  if a not in graph:
      graph[a] = {'prec':set(), 'suiv':set()}
  if b not in graph:
      graph[b] = {'prec':set(), 'suiv':set()}
  graph[a]['suiv'].add(b)
  graph[b]['prec'].add(a)
print(len(all_n), graph)


really_all = all_n.copy()

def order(vals, rules):
    all_n = set(vals)
    rules = [ r for r in rules if set(r) <= all_n]
    
    ordered = []
    done = really_all.difference(all_n)

    print('*** all_n', all_n)
    print('    rules', rules) 
    while all_n:
        node = list(all_n)[0]
        precs = graph[node]['prec'].difference(done)
        while precs:
            print("  trait. node", node)
            node = precs.pop()
            precs = graph[node]['prec'].difference(done)
        print("found node", node)
        done.add(node)
        ordered.append(node)
        all_n.remove(node)
        #print(ordered, len(done), len(all_n))
    return ordered


print("===")
for vals in updates:
    if not verify2(vals):
        print("recoit vals", vals)
        vals = order(vals, rules[:])
        print("tri:", vals)
        nb += vals[(len(vals) - 1)//2]
    

#print(len(rules)+ len(updates))





print(nb)

#print("Réponse partie 1:", nb1)
#print("Réponse partie 2:", nb2)