Guest User

Untitled

a guest
Dec 12th, 2018
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 18.22 KB | None | 0 0
  1. def day1a():
  2. with open("input_1_AOC_2018") as fh:
  3. data = fh.readlines()
  4. print(sum([float(x.strip()) for x in data]))
  5.  
  6.  
  7. def day1b():
  8. from itertools import cycle
  9.  
  10. with open("input_1_AOC_2018") as fh:
  11. data = fh.readlines()
  12.  
  13. maxiter = 10 ** 8
  14. done = set([0])
  15. cumsum = 0
  16. for x in cycle(data):
  17. cumsum += int(x.strip())
  18. if cumsum in done:
  19. print(cumsum)
  20. break
  21. done.add(cumsum)
  22.  
  23. print(len(list(done)))
  24.  
  25.  
  26. def day2a():
  27. from collections import Counter
  28. with open("day_2_AOC.txt") as fh:
  29. data = fh.readlines()
  30.  
  31. doubles = 0
  32. tripples = 0
  33.  
  34. for x in data:
  35. counts = Counter(x.strip()).values()
  36. if 2 in counts:
  37. doubles += 1
  38. if 3 in counts:
  39. tripples += 1
  40.  
  41. print(doubles * tripples)
  42.  
  43.  
  44. def day2b():
  45. with open("day_2_AOC.txt") as fh:
  46. data = fh.readlines()
  47.  
  48. storage = []
  49. data = [list(x.strip()) for x in data]
  50.  
  51. for x in data:
  52. for item in storage:
  53. check = [z != y for z, y in zip(x, item)]
  54. if sum(check) == 1:
  55. ans = ""
  56. for y, z in zip(x, item):
  57. if y == z:
  58. ans += y
  59. print(ans)
  60. storage.append(x)
  61.  
  62.  
  63. def day3a():
  64. import numpy as np
  65.  
  66. cloth = np.zeros([1000, 1000])
  67.  
  68. with open("day_3_AOC") as fh:
  69. data = fh.readlines()
  70.  
  71. for request in data:
  72. requestnr, _, offsets, size = request.strip().split(" ")
  73. requestnr = int(requestnr.strip("#"))
  74. left_offset, upper_offset = [int(x) for x in offsets.strip(":").split(",")]
  75. width, height = [int(x) for x in size.split("x")]
  76. cloth[left_offset:left_offset + width, upper_offset:upper_offset + height] += 1
  77.  
  78. print(sum(sum(cloth > 1)))
  79.  
  80.  
  81. def day3b():
  82. import numpy as np
  83.  
  84. cloth = np.zeros([1000, 1000])
  85.  
  86. with open("day_3_AOC") as fh:
  87. data = fh.readlines()
  88.  
  89. def parse_request(request):
  90. requestnr, _, offsets, size = request.strip().split(" ")
  91. requestnr = int(requestnr.strip("#"))
  92. left_offset, upper_offset = [int(x) for x in offsets.strip(":").split(",")]
  93. width, height = [int(x) for x in size.split("x")]
  94. return [requestnr, left_offset, upper_offset, width, height]
  95.  
  96. for request in data:
  97. requestnr, left_offset, upper_offset, width, height = parse_request(request)
  98. cloth[left_offset:left_offset + width, upper_offset:upper_offset + height] += 1
  99.  
  100. for request in data:
  101. requestnr, left_offset, upper_offset, width, height = parse_request(request)
  102. cloth[left_offset:left_offset + width, upper_offset:upper_offset + height] += 1
  103. if sum(sum(cloth[left_offset:left_offset + width, upper_offset:upper_offset + height])) == height * width:
  104. print(requestnr)
  105.  
  106.  
  107. def day4a():
  108. from collections import defaultdict, Counter
  109. import datetime
  110.  
  111. timedict = {}
  112.  
  113. with open("day_4_AOC.txt") as fh:
  114. data = fh.readlines()
  115.  
  116. for line in data:
  117. date = line.strip().split(" ")[0][1:]
  118. time = line.strip().split(" ")[1][:-1]
  119. hour = int(time.split(":")[0])
  120. minute = int(time.split(":")[1])
  121. status = line.strip().split(" ")[2:]
  122.  
  123. total_min = hour * 60 + minute
  124. year, month, day = [int(x) for x in date.split("-")]
  125. dt = datetime.datetime(year=year, month=month, day=day, hour=hour, minute=minute)
  126.  
  127. timedict[dt] = status
  128.  
  129. times = sorted(list(timedict.keys()))
  130.  
  131. record = defaultdict(list)
  132. minute_record = defaultdict(list)
  133. sleeptime = 0
  134. lastfall = ""
  135. guard = ""
  136. for time in times:
  137. status = timedict[time]
  138. if status[-1] == "shift":
  139. record[guard].append(sleeptime)
  140. guard = status[1]
  141. sleeptime = 0
  142.  
  143. elif status[0] == "falls":
  144. lastfall = time
  145.  
  146. elif status[0] == "wakes":
  147. sleeptime += (time - lastfall).total_seconds() / 60
  148. minutes = range(lastfall.minute, time.minute)
  149. minute_record[guard].append(minutes)
  150. else:
  151. print("debug this code")
  152.  
  153. max_sleep = 0
  154. maxguard = ""
  155.  
  156. for guard, sleeplist in record.items():
  157. if sum(sleeplist) > max_sleep:
  158. max_sleep = sum(sleeplist)
  159. maxguard = guard
  160.  
  161. totalminutes = []
  162. for minrange in minute_record[maxguard]:
  163. totalminutes += list(minrange)
  164.  
  165. print(max(Counter(totalminutes).values()))
  166. print(maxguard)
  167.  
  168.  
  169. def day4b():
  170. from collections import defaultdict, Counter
  171. import datetime
  172.  
  173. timedict = {}
  174.  
  175. with open("day_4_AOC.txt") as fh:
  176. data = fh.readlines()
  177.  
  178. for line in data:
  179. date = line.strip().split(" ")[0][1:]
  180. time = line.strip().split(" ")[1][:-1]
  181. hour = int(time.split(":")[0])
  182. minute = int(time.split(":")[1])
  183. status = line.strip().split(" ")[2:]
  184.  
  185. total_min = hour * 60 + minute
  186. year, month, day = [int(x) for x in date.split("-")]
  187. dt = datetime.datetime(year=year, month=month, day=day, hour=hour, minute=minute)
  188. timedict[dt] = status
  189.  
  190. times = sorted(list(timedict.keys()))
  191.  
  192. record = defaultdict(list)
  193. minute_record = defaultdict(list)
  194. sleeptime = 0
  195. lastfall = ""
  196. guard = ""
  197. sleeping = False
  198. for time in times:
  199. status = timedict[time]
  200. if status[-1] == "shift":
  201. record[guard].append(sleeptime)
  202. guard = status[1]
  203. sleeping = False
  204. sleeptime = 0
  205. elif status[0] == "falls":
  206. sleeping = True
  207. lastfall = time
  208.  
  209. elif status[0] == "wakes":
  210. sleeptime += (time - lastfall).total_seconds() / 60
  211. sleeping = False
  212. minutes = range(lastfall.minute, time.minute)
  213. minute_record[guard].append(minutes)
  214. else:
  215. print()
  216.  
  217. maxslp = 0
  218. maxmin = 0
  219. maxguard = ""
  220. for guard in minute_record:
  221. totalminutes = []
  222. for minrange in minute_record[guard]:
  223. totalminutes += list(minrange)
  224. counts = Counter(totalminutes)
  225. for minute, n in counts.items():
  226. if n > maxslp:
  227. maxslp = n
  228. maxmin = minute
  229. maxguard = guard
  230.  
  231. print(maxmin, maxguard)
  232.  
  233.  
  234. def day5b():
  235. from collections import deque
  236.  
  237. with open("day_5_AOC.txt") as fh:
  238. data = fh.read()
  239.  
  240. def match(a, b):
  241. return (a != b) and (a.lower() == b.lower())
  242.  
  243. dataoriginal = data.strip()
  244.  
  245. letters = list(set(dataoriginal.lower()))
  246. minlen = float("inf")
  247.  
  248. for letter in letters:
  249. data = "".join([x for x in dataoriginal if (x.lower() != letter)])
  250.  
  251. todo = deque(list(data))
  252. done = deque([])
  253.  
  254. a = todo.pop()
  255. while True:
  256. b = a
  257. a = todo.pop()
  258. if match(a, b):
  259. if done:
  260. a = done.pop()
  261. elif todo:
  262. a = todo.pop()
  263. else:
  264. break
  265.  
  266. else:
  267. done.append(b)
  268. if len(todo) < 1:
  269. done.append(a)
  270. break
  271.  
  272. if len(list(done)) < minlen:
  273. minlen = len(list(done))
  274.  
  275. print(minlen)
  276.  
  277.  
  278. def day6b():
  279. # part a was lost due to a crash
  280. import numpy as np
  281.  
  282. with open("day_6_AOC.txt") as fh:
  283. data = [x.strip().split(", ") for x in fh.readlines()]
  284.  
  285. coordarray = np.array([(int(x[0]), int(x[1])) for x in data])
  286.  
  287. hloc = coordarray[:, 0]
  288. vloc = coordarray[:, 1]
  289. nclust, dim = coordarray.shape
  290.  
  291. minx, miny = coordarray.min(axis=0)
  292. maxx, maxy = coordarray.max(axis=0)
  293.  
  294. minx, miny = [int(z - (10000 / nclust)) for z in [minx, miny]]
  295. maxx, maxy = [int(z + (10000 / nclust)) for z in [maxx, maxy]]
  296.  
  297. hdist = np.abs(np.array(range(minx, maxx + 1) - hloc.reshape(nclust, 1) + np.zeros((maxy + 1 - miny, 1, 1))))
  298. vdist = np.abs(
  299. np.array(range(miny, maxy + 1)).reshape((maxy + 1 - miny, 1, 1)) - vloc.reshape(nclust, 1)) + np.zeros(
  300. (maxx + 1 - minx))
  301. totaldist = (hdist + vdist).sum(axis=1)
  302. print((totaldist < 10000).sum())
  303.  
  304.  
  305. def day7a():
  306. from collections import defaultdict
  307.  
  308. with open("day_7_AOC.txt") as fh:
  309. data = fh.readlines()
  310.  
  311. def get_signles(x):
  312. return [y for y in x.split() if len(y) == 1]
  313.  
  314. graph = defaultdict(lambda: {"in": [], "out": [], "done": 0})
  315.  
  316. for line in data:
  317. first, second = get_signles(line)
  318. graph[first]["out"].append(second)
  319. graph[second]["in"].append(first)
  320.  
  321. current_options = []
  322. for key in graph:
  323. if len(graph[key]["in"]) == 0:
  324. current_options.append(key)
  325.  
  326. seq = []
  327. while current_options:
  328. current_options.sort()
  329. print(current_options)
  330. next_step = current_options[0]
  331. current_options = current_options[1:]
  332. seq.append(next_step)
  333. for dependent in graph[next_step]["out"]:
  334. graph[dependent]["done"] += 1
  335. if graph[dependent]["done"] == len(graph[dependent]["in"]):
  336. current_options.append(dependent)
  337.  
  338. print("".join(seq))
  339.  
  340.  
  341. def day7b():
  342. from collections import defaultdict
  343. # day 7 part 2
  344. with open("day_7_AOC.txt") as fh:
  345. data = fh.readlines()
  346.  
  347. def get_signles(x):
  348. return [y for y in x.split() if len(y) == 1]
  349.  
  350. graph = defaultdict(lambda: {"in": [], "out": [], "done": 0})
  351.  
  352. for line in data:
  353. first, second = get_signles(line)
  354. graph[first]["out"].append(second)
  355. graph[second]["in"].append(first)
  356.  
  357. current_options = []
  358. for key in graph:
  359. if len(graph[key]["in"]) == 0:
  360. current_options.append(key)
  361.  
  362. class worker_instance():
  363. def __init__(self):
  364. self.task = "idle"
  365. self.time_task = -1
  366. self.last_task_ended_at = 0
  367. self.time_start = -1
  368.  
  369. def is_working(self):
  370. return (self.task != "idle")
  371.  
  372. def isdone(self, t):
  373. return self.time_task <= (t - self.time_start)
  374.  
  375. def givetask(self, x, xt, t):
  376. self.time_start = t
  377. self.task = x
  378. self.time_task = xt
  379.  
  380. def hand_over_task(self):
  381. task = self.task
  382. self.task = "idle"
  383. return task
  384.  
  385. seq = []
  386. n_workers = 5
  387. t = 0
  388. basetime = 60
  389. workerlist = [worker_instance() for x in range(n_workers)]
  390.  
  391. while len(seq) < len(graph.keys()):
  392. stuff_done_this_s = []
  393. for worker in workerlist:
  394. if worker.is_working():
  395. if worker.isdone(t):
  396. stuff_done_this_s.append(worker.hand_over_task())
  397.  
  398. for stuff in stuff_done_this_s:
  399. for dependent in graph[stuff]["out"]:
  400. graph[dependent]["done"] += 1
  401. if graph[dependent]["done"] == len(graph[dependent]["in"]):
  402. current_options.append(dependent)
  403. print(t, sorted(stuff_done_this_s))
  404. seq += sorted(stuff_done_this_s)
  405. current_options.sort()
  406. print(current_options)
  407. idleworkers = [worker for worker in workerlist if not (worker.is_working())]
  408.  
  409. n_tasks_to_be_filled = min([len(idleworkers), len(current_options)])
  410. for i in range(n_tasks_to_be_filled):
  411. xt = ord(current_options[i]) + basetime - 64
  412. idleworkers[i].givetask(current_options[i], xt, t)
  413.  
  414. current_options = current_options[n_tasks_to_be_filled:]
  415.  
  416. t += 1
  417.  
  418. print("".join(seq))
  419. print(t - 1)
  420.  
  421.  
  422. def day8a():
  423. from collections import deque
  424.  
  425. with open("day_8_AOC.txt") as fh:
  426. data = fh.read()
  427.  
  428. dataque = deque(int(x) for x in data.split())
  429. dataque.reverse()
  430.  
  431. fullgraph = {}
  432.  
  433. def construct_node(currentnode, values):
  434. nchild = dataque.pop()
  435. nmeta = dataque.pop()
  436. for child in range(nchild):
  437. currentnode[child] = {}
  438. construct_node(currentnode[child], values)
  439. currentnode["metadata"] = []
  440. for metadata in range(nmeta):
  441. val = dataque.pop()
  442. values.append(val)
  443. currentnode["metadata"].append(val)
  444.  
  445. values = []
  446. construct_node(fullgraph, values)
  447.  
  448. print("sum of all metadat", sum(values))
  449.  
  450.  
  451. def day8b():
  452. from collections import deque
  453.  
  454. with open("day_8_AOC.txt") as fh:
  455. data = fh.read()
  456.  
  457. dataque = deque(int(x) for x in data.split())
  458. dataque.reverse()
  459.  
  460. fullgraph = {}
  461.  
  462. def construct_node(currentnode, values):
  463. nchild = dataque.pop()
  464. nmeta = dataque.pop()
  465. for child in range(1, nchild + 1):
  466. currentnode[child] = {}
  467. construct_node(currentnode[child], values)
  468. currentnode["metadata"] = []
  469. for metadata in range(nmeta):
  470. val = dataque.pop()
  471. values.append(val)
  472. currentnode["metadata"].append(val)
  473.  
  474. metadata = []
  475. construct_node(fullgraph, metadata)
  476.  
  477. def assign_values(currentnode):
  478. if 1 not in currentnode:
  479. currentnode["value"] = sum(currentnode["metadata"])
  480. return
  481.  
  482. currentnode["value"] = 0
  483. for metadata in currentnode["metadata"]:
  484. if metadata in currentnode:
  485. if "value" not in currentnode[metadata]:
  486. assign_values(currentnode[metadata])
  487. currentnode["value"] += currentnode[metadata]["value"]
  488.  
  489. assign_values(fullgraph)
  490. print(fullgraph["value"])
  491.  
  492.  
  493. def day9():
  494. from collections import deque
  495.  
  496. nplayer = 435
  497. last_marble_worth = 71184 * 100 # remove the *100 for part 1
  498.  
  499. playerscores = [0] * nplayer
  500. player = -1
  501.  
  502. marblecircle = deque([])
  503.  
  504. for marblenr in range(last_marble_worth + 1):
  505. player = (player + 1) % nplayer
  506. if (marblenr % 23) == 0 and (marblenr != 0):
  507. playerscores[player] += marblenr
  508. marblecircle.rotate(7)
  509. playerscores[player] += marblecircle.pop()
  510. marblecircle.rotate(-1)
  511. else:
  512. marblecircle.rotate(-1)
  513. marblecircle.append(marblenr)
  514.  
  515. print(max(playerscores))
  516.  
  517.  
  518. def day10():
  519. from collections import defaultdict
  520.  
  521. with open("day_10_AOC.txt") as fh:
  522. data = fh.readlines()
  523.  
  524. positiondict = defaultdict(list)
  525. for line in data:
  526. line = "".join([x for x in line if (x.isdigit() | (x in set(" -")))])
  527. x, y, dx, dy = [int(x) for x in line.split()]
  528. positiondict[(x, y)].append((dx, dy))
  529.  
  530. def calc_cohesion(positiondict, linedist=1): # based on lines of connecting points
  531. total = 0
  532. for x, y in positiondict:
  533. for sign in [-1, 1]:
  534. if all([(x + sign * dist, y) in positiondict for dist in range(1, linedist + 1)]):
  535. total += 1
  536. if all([(x, y + sign * dist) in positiondict for dist in range(1, linedist + 1)]):
  537. total += 1
  538.  
  539. return total
  540.  
  541. def move_one_sec(positiondict):
  542. new_dict = defaultdict(list)
  543.  
  544. for x, y in positiondict:
  545. for dx, dy in positiondict[(x, y)]:
  546. new_dict[x + dx, y + dy].append((dx, dy))
  547.  
  548. return new_dict
  549.  
  550. bestsecond = -1
  551. bestscore = -1
  552. bestpositions = {}
  553. for second in range(50000):
  554. score = calc_cohesion(positiondict, 2)
  555. if score > bestscore:
  556. bestscore = score
  557. bestsecond = second
  558. bestpositions = positiondict
  559. # print(bestscore)
  560. positiondict = move_one_sec(positiondict)
  561.  
  562. def print_stars(positiondict):
  563. xcoords, ycoords = [[x[y] for x in positiondict.keys()] for y in [0, 1]]
  564. minx, miny = [min(x) for x in [xcoords, ycoords]]
  565. maxx, maxy = [max(x) for x in [xcoords, ycoords]]
  566. for row in range(miny, maxy + 1):
  567. print("".join(["#" if (col, row) in positiondict else " " for col in range(minx, maxx + 1)]), "\n")
  568.  
  569. print_stars(bestpositions)
  570.  
  571. print(bestscore)
  572. print(bestsecond)
  573. print_stars(bestpositions)
  574.  
  575.  
  576. def day11():
  577. import numpy as np
  578.  
  579. idnr = 5791
  580. rack_id = (np.int_(range(1, 301)) + 10)
  581. grid = ((rack_id * (np.array(range(1, 301)).reshape(300, 1))) + idnr) * rack_id
  582. grid = np.floor((grid % 1000) / 100) - 5
  583.  
  584. cumsum_x = np.cumsum(grid, axis=0) # vertical cumsum
  585. cumsum_x = np.concatenate([np.zeros((300)).reshape(1, 300), cumsum_x], axis=0)
  586. best = -100
  587. bestcoords = -1
  588.  
  589. possible_grid_sizes = range(1, 301) # change to [3] for the answer to part 1
  590.  
  591. for size in possible_grid_sizes:
  592. for xcoord in range(300 - (size - 1)):
  593. for ycoord in range(300 - (size - 1)):
  594. upper_cumsum = cumsum_x[ycoord + size, xcoord:xcoord + size]
  595. lower_cumsum = cumsum_x[ycoord, xcoord:xcoord + size]
  596. score = (upper_cumsum - lower_cumsum).sum()
  597. if score > best:
  598. best = score
  599. bestcoords = (xcoord + 1, ycoord + 1, size)
  600.  
  601. print(best, bestcoords)
  602.  
  603.  
  604. def day12():
  605. from collections import defaultdict
  606.  
  607. with open("day_12_AOC.txt") as fh:
  608. data = fh.readlines()
  609.  
  610. state = data[0].split(":")[1].strip()
  611.  
  612. statedict = defaultdict(lambda: ".")
  613.  
  614. for idx, val in enumerate(state):
  615. if val == "#":
  616. statedict[idx] = val
  617.  
  618. instructiondict = defaultdict(lambda: ".")
  619. for instruction in data[2:]:
  620. originalstate, outputstate = [x.strip() for x in instruction.split("=>")]
  621. instructiondict[originalstate] = outputstate
  622.  
  623. def print_all(statedict):
  624. min_plant = min([key for key, val in statedict.items() if val == "#"])
  625. max_plant = max([key for key, val in statedict.items() if val == "#"])
  626. print("".join([statedict[place] for place in range(min_plant, max_plant + 1)]))
  627.  
  628. n_iter = 1000 # 50000000000 # after some time the score increases 55/generation
  629.  
  630. for i in range(n_iter):
  631. # print_all(statedict)
  632. min_plant = min([key for key, val in statedict.items() if val == "#"])
  633. max_plant = max([key for key, val in statedict.items() if val == "#"])
  634. new_state = defaultdict(lambda: ".")
  635. for place in range(min_plant - 2, max_plant + 3):
  636. if instructiondict["".join([statedict[position] for position in range(place - 2, place + 3)])] == "#":
  637. new_state[place] = "#"
  638. statedict = new_state
  639.  
  640. print(sum([key for key, val in statedict.items() if val == "#"]) + (50000000000 - 1000) * 55)
Add Comment
Please, Sign In to add comment