Upload my 2019 Advent of Code attempts
Well, unexpectedly (perhaps naively so), I only made it to Day 7. I created these before I stumbled upon the idea of the mono-repository; otherwise, I like to think I would have more granular commits introducing this work.
This commit is contained in:
parent
d480b6f08b
commit
456d358cd7
11 changed files with 773 additions and 0 deletions
8
advent-of-code/aoc2019.nix
Normal file
8
advent-of-code/aoc2019.nix
Normal file
|
@ -0,0 +1,8 @@
|
|||
with import <nixpkgs> {};
|
||||
with python35Packages;
|
||||
|
||||
buildPythonPackage {
|
||||
name = "wpcarro";
|
||||
src = ./day_5.py;
|
||||
propagatedBuildInputs = [ pytest numpy ];
|
||||
}
|
119
advent-of-code/day_1.py
Normal file
119
advent-of-code/day_1.py
Normal file
|
@ -0,0 +1,119 @@
|
|||
from math import floor
|
||||
|
||||
xs = [
|
||||
102473,
|
||||
84495,
|
||||
98490,
|
||||
68860,
|
||||
62204,
|
||||
72810,
|
||||
65185,
|
||||
145951,
|
||||
77892,
|
||||
108861,
|
||||
70764,
|
||||
67286,
|
||||
74002,
|
||||
80773,
|
||||
52442,
|
||||
131505,
|
||||
107162,
|
||||
126993,
|
||||
59784,
|
||||
64231,
|
||||
91564,
|
||||
68585,
|
||||
98735,
|
||||
69020,
|
||||
77332,
|
||||
60445,
|
||||
65826,
|
||||
111506,
|
||||
95431,
|
||||
146687,
|
||||
135119,
|
||||
86804,
|
||||
95915,
|
||||
85434,
|
||||
111303,
|
||||
148127,
|
||||
132921,
|
||||
136213,
|
||||
89004,
|
||||
143137,
|
||||
144853,
|
||||
143017,
|
||||
104386,
|
||||
100612,
|
||||
54760,
|
||||
63813,
|
||||
144191,
|
||||
84481,
|
||||
69718,
|
||||
84936,
|
||||
98621,
|
||||
124993,
|
||||
92736,
|
||||
60369,
|
||||
137284,
|
||||
101902,
|
||||
112726,
|
||||
51784,
|
||||
126496,
|
||||
85005,
|
||||
101661,
|
||||
137278,
|
||||
136637,
|
||||
90340,
|
||||
100209,
|
||||
53683,
|
||||
50222,
|
||||
132060,
|
||||
98797,
|
||||
139054,
|
||||
135638,
|
||||
100632,
|
||||
137849,
|
||||
125333,
|
||||
103981,
|
||||
76954,
|
||||
134352,
|
||||
74229,
|
||||
93402,
|
||||
62552,
|
||||
50286,
|
||||
57066,
|
||||
98439,
|
||||
120708,
|
||||
117827,
|
||||
107884,
|
||||
72837,
|
||||
148663,
|
||||
125645,
|
||||
61460,
|
||||
120555,
|
||||
142473,
|
||||
106668,
|
||||
58612,
|
||||
58576,
|
||||
143366,
|
||||
90058,
|
||||
121087,
|
||||
89546,
|
||||
126161,
|
||||
]
|
||||
|
||||
|
||||
def fuel_for_mass(x):
|
||||
"""Return the amount of fuel (in mass) required for a mass of X. The total
|
||||
amount of fuel includes the amount of fuel required for the fuel itself,
|
||||
since fuel also has a mass weights."""
|
||||
mass_fuel = floor(x / 3) - 2
|
||||
if mass_fuel < 0:
|
||||
return 0
|
||||
else:
|
||||
fuel_fuel = fuel_for_mass(mass_fuel)
|
||||
return mass_fuel + fuel_fuel
|
||||
|
||||
|
||||
print(sum(fuel_for_mass(x) for x in xs))
|
32
advent-of-code/day_2.py
Normal file
32
advent-of-code/day_2.py
Normal file
|
@ -0,0 +1,32 @@
|
|||
from itertools import product
|
||||
|
||||
x = [
|
||||
1, 0, 0, 3, 1, 1, 2, 3, 1, 3, 4, 3, 1, 5, 0, 3, 2, 1, 10, 19, 1, 6, 19, 23,
|
||||
2, 23, 6, 27, 2, 6, 27, 31, 2, 13, 31, 35, 1, 10, 35, 39, 2, 39, 13, 43, 1,
|
||||
43, 13, 47, 1, 6, 47, 51, 1, 10, 51, 55, 2, 55, 6, 59, 1, 5, 59, 63, 2, 9,
|
||||
63, 67, 1, 6, 67, 71, 2, 9, 71, 75, 1, 6, 75, 79, 2, 79, 13, 83, 1, 83, 10,
|
||||
87, 1, 13, 87, 91, 1, 91, 10, 95, 2, 9, 95, 99, 1, 5, 99, 103, 2, 10, 103,
|
||||
107, 1, 107, 2, 111, 1, 111, 5, 0, 99, 2, 14, 0, 0
|
||||
]
|
||||
|
||||
|
||||
def interpret(i, x):
|
||||
op, a, b, out = x[i + 0], x[i + 1], x[i + 2], x[i + 3]
|
||||
if op == 1:
|
||||
x[out] = x[a] + x[b]
|
||||
return interpret(i + 4, x)
|
||||
elif op == 2:
|
||||
x[out] = x[a] * x[b]
|
||||
return interpret(i + 4, x)
|
||||
elif op == 99:
|
||||
return x
|
||||
else:
|
||||
raise Exception('Unsupported opcode: {}. {}, {}'.format(op, a, b))
|
||||
|
||||
|
||||
for a, b in product(range(100), range(100)):
|
||||
y = x[:]
|
||||
y[1] = a
|
||||
y[2] = b
|
||||
if interpret(0, y)[0] == 19690720:
|
||||
print(100 * a + b)
|
137
advent-of-code/day_3.py
Normal file
137
advent-of-code/day_3.py
Normal file
|
@ -0,0 +1,137 @@
|
|||
from math import floor
|
||||
from heapq import heappush, heappop
|
||||
|
||||
xs = [
|
||||
"R1009", "U993", "L383", "D725", "R163", "D312", "R339", "U650", "R558",
|
||||
"U384", "R329", "D61", "L172", "D555", "R160", "D972", "L550", "D801",
|
||||
"L965", "U818", "L123", "D530", "R176", "D353", "L25", "U694", "L339",
|
||||
"U600", "L681", "D37", "R149", "D742", "R762", "U869", "R826", "U300",
|
||||
"L949", "U978", "L303", "U361", "R136", "D343", "L909", "U551", "R745",
|
||||
"U913", "L566", "D292", "R820", "U886", "R205", "D431", "L93", "D71",
|
||||
"R577", "U872", "L705", "U510", "L698", "U963", "R607", "U527", "L669",
|
||||
"D543", "R690", "U954", "L929", "D218", "R490", "U500", "L589", "D332",
|
||||
"R949", "D538", "R696", "U659", "L188", "U468", "L939", "U833", "L445",
|
||||
"D430", "R78", "D303", "R130", "D649", "R849", "D712", "L511", "U745",
|
||||
"R51", "U973", "R799", "U829", "R605", "D771", "L837", "U204", "L414",
|
||||
"D427", "R538", "U116", "R540", "D168", "R493", "U900", "L679", "U431",
|
||||
"L521", "D500", "L428", "U332", "L954", "U717", "L853", "D339", "L88",
|
||||
"U807", "L607", "D496", "L163", "U468", "L25", "U267", "L759", "D898",
|
||||
"L591", "U445", "L469", "U531", "R596", "D486", "L728", "D677", "R350",
|
||||
"D429", "R39", "U568", "R92", "D875", "L835", "D841", "R877", "U178",
|
||||
"L221", "U88", "R592", "U692", "R455", "U693", "L419", "U90", "R609",
|
||||
"U672", "L293", "U168", "R175", "D456", "R319", "D570", "R504", "D165",
|
||||
"L232", "D624", "L604", "D68", "R807", "D59", "R320", "D281", "L371",
|
||||
"U956", "L788", "D897", "L231", "D829", "R287", "D798", "L443", "U194",
|
||||
"R513", "D925", "L232", "U225", "L919", "U563", "R448", "D889", "R661",
|
||||
"U852", "L950", "D558", "L269", "U186", "L625", "U673", "L995", "U732",
|
||||
"R435", "U849", "L413", "D690", "L158", "D234", "R361", "D458", "L271",
|
||||
"U90", "L781", "U754", "R256", "U162", "L842", "U927", "L144", "D62",
|
||||
"R928", "D238", "R473", "U97", "L745", "U303", "L487", "D349", "L520",
|
||||
"D31", "L825", "U385", "L133", "D948", "L39", "U62", "R801", "D664",
|
||||
"L333", "U134", "R692", "U385", "L658", "U202", "L279", "D374", "R489",
|
||||
"D686", "L182", "U222", "R733", "U177", "R94", "D603", "L376", "U901",
|
||||
"R216", "D851", "L155", "D214", "L460", "U758", "R121", "D746", "L180",
|
||||
"U175", "L943", "U146", "L166", "D251", "L238", "U168", "L642", "D341",
|
||||
"R281", "U182", "R539", "D416", "R553", "D67", "L748", "U272", "R257",
|
||||
"D869", "L340", "U180", "R791", "U138", "L755", "D976", "R731", "U713",
|
||||
"R602", "D284", "L258", "U176", "R509", "U46", "R935", "U576", "R96",
|
||||
"U89", "L913", "U703", "R833"
|
||||
]
|
||||
ys = [
|
||||
"L1006", "D998", "R94", "D841", "R911", "D381", "R532", "U836", "L299",
|
||||
"U237", "R781", "D597", "L399", "D800", "L775", "D405", "L485", "U636",
|
||||
"R589", "D942", "L878", "D779", "L751", "U711", "L973", "U410", "L151",
|
||||
"U15", "L685", "U417", "L106", "D648", "L105", "D461", "R448", "D743",
|
||||
"L589", "D430", "R883", "U37", "R155", "U350", "L421", "U23", "R337",
|
||||
"U816", "R384", "D671", "R615", "D410", "L910", "U914", "L579", "U385",
|
||||
"R916", "U13", "R268", "D519", "R289", "U410", "L389", "D885", "L894",
|
||||
"U734", "L474", "U707", "L72", "U155", "L237", "U760", "L127", "U806",
|
||||
"L15", "U381", "L557", "D727", "L569", "U320", "L985", "D452", "L8",
|
||||
"D884", "R356", "U732", "L672", "D458", "L485", "U402", "L238", "D30",
|
||||
"R644", "U125", "R753", "U183", "L773", "U487", "R849", "U210", "L164",
|
||||
"D808", "L595", "D668", "L340", "U785", "R313", "D72", "L76", "D263",
|
||||
"R689", "U604", "R471", "U688", "R462", "D915", "R106", "D335", "R869",
|
||||
"U499", "R190", "D916", "R468", "D882", "R56", "D858", "L143", "D741",
|
||||
"L386", "U856", "R50", "U853", "R151", "D114", "L773", "U854", "L290",
|
||||
"D344", "L23", "U796", "L531", "D932", "R314", "U960", "R643", "D303",
|
||||
"L661", "D493", "L82", "D491", "L722", "U848", "L686", "U4", "L985",
|
||||
"D509", "L135", "D452", "R500", "U105", "L326", "D101", "R222", "D944",
|
||||
"L645", "D362", "L628", "U305", "L965", "U356", "L358", "D137", "R787",
|
||||
"U728", "R967", "U404", "R18", "D928", "L695", "D965", "R281", "D597",
|
||||
"L791", "U731", "R746", "U163", "L780", "U41", "L255", "U81", "L530",
|
||||
"D964", "R921", "D297", "R475", "U663", "L226", "U623", "L984", "U943",
|
||||
"L143", "U201", "R926", "U572", "R343", "U839", "R764", "U751", "R128",
|
||||
"U939", "R987", "D108", "R474", "U599", "R412", "D248", "R125", "U797",
|
||||
"L91", "D761", "L840", "U290", "L281", "U779", "R650", "D797", "R185",
|
||||
"D320", "L25", "U378", "L696", "U332", "R75", "D620", "L213", "D667",
|
||||
"R558", "U267", "L846", "U306", "R939", "D220", "R311", "U827", "R345",
|
||||
"U534", "R56", "D679", "R48", "D845", "R898", "U8", "R862", "D960", "R753",
|
||||
"U319", "L886", "D795", "R805", "D265", "R876", "U729", "R894", "D368",
|
||||
"R858", "U744", "R506", "D327", "L903", "U919", "L721", "U507", "L463",
|
||||
"U753", "R775", "D719", "R315", "U128", "R17", "D376", "R999", "D386",
|
||||
"L259", "U181", "L162", "U605", "L265", "D430", "R35", "D968", "R207",
|
||||
"U466", "R796", "D667", "R93", "U749", "L315", "D410", "R312", "U929",
|
||||
"L923", "U260", "R638"
|
||||
]
|
||||
|
||||
|
||||
def to_coords(xs):
|
||||
row, col = 0, 0
|
||||
coords = []
|
||||
for x in xs:
|
||||
d, amt = x[0], int(x[1:])
|
||||
if d == 'U':
|
||||
for i in range(1, amt + 1):
|
||||
coords.append((row + i, col))
|
||||
row += amt
|
||||
elif d == 'D':
|
||||
for i in range(1, amt + 1):
|
||||
coords.append((row - i, col))
|
||||
row -= amt
|
||||
elif d == 'L':
|
||||
for i in range(1, amt + 1):
|
||||
coords.append((row, col - i))
|
||||
col -= amt
|
||||
elif d == 'R':
|
||||
for i in range(1, amt + 1):
|
||||
coords.append((row, col + i))
|
||||
col += i
|
||||
return coords
|
||||
|
||||
|
||||
def contains(row, col, d):
|
||||
if row not in d:
|
||||
return False
|
||||
return col in d[row]
|
||||
|
||||
|
||||
def intersections(xs, ys):
|
||||
d = {}
|
||||
ints = set()
|
||||
for row, col in to_coords(xs):
|
||||
if row in d:
|
||||
d[row].add(col)
|
||||
else:
|
||||
d[row] = {col}
|
||||
for row, col in to_coords(ys):
|
||||
if contains(row, col, d):
|
||||
ints.add((row, col))
|
||||
return ints
|
||||
|
||||
|
||||
def trace_to(coord, xs):
|
||||
count = 0
|
||||
for coord_x in to_coords(xs):
|
||||
count += 1
|
||||
if coord_x == coord:
|
||||
return count
|
||||
raise Exception("Intersection doesn't exist")
|
||||
|
||||
|
||||
answer = []
|
||||
for coord in intersections(xs, ys):
|
||||
x = trace_to(coord, xs)
|
||||
y = trace_to(coord, ys)
|
||||
heappush(answer, x + y)
|
||||
|
||||
print(heappop(answer))
|
35
advent-of-code/day_4.py
Normal file
35
advent-of-code/day_4.py
Normal file
|
@ -0,0 +1,35 @@
|
|||
import re
|
||||
|
||||
start = 134792
|
||||
end = 675810
|
||||
|
||||
|
||||
def satisfies(x):
|
||||
x = str(x)
|
||||
result = False
|
||||
double, not_decreasing = False, False
|
||||
|
||||
# double and *only* double exists
|
||||
for i in range(len(x) - 1):
|
||||
# double and left-of-a is BOL or !x
|
||||
# and right-of-b is EOL or !x
|
||||
a, b = x[i], x[i + 1]
|
||||
bol = i - 1 < 0
|
||||
eol = i + 2 >= len(x)
|
||||
if a == b and (bol or x[i - 1] != a) and (eol or x[i + 2] != a):
|
||||
double = True
|
||||
break
|
||||
|
||||
# not_decreasing
|
||||
prev = int(x[0])
|
||||
for a in x[1:]:
|
||||
a = int(a)
|
||||
if prev > a:
|
||||
return False
|
||||
prev = a
|
||||
not_decreasing = True
|
||||
|
||||
return double and not_decreasing
|
||||
|
||||
|
||||
print(len([x for x in range(start, end + 1) if satisfies(x)]))
|
50
advent-of-code/day_5.ex
Normal file
50
advent-of-code/day_5.ex
Normal file
|
@ -0,0 +1,50 @@
|
|||
defmodule Interpretter do
|
||||
def interpret_param({mode, x}, xs) do
|
||||
case mode do
|
||||
:positional -> Enum.at(xs, x)
|
||||
:immediate -> x
|
||||
end
|
||||
end
|
||||
|
||||
# Perhaps I can model the intepretter after Forth and make it a stack-based
|
||||
# interpretter with an emphasis on debugability, introspection.
|
||||
def interpret(i, xs) do
|
||||
stack = []
|
||||
op = Enum.at(xs, i)
|
||||
|
||||
# map instructions into an intermediate representation (i.e. IR) where the
|
||||
# opcodes are mapped into atoms and the arguments are mapped into references
|
||||
# or literals.
|
||||
|
||||
instructions =
|
||||
%{'01' => :add,
|
||||
'02' => :multiply,
|
||||
'03' => :input,
|
||||
'04' => :output,
|
||||
'05' => :jump_if_true,
|
||||
'06' => :jump_if_false,
|
||||
'07' => :less_than,
|
||||
'08' => :equal_to,
|
||||
'99' => :return}
|
||||
|
||||
case xs do
|
||||
[:add, a, b, {:positional, out} | rest] ->
|
||||
a = interpret_param(a, xs)
|
||||
b = interpret_param(b, xs)
|
||||
Interpretter.interpret(i + 3, List.insert_at(xs, out, a + b))
|
||||
|
||||
[:multiply, a, b, {:positional, out} | rest] ->
|
||||
a = interpret_param(a, xs)
|
||||
b = interpret_param(b, xs)
|
||||
Interpretter.interpret(i + 3, List.insert_at(xs, out, a * b))
|
||||
|
||||
[:input, a | rest] -> nil
|
||||
[:output, a | rest] -> nil
|
||||
[:jump_if_true, a, b | rest] -> nil
|
||||
[:jump_if_false, a, b | rest] -> nil
|
||||
[:less_than, a, b, out | rest] -> nil
|
||||
[:equal_to, a, b, out | rest] -> nil
|
||||
[:return | _rest] -> nil
|
||||
end
|
||||
end
|
||||
end
|
170
advent-of-code/day_5.py
Normal file
170
advent-of-code/day_5.py
Normal file
|
@ -0,0 +1,170 @@
|
|||
x = [
|
||||
3, 225, 1, 225, 6, 6, 1100, 1, 238, 225, 104, 0, 1102, 31, 68, 225, 1001,
|
||||
13, 87, 224, 1001, 224, -118, 224, 4, 224, 102, 8, 223, 223, 1001, 224, 7,
|
||||
224, 1, 223, 224, 223, 1, 174, 110, 224, 1001, 224, -46, 224, 4, 224, 102,
|
||||
8, 223, 223, 101, 2, 224, 224, 1, 223, 224, 223, 1101, 13, 60, 224, 101,
|
||||
-73, 224, 224, 4, 224, 102, 8, 223, 223, 101, 6, 224, 224, 1, 224, 223,
|
||||
223, 1101, 87, 72, 225, 101, 47, 84, 224, 101, -119, 224, 224, 4, 224,
|
||||
1002, 223, 8, 223, 1001, 224, 6, 224, 1, 223, 224, 223, 1101, 76, 31, 225,
|
||||
1102, 60, 43, 225, 1102, 45, 31, 225, 1102, 63, 9, 225, 2, 170, 122, 224,
|
||||
1001, 224, -486, 224, 4, 224, 102, 8, 223, 223, 101, 2, 224, 224, 1, 223,
|
||||
224, 223, 1102, 29, 17, 224, 101, -493, 224, 224, 4, 224, 102, 8, 223, 223,
|
||||
101, 1, 224, 224, 1, 223, 224, 223, 1102, 52, 54, 225, 1102, 27, 15, 225,
|
||||
102, 26, 113, 224, 1001, 224, -1560, 224, 4, 224, 102, 8, 223, 223, 101, 7,
|
||||
224, 224, 1, 223, 224, 223, 1002, 117, 81, 224, 101, -3645, 224, 224, 4,
|
||||
224, 1002, 223, 8, 223, 101, 6, 224, 224, 1, 223, 224, 223, 4, 223, 99, 0,
|
||||
0, 0, 677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1105, 0, 99999, 1105, 227, 247,
|
||||
1105, 1, 99999, 1005, 227, 99999, 1005, 0, 256, 1105, 1, 99999, 1106, 227,
|
||||
99999, 1106, 0, 265, 1105, 1, 99999, 1006, 0, 99999, 1006, 227, 274, 1105,
|
||||
1, 99999, 1105, 1, 280, 1105, 1, 99999, 1, 225, 225, 225, 1101, 294, 0, 0,
|
||||
105, 1, 0, 1105, 1, 99999, 1106, 0, 300, 1105, 1, 99999, 1, 225, 225, 225,
|
||||
1101, 314, 0, 0, 106, 0, 0, 1105, 1, 99999, 8, 226, 677, 224, 102, 2, 223,
|
||||
223, 1005, 224, 329, 1001, 223, 1, 223, 1108, 677, 226, 224, 102, 2, 223,
|
||||
223, 1006, 224, 344, 101, 1, 223, 223, 108, 677, 226, 224, 102, 2, 223,
|
||||
223, 1006, 224, 359, 101, 1, 223, 223, 7, 677, 226, 224, 102, 2, 223, 223,
|
||||
1005, 224, 374, 101, 1, 223, 223, 1007, 226, 677, 224, 102, 2, 223, 223,
|
||||
1005, 224, 389, 101, 1, 223, 223, 8, 677, 677, 224, 102, 2, 223, 223, 1006,
|
||||
224, 404, 1001, 223, 1, 223, 1007, 677, 677, 224, 1002, 223, 2, 223, 1006,
|
||||
224, 419, 101, 1, 223, 223, 1108, 677, 677, 224, 1002, 223, 2, 223, 1005,
|
||||
224, 434, 1001, 223, 1, 223, 1107, 226, 677, 224, 102, 2, 223, 223, 1005,
|
||||
224, 449, 101, 1, 223, 223, 107, 226, 226, 224, 102, 2, 223, 223, 1006,
|
||||
224, 464, 101, 1, 223, 223, 1108, 226, 677, 224, 1002, 223, 2, 223, 1005,
|
||||
224, 479, 1001, 223, 1, 223, 7, 677, 677, 224, 102, 2, 223, 223, 1006, 224,
|
||||
494, 1001, 223, 1, 223, 1107, 677, 226, 224, 102, 2, 223, 223, 1005, 224,
|
||||
509, 101, 1, 223, 223, 107, 677, 677, 224, 1002, 223, 2, 223, 1006, 224,
|
||||
524, 101, 1, 223, 223, 1008, 677, 677, 224, 1002, 223, 2, 223, 1006, 224,
|
||||
539, 101, 1, 223, 223, 7, 226, 677, 224, 1002, 223, 2, 223, 1005, 224, 554,
|
||||
101, 1, 223, 223, 108, 226, 226, 224, 1002, 223, 2, 223, 1006, 224, 569,
|
||||
101, 1, 223, 223, 1008, 226, 677, 224, 102, 2, 223, 223, 1005, 224, 584,
|
||||
101, 1, 223, 223, 8, 677, 226, 224, 1002, 223, 2, 223, 1005, 224, 599, 101,
|
||||
1, 223, 223, 1007, 226, 226, 224, 1002, 223, 2, 223, 1005, 224, 614, 101,
|
||||
1, 223, 223, 1107, 226, 226, 224, 1002, 223, 2, 223, 1006, 224, 629, 101,
|
||||
1, 223, 223, 107, 677, 226, 224, 1002, 223, 2, 223, 1005, 224, 644, 1001,
|
||||
223, 1, 223, 1008, 226, 226, 224, 1002, 223, 2, 223, 1006, 224, 659, 101,
|
||||
1, 223, 223, 108, 677, 677, 224, 1002, 223, 2, 223, 1005, 224, 674, 1001,
|
||||
223, 1, 223, 4, 223, 99, 226
|
||||
]
|
||||
|
||||
# Interpretter spec:
|
||||
# Op-code width: 2
|
||||
# ABCDE
|
||||
# A: Mode of 3rd parameter
|
||||
# B: Mode of 2rd parameter
|
||||
# C: Mode of 1st parameter
|
||||
# DE: 2-digit op-code
|
||||
#
|
||||
# Not every op-code has the same arity.
|
||||
#
|
||||
# Parameter modes:
|
||||
# - positional: index of memory. 0
|
||||
# - immediate: raw value. 1
|
||||
# Assert that you never attempt to write to an "immediate value"
|
||||
|
||||
# Parameter modes
|
||||
POS = '0' # positional parameter mode
|
||||
VAL = '1' # immediate parameter mode
|
||||
|
||||
|
||||
# Pasted from day-2.py
|
||||
# interpretter :: Int -> [Int] -> [Int] -> IO ()
|
||||
def interpret(i, x, argv=[], outs=[]):
|
||||
"""Values in `argv` will be applied to any `input` fields."""
|
||||
# The widest op-code we'll see is 3 + 2 = 5 for either addition or
|
||||
# multiplication since each of those is a 3-arity function with a two-digit
|
||||
# op-code.
|
||||
instruction = '{:05d}'.format(x[i])
|
||||
op = instruction[-2:]
|
||||
|
||||
if op == '01':
|
||||
a, b, out = x[i + 1], x[i + 2], x[i + 3]
|
||||
mode_a, mode_b, mode_out = instruction[2], instruction[1], instruction[
|
||||
0]
|
||||
a = a if mode_a == VAL else x[a]
|
||||
b = b if mode_b == VAL else x[b]
|
||||
assert mode_out == POS
|
||||
x[out] = a + b
|
||||
return interpret(i + 4, x, argv=argv, outs=outs)
|
||||
elif op == '02':
|
||||
a, b, out = x[i + 1], x[i + 2], x[i + 3]
|
||||
mode_a, mode_b, mode_out = instruction[2], instruction[1], instruction[
|
||||
0]
|
||||
a = a if mode_a == VAL else x[a]
|
||||
b = b if mode_b == VAL else x[b]
|
||||
assert mode_out == POS
|
||||
x[out] = a * b
|
||||
return interpret(i + 4, x, argv=argv, outs=outs)
|
||||
# input
|
||||
elif op == '03':
|
||||
a = x[i + 1]
|
||||
mode_a = instruction[2]
|
||||
assert mode_a == POS
|
||||
# What's the pythonic way to defensively get this value?
|
||||
if len(argv) and argv[0] is not None:
|
||||
x[a] = argv[0]
|
||||
return interpret(i + 2, x, argv=argv[1:], outs=outs)
|
||||
elif len(outs) and outs[-1] is not None:
|
||||
x[a] = outs[-1]
|
||||
return interpret(i + 2, x, argv=argv, outs=outs)
|
||||
else:
|
||||
# Here we want to block until the user applies input. This could be
|
||||
# done easily with message passing for something similar.
|
||||
x[a] = int(input('Enter: '))
|
||||
return interpret(i + 2, x, argv=argv)
|
||||
# output
|
||||
elif op == '04':
|
||||
a = x[i + 1]
|
||||
mode_a = instruction[2]
|
||||
a = a if mode_a == VAL else x[a]
|
||||
outs.append(a)
|
||||
return interpret(i + 2, x, argv=argv, outs=outs)
|
||||
# jump-if-true
|
||||
elif op == '05':
|
||||
a, b = x[i + 1], x[i + 2]
|
||||
mode_a, mode_b = instruction[2], instruction[1]
|
||||
a = a if mode_a == VAL else x[a]
|
||||
b = b if mode_b == VAL else x[b]
|
||||
if a != 0:
|
||||
return interpret(b, x, argv=argv, outs=outs)
|
||||
else:
|
||||
return interpret(i + 3, x, argv=argv, outs=outs)
|
||||
# jump-if-false
|
||||
elif op == '06':
|
||||
a, b = x[i + 1], x[i + 2]
|
||||
mode_a, mode_b = instruction[2], instruction[1]
|
||||
a = a if mode_a == VAL else x[a]
|
||||
b = b if mode_b == VAL else x[b]
|
||||
if a == 0:
|
||||
return interpret(b, x, argv=argv, outs=outs)
|
||||
else:
|
||||
return interpret(i + 3, x, argv=argv, outs=outs)
|
||||
pass
|
||||
# less than
|
||||
elif op == '07':
|
||||
a, b, out = x[i + 1], x[i + 2], x[i + 3]
|
||||
mode_a, mode_b, mode_out = instruction[2], instruction[1], instruction[
|
||||
0]
|
||||
a = a if mode_a == VAL else x[a]
|
||||
b = b if mode_b == VAL else x[b]
|
||||
assert mode_out == POS
|
||||
if a < b:
|
||||
x[out] = 1
|
||||
else:
|
||||
x[out] = 0
|
||||
return interpret(i + 4, x, argv=argv, outs=outs)
|
||||
# equals
|
||||
elif op == '08':
|
||||
a, b, out = x[i + 1], x[i + 2], x[i + 3]
|
||||
mode_a, mode_b, mode_out = instruction[2], instruction[1], instruction[
|
||||
0]
|
||||
a = a if mode_a == VAL else x[a]
|
||||
b = b if mode_b == VAL else x[b]
|
||||
assert mode_out == POS
|
||||
if a == b:
|
||||
x[out] = 1
|
||||
else:
|
||||
x[out] = 0
|
||||
return interpret(i + 4, x, argv=argv, outs=outs)
|
||||
elif op == '99':
|
||||
return x[0]
|
||||
else:
|
||||
raise Exception('Unsupported opcode: {}.'.format(op))
|
BIN
advent-of-code/day_5.pyc
Normal file
BIN
advent-of-code/day_5.pyc
Normal file
Binary file not shown.
155
advent-of-code/day_6.py
Normal file
155
advent-of-code/day_6.py
Normal file
|
@ -0,0 +1,155 @@
|
|||
from graphviz import Digraph
|
||||
|
||||
data = """6WF)DRK 2PT)PSM H42)FN8 1XR)LQD HRK)9KL TD6)H8W 98Z)BJM RCQ)LVG
|
||||
RWQ)Q7H 2PS)X94 NHB)25X PXC)W57 L8L)MVX CFK)D8K R1B)43T PDY)QKX FQK)82K JJ6)MQJ
|
||||
FB6)6V1 R28)5MZ BN2)5HN 6BQ)JVC W57)22C MQJ)DL2 MTC)84R RH8)CRN Y27)3GN CKQ)31C
|
||||
R7V)9BK ZDY)PDY X2Q)Y6S Q8B)SAN 1Z3)PVT R87)57R KCJ)44X PWQ)9CB HLC)VYW HFP)9XS
|
||||
X33)MC3 RYS)R7R JRF)VHW 79R)FXZ YQQ)STV 8J6)JWX Q6D)RV6 LL9)B4D 6R1)T1Z VK9)42M
|
||||
PQP)17N K6C)HMK GLY)N47 KDW)CDC DQ4)RY5 SND)FDR 7YF)1VN MDT)B3S D3F)98Z 5VH)MR7
|
||||
KNR)2L8 CJW)QDL FWY)14X SJD)79R COM)BXW T2B)FPB B2Q)BRJ Z21)HYC VHW)5XR WZ4)2JM
|
||||
8HF)342 PYR)X9Y RKF)P43 S1S)9WT 2PB)BSB QF7)M9T HML)HMC 7J9)7Q6 8F1)29K DH1)NDM
|
||||
1YC)PXC P32)HR7 PMX)7Y9 STV)SLW NYY)NF1 TG9)998 DMB)DLW XGL)1Z3 GK8)WCS YHR)HQC
|
||||
9Q5)B6D R2T)CM5 6KC)J5G ZM9)L8L J8T)F89 3LN)YOU T2T)Z8F SCY)FKG 9W4)195 QLM)DD7
|
||||
4QY)JCB WKM)3JF 693)YM8 61M)B6Y DSP)X2M YZ5)DPL BC9)3B1 BDB)JTG 3TJ)TW1 W5M)SF6
|
||||
K4Q)X56 5HT)YHX YJG)DM5 68N)X2Q 2YP)DS5 BLK)MY3 6WV)VZ4 2JQ)ZT8 G93)V2W WN1)SBD
|
||||
SS7)DY9 X56)8HP JY1)VS4 XQ6)L94 98Z)DMC V6S)NWT D9L)Y44 V6G)GVS JDW)FZW FJT)S38
|
||||
L2Z)VPL 7ZX)DKK X2M)8WM YVZ)XWS HMK)P87 47M)TD6 TDZ)21T 19R)95B GD9)Q1L 9QX)DFR
|
||||
Y64)XGN CRG)6VY V3L)61D RJ4)C9Z XXG)P53 VJ8)QTF CPQ)2M9 JRN)8V1 KMH)K94 DLW)VQ4
|
||||
91W)2QQ G4B)RWQ 4P1)MKS K6G)DZ7 WCS)JR9 LXM)7RY 6ZB)K6G HMC)622 Z21)BLK Q6N)48V
|
||||
66S)MK4 PDK)6WV Y6S)GY1 2L8)ZMG 42W)ZN6 6MS)8TZ JBY)STQ NSF)3ZM 5CV)X9N K4V)WFL
|
||||
J6R)DT8 N3N)CX4 PTD)YXT F74)4T5 C51)3FW KRW)DS1 NWT)CKQ 195)6G6 HVQ)S18 Q7H)BKM
|
||||
SKN)4D4 GK2)MLX MVX)TG9 YPK)RHQ Y9F)Z8W 42M)WNL 84R)6JP KNC)NHF FZW)PGM 3FW)HGX
|
||||
DBK)FB6 45T)HLT L11)JVN HB5)K6C QH5)888 BTJ)J55 8BT)8ZS FR1)XGL S87)PS9 C4K)BN2
|
||||
N2Q)18C KTF)ZM9 TN2)B2Q DF3)CFK 9T3)TMR P29)3P1 P1W)7SQ 4D4)1DJ LML)ZJ3 Q4L)RKF
|
||||
MW2)79T LVG)CPQ BDC)JH5 DNZ)232 998)GTM YGS)4WH GY1)C51 J55)QBT B8Z)34W FJ2)H42
|
||||
58J)326 T1Z)DCJ 1ZH)GLV 1YC)JG6 14K)22B RY5)QRY 7V2)2WT 4GQ)XHV ZJ3)TQ8 2G8)SN3
|
||||
FPB)HMN SC4)57D 5LQ)R2T LXM)R8Z JQ6)G4B WNL)GK2 42M)P75 LM3)YPK ZN6)753 PN4)835
|
||||
C4H)JY1 LR4)VD5 PSM)P1W VWL)C6C G2V)WBC 85M)R24 B1V)QW7 175)2PM Y1V)1ZH 34W)3MJ
|
||||
WN7)TTB 3PV)CQD N7Y)9T3 223)8D4 RV6)LJ9 HFP)JRF VMT)DNB GJP)D3F J5G)KMS 7Q6)ZW2
|
||||
YCB)JBY XGN)MNL 888)DSP X61)Q6N WT5)X12 SDN)FD1 2QC)54W V98)964 T7S)YVZ MLX)9VZ
|
||||
FR8)QH5 TVQ)2PS 2PV)FHY F4S)MPT 3J9)JNB J6M)GDC Q4C)MJN 9VZ)BZK P2P)B69 WBC)M1W
|
||||
D97)HPF JKB)9L4 593)6YJ RMB)4Q5 QZB)38C H12)6R1 MKY)DDD HGX)CRG P53)WY7 22B)GMM
|
||||
44X)2D8 DT8)L7H 3Y2)D3S FB8)68N 3BC)1XR 4XF)TVQ VPL)R7V Z4V)JSK B3S)FW5 49Z)YQQ
|
||||
99V)D13 54Q)SS7 CYC)TXH PQ3)78W X4M)G9H WFL)M99 ZYY)3Y2 12Y)PSW W38)P29 H8W)JJ6
|
||||
P66)VPH GK2)45T H5F)FJT JDJ)SNV 14F)96Q JG6)TQ4 2L6)52Q SCY)CBJ 3GN)KNC KLM)XPR
|
||||
DH1)QZB DMB)X7G DPL)7SX D97)N3N GNS)T95 53P)GW2 BHR)HNB YHX)XQV 2CR)Y1V C9D)Z7P
|
||||
FN8)2PT 6LF)FCQ JNL)LQR SPV)YCB HGX)N83 VS4)8BT 5RH)FTX HYC)X2J 69V)J6S 9XS)PN4
|
||||
SD7)5Q3 2RN)82D QRY)FFY K2Y)3X2 79Z)S2Z YN2)Y64 JKB)MDT KJ8)NDH N57)5VH 3XK)1Q1
|
||||
SCH)FJ6 17N)GMP QR4)7V2 GLV)GLY NHF)ZDY QDL)S14 QF1)BMC ZLF)DHN 3JF)7TR MKS)GCY
|
||||
964)91R 9L4)L5G RRX)6ZB CD7)73M 3X2)PGC HNB)S9Z L94)KLM 8MQ)SCR 18C)3TJ M4Y)BTJ
|
||||
BC9)5YR TV5)SCY 2NX)8CC C9Z)MTC B69)3QP HR7)CHJ 8ZS)JRN 31C)TJW D43)4NH 93Q)X9X
|
||||
T95)DNZ LQ5)BC9 9T5)S2C RP8)DH1 GCY)SD7 Y44)9B5 VG5)ZYY 7RY)V3L PWV)Q4L NF1)7YF
|
||||
DRK)Y8V D13)GYG TW1)2PB ZVZ)2VV BRJ)V2V 9CB)Y7B MK4)9CJ TMR)6XS HWF)GK8 QTF)S1S
|
||||
DFW)6LF N3S)WN1 N2Q)MSW CZ5)X61 FXZ)C4H SCQ)MF7 9LY)3LN 5MZ)PMX CN9)WF9 FHY)PR8
|
||||
S38)NWH M29)G5S 4NH)GZJ 5YR)54H CLX)MNY TJD)HQL RRZ)4GQ YHB)CZ5 P37)93Q YJG)3Q3
|
||||
95B)QMF CMQ)BLZ QD9)45M JSK)R28 YCW)CLX 8K3)JGB N8M)PQW P75)1HL XBS)T2T 22C)PVW
|
||||
689)6MS FFY)RWX YHL)2G8 Y8V)4P1 Y7B)62Z YKJ)JDJ 1HL)5LQ PZ3)B1C 52Q)7HB 3Q2)ZV7
|
||||
YBF)Z4V J95)SDH NM6)YBF 8YN)J3M J6S)KNR PVT)N4X SDH)RFW RFW)7Y1 JCB)52B 3MJ)H58
|
||||
4QF)XHZ F62)DFW 7LJ)KDW JHL)C9D B4D)Q8B 342)YGS PFR)ZQT Z9K)TNS 8F8)WLB 94N)DMB
|
||||
QBT)RYS 3VR)KRR 8D4)ST6 X9N)2PV 632)8K3 MX5)XNP 57D)Y27 18D)PQP D3F)RJ4 PLS)PBL
|
||||
1JP)YDC 79V)BG2 S14)2NX 4Q5)NCQ FTX)555 2PM)KMH HQC)RMB 9Z9)BNZ XHV)Y94 7ZP)YHR
|
||||
BNZ)49Z W6D)LX6 SLS)JL3 PVW)P9W Z1L)HB5 DS5)G2V Z9Q)RV8 DFR)LPJ 836)693 K94)VWL
|
||||
HRG)836 J3V)593 52N)LPK 9KL)Y7M LX6)F7D JL3)511 L4G)D97 1RH)Y9F NJ2)LML GW2)9WV
|
||||
8KZ)NRC XQV)G6D R8Z)QF7 326)HML R7R)8PM 622)YCW WQY)LGS NF1)FF3 5LQ)QF1 5XR)PTD
|
||||
V2V)PFR 9T5)JQ6 CBQ)8KZ VZ4)HVQ TJW)DQT 9WT)5M6 CFK)YHL JR9)1JP Y1K)CF4 8WS)JPY
|
||||
VYC)1D6 GKK)7J9 JTG)RRX 6V1)F74 1H5)QR4 SN3)NMG MF7)GQ1 RYK)SCH BNZ)9LY 1DJ)9LP
|
||||
L6W)5BK FCQ)BFL DCJ)3RD MXD)8MQ RWX)1RH NBF)WKM K6C)WNH H58)L6W Y7B)BJH PGC)NBF
|
||||
96Q)Q2W F7D)BSN 223)Z9K K94)VYC X9X)7M3 Q1M)3J9 QXF)XQ6 DD7)3Q2 Q1L)NHB 79T)LXQ
|
||||
8TZ)M29 21T)Q4C B1C)NSF 8D8)FJ2 LJH)HGJ QS2)PS1 5KX)Z2L C6C)6BQ VQ2)2YP P87)N8M
|
||||
ST5)L4G 8SP)W5M T4H)69V 9WF)GHS FF3)SND C5G)GKK VQ2)X4M P43)8J6 TD6)384 66V)CN9
|
||||
CX4)T9T NCQ)2JQ 29K)K8K RY5)K4Q GQ3)T4H FNH)P32 3BC)PRQ 5HN)4QY M1W)BGT 84R)ST5
|
||||
S45)CJW CK4)W7G SGX)19R S2C)7ZX DHN)W5Y 8D9)HM2 BSB)SPV D8K)DFV JHL)2L6 KYP)12Y
|
||||
KDN)6X7 Y44)SQZ 6G6)SJD N7D)QGF Q84)8WJ F89)LL9 LYJ)2RN 25X)Q84 HM3)53P JNB)QD9
|
||||
SLW)1DQ 384)3BC PR8)NGV 49N)7ZP 65H)LHJ 6XS)S45 ZMG)FR1 X2M)Y86 QD3)QLM P4R)PQ3
|
||||
RTK)4M3 4YW)N7D R7V)M4M 73M)CBF DFV)64R Z7P)LMK HRG)Y1K 3ZM)BCZ WY7)QXP DMC)9Q5
|
||||
PSW)1H5 8CC)TV5 TTB)S88 BZK)K2Y T2B)CBQ HJB)Y19 DQW)KML Z8W)8ZL PBL)5TK 1D6)MX5
|
||||
3MJ)4YW MDT)HJB 62Z)X33 DZ7)BDC 9CJ)FRD 82D)KDN LK7)18D 9QQ)61M Y34)DZG J4T)6KC
|
||||
971)QD3 511)GQ3 MJN)F62 RNM)NKG BGW)KJ8 DL2)1YH ZQT)RYZ 1YH)ZJ6 2WT)YYQ 7HB)DYQ
|
||||
3BN)WQY 2M9)62D TSK)YR1 N7Y)VJ8 WZ4)FWT MNY)YN2 DYQ)RRZ 3RG)YT3 2SM)VK9 JH5)ZXH
|
||||
GYG)K2M PKF)V6G JGB)S87 X94)N57 MSW)L2Z X4N)25G BLZ)4QF JPY)GD9 WLB)V6S KML)2SM
|
||||
TXH)9X1 48V)KTR 8PM)WZ4 ZW2)967 PS9)3BN 4WH)9T5 8M1)R6V N7M)VWK S88)978 N4X)8KH
|
||||
6VY)PLS NRC)874 QGF)QWJ NMG)J3V B8Z)WPF 45M)2QC KDW)VQ2 FZW)223 BXW)QXF FRD)PWV
|
||||
8HP)4G7 KDN)YYL LHJ)SDN P6P)XMC W5Y)RYK HX8)KW3 Z2L)H12 WPF)T2B L7H)BGW MNL)17B
|
||||
GHS)66V QKX)XWV FW5)W38 PDK)Y34 FKG)Q6D DQT)YJG 15G)79V 4VK)51Y BJH)LR4 48V)6GC
|
||||
DM5)Y1F CM5)VG5 KB8)HRK 5HN)RCQ 6JP)SDQ LGH)NJ2 L94)N7Y 4Y2)ZLF 25G)C4K K8K)SLS
|
||||
232)ZVZ GQ1)58J RV8)H5F 78W)565 YCF)8D9 DZG)99V N83)CKR TN2)ZCX NGV)8SP BSN)FTN
|
||||
LPJ)94N 3Q3)Q1M JVX)971 54W)LGH 67Y)P66 R24)P37 3QP)QTY YHR)FLT GMP)NM6 NDH)632
|
||||
PWV)8D8 LMK)3PV ZWJ)KB8 967)4VK 3B1)WN7 XWS)5CV YR1)FNH 565)4PH 5BK)V98 W5Y)FR8
|
||||
PS1)HX8 38C)XXG XWV)1YC M4M)LQ5 S9Z)49N XMC)R1B YYL)VC9 GMM)SCQ LXQ)J95 51Y)RP8
|
||||
HLT)XBS 82K)B8Z NR5)7K3 K2M)67Y SF6)W6D CF4)85M MC3)LXM HMN)RNM BFL)4XF MT2)PM4
|
||||
VWK)JKB 3JF)ZTZ QWJ)9QQ KRR)TJD VYW)Z9Q CK4)QS2 8NQ)NR5 57R)BHR 8WM)YHB Y86)GNS
|
||||
2Y2)Z21 X12)9QX LJ9)YKJ 3RD)8F1 7SQ)CK4 ZXH)3XK DDD)5KX ZCX)PYR GZJ)KXL KC5)52N
|
||||
PM4)RYP 14X)ZWJ FJ6)175 17B)689 HQL)14F LQR)DBK LGS)4Y2 2QQ)SGR 2VV)8F8 J6S)LM3
|
||||
RTP)YZ5 XDD)14K VQ4)MT2 KMH)KYC CKR)RTP VD5)MRM CM5)KRW BG3)XDD PGM)J4T MY3)JVX
|
||||
Z8F)WNP BKM)WT5 FLT)KTF N7D)8M1 Y19)CMQ HPF)WDL 65H)JJP 2MQ)66S 4Q5)54Q Q2W)ZL4
|
||||
QTY)659 MRM)9Z9 X2J)SC4 YWH)RB3 FTN)LYJ LMK)N7M SGX)15G KW3)FQK 3VV)JNL JWX)R8R
|
||||
9Z3)9MB BMC)N3S W7G)Z1L SD7)MW2 376)RH8 NWT)JHL 7CD)N2Z KTR)HM3 1Q1)TDZ DY9)2CR
|
||||
6YJ)14G FWT)JDW C2S)C5G SNV)J6M 5TK)YWH J3M)8HF HM2)GJP P9W)7CD 1VN)SGX KMS)RBK
|
||||
64R)B1V 62D)3VV 61D)F4S XPR)SKN FJT)N3P 9WV)D43 TQ8)BDB 46H)K4V 8WJ)MXD NDM)9WF
|
||||
8ZL)1QJ SCR)2MQ 7Y9)LJH VPH)MKY YDC)PDK 4G7)65H 2JM)NYY T9T)VMT 8M1)TSK G5S)X4N
|
||||
6FH)KYP D98)DQW G6D)C2S 6X7)N2Q 1QJ)T7S ZL4)J8T 5BT)3VR 835)KCJ YM8)3RG Y7M)PWQ
|
||||
54W)9W4 CBF)7LJ 4T5)8WS RHQ)HBK CQD)D98 HGJ)J6R JVC)79Z FD1)PKF VC9)5BT C4H)6WF
|
||||
D3S)P6P MR7)BG3 R6V)DF3 9X1)NQ5 ZTZ)2Y2 8WM)HFP CDC)376 TQ4)M4Y 9MB)N1R HBK)DQ4
|
||||
1DQ)CYC WNP)DM8 CBJ)LK7 ZT8)FWY LQD)PNN 555)9Z3 TNS)D9L QMF)L11 FR8)5RH WF9)R87
|
||||
NKG)5HT L5G)91W N2Z)YV9 9B5)CD7 ZV7)8NQ ST6)74T ZJ6)CQV S18)47M 74T)8YN WNH)TN2
|
||||
874)46H 3VV)PZ3 Y1F)42W MPT)2LP FDR)HWF X7G)RTK 52B)P4R RYP)G93 NWH)YCF 7TR)FB8
|
||||
RWQ)6FH 8F8)HLC CRN)P2P B6D)KC5 PNN)HRG""".split()
|
||||
|
||||
# COM is the root in this tree
|
||||
|
||||
|
||||
# parent :: Vertex -> [Edge] -> Maybe(Vertex)
|
||||
def parent(x, xs):
|
||||
for a, b in xs:
|
||||
if b == x:
|
||||
return a
|
||||
return None
|
||||
|
||||
|
||||
# parents :: Vertex -> [Edge] -> [Vertex]
|
||||
def parents(x, xs):
|
||||
parents = []
|
||||
p = parent(x, xs)
|
||||
while p:
|
||||
parents.append(p)
|
||||
p = parent(p, xs)
|
||||
return parents
|
||||
|
||||
|
||||
# alias Vertex :: String
|
||||
# alias Edge :: (String, String)
|
||||
# to_edge_list :: [String] -> [(String, String)]
|
||||
def to_edge_list(xs):
|
||||
"""Returns a list of tuples where (A, B) represents a directed edge from
|
||||
vertex A to vertex B."""
|
||||
return [(x[0:3], x[4:]) for x in xs]
|
||||
|
||||
|
||||
# to_graphviz :: [Edge] -> String
|
||||
def to_graphviz(xs):
|
||||
d = Digraph()
|
||||
for a, b in xs:
|
||||
d.node(a, label=a)
|
||||
d.edge(a, b)
|
||||
return d.source
|
||||
|
||||
|
||||
graph = to_edge_list(data)
|
||||
you = parents('YOU', graph)
|
||||
san = parents('SAN', graph)
|
||||
|
||||
# Distance from YOU to shared point with SAN
|
||||
yd = 1
|
||||
for i in range(len(you)):
|
||||
if you[i] in san:
|
||||
break
|
||||
yd += 1
|
||||
|
||||
# Distance from SAN to shared point with YOU
|
||||
sd = 1
|
||||
for i in range(len(san)):
|
||||
if san[i] in you:
|
||||
break
|
||||
sd += 1
|
||||
|
||||
print('Number of orbital transfers required: {}'.format(yd - 1 + sd - 1))
|
49
advent-of-code/day_7.py
Normal file
49
advent-of-code/day_7.py
Normal file
|
@ -0,0 +1,49 @@
|
|||
from day_5 import interpret
|
||||
from itertools import permutations
|
||||
|
||||
# TODO: I may need to re-write this in Elixir modelling each amplifier as a
|
||||
# `Process` and `Process.send`ing each amplifier the signals.
|
||||
|
||||
data = [
|
||||
3, 8, 1001, 8, 10, 8, 105, 1, 0, 0, 21, 38, 59, 76, 89, 106, 187, 268, 349,
|
||||
430, 99999, 3, 9, 1002, 9, 3, 9, 101, 2, 9, 9, 1002, 9, 4, 9, 4, 9, 99, 3,
|
||||
9, 1001, 9, 5, 9, 1002, 9, 5, 9, 1001, 9, 2, 9, 1002, 9, 3, 9, 4, 9, 99, 3,
|
||||
9, 1001, 9, 4, 9, 102, 4, 9, 9, 1001, 9, 3, 9, 4, 9, 99, 3, 9, 101, 4, 9,
|
||||
9, 1002, 9, 5, 9, 4, 9, 99, 3, 9, 1002, 9, 3, 9, 101, 5, 9, 9, 1002, 9, 3,
|
||||
9, 4, 9, 99, 3, 9, 102, 2, 9, 9, 4, 9, 3, 9, 1002, 9, 2, 9, 4, 9, 3, 9,
|
||||
1002, 9, 2, 9, 4, 9, 3, 9, 101, 2, 9, 9, 4, 9, 3, 9, 1002, 9, 2, 9, 4, 9,
|
||||
3, 9, 102, 2, 9, 9, 4, 9, 3, 9, 101, 1, 9, 9, 4, 9, 3, 9, 1001, 9, 1, 9, 4,
|
||||
9, 3, 9, 1002, 9, 2, 9, 4, 9, 3, 9, 101, 2, 9, 9, 4, 9, 99, 3, 9, 1002, 9,
|
||||
2, 9, 4, 9, 3, 9, 101, 2, 9, 9, 4, 9, 3, 9, 1002, 9, 2, 9, 4, 9, 3, 9, 101,
|
||||
1, 9, 9, 4, 9, 3, 9, 102, 2, 9, 9, 4, 9, 3, 9, 102, 2, 9, 9, 4, 9, 3, 9,
|
||||
101, 2, 9, 9, 4, 9, 3, 9, 101, 2, 9, 9, 4, 9, 3, 9, 102, 2, 9, 9, 4, 9, 3,
|
||||
9, 1001, 9, 2, 9, 4, 9, 99, 3, 9, 1002, 9, 2, 9, 4, 9, 3, 9, 1001, 9, 2, 9,
|
||||
4, 9, 3, 9, 101, 1, 9, 9, 4, 9, 3, 9, 101, 2, 9, 9, 4, 9, 3, 9, 101, 2, 9,
|
||||
9, 4, 9, 3, 9, 102, 2, 9, 9, 4, 9, 3, 9, 1001, 9, 2, 9, 4, 9, 3, 9, 102, 2,
|
||||
9, 9, 4, 9, 3, 9, 1001, 9, 1, 9, 4, 9, 3, 9, 1001, 9, 2, 9, 4, 9, 99, 3, 9,
|
||||
1001, 9, 2, 9, 4, 9, 3, 9, 102, 2, 9, 9, 4, 9, 3, 9, 1001, 9, 2, 9, 4, 9,
|
||||
3, 9, 102, 2, 9, 9, 4, 9, 3, 9, 101, 2, 9, 9, 4, 9, 3, 9, 1002, 9, 2, 9, 4,
|
||||
9, 3, 9, 1002, 9, 2, 9, 4, 9, 3, 9, 1002, 9, 2, 9, 4, 9, 3, 9, 101, 1, 9,
|
||||
9, 4, 9, 3, 9, 101, 1, 9, 9, 4, 9, 99, 3, 9, 101, 2, 9, 9, 4, 9, 3, 9, 102,
|
||||
2, 9, 9, 4, 9, 3, 9, 1002, 9, 2, 9, 4, 9, 3, 9, 1001, 9, 2, 9, 4, 9, 3, 9,
|
||||
1001, 9, 2, 9, 4, 9, 3, 9, 1001, 9, 2, 9, 4, 9, 3, 9, 1001, 9, 1, 9, 4, 9,
|
||||
3, 9, 1001, 9, 2, 9, 4, 9, 3, 9, 1001, 9, 2, 9, 4, 9, 3, 9, 102, 2, 9, 9,
|
||||
4, 9, 99
|
||||
]
|
||||
|
||||
data_a, data_b, data_c, data_d, data_e = data[:], data[:], data[:], data[:], data[:]
|
||||
|
||||
# m = 0
|
||||
# for a, b, c, d, e in permutations(range(5, 10)):
|
||||
# answer = None
|
||||
# z = 0
|
||||
# while z is not None:
|
||||
# print(a, b, c, d, e)
|
||||
# print('---')
|
||||
# v = interpret(0, data_a, argv=[a, z])
|
||||
# print(v)
|
||||
# w = interpret(0, data_b, argv=[b, v])
|
||||
# x = interpret(0, data_c, argv=[c, w])
|
||||
# y = interpret(0, data_d, argv=[d, x])
|
||||
# z = interpret(0, data_e, argv=[e, y])
|
||||
# m = max(m, z)
|
18
advent-of-code/writePythonBin.nix
Normal file
18
advent-of-code/writePythonBin.nix
Normal file
|
@ -0,0 +1,18 @@
|
|||
{ pkgs ? import <nixpkgs> {}, ... }:
|
||||
|
||||
{ name, deps, src }:
|
||||
|
||||
let
|
||||
inherit (pkgs) pythonPackages writeTextFile;
|
||||
inherit (builtins) toFile;
|
||||
|
||||
in writeTextFile {
|
||||
inherit name;
|
||||
executable = true;
|
||||
destination = "/bin/${name}";
|
||||
|
||||
text = ''
|
||||
#!/bin/sh
|
||||
${pkgs.python3}/bin/python3 ${src}
|
||||
'';
|
||||
}
|
Loading…
Reference in a new issue