this repo has no description
at master 9.5 kB view raw
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```