tangled
alpha
login
or
join now
hauleth.dev
/
advent-of-code
3
fork
atom
this repo has no description
3
fork
atom
overview
issues
pulls
pipelines
ft: add day 21.2022
hauleth.dev
3 years ago
4d54275b
43d53ae0
+173
1 changed file
expand all
collapse all
unified
split
2022
day21.livemd
+173
2022/day21.livemd
···
1
1
+
<!-- livebook:{"persist_outputs":true} -->
2
2
+
3
3
+
# Day 21
4
4
+
5
5
+
```elixir
6
6
+
Mix.install([
7
7
+
{:kino_aoc, git: "https://github.com/ljgago/kino_aoc"}
8
8
+
])
9
9
+
```
10
10
+
11
11
+
<!-- livebook:{"output":true} -->
12
12
+
13
13
+
```
14
14
+
:ok
15
15
+
```
16
16
+
17
17
+
## Section
18
18
+
19
19
+
<!-- livebook:{"attrs":{"day":"21","session_secret":"ADVENT_OF_CODE_SESSION","variable":"puzzle_input","year":"2022"},"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} -->
20
20
+
21
21
+
```elixir
22
22
+
{:ok, puzzle_input} =
23
23
+
KinoAOC.download_puzzle("2022", "21", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION"))
24
24
+
```
25
25
+
26
26
+
<!-- livebook:{"output":true} -->
27
27
+
28
28
+
```
29
29
+
{:ok,
30
30
+
"jqtt: tnwg * mbnq\nvsww: jmrn + twmm\nppws: qtfb * rdsp\nljqm: 14\nbsvb: tbqb - fqqm\nwfpq: hgdp * ddvm\njhtm: 2\nslnm: rrtr * lhwh\nlgzs: jtrw * dfmw\nrmwf: pmsv - llsm\nprzw: bqwv + ghcz\nrqwg: 6\npsrl: 4\njddv: plnt * gcfc\nvtbv: rwmn + zcwm\nhgtf: qrlv + brzm\nhhlf: 2\nqnwv: vhwb + thlf\nsbwr: ppws * rlvq\ncpld: gwmj + rhcd\nnnmv: gjsm * jrpf\nltft: rfvj * cttp\nsjzd: 2\nfnnl: rpmq * zgms\nthmv: 3\nslsp: 5\nqnhh: crqv + hdgl\nlzmd: 2\ncfjz: 18\nnftb: 3\nwndb: ztgl * cwnt\nbjbh: hhnq + wchj\nhcsl: sbtp + wrnf\nwljw: wrmd / ffct\nfctr: 2\nwnmz: 17\nmhfl: 3\ncrfw: sdvt * gvrz\nvqdv: 3\nzswr: 4\ntbgc: hqzm * qtsc\nbcmz: jqbf + vchc\nfltj: jlgw / prsv\npnbd: 2\nvqcc: 3\npdhb: 11\nmssc: hjbb * zzsf\nfbcp: pfhh + fhbm\nqjlj: 2\nbwmp: gwqd + zttp\nqqnm: fftd * mbst\nrmwh: tcnh - pcmh\nssrc: 2\ntlhm: tjfv + zpsf\nrnbd: jjvt + hmzp\ngbwn: cvlv + djwh\npfpd: 4\nnfvs: cpmc + vzhf\nssts: 3\nhvbh: 3\nfnwt: shzp * thgj\nbwjj: wfnf * dtqb\ndvll: 1\nrjtf: 3\ngtrh: lcqd + prrn\npbqm: 1\nnlrm: 5\ndftz: mzng * tncp\nrlsl: ppmh / pvnb\nhhgf: dwnr * qbrj\nlddg: tbzq * ncwd\npclv: qqnt - gcqz\nblhb: rnzq + mhqz\ndrnr: zlhg + mvcq\nhgwl: jqtl + wzsr\nzswf: blqr * lvsb\nfdbt: pwfs * gnhq\nfwlm: 1\nwpzv: 3\ncdwp: gfhs + wtbp\nhzch: fdbd + nrth\npdsl: 3\nphql: hbmw * wrlt\nztvt: 1\nfgfp: 13\nwfjt: 3\nwrmd: fhrp * jrdr\ncldc: fmgr + cdjg\nvfvb: zlgm - stzg\nqfrh: hbhc * gnhc\njrdr: 2\nfcdv: 3\nhjjp: cvmd * qnjb\nftmr: qtbj + gnfr\ngqfw: 3\nzgzh: phsj + jzrn\ncqvn: 7\nbbhr: jdbt * ccrh\nvrvs: 5\nrlvz: pwvl * lczp\nsmhn: 2\nrzhg: 6\nqbmc: 3\nwtvv: 4\nnqnb: 4\nzshh: ngfn + ljqm\nrpph: hbwt * fwfh\nlqqw: grqf * jwfc\njwgt: lwjj * fsfh\nwqmw: 4\nnzjs: 2\ngcvc: 2\npwvl: 16\ngwqd: 10\nprrn: 4\nbtrp: 5\nmpjh: 2\nfbcl: 2\nmwbr: 2\nlcgw: zpmm + lwfw\ndlsw: 1\nvwtr: rgsj / vfcg\nvhjq: wrvz * dmzh\nmdvc: 5\nsldj: 5\nfwpv: 11\npvqb: qwdt + srzd\nptqg: 12\nchzc: 2\nvfsz: 3\nhjlt: mrgj * ffdp\nmvtd: 5\njldc: dvvw * zbwz\nbsft: 2\nsvsd: 9\nqcbl: fztd * cpld\nhjzq: 3\nctmh: 2\ncnss: 2\nzqrj: mhhq * fjfc\njsgj: 5\nqrmb: 7\nnszq: rdhf * zstr\nmgsm: 5\nzmhz: cglq * cttz\nmsjt: 3\nczrh: cvbr / djtb\nlslt: grfq / hsgj\nnfcm: 3\nncsj: 14\nvgjt: 3\nldzh: 4\nlzdj: 8\nglrq: 5\ncjjr: 11\ndnwc: 8\npldf: vcdj * chzc\nrfwr: rqcp * qpwg\nzblf: 2\nswbp: wggc + qcnf\nhcjq: jfft * hhll\nfjlz: vjdq + dzsp\nzswq: wbmt + scrh\ntzrc: fflf + mpbq\nzsjl: jmdd * mpwj\ntmwj: 4\njfvd: 3\njqzf: 2\nhtzv: tlps + sjjp\ngmwm: 7\nqbrj: 2\ncmdr: lswp * lljh\nrtpp: 1\nqrdg: slst + bbrq\nhqzm: 2\nvdsw: 3\nhzhv: 6\nhumn: 927\ndzsp: 5\nlpsb: 5\njqcq: 5\nmvcq: 12\ncfhv: 2\nqrrf: vqvn - wprq\nmznq: sfjb * hvtd\nbzfw: 4\nnctp: 4\nbzjg: hcnm + jtbm\ngppp: fnfn * qqnm\nghzf: szlh * bgcc\nrfls: gjnf / hffp\nnfjz: 4\npqzg: 4\nfrhd: twtc * rrmn\nmvds: 1\nhqlh: pwvn * qtvf\nwfgr: twsv * tntz\nmfsl: dlsw + hlmh\nlzlf: szvt + qwcz\ncgwz: 14\nwvjb: 4\nhsnr: 4\ndhdl: hmcr * lscn\nqmwp: cbdg * mplg\njfft: qjfq + vzpv\ntttw: 6\nqcsp: 12\ncmtc: qtrv * fcfl\nzttp: jnbr * sldj\ncnrm: 3\nmqtj: nhhv * bsdz\ntwmm: mhbm * ltwj\nvphb: fcdv * wgpg\nrcpt: 2\nsglw: wplj + ffmd\ngwqw: pntz - dwzg\nbwdq: 3\ngjdr: mpqg + qsvs\nmgtw: ddgp + cqlr\ncgzf: 4\nvmpw: btrp + wlhb\ncvbn: 4\njcsn: lntg * tmqv\npgdh: frmz + sqth\nfqbc: lgzs + zttz\nllpw: 8\nhbnz: 12\nzdll: 19\npbnr: 5\npzcv: 1\nwlwl: 2\nljcq: 6\nvwgp: 8\nthlf: 2\nmzqq: pgdh + rmch\ndhrn: 5\njbrv: mttw * rjhz\npbgz: 2\ntmnw: dfdq - ljmt\nssqj: 6\nsplf: nlzg / jvrb\npflc: 2\nssmt: rlwg + rppv\ngpwh: 3\nnncw: 11\nggzr: sqvs * ctcq\nvjcm: 2\nzdlm: nsrp - nptq\npwfb: 3\nglpb: 5\nccrm: ztzh * mjjv\ntpnw: smdm + zblf\nmnmm: 2\nprnd: mwvp / lddf\nchfq: sbzg * qqcw\ngtcw: drhz + hmqm\nlpwm: 4\nlnpt: lpcg - gvrg\nbmsr: cqrt + mqst\nhbsb: lztz * tmll\nvcrf: 4\nsjwd: 3\nmjdq: fcvf * ghzf\ndpng: qjvl * htzv\nlvsb: 4\nmsmz: zbvr * ndpr\ngzgd: jtvv + djmv\nftsd: 2\ntjfh: 2\njggn: cqsq * szrw\nvjzc: 5\ncvqj: fwlm + qpdm\nngzd: jdvr + hzld\ngdzl: 3\nsvvl: hcsl + tqvn\nldqv: ncqc * pvcl\nfgqr: nwsb - glnr\nrzmw: 4\nrzlb: 5\nmvtf: 7\ntsbg: tshn * lspr\nglmh: 4\nmwjj: lfgq + wqqz\nrmnq: vmpw + vwtr\nlfsd: 3\nwdnd: 2\njfps: 2\nwzmg: jznb + ntth\nlmnv: wmwb * hlgs\nzghz: scnm + jgpj\nwgjp: slnt + wccg\ncmnb: 2\ngjnf: jzzv * cfrs\nlfwr: cwht + bmsr\nqqcw: 2\nhmzn: gwjs * tqfv\nvvjt: ftmz + bzmt\nvdvv: 2\nwnmv: 4\nvgnz: 3\nfmgr: 4\nsqvc: dzzd + jrhp\njsgr: znft * lhcl\nlfcf: 5\ndhhr: rmwf + ffjt\nrcbh: tvdm + wccm\nlntg: cqpv / gghf\nvqqr: dgct + vnjw\ntjsp: 2\npnjw: 18\npvfm: 2\ntzsj: 2\nrcnm: 2\nzt" <> ...}
31
31
+
```
32
32
+
33
33
+
```elixir
34
34
+
data =
35
35
+
puzzle_input
36
36
+
|> String.split("\n", trim: true)
37
37
+
|> Map.new(fn <<name::4-binary>> <> ": " <> rest ->
38
38
+
Regex.named_captures(~r"(?<num>\d+)|(?<a>.{4}) (?<op>[-+*/]) (?<b>.{4})", rest)
39
39
+
|> case do
40
40
+
%{"num" => "", "op" => op, "a" => a, "b" => b} -> {op, a, b}
41
41
+
%{"num" => num} -> String.to_integer(num)
42
42
+
end
43
43
+
|> then(&{name, &1})
44
44
+
end)
45
45
+
46
46
+
map_size(data)
47
47
+
```
48
48
+
49
49
+
<!-- livebook:{"output":true} -->
50
50
+
51
51
+
```
52
52
+
2773
53
53
+
```
54
54
+
55
55
+
```elixir
56
56
+
defmodule Evaluator do
57
57
+
def eval(key, map) do
58
58
+
case Map.fetch!(map, key) do
59
59
+
{op, a, b} ->
60
60
+
va = eval(a, map)
61
61
+
vb = eval(b, map)
62
62
+
63
63
+
do_math(op, va, vb)
64
64
+
65
65
+
num ->
66
66
+
num
67
67
+
end
68
68
+
end
69
69
+
70
70
+
defp do_math(op, a, b) when not is_integer(a) or not is_integer(b), do: {op, a, b}
71
71
+
defp do_math("+", a, b), do: a + b
72
72
+
defp do_math("-", a, b), do: a - b
73
73
+
defp do_math("*", a, b), do: a * b
74
74
+
defp do_math("/", a, b), do: div(a, b)
75
75
+
end
76
76
+
```
77
77
+
78
78
+
<!-- livebook:{"output":true} -->
79
79
+
80
80
+
```
81
81
+
{:module, Evaluator, <<70, 79, 82, 49, 0, 0, 9, ...>>, {:do_math, 3}}
82
82
+
```
83
83
+
84
84
+
## Task 1
85
85
+
86
86
+
```elixir
87
87
+
Evaluator.eval("root", data)
88
88
+
```
89
89
+
90
90
+
<!-- livebook:{"output":true} -->
91
91
+
92
92
+
```
93
93
+
110181395003396
94
94
+
```
95
95
+
96
96
+
## Task 2
97
97
+
98
98
+
```elixir
99
99
+
{_, a, b} = data["root"]
100
100
+
```
101
101
+
102
102
+
<!-- livebook:{"output":true} -->
103
103
+
104
104
+
```
105
105
+
{"+", "tlpd", "jjmw"}
106
106
+
```
107
107
+
108
108
+
```elixir
109
109
+
vb = Evaluator.eval(b, %{data | "humn" => nil})
110
110
+
```
111
111
+
112
112
+
<!-- livebook:{"output":true} -->
113
113
+
114
114
+
```
115
115
+
22931068684876
116
116
+
```
117
117
+
118
118
+
So we see that `b` is independent from `humn`.
119
119
+
120
120
+
```elixir
121
121
+
defmodule Solver do
122
122
+
def unravel(:humn, value), do: value
123
123
+
124
124
+
def unravel({"/", a, b}, value) when is_integer(b), do: unravel(a, value * b)
125
125
+
def unravel({"+", a, b}, value) when is_integer(b), do: unravel(a, value - b)
126
126
+
def unravel({"+", a, b}, value) when is_integer(a), do: unravel(b, value - a)
127
127
+
def unravel({"-", a, b}, value) when is_integer(b), do: unravel(a, value + b)
128
128
+
def unravel({"-", a, b}, value) when is_integer(a), do: unravel(b, a - value)
129
129
+
def unravel({"*", a, b}, value) when is_integer(b), do: unravel(a, div(value, b))
130
130
+
def unravel({"*", a, b}, value) when is_integer(a), do: unravel(b, div(value, a))
131
131
+
end
132
132
+
```
133
133
+
134
134
+
<!-- livebook:{"output":true} -->
135
135
+
136
136
+
```
137
137
+
{:module, Solver, <<70, 79, 82, 49, 0, 0, 8, ...>>, {:unravel, 2}}
138
138
+
```
139
139
+
140
140
+
```elixir
141
141
+
va = Evaluator.eval(a, %{data | "humn" => :humn})
142
142
+
```
143
143
+
144
144
+
<!-- livebook:{"output":true} -->
145
145
+
146
146
+
```
147
147
+
{"/",
148
148
+
{"+",
149
149
+
{"*",
150
150
+
{"-", 87250326333032,
151
151
+
{"*",
152
152
+
{"-",
153
153
+
{"/",
154
154
+
{"+", 892,
155
155
+
{"*", 3,
156
156
+
{"+", 203,
157
157
+
{"/",
158
158
+
{"-",
159
159
+
{"/",
160
160
+
{"+", 660,
161
161
+
{"*", 2, {"-", {"*", 3, {"+", {"/", {"-", {"/", {"+", ...}, 2}, 85}, 5}, 124}}, 126}}},
162
162
+
2}, 183}, 3}}}}, 5}, 444}, 6}}, 2}, 808}, 2}
163
163
+
```
164
164
+
165
165
+
```elixir
166
166
+
Solver.unravel(va, vb)
167
167
+
```
168
168
+
169
169
+
<!-- livebook:{"output":true} -->
170
170
+
171
171
+
```
172
172
+
3721298272959
173
173
+
```