84 lines
2.3 KiB
Python
84 lines
2.3 KiB
Python
# AOC Day Script Day XX
|
|
# Date : 20XX.12.XX
|
|
# Python Code
|
|
# Developer : David Bandeira
|
|
|
|
import sys,time
|
|
from helpingFunctions import *
|
|
from collections import defaultdict
|
|
|
|
setSampleMode(False)
|
|
|
|
aocDay = identifyDay(sys.argv[0])
|
|
aocYear = identifyYear(sys.argv[0])
|
|
|
|
path = getPath2Data(aocDay,aocYear)
|
|
filename = getFilename2Data(aocDay)
|
|
|
|
def createGrid(data):
|
|
grid = {}
|
|
for gridY in range(len(data)):
|
|
for gridX in range(len(data[0])):
|
|
grid[gridX,gridY]=int(data[gridY][gridX])
|
|
return grid
|
|
|
|
def findTrails(grid):
|
|
trails = {}
|
|
trailStartList = [k for k,v in grid.items() if v == 0]
|
|
return trailStartList
|
|
|
|
def findNextinTrail(pos,trail,grid,p2=False):
|
|
ret = []
|
|
trailX,trailY = trail
|
|
for moveX,moveY in [(-1,0),(0,-1),(1,0),(0,1)]:
|
|
try:
|
|
value = grid[(trailX+moveX,trailY+moveY)]
|
|
except:
|
|
value = -1
|
|
if value == 9 and pos == 8:
|
|
ret.append((trailX+moveX,trailY+moveY))
|
|
elif value == pos + 1:
|
|
ret = ret + findNextinTrail(pos+1,(trailX+moveX,trailY+moveY),grid,p2)
|
|
if p2 == False:
|
|
ret = list(set(ret))
|
|
return list(ret)
|
|
|
|
def taskA (data) -> int:
|
|
gameScoreA = 0
|
|
grid = createGrid(data)
|
|
trailList = findTrails(grid)
|
|
for trail in trailList:
|
|
gameScoreA += len(findNextinTrail(0,trail,grid))
|
|
return gameScoreA
|
|
|
|
def taskB (data) -> int:
|
|
gameScoreB = 0
|
|
grid = createGrid(data)
|
|
trailList = findTrails(grid)
|
|
for trail in trailList:
|
|
gameScoreB += len(findNextinTrail(0,trail,grid,True))
|
|
return gameScoreB
|
|
|
|
def task(task: int,data) -> int:
|
|
score=0
|
|
if task == 1:
|
|
score = taskA(data)
|
|
elif task == 2:
|
|
score = taskB(data)
|
|
return score
|
|
|
|
def main():
|
|
showSampleMode()
|
|
try:
|
|
data = open(path+'/'+filename).read().strip().split('\n')
|
|
except:
|
|
print ('no inputfile found')
|
|
print ('please check file %s on path %s' % (filename, path))
|
|
quit()
|
|
st=time.time()
|
|
print ('Day '+aocDay+': Tasks 1: '+ str(task(1,data))+ ' executation time: ' + str(int((time.time()-st)*1000)) + 'ms')
|
|
st=time.time()
|
|
print ('Day '+aocDay+': Tasks 2: '+ str(task(2,data))+ ' executation time: ' + str(int((time.time()-st)*1000)) + 'ms')
|
|
|
|
if __name__ == "__main__":
|
|
main() |