thomas_2023/day_5/Main.gd
2024-06-19 21:02:45 -04:00

186 lines
4 KiB
GDScript

extends Control
func _ready():
pass
func read_map(lines, i):
var map = []
while true:
var line = lines[i]
if line == '':
break
i += 1
var map_entry_string = line.split(' ')
var entry = MapEntry.new()
entry.dst_start = int(map_entry_string[0])
entry.src_start = int(map_entry_string[1])
entry.range = int(map_entry_string[2])
entry.dst_end = entry.dst_start + entry.range - 1
entry.src_end = entry.src_start + entry.range - 1
map.append(entry)
return [map, i]
func parse_input(input):
var lines = input.split('\n')
var i = 0
var maps = Maps.new()
# Parse seeds
var seeds_str = lines[i].split(' ').slice(1)
var seeds = []
for s in seeds_str:
seeds.append(int(s))
# Skip to seed-to-soil map
i += 3
var map_i = read_map(lines, i)
maps.seed2soil = map_i[0]
i = map_i[1]
# Skip to soil-to-fertilizer map
i += 2
map_i = read_map(lines, i)
maps.soil2fertilizer = map_i[0]
i = map_i[1]
# Skip to fertilizer-to-water map
i += 2
map_i = read_map(lines, i)
maps.fertilizer2water = map_i[0]
i = map_i[1]
# Skip to water-to-light map
i += 2
map_i = read_map(lines, i)
maps.water2light = map_i[0]
i = map_i[1]
# Skip to light-to-temperature map
i += 2
map_i = read_map(lines, i)
maps.light2temperature = map_i[0]
i = map_i[1]
# Skip to temperature-to-humidity map
i += 2
map_i = read_map(lines, i)
maps.temperature2humidity = map_i[0]
i = map_i[1]
# Skip to humidity-to-location map
i += 2
map_i = read_map(lines, i)
maps.humidity2location = map_i[0]
i = map_i[1]
return [seeds, maps]
func _on_part1():
var input = $TextEdit.text + '\n' # Safety newline :)
var seeds_maps = parse_input(input)
var seeds = seeds_maps[0]
var maps = seeds_maps[1]
print(seeds)
print(maps)
var overall_closest = INF
for seed in seeds:
var closest = maps.find_closest(seed)
overall_closest = min(overall_closest, closest)
print("Closest location: " + str(overall_closest))
func remap_range(map, initial_range):
var unchopped = [initial_range]
var chopped = []
for i in range(len(map)):
var remap = map[i]
var new_ranges = []
for range_ in unchopped:
if not (range_.start <= remap.src_end and remap.src_start <= range_.end):
new_ranges.append(range_)
continue
# Case 1
if range_.start < remap.src_start:
var range = SeedRange.new()
range.start = range_.start
range.end = remap.src_start - 1
new_ranges.append(range)
# Case 2
var bump = remap.dst_start - remap.src_start
var range = SeedRange.new()
range.start = max(range_.start, remap.src_start) + bump
range.end = min(range_.end, remap.src_end) + bump
chopped.append(range)
# Case 3
if range_.end > remap.src_end:
range = SeedRange.new()
range.start = remap.src_end + 1
range.end = range_.end
new_ranges.append(range)
unchopped = Array(new_ranges)
return unchopped + chopped
func do_thing(in_ranges, map):
var out_ranges = []
for seed in in_ranges:
var remapped = remap_range(map, seed)
out_ranges += remapped
return out_ranges
func _on_part2():
var input = $TextEdit.text + '\n' # Safety newline :)
var seeds_maps = parse_input(input)
var seed_ints = seeds_maps[0]
var maps = seeds_maps[1]
var seeds = []
for i in range(len(seed_ints) / 2):
var start = seed_ints[i * 2 + 0]
var length = seed_ints[i * 2 + 1]
var seed = SeedRange.new()
seed.start = start
seed.end = start + length - 1
seeds.append(seed)
print(seeds)
var soils = do_thing(seeds, maps.seed2soil)
var fertilizers = do_thing(soils, maps.soil2fertilizer)
var waters = do_thing(fertilizers, maps.fertilizer2water)
var lights = do_thing(waters, maps.water2light)
var temperatures = do_thing(lights, maps.light2temperature)
var humidities = do_thing(temperatures, maps.temperature2humidity)
var locations = do_thing(humidities, maps.humidity2location)
print(locations)
var lowest = locations[0].start
for loc in locations:
lowest = min(lowest, loc.start)
print(lowest)