View Single Post
AoC Dag 6 i Python:

SPOILER ALERT! Vis spoiler

Litt quick'n'dirty-løsning for del 2. Kunne sikker integrert de bedre. I del 1 utfører jeg bare algoritmen de spesifiserer, og lagrer hver tilstand i en dict. Med en gang jeg ser at dicten har en tidligere tilstand så avbryter jeg.

I del 2 så gjør jeg akkurat det samme, men nullstiller dicten når jeg ser første sykel. Setter samtidig et flagg som gjør at neste gang sykelen startes, så avbrytes loopen.

Kode

memos = {}
banks = map(int,open("6.txt").read().split()) #[0,2,7,0]
 
def realloc(b):
    ix_hi = b.index(max(b))
    blocks = b[ix_hi]
    b[ix_hi] = 0
    ix = (ix_hi + 1) % len(b)
    while blocks > 0:
        b[ix] += 1
        blocks -= 1
        ix = (ix + 1) % len(b)
    return b
 
# Part 1
cycles = 0
while True:
    memostring = ','.join(map(str,banks))
    if memostring in memos:
        break
 
    memos[memostring] = True
    cycles += 1
    realloc(banks)
print cycles
 
# Part 2
cycles = 0
seen_cycle = False
while True:
    memostring = ','.join(map(str,banks))
    if memostring in memos:
        if seen_cycle:
            break
        seen_cycle = True
        memos = {}
 
    memos[memostring] = True
    if seen_cycle:
        cycles += 1
    realloc(banks)
print cycles