AdventOfCode/fred.py

118 lines
3.4 KiB
Python
Raw Normal View History

2024-11-28 18:47:06 +01:00
import re,sys
def toGrid(input,parser=None):
grid = []
if parser:
with open(input) as file:
for line in file:
grid.append(list2int(line.rstrip()))
else:
with open(input) as file:
for line in file:
2024-11-29 19:02:00 +01:00
grid.append(list(line.rstrip()))
2024-11-28 18:47:06 +01:00
return grid
2024-12-01 12:58:38 +01:00
def findDupes(input:list):
# Returns the indicies of duplicate values in list
return [item for item in set(input) if input.count(item) > 1]
2024-11-30 20:13:48 +01:00
def lprint(x:str,log:bool):
if log:
print(x)
2024-11-29 19:02:00 +01:00
def expand_grid(grid):
num_rows = len(grid)
num_cols = len(grid[0])
expanded_grid = []
expanded_grid.append(['.'] * (num_cols + 2))
for row in grid:
expanded_grid.append(['.'] + row + ['.'])
expanded_grid.append(['.'] * (num_cols + 2))
return expanded_grid
def getCenter(grid):
return (int(len(grid)/2),int(len(grid[0])/2))
def nprint(grid,cur:set=None,sign:str=None):
2024-11-28 18:47:06 +01:00
for idx,i in enumerate(grid):
for jdx,j in enumerate(i):
2024-11-29 19:02:00 +01:00
if (idx,jdx) == cur:
if len(sign) > 1:
print(sign[0]+grid[idx][jdx]+sign[1],end='')
else:
print(sign,end=' ')
else:
print(grid[idx][jdx],end=' ')
2024-11-28 18:47:06 +01:00
print()
2024-11-28 15:10:22 +01:00
2024-11-24 19:14:52 +01:00
def list2int(x):
return list(map(int, x))
2024-11-25 12:27:11 +01:00
2024-11-28 15:10:22 +01:00
def get_re(pattern,str):
match = re.match(pattern, str)
if match:
return match
return None
2024-11-25 12:27:11 +01:00
def ppprint(x):
for idx,i in enumerate(x):
for jdx,j in enumerate(i):
print(x[idx][jdx],end='')
print()
2024-11-28 13:58:15 +01:00
def get_value_in_direction(grid, position, direction=None):
"""
Get the value in a specified direction from a given position in a grid.
If no direction is provided, returns the value at the current position.
Parameters:
grid (list of list of int/float): The 2D grid.
position (set): A set containing x (row index) and y (column index) as integers.
direction (str, optional): The direction to check.
Options: 'up', 'down', 'left', 'right',
'up-left', 'up-right', 'down-left', 'down-right'.
Returns:
The value in the grid in the specified direction, or None if out of bounds.
"""
# Ensure the position is a set of two integers
if len(position) != 2 or not all(isinstance(coord, int) for coord in position):
raise ValueError("Position must be a set containing two integers (x, y).")
x, y = position
offsets = {
'up': (-1, 0),
'down': (1, 0),
'left': (0, -1),
'right': (0, 1),
'up-left': (-1, -1),
'up-right': (-1, 1),
'down-left': (1, -1),
'down-right': (1, 1)
}
# If no direction is given, return the value at the current position
if direction is None:
if 0 <= x < len(grid) and 0 <= y < len(grid[x]):
return grid[x][y]
else:
return None
# Validate direction
if direction not in offsets:
raise ValueError(f"Invalid direction: {direction}. Choose from {list(offsets.keys())}")
dx, dy = offsets[direction]
new_x, new_y = x + dx, y + dy
# Check for out-of-bounds, considering varying row lengths
if 0 <= new_x < len(grid) and 0 <= new_y < len(grid[new_x]):
return grid[new_x][new_y]
else:
return None