did first! 2017.06.1
This commit is contained in:
parent
a3017435b7
commit
6ab8e45b17
78
2017/06/1memory-balance.py
Executable file
78
2017/06/1memory-balance.py
Executable file
@ -0,0 +1,78 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
# this one seems fun!
|
||||||
|
# i have 16 memory banks, each with a number of blocks.
|
||||||
|
# every cycle, the banks are re-balanced according to the following:
|
||||||
|
# - the bank with the greatest number of blocks is the candidate to balance.
|
||||||
|
# - ties are broken by bank index: lowest wins candidacy.
|
||||||
|
# - remove all blocks from candidate bank, redistributing them
|
||||||
|
# one to each following bank (by index no.), wrapping at the end.
|
||||||
|
# - the candidate bank will only balance BACK to itself if it wraps.
|
||||||
|
# that is, make sure to re-balance starting from the NEXT bank.
|
||||||
|
# my puzzle is to solve after how many cycles will the banks be in
|
||||||
|
# a familiar state. that is, how many cycles in the cycle?
|
||||||
|
# i can number bank states as:
|
||||||
|
# - given input state is bank state 0
|
||||||
|
# - each following state is incremented by +1, so that state n
|
||||||
|
# represents the bank state after n cycles are completed.
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
def strings_to_ints(data):
|
||||||
|
for i in range(len(data)):
|
||||||
|
data[i] = int(data[i])
|
||||||
|
return data
|
||||||
|
|
||||||
|
def process_input(file):
|
||||||
|
list_of_strings = file.read().split()
|
||||||
|
list_of_ints = strings_to_ints(list_of_strings)
|
||||||
|
return list_of_ints
|
||||||
|
|
||||||
|
def find_greatest(ints):
|
||||||
|
index_of_greatest = 0
|
||||||
|
for i in range(len(ints)):
|
||||||
|
if ints[i] > ints[index_of_greatest]:
|
||||||
|
index_of_greatest = i
|
||||||
|
return index_of_greatest
|
||||||
|
|
||||||
|
def rebalance(ints):
|
||||||
|
candidate = find_greatest(ints)
|
||||||
|
to_rebalance = ints[candidate]
|
||||||
|
print(f'rebalancing the {candidate}th (i.e. {to_rebalance}) from {ints}...')
|
||||||
|
new_ints = []
|
||||||
|
for int in ints:
|
||||||
|
new_ints.append(int)
|
||||||
|
new_ints[candidate] = 0
|
||||||
|
for i in range(to_rebalance):
|
||||||
|
target_index = candidate + i + 1 # since i is between 0 and (to_rebalance - 1) incl.
|
||||||
|
target_index = target_index % len(new_ints)
|
||||||
|
new_ints[target_index] = new_ints[target_index] + 1
|
||||||
|
# what the fuck. why does bankstate get updated. huh
|
||||||
|
# after changing my simple new_ints = ints to a for-loop builder
|
||||||
|
# thing, the shit just fucking works. huh?? clearly the = operator
|
||||||
|
# isn't JUST a variable assignment button. something is afoot.....
|
||||||
|
print(f'rebalanced as {new_ints}')
|
||||||
|
return new_ints
|
||||||
|
|
||||||
|
def check_duplicate(intses):
|
||||||
|
has_duplicate = False
|
||||||
|
latest_ints = intses[len(intses)-1]
|
||||||
|
for i in range(len(intses)-1): # don't check final index. lol
|
||||||
|
if intses[i] == latest_ints:
|
||||||
|
has_duplicate = True
|
||||||
|
return has_duplicate
|
||||||
|
|
||||||
|
# the main script!
|
||||||
|
#
|
||||||
|
with open('input', 'r', encoding='utf-8') as file:
|
||||||
|
bankstate = [process_input(file)]
|
||||||
|
print(f'initialized bankstate as {bankstate}')
|
||||||
|
|
||||||
|
seen_before = False
|
||||||
|
cycles = 0 # initialize cycles counter. this matches current bankstate index
|
||||||
|
while not seen_before:
|
||||||
|
cycles += 1 # happy new cycles! *confetti*
|
||||||
|
last_state = bankstate[len(bankstate)-1] # note: bankstate's max index is cycles-1 currently
|
||||||
|
new_state = rebalance(last_state)
|
||||||
|
bankstate.append(new_state)
|
||||||
|
seen_before = check_duplicate(bankstate)
|
||||||
|
print(f"we looped after {cycles} cycles! that's a lot... i'm so dizzy....")
|
1
2017/06/input
Normal file
1
2017/06/input
Normal file
@ -0,0 +1 @@
|
|||||||
|
2 8 8 5 4 2 3 1 5 5 1 2 15 13 5 14
|
Loading…
x
Reference in New Issue
Block a user