this repo has no description
1<!-- livebook:{"persist_outputs":true} -->
2
3# Day 21
4
5```elixir
6Mix.install([
7 {:kino_aoc, git: "https://github.com/ljgago/kino_aoc"}
8])
9```
10
11<!-- livebook:{"output":true} -->
12
13```
14* Getting kino_aoc (https://github.com/ljgago/kino_aoc)
15remote: Enumerating objects: 78, done.
16remote: Counting objects: 100% (78/78), done.
17remote: Compressing objects: 100% (50/50), done.
18remote: Total 78 (delta 25), reused 67 (delta 18), pack-reused 0
19origin/HEAD set to main
20Resolving Hex dependencies...
21Dependency resolution completed:
22New:
23 castore 0.1.20
24 finch 0.14.0
25 hpax 0.1.2
26 jason 1.4.0
27 kino 0.8.0
28 mime 2.0.3
29 mint 1.4.2
30 nimble_options 0.5.2
31 nimble_pool 0.2.6
32 req 0.3.4
33 table 0.1.2
34 telemetry 1.2.0
35* Getting kino (Hex package)
36* Getting req (Hex package)
37* Getting finch (Hex package)
38* Getting jason (Hex package)
39* Getting mime (Hex package)
40* Getting castore (Hex package)
41* Getting mint (Hex package)
42* Getting nimble_options (Hex package)
43* Getting nimble_pool (Hex package)
44* Getting telemetry (Hex package)
45* Getting hpax (Hex package)
46* Getting table (Hex package)
47==> table
48Compiling 5 files (.ex)
49Generated table app
50==> mime
51Compiling 1 file (.ex)
52Generated mime app
53==> nimble_options
54Compiling 3 files (.ex)
55Generated nimble_options app
56==> kino
57Compiling 37 files (.ex)
58Generated kino app
59===> Analyzing applications...
60===> Compiling telemetry
61==> jason
62Compiling 10 files (.ex)
63Generated jason app
64==> hpax
65Compiling 4 files (.ex)
66Generated hpax app
67==> nimble_pool
68Compiling 2 files (.ex)
69Generated nimble_pool app
70==> castore
71Compiling 1 file (.ex)
72Generated castore app
73==> mint
74Compiling 1 file (.erl)
75Compiling 19 files (.ex)
76Generated mint app
77==> finch
78Compiling 13 files (.ex)
79Generated finch app
80==> req
81Compiling 5 files (.ex)
82Generated req app
83==> kino_aoc
84Compiling 3 files (.ex)
85Generated kino_aoc app
86```
87
88<!-- livebook:{"output":true} -->
89
90```
91:ok
92```
93
94## Section
95
96<!-- livebook:{"attrs":{"day":"21","session_secret":"ADVENT_OF_CODE_SESSION","variable":"puzzle_input","year":"2022"},"chunks":null,"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} -->
97
98```elixir
99{:ok, puzzle_input} =
100 KinoAOC.download_puzzle("2022", "21", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION"))
101```
102
103<!-- livebook:{"output":true} -->
104
105```
106{:ok,
107 "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" <> ...}
108```
109
110```elixir
111data =
112 puzzle_input
113 |> String.split("\n", trim: true)
114 |> Map.new(fn <<name::4-binary>> <> ": " <> rest ->
115 Regex.named_captures(~r"(?<num>\d+)|(?<a>.{4}) (?<op>[-+*/]) (?<b>.{4})", rest)
116 |> case do
117 %{"num" => "", "op" => op, "a" => a, "b" => b} -> {op, a, b}
118 %{"num" => num} -> String.to_integer(num)
119 end
120 |> then(&{name, &1})
121 end)
122
123map_size(data)
124```
125
126<!-- livebook:{"output":true} -->
127
128```
1292773
130```
131
132```elixir
133defmodule Evaluator do
134 def eval(key, map) do
135 case Map.fetch!(map, key) do
136 {op, a, b} ->
137 va = eval(a, map)
138 vb = eval(b, map)
139
140 do_math(op, va, vb)
141
142 num ->
143 num
144 end
145 end
146
147 defp do_math(op, a, b) when not is_integer(a) or not is_integer(b), do: {op, a, b}
148 defp do_math("+", a, b), do: a + b
149 defp do_math("-", a, b), do: a - b
150 defp do_math("*", a, b), do: a * b
151 defp do_math("/", a, b), do: div(a, b)
152end
153```
154
155<!-- livebook:{"output":true} -->
156
157```
158{:module, Evaluator, <<70, 79, 82, 49, 0, 0, 9, ...>>, {:do_math, 3}}
159```
160
161## Task 1
162
163```elixir
164Evaluator.eval("root", data)
165```
166
167<!-- livebook:{"output":true} -->
168
169```
170110181395003396
171```
172
173## Task 2
174
175```elixir
176{_, a, b} = data["root"]
177```
178
179<!-- livebook:{"output":true} -->
180
181```
182{"+", "tlpd", "jjmw"}
183```
184
185```elixir
186vb = Evaluator.eval(b, %{data | "humn" => nil})
187```
188
189<!-- livebook:{"output":true} -->
190
191```
19222931068684876
193```
194
195So we see that `b` is independent from `humn`.
196
197```elixir
198defmodule Solver do
199 def unravel(:humn, value), do: value
200
201 def unravel({"/", a, b}, value) when is_integer(b), do: unravel(a, value * b)
202 def unravel({"+", a, b}, value) when is_integer(b), do: unravel(a, value - b)
203 def unravel({"+", a, b}, value) when is_integer(a), do: unravel(b, value - a)
204 def unravel({"-", a, b}, value) when is_integer(b), do: unravel(a, value + b)
205 def unravel({"-", a, b}, value) when is_integer(a), do: unravel(b, a - value)
206 def unravel({"*", a, b}, value) when is_integer(b), do: unravel(a, div(value, b))
207 def unravel({"*", a, b}, value) when is_integer(a), do: unravel(b, div(value, a))
208end
209```
210
211<!-- livebook:{"output":true} -->
212
213```
214{:module, Solver, <<70, 79, 82, 49, 0, 0, 8, ...>>, {:unravel, 2}}
215```
216
217```elixir
218va = Evaluator.eval(a, %{data | "humn" => :humn})
219```
220
221<!-- livebook:{"output":true} -->
222
223```
224{"/",
225 {"+",
226 {"*",
227 {"-", 87250326333032,
228 {"*",
229 {"-",
230 {"/",
231 {"+", 892,
232 {"*", 3,
233 {"+", 203,
234 {"/",
235 {"-",
236 {"/",
237 {"+", 660,
238 {"*", 2, {"-", {"*", 3, {"+", {"/", {"-", {"/", {"+", ...}, 2}, 85}, 5}, 124}}, 126}}},
239 2}, 183}, 3}}}}, 5}, 444}, 6}}, 2}, 808}, 2}
240```
241
242```elixir
243Solver.unravel(va, vb)
244```
245
246<!-- livebook:{"output":true} -->
247
248```
2493721298272959
250```