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