Advertisement
rolfvanoven

AoC 2023 dag 3

Dec 5th, 2023
762
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.64 KB | None | 0 0
  1. # bestand lezen en in stukjes hakken:
  2. bestand = open('input.txt', 'r')
  3. alles = bestand.readlines()
  4. for x in range(len(alles)):
  5.   alles[x] = '.'+alles[x].replace('\n', '')+'.'
  6.  
  7.  
  8. symbolen = ['#', '$', '%', '&', '*', '+', '-', '/', '=', '@']
  9. getallen = []
  10.  
  11. for x in range(len(alles)):
  12. #  print(alles[x])
  13.   getallen.append(alles[x].split('.'))
  14.   for y in range(len(symbolen)):
  15.     while symbolen[y] in getallen[x]:
  16.       getallen[x].remove(symbolen[y])
  17.   while '' in getallen[x]:
  18.     getallen[x].remove('')
  19.  
  20.  
  21.  
  22. antwoorda = 0
  23.  
  24. #horizontaal zoeken:
  25. for x in range(len(getallen)):
  26.   for y in range(len(getallen[x])):
  27.     for z in range(len(symbolen)):
  28.       if symbolen[z] in getallen[x][y]:
  29.         gevonden = getallen[x][y].split(symbolen[z])
  30.         if '' in gevonden:
  31.           gevonden.remove('')
  32.         for a in range(len(gevonden)):
  33.           antwoorda += int(gevonden[a])
  34.         getallen[x][y] = ''
  35.   while '' in getallen[x]:
  36.     getallen[x].remove('')
  37.  
  38.  
  39. #verticaal zoeken:
  40. for x in range(len(getallen)):
  41.   for y in range(len(getallen[x])):
  42.     teltdeze = 0
  43.     start = alles[x].find('.'+getallen[x][y]+'.')+1
  44.     eind = start+len(getallen[x][y])
  45.     if x > 0:
  46.       for z in range(len(symbolen)):
  47.         if symbolen[z] in alles[x-1][start-1:eind+1]:
  48.           teltdeze = 1
  49.     if x < len(alles)-1:
  50.       for z in range(len(symbolen)):
  51.         if symbolen[z] in alles[x+1][start-1:eind+1]:
  52.           teltdeze = 1
  53.     antwoorda += int(getallen[x][y]) * teltdeze
  54.  
  55. print(antwoorda)
  56.  
  57.  
  58.  
  59. #gear ratios:
  60. def linkergetal(lijn, plek):
  61.   getal = '0'
  62.   for x in range(plek):
  63.     if alles[lijn][plek-x-1].isnumeric():
  64.       getal = alles[lijn][plek-x-1] + getal
  65.     else:
  66.       return(int(getal)/10)
  67.   return(int(getal))
  68.  
  69. def rechtergetal(lijn, plek):
  70.   getal = '0'
  71.   for x in range(plek):
  72.     if alles[lijn][plek+x+1].isnumeric():
  73.       getal += alles[lijn][plek+x+1]
  74.     else:
  75.       return(int(getal))
  76.   return(int(getal))
  77.    
  78.  
  79. def bovengetal(lijn,plek):
  80.   getal = '0'
  81.   gevonden = 0
  82.   for x in range(3):
  83.     if alles[lijn-1][plek+1-x].isnumeric():
  84.       gevonden = plek+1-x
  85.   if gevonden > 0:
  86.     while alles[lijn-1][gevonden-1].isnumeric():
  87.       gevonden -= 1
  88.     for x in range(4):
  89.       if alles[lijn-1][gevonden+x].isnumeric():
  90.         getal += alles[lijn-1][gevonden+x]
  91.       else:
  92.         return(int(getal))
  93.   return(int(getal))
  94.  
  95. def ondergetal(lijn,plek):
  96.   getal = '0'
  97.   gevonden = 0
  98.   for x in range(3):
  99.     if alles[lijn+1][plek+1-x].isnumeric():
  100.       gevonden = plek+1-x
  101.   if gevonden > 0:
  102.     while alles[lijn+1][gevonden-1].isnumeric():
  103.       gevonden -= 1
  104.     for x in range(4):
  105.       if alles[lijn+1][gevonden+x].isnumeric():
  106.         getal += alles[lijn+1][gevonden+x]
  107.       else:
  108.         return(int(getal))
  109.   return(int(getal))
  110.  
  111. def dubbelonder(lijn, plek):
  112.   if alles[lijn+1][plek-1].isnumeric() and alles[lijn+1][plek+1].isnumeric() and alles[lijn+1][plek] == '.':
  113.     return(True)
  114.  
  115. def linksonder(lijn, plek):
  116.   getal = ''
  117.   for x in range(3):
  118.     if alles[lijn+1][plek-x-1].isnumeric():
  119.       getal = alles[lijn+1][plek-x-1] + getal
  120.   return(int(getal))
  121.  
  122. def rechtsonder(lijn,plek):
  123.   getal = ''
  124.   for x in range(3):
  125.     if alles[lijn+1][plek+x+1].isnumeric():
  126.       getal += alles[lijn+1][plek+x+1]
  127.   return(int(getal))
  128.  
  129. def dubbelboven(lijn, plek):
  130.   if alles[lijn-1][plek-1].isnumeric() and alles[lijn-1][plek+1].isnumeric() and alles[lijn-1][plek] == '.':
  131.     return(True)
  132.  
  133. def linksboven(lijn, plek):
  134.   getal = ''
  135.   for x in range(3):
  136.     if alles[lijn-1][plek-x-1].isnumeric():
  137.       getal = alles[lijn-1][plek-x-1] + getal
  138.   return(int(getal))
  139.  
  140. def rechtsboven(lijn,plek):
  141.   getal = ''
  142.   for x in range(3):
  143.     if alles[lijn-1][plek+x+1].isnumeric():
  144.       getal += alles[lijn-1][plek+x+1]
  145.   return(int(getal))
  146.  
  147.  
  148. def tandwiel(lijn,plek):
  149.   deze = []
  150.   if lijn > 0:
  151.     if dubbelboven(lijn,plek):
  152.       deze = [linksboven(lijn,plek), rechtsboven(lijn,plek)]
  153.       return(deze)
  154.     elif bovengetal(lijn,plek) > 0:
  155.       deze.append(bovengetal(lijn,plek))
  156.   if rechtergetal(lijn,plek) > 0:
  157.     deze.append(rechtergetal(lijn,plek))
  158.   if lijn < len(alles)-1:
  159.     if dubbelonder(lijn,plek):
  160.       deze = [linksonder(lijn,plek), rechtsonder(lijn,plek)]
  161.       return(deze)
  162.     elif ondergetal(lijn,plek) > 0:
  163.       deze.append(ondergetal(lijn,plek))
  164.   if linkergetal(lijn,plek) > 0:
  165.     deze.append(linkergetal(lijn,plek))
  166.   return(deze)    
  167.  
  168.  
  169. antwoordb = 0
  170.  
  171. for x in range(len(alles)):
  172.   for y in range(len(alles[x])):
  173.     if alles[x][y] == '*':
  174.       deze = tandwiel(x,y)
  175.       if len(deze) == 2:
  176.         antwoordb += deze[0] * deze[1]
  177.  
  178. print(antwoordb)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement