Added Day 5 Python versions
This commit is contained in:
parent
85ec6c22fe
commit
b9a86c612c
2 changed files with 255 additions and 0 deletions
115
day5/d5p1.py
Normal file
115
day5/d5p1.py
Normal file
|
@ -0,0 +1,115 @@
|
|||
#!/usr/bin/python3
|
||||
from enum import IntEnum
|
||||
import re
|
||||
import sys
|
||||
|
||||
class Maps(IntEnum):
|
||||
seeds = 0
|
||||
seedToSoil = 1
|
||||
soilToFertilizer = 2
|
||||
fertilizerToWater = 3
|
||||
waterToLight = 4
|
||||
lightToTemp = 5
|
||||
temptoHumidity = 6
|
||||
humidityToLocation = 7
|
||||
|
||||
class Column(IntEnum):
|
||||
DESTINATION = 0
|
||||
ORIGIN = 1
|
||||
LENGTH = 2
|
||||
|
||||
def file_load(path):
|
||||
file = FileAccess.open(path, FileAccess.READ)
|
||||
content = file.get_as_text()
|
||||
return content
|
||||
|
||||
def strarr_to_arr(data):
|
||||
new = []
|
||||
for i in range(0, len(data)):
|
||||
new.append(data[i])
|
||||
|
||||
return new
|
||||
|
||||
def input_clean(data):
|
||||
output = []
|
||||
for i in range(len(data)):
|
||||
regex = re.compile(r"^(.*-to-.* map:\n)|^(seeds: )")
|
||||
output.append(regex.sub("", data[i]))
|
||||
|
||||
return output
|
||||
|
||||
# bad variable names :(
|
||||
def input_format(data):
|
||||
new = []
|
||||
for i in range(0, len(data)):
|
||||
temp = strarr_to_arr(data[i].split("\n"))
|
||||
temp4 = []
|
||||
|
||||
for j in range(0, len(temp)):
|
||||
temp2 = strarr_to_arr(temp[j].split(" "))
|
||||
temp3 = []
|
||||
|
||||
for k in range(0, len(temp2)):
|
||||
if not len(temp2[k]):
|
||||
continue
|
||||
temp3.append(int(temp2[k]))
|
||||
|
||||
temp4.append(temp3)
|
||||
|
||||
new.append(temp4)
|
||||
|
||||
return new
|
||||
|
||||
def is_mapped(thing, data):
|
||||
for v in thing:
|
||||
if data >= v[Column.ORIGIN] and data <= v[Column.ORIGIN]+v[Column.LENGTH]:
|
||||
return v[Column.DESTINATION] + (data-v[Column.ORIGIN])
|
||||
|
||||
return data
|
||||
|
||||
def is_revmapped(thing, data):
|
||||
for v in thing:
|
||||
if data >= v[Column.DESTINATION] and data <= v[Column.DESTINATION]+v[Column.LENGTH]:
|
||||
return v[Column.ORIGIN] + (data-v[Column.DESTINATION])
|
||||
|
||||
return data
|
||||
|
||||
def map_input(data, seed):
|
||||
temp = seed
|
||||
for map in range(Maps.seedToSoil, Maps.humidityToLocation+1):
|
||||
temp = is_mapped(data[map], temp)
|
||||
#print("Output: %s %s" % [map, temp])
|
||||
|
||||
return temp
|
||||
|
||||
def revmap_input(data, location):
|
||||
temp = location
|
||||
for map in range(Maps.humidityToLocation, Maps.seedToSoil-1, -1):
|
||||
temp = is_revmapped(data[map], temp)
|
||||
#print("Output: %s %s" % [map, temp])
|
||||
|
||||
return temp
|
||||
|
||||
def __main__():
|
||||
print("Hello!")
|
||||
|
||||
temp = ""
|
||||
with open(sys.argv[1]) as f:
|
||||
temp = f.read().split("\n\n")
|
||||
|
||||
temp = input_clean(temp)
|
||||
data = input_format(temp)
|
||||
|
||||
seeds = data[0][0]
|
||||
print(seeds)
|
||||
|
||||
minval = 2**32
|
||||
for seed in seeds:
|
||||
location = map_input(data, seed)
|
||||
|
||||
if location < minval:
|
||||
minval = location
|
||||
|
||||
print("Answer: %s" % minval)
|
||||
|
||||
__main__()
|
140
day5/d5p2.py
Normal file
140
day5/d5p2.py
Normal file
|
@ -0,0 +1,140 @@
|
|||
#!/usr/bin/python3
|
||||
from enum import IntEnum
|
||||
import re
|
||||
import sys
|
||||
|
||||
class Maps(IntEnum):
|
||||
seeds = 0
|
||||
seedToSoil = 1
|
||||
soilToFertilizer = 2
|
||||
fertilizerToWater = 3
|
||||
waterToLight = 4
|
||||
lightToTemp = 5
|
||||
temptoHumidity = 6
|
||||
humidityToLocation = 7
|
||||
|
||||
class Column(IntEnum):
|
||||
DESTINATION = 0
|
||||
ORIGIN = 1
|
||||
LENGTH = 2
|
||||
|
||||
def file_load(path):
|
||||
file = FileAccess.open(path, FileAccess.READ)
|
||||
content = file.get_as_text()
|
||||
return content
|
||||
|
||||
def strarr_to_arr(data):
|
||||
new = []
|
||||
for i in range(0, len(data)):
|
||||
new.append(data[i])
|
||||
|
||||
return new
|
||||
|
||||
def input_clean(data):
|
||||
output = []
|
||||
for i in range(len(data)):
|
||||
regex = re.compile(r"^(.*-to-.* map:\n)|^(seeds: )")
|
||||
output.append(regex.sub("", data[i]))
|
||||
|
||||
return output
|
||||
|
||||
# bad variable names :(
|
||||
def input_format(data):
|
||||
new = []
|
||||
for i in range(0, len(data)):
|
||||
temp = strarr_to_arr(data[i].split("\n"))
|
||||
temp4 = []
|
||||
|
||||
for j in range(0, len(temp)):
|
||||
temp2 = strarr_to_arr(temp[j].split(" "))
|
||||
temp3 = []
|
||||
|
||||
for k in range(0, len(temp2)):
|
||||
if not len(temp2[k]):
|
||||
continue
|
||||
temp3.append(int(temp2[k]))
|
||||
|
||||
temp4.append(temp3)
|
||||
|
||||
new.append(temp4)
|
||||
|
||||
return new
|
||||
|
||||
def is_mapped(thing, data):
|
||||
for v in thing:
|
||||
if data >= v[Column.ORIGIN] and data <= v[Column.ORIGIN]+v[Column.LENGTH]:
|
||||
return v[Column.DESTINATION] + (data-v[Column.ORIGIN])
|
||||
|
||||
return data
|
||||
|
||||
def is_revmapped(thing, data):
|
||||
for v in thing:
|
||||
if data >= v[Column.DESTINATION] and data <= v[Column.DESTINATION]+v[Column.LENGTH]:
|
||||
return v[Column.ORIGIN] + (data-v[Column.DESTINATION])
|
||||
|
||||
return data
|
||||
|
||||
def map_input(data, seed):
|
||||
temp = seed
|
||||
for map in range(Maps.seedToSoil, Maps.humidityToLocation+1):
|
||||
temp = is_mapped(data[map], temp)
|
||||
#print("Output: %s %s" % [map, temp])
|
||||
|
||||
return temp
|
||||
|
||||
def revmap_input(data, location):
|
||||
temp = location
|
||||
for map in range(Maps.humidityToLocation, Maps.seedToSoil-1, -1):
|
||||
temp = is_revmapped(data[map], temp)
|
||||
#print("Output: %s %s" % [map, temp])
|
||||
|
||||
return temp
|
||||
|
||||
def __main__():
|
||||
print("Hello!")
|
||||
|
||||
temp = ""
|
||||
with open(sys.argv[1]) as f:
|
||||
temp = f.read().split("\n\n")
|
||||
|
||||
temp = input_clean(temp)
|
||||
data = input_format(temp)
|
||||
#print(input[Maps.seeds])
|
||||
#print(input[Maps.seedToSoil])
|
||||
|
||||
seeds = data[0][0]
|
||||
print(seeds)
|
||||
|
||||
"""
|
||||
minval = 2**32
|
||||
for i in range(0, len(seeds) // 2):
|
||||
start = seeds[i*2]
|
||||
end = seeds[i*2+1]
|
||||
|
||||
print(f"Testing seeds: {start}-{start+end}")
|
||||
|
||||
for j in range(0, end):
|
||||
if not j % 1000000:
|
||||
print(f"Test: {start+j}")
|
||||
|
||||
location = map_input(data, start+j)
|
||||
if location < minval:
|
||||
minval = location
|
||||
|
||||
print(f"Answer 2: {minval}")
|
||||
"""
|
||||
|
||||
testlocation = 0
|
||||
while True:
|
||||
if testlocation % 100000 == 0:
|
||||
print(testlocation)
|
||||
for i in range(0, len(seeds) // 2):
|
||||
seed = revmap_input(data, testlocation)
|
||||
if seed >= seeds[i*2] and seed <= seeds[i*2]+seeds[i*2+1]:
|
||||
print(f"Answer 2: {testlocation}")
|
||||
print(f"Value is between seed {seeds[i*2]} and {seeds[i*2]+seeds[i*2+1]}")
|
||||
return
|
||||
|
||||
testlocation+=1
|
||||
|
||||
__main__()
|
Loading…
Reference in a new issue