From 00c23a0553c61ee5f64cca4b9a2134c5ac778691 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 6 Jan 2024 16:30:44 +0000 Subject: [PATCH] deploy: e88123441275680f3b37d9d6166168926459bd04 --- 404.html | 2 +- .../postcondition-ambiguity/index.html | 2 +- .../algorithms-and-correctness/index.html | 2 +- .../index.html | 2 +- algorithms/category/graphs/index.html | 2 +- algorithms/category/hash-tables/index.html | 2 +- .../category/paths-in-graphs/index.html | 2 +- algorithms/category/recursion/index.html | 2 +- .../category/red-black-trees/index.html | 2 +- algorithms/graphs/bfs-tree/index.html | 2 +- .../graphs/iterative-and-iterators/index.html | 2 +- algorithms/hash-tables/breaking/index.html | 2 +- .../breaking/mitigations/index.html | 2 +- .../hash-tables/breaking/python/index.html | 2 +- algorithms/index.html | 4 ++-- algorithms/paths/bf-to-astar/astar/index.html | 2 +- algorithms/paths/bf-to-astar/bf/index.html | 2 +- .../paths/bf-to-astar/dijkstra/index.html | 2 +- algorithms/paths/bf-to-astar/index.html | 4 ++-- algorithms/rb-trees/applications/index.html | 2 +- algorithms/rb-trees/rules/index.html | 2 +- algorithms/recursion/karel/index.html | 2 +- .../recursion/karel/solution/index.html | 2 +- .../bottom-up-dp/index.html | 2 +- .../pyramid-slide-down/greedy/index.html | 2 +- .../recursion/pyramid-slide-down/index.html | 2 +- .../pyramid-slide-down/naive/index.html | 2 +- .../pyramid-slide-down/top-down-dp/index.html | 2 +- algorithms/tags/a-star/index.html | 2 +- algorithms/tags/applications/index.html | 2 +- algorithms/tags/astar/index.html | 2 +- algorithms/tags/backtracking/index.html | 2 +- algorithms/tags/balanced-trees/index.html | 2 +- algorithms/tags/bellman-ford/index.html | 2 +- algorithms/tags/bfs/index.html | 2 +- algorithms/tags/bottom-up-dp/index.html | 2 +- algorithms/tags/brute-force/index.html | 2 +- algorithms/tags/c/index.html | 2 +- algorithms/tags/cpp/index.html | 2 +- algorithms/tags/csharp/index.html | 2 +- algorithms/tags/dijkstra/index.html | 2 +- algorithms/tags/dynamic-array/index.html | 2 +- .../tags/dynamic-programming/index.html | 2 +- algorithms/tags/exponential/index.html | 2 +- algorithms/tags/graphs/index.html | 2 +- algorithms/tags/greedy/index.html | 2 +- algorithms/tags/hash-tables/index.html | 2 +- algorithms/tags/index.html | 2 +- algorithms/tags/iterative/index.html | 2 +- algorithms/tags/iterators/index.html | 2 +- algorithms/tags/java/index.html | 2 +- algorithms/tags/karel/index.html | 2 +- algorithms/tags/postconditions/index.html | 2 +- algorithms/tags/python/index.html | 2 +- algorithms/tags/recursion/index.html | 2 +- algorithms/tags/red-black-trees/index.html | 2 +- algorithms/tags/solution/index.html | 2 +- algorithms/tags/sorting/index.html | 2 +- algorithms/tags/testing/index.html | 2 +- algorithms/tags/time-complexity/index.html | 2 +- algorithms/tags/top-down-dp/index.html | 2 +- algorithms/time-complexity/extend/index.html | 2 +- ...5ede8.102142f5.js => 1535ede8.3c894b1e.js} | 2 +- ...175ec.504e3826.js => 22a175ec.92356088.js} | 2 +- ...f3aa1.4ebbc06f.js => 377f3aa1.728ad61c.js} | 2 +- ...4b779.1354e52a.js => 3da4b779.0020fbfc.js} | 2 +- assets/js/4200b1a9.d764baec.js | 1 + assets/js/4200b1a9.faadd2c9.js | 1 - ...c7293.6c273bef.js => 595c7293.6ef41b13.js} | 2 +- ...2c0bc.54d577f1.js => 7052c0bc.acb5879a.js} | 2 +- ...ef108.5b256546.js => 794ef108.b36337bc.js} | 2 +- ...1e0d8.e078634a.js => 84d1e0d8.f2e0ffd7.js} | 2 +- ...88602.2a7bb9cd.js => b1288602.fa264713.js} | 2 +- assets/js/bb882650.6eee4002.js | 1 - assets/js/bb882650.925fdbba.js | 1 + ...4056e.3de7285f.js => c4c4056e.a7e01235.js} | 2 +- assets/js/cfa2b263.ce80265a.js | 1 + assets/js/cfa2b263.efd5103c.js | 1 - ...e838c.3caaf7e6.js => d05e838c.c79b079a.js} | 2 +- ...2ebad.2596a554.js => dff2ebad.26aca592.js} | 2 +- assets/js/f48be158.3578ba3c.js | 1 + assets/js/f48be158.5e2dd98c.js | 1 - ...n.65095f6f.js => runtime~main.3f39a938.js} | 2 +- blog/2023/08/02/copr/index.html | 2 +- blog/aoc-2022/1st-week/index.html | 4 ++-- blog/aoc-2022/2nd-week/index.html | 4 ++-- blog/aoc-2022/3rd-week/index.html | 2 +- blog/aoc-2022/4th-week/index.html | 4 ++-- blog/aoc-2022/intro/index.html | 2 +- blog/archive/index.html | 2 +- blog/atom.xml | 8 ++++---- blog/feed.json | 8 ++++---- blog/index.html | 2 +- blog/leetcode/sort-diagonally/index.html | 4 ++-- blog/rss.xml | 8 ++++---- blog/tags/admin/index.html | 2 +- blog/tags/advent-of-code-2022/index.html | 2 +- blog/tags/advent-of-code/index.html | 2 +- blog/tags/copr/index.html | 2 +- blog/tags/cpp/index.html | 2 +- blog/tags/index.html | 2 +- blog/tags/iterators/index.html | 2 +- blog/tags/leetcode/index.html | 2 +- blog/tags/red-hat/index.html | 2 +- blog/tags/rust/index.html | 2 +- blog/tags/vps/index.html | 2 +- blog/tags/🏭/index.html | 2 +- c/bonuses/seminar-03/index.html | 2 +- c/bonuses/seminar-04/index.html | 2 +- c/bonuses/seminar-05-06/index.html | 4 ++-- c/bonuses/seminar-08/index.html | 4 ++-- c/bonuses/seminar-10/index.html | 4 ++-- c/category/bonuses/index.html | 2 +- c/category/practice-exams/index.html | 2 +- c/index.html | 4 ++-- c/mr/index.html | 4 ++-- c/pexam/cams/index.html | 2 +- c/pexam/garbage_collect/index.html | 2 +- contributions/index.html | 4 ++-- cpp/category/exceptions-and-raii/index.html | 2 +- cpp/environment/index.html | 2 +- .../placeholders/index.html | 2 +- cpp/index.html | 4 ++-- .../graphs/iterative-and-iterators.tar.bz2 | Bin 1941 -> 1941 bytes .../graphs/iterative-and-iterators.tar.gz | Bin 1932 -> 1936 bytes files/algorithms/paths/bf-to-astar.tar.bz2 | Bin 3161 -> 3168 bytes files/algorithms/paths/bf-to-astar.tar.gz | Bin 2993 -> 2994 bytes files/algorithms/recursion/karel-1.tar.bz2 | Bin 5882 -> 5892 bytes files/algorithms/recursion/karel-1.tar.gz | Bin 6581 -> 6582 bytes .../recursion/pyramid-slide-down.tar.bz2 | Bin 1547 -> 1550 bytes .../recursion/pyramid-slide-down.tar.gz | Bin 1421 -> 1424 bytes .../algorithms/time-complexity/extend.tar.bz2 | Bin 4081 -> 4074 bytes .../algorithms/time-complexity/extend.tar.gz | Bin 3911 -> 3912 bytes .../leetcode/sort-matrix-diagonally/makefile | 2 +- .../sort-matrix-diagonally/matrix-sort.cpp | 2 +- files/c/bonuses/03.tar.bz2 | Bin 2640 -> 2643 bytes files/c/bonuses/03.tar.gz | Bin 2338 -> 2339 bytes files/c/bonuses/04.tar.bz2 | Bin 2538 -> 2548 bytes files/c/bonuses/04.tar.gz | Bin 2499 -> 2501 bytes files/c/bonuses/05-06.tar.bz2 | Bin 3645 -> 3646 bytes files/c/bonuses/05-06.tar.gz | Bin 3486 -> 3488 bytes files/c/bonuses/08.tar.bz2 | Bin 73527 -> 73567 bytes files/c/bonuses/08.tar.gz | Bin 106229 -> 106229 bytes files/c/bonuses/10.tar.bz2 | Bin 234814 -> 234833 bytes files/c/bonuses/10.tar.gz | Bin 230122 -> 230123 bytes index.html | 2 +- search/index.html | 2 +- talks/index.html | 2 +- 148 files changed, 146 insertions(+), 146 deletions(-) rename assets/js/{1535ede8.102142f5.js => 1535ede8.3c894b1e.js} (99%) rename assets/js/{22a175ec.504e3826.js => 22a175ec.92356088.js} (62%) rename assets/js/{377f3aa1.4ebbc06f.js => 377f3aa1.728ad61c.js} (89%) rename assets/js/{3da4b779.1354e52a.js => 3da4b779.0020fbfc.js} (89%) create mode 100644 assets/js/4200b1a9.d764baec.js delete mode 100644 assets/js/4200b1a9.faadd2c9.js rename assets/js/{595c7293.6c273bef.js => 595c7293.6ef41b13.js} (98%) rename assets/js/{7052c0bc.54d577f1.js => 7052c0bc.acb5879a.js} (90%) rename assets/js/{794ef108.5b256546.js => 794ef108.b36337bc.js} (95%) rename assets/js/{84d1e0d8.e078634a.js => 84d1e0d8.f2e0ffd7.js} (94%) rename assets/js/{b1288602.2a7bb9cd.js => b1288602.fa264713.js} (98%) delete mode 100644 assets/js/bb882650.6eee4002.js create mode 100644 assets/js/bb882650.925fdbba.js rename assets/js/{c4c4056e.3de7285f.js => c4c4056e.a7e01235.js} (98%) create mode 100644 assets/js/cfa2b263.ce80265a.js delete mode 100644 assets/js/cfa2b263.efd5103c.js rename assets/js/{d05e838c.3caaf7e6.js => d05e838c.c79b079a.js} (98%) rename assets/js/{dff2ebad.2596a554.js => dff2ebad.26aca592.js} (55%) create mode 100644 assets/js/f48be158.3578ba3c.js delete mode 100644 assets/js/f48be158.5e2dd98c.js rename assets/js/{runtime~main.65095f6f.js => runtime~main.3f39a938.js} (91%) diff --git a/404.html b/404.html index 7094698..1636bf9 100644 --- a/404.html +++ b/404.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/algorithms-correctness/postcondition-ambiguity/index.html b/algorithms/algorithms-correctness/postcondition-ambiguity/index.html index f68c46e..0e018e2 100644 --- a/algorithms/algorithms-correctness/postcondition-ambiguity/index.html +++ b/algorithms/algorithms-correctness/postcondition-ambiguity/index.html @@ -16,7 +16,7 @@ - + diff --git a/algorithms/category/algorithms-and-correctness/index.html b/algorithms/category/algorithms-and-correctness/index.html index 773cfcc..44d17de 100644 --- a/algorithms/category/algorithms-and-correctness/index.html +++ b/algorithms/category/algorithms-and-correctness/index.html @@ -18,7 +18,7 @@ correctness. - + diff --git a/algorithms/category/asymptotic-notation-and-time-complexity/index.html b/algorithms/category/asymptotic-notation-and-time-complexity/index.html index d6d0535..60a3dfc 100644 --- a/algorithms/category/asymptotic-notation-and-time-complexity/index.html +++ b/algorithms/category/asymptotic-notation-and-time-complexity/index.html @@ -16,7 +16,7 @@ - + diff --git a/algorithms/category/graphs/index.html b/algorithms/category/graphs/index.html index 104f057..52730db 100644 --- a/algorithms/category/graphs/index.html +++ b/algorithms/category/graphs/index.html @@ -16,7 +16,7 @@ - + diff --git a/algorithms/category/hash-tables/index.html b/algorithms/category/hash-tables/index.html index 45ebdbf..41edc2e 100644 --- a/algorithms/category/hash-tables/index.html +++ b/algorithms/category/hash-tables/index.html @@ -16,7 +16,7 @@ - + diff --git a/algorithms/category/paths-in-graphs/index.html b/algorithms/category/paths-in-graphs/index.html index 69636ae..13b5c76 100644 --- a/algorithms/category/paths-in-graphs/index.html +++ b/algorithms/category/paths-in-graphs/index.html @@ -16,7 +16,7 @@ - + diff --git a/algorithms/category/recursion/index.html b/algorithms/category/recursion/index.html index 2e77fe6..90c971e 100644 --- a/algorithms/category/recursion/index.html +++ b/algorithms/category/recursion/index.html @@ -16,7 +16,7 @@ - + diff --git a/algorithms/category/red-black-trees/index.html b/algorithms/category/red-black-trees/index.html index ccd4a1a..23bb967 100644 --- a/algorithms/category/red-black-trees/index.html +++ b/algorithms/category/red-black-trees/index.html @@ -16,7 +16,7 @@ - + diff --git a/algorithms/graphs/bfs-tree/index.html b/algorithms/graphs/bfs-tree/index.html index 252fbac..26d24b5 100644 --- a/algorithms/graphs/bfs-tree/index.html +++ b/algorithms/graphs/bfs-tree/index.html @@ -16,7 +16,7 @@ - + diff --git a/algorithms/graphs/iterative-and-iterators/index.html b/algorithms/graphs/iterative-and-iterators/index.html index bdc66ba..72435cc 100644 --- a/algorithms/graphs/iterative-and-iterators/index.html +++ b/algorithms/graphs/iterative-and-iterators/index.html @@ -16,7 +16,7 @@ - + diff --git a/algorithms/hash-tables/breaking/index.html b/algorithms/hash-tables/breaking/index.html index 976322c..8af3162 100644 --- a/algorithms/hash-tables/breaking/index.html +++ b/algorithms/hash-tables/breaking/index.html @@ -16,7 +16,7 @@ - + diff --git a/algorithms/hash-tables/breaking/mitigations/index.html b/algorithms/hash-tables/breaking/mitigations/index.html index aea5a93..442d44a 100644 --- a/algorithms/hash-tables/breaking/mitigations/index.html +++ b/algorithms/hash-tables/breaking/mitigations/index.html @@ -16,7 +16,7 @@ - + diff --git a/algorithms/hash-tables/breaking/python/index.html b/algorithms/hash-tables/breaking/python/index.html index bd5d99e..00c0ed2 100644 --- a/algorithms/hash-tables/breaking/python/index.html +++ b/algorithms/hash-tables/breaking/python/index.html @@ -16,7 +16,7 @@ - + diff --git a/algorithms/index.html b/algorithms/index.html index a250af1..7b7fcd1 100644 --- a/algorithms/index.html +++ b/algorithms/index.html @@ -14,7 +14,7 @@ - + @@ -23,6 +23,6 @@ course of teaching Algorithms and data structures I.

It is a various mix of stuff that may have been produced as a follow-up on some question asked at the seminar or spontanously.

If you have some ideas for posts, please do not hesitate to submit them as issues -in the linked GitLab.

+in the linked GitLab.

\ No newline at end of file diff --git a/algorithms/paths/bf-to-astar/astar/index.html b/algorithms/paths/bf-to-astar/astar/index.html index fa4d367..0522a1a 100644 --- a/algorithms/paths/bf-to-astar/astar/index.html +++ b/algorithms/paths/bf-to-astar/astar/index.html @@ -16,7 +16,7 @@ - + diff --git a/algorithms/paths/bf-to-astar/bf/index.html b/algorithms/paths/bf-to-astar/bf/index.html index bb90723..514667a 100644 --- a/algorithms/paths/bf-to-astar/bf/index.html +++ b/algorithms/paths/bf-to-astar/bf/index.html @@ -18,7 +18,7 @@ something. - + diff --git a/algorithms/paths/bf-to-astar/dijkstra/index.html b/algorithms/paths/bf-to-astar/dijkstra/index.html index c15a994..55cbd4f 100644 --- a/algorithms/paths/bf-to-astar/dijkstra/index.html +++ b/algorithms/paths/bf-to-astar/dijkstra/index.html @@ -16,7 +16,7 @@ - + diff --git a/algorithms/paths/bf-to-astar/index.html b/algorithms/paths/bf-to-astar/index.html index e748a91..299ef8c 100644 --- a/algorithms/paths/bf-to-astar/index.html +++ b/algorithms/paths/bf-to-astar/index.html @@ -16,7 +16,7 @@ - + @@ -56,7 +56,7 @@ two positions on the map made

We can see the graph header here:

-
#ifndef _GRAPH_HPP
#define _GRAPH_HPP

#include <cmath>
#include <limits>
#include <ostream>
#include <utility>
#include <vector>

using vertex_t = std::pair<int, int>;

struct graph {
graph(const std::vector<std::vector<char>>& map)
: map(map),
_height(static_cast<int>(map.size())),
_width(map.empty() ? 0 : static_cast<int>(map[0].size())) {}

static auto unreachable() -> int { return UNREACHABLE; }
static auto normal_cost() -> int { return NORMAL_COST; }
static auto vortex_cost() -> int { return VORTEX_COST; }

auto cost(const vertex_t& u, const vertex_t& v) const -> int {
auto [ux, uy] = u;
auto [vx, vy] = v;

auto hd = std::abs(ux - vx) + std::abs(uy - vy);
switch (hd) {
// ‹u = v›; staying on the same cell
case 0:
return 0;
// ‹u› and ‹v› are neighbours
case 1:
break;
// ‹u› and ‹v› are not neighbouring cells
default:
return UNREACHABLE;
}

// boundary check
if (vy < 0 || vy >= _height || vx < 0 || vx >= _width) {
return UNREACHABLE;
}

switch (map[vy][vx]) {
case '#':
return UNREACHABLE;
case '*':
return VORTEX_COST;
default:
return NORMAL_COST;
}
}

auto width() const -> int { return _width; }
auto height() const -> int { return _height; }
auto has(const vertex_t& v) const -> bool {
auto [x, y] = v;
return (0 <= y && y < _height) && (0 <= x && x < _width);
}

friend std::ostream& operator<<(std::ostream& os, const graph& g);

private:
std::vector<std::vector<char>> map;
int _height, _width;

const static int UNREACHABLE = std::numeric_limits<int>::max();
// XXX: modify here to change the price of entering the vortex
const static int VORTEX_COST = 5;
const static int NORMAL_COST = 1;
};

std::ostream& operator<<(std::ostream& os, const graph& g) {
for (const auto& row : g.map) {
for (const char cell : row) {
os << cell;
}
os << "\n";
}

return os;
}

#endif /* _GRAPH_HPP */
+
#ifndef _GRAPH_HPP
#define _GRAPH_HPP

#include <cmath>
#include <limits>
#include <ostream>
#include <utility>
#include <vector>

using vertex_t = std::pair<int, int>;

struct graph {
graph(const std::vector<std::vector<char>>& map)
: map(map),
_height(static_cast<int>(map.size())),
_width(map.empty() ? 0 : static_cast<int>(map[0].size())) {}

static auto unreachable() -> int { return UNREACHABLE; }
static auto normal_cost() -> int { return NORMAL_COST; }
static auto vortex_cost() -> int { return VORTEX_COST; }

auto cost(const vertex_t& u, const vertex_t& v) const -> int {
auto [ux, uy] = u;
auto [vx, vy] = v;

auto md = std::abs(ux - vx) + std::abs(uy - vy);
switch (md) {
// ‹u = v›; staying on the same cell
case 0:
return 0;
// ‹u› and ‹v› are neighbours
case 1:
break;
// ‹u› and ‹v› are not neighbouring cells
default:
return UNREACHABLE;
}

// boundary check
if (vy < 0 || vy >= _height || vx < 0 || vx >= _width) {
return UNREACHABLE;
}

switch (map[vy][vx]) {
case '#':
return UNREACHABLE;
case '*':
return VORTEX_COST;
default:
return NORMAL_COST;
}
}

auto width() const -> int { return _width; }
auto height() const -> int { return _height; }
auto has(const vertex_t& v) const -> bool {
auto [x, y] = v;
return (0 <= y && y < _height) && (0 <= x && x < _width);
}

friend std::ostream& operator<<(std::ostream& os, const graph& g);

private:
std::vector<std::vector<char>> map;
int _height, _width;

const static int UNREACHABLE = std::numeric_limits<int>::max();
// XXX: modify here to change the price of entering the vortex
const static int VORTEX_COST = 5;
const static int NORMAL_COST = 1;
};

std::ostream& operator<<(std::ostream& os, const graph& g) {
for (const auto& row : g.map) {
for (const char cell : row) {
os << cell;
}
os << "\n";
}

return os;
}

#endif /* _GRAPH_HPP */
Source code

You can find all the source code referenced in this series here.

Let's finally start with some algorithms!

diff --git a/algorithms/rb-trees/applications/index.html b/algorithms/rb-trees/applications/index.html index 3e642c5..55c60a6 100644 --- a/algorithms/rb-trees/applications/index.html +++ b/algorithms/rb-trees/applications/index.html @@ -16,7 +16,7 @@ - + diff --git a/algorithms/rb-trees/rules/index.html b/algorithms/rb-trees/rules/index.html index 3e3323f..45482cf 100644 --- a/algorithms/rb-trees/rules/index.html +++ b/algorithms/rb-trees/rules/index.html @@ -16,7 +16,7 @@ - + diff --git a/algorithms/recursion/karel/index.html b/algorithms/recursion/karel/index.html index 6843fe2..e58387b 100644 --- a/algorithms/recursion/karel/index.html +++ b/algorithms/recursion/karel/index.html @@ -16,7 +16,7 @@ - + diff --git a/algorithms/recursion/karel/solution/index.html b/algorithms/recursion/karel/solution/index.html index 62fe2ff..e9fbf09 100644 --- a/algorithms/recursion/karel/solution/index.html +++ b/algorithms/recursion/karel/solution/index.html @@ -16,7 +16,7 @@ - + diff --git a/algorithms/recursion/pyramid-slide-down/bottom-up-dp/index.html b/algorithms/recursion/pyramid-slide-down/bottom-up-dp/index.html index b9ab384..6320266 100644 --- a/algorithms/recursion/pyramid-slide-down/bottom-up-dp/index.html +++ b/algorithms/recursion/pyramid-slide-down/bottom-up-dp/index.html @@ -16,7 +16,7 @@ - + diff --git a/algorithms/recursion/pyramid-slide-down/greedy/index.html b/algorithms/recursion/pyramid-slide-down/greedy/index.html index c6a1612..a0befdb 100644 --- a/algorithms/recursion/pyramid-slide-down/greedy/index.html +++ b/algorithms/recursion/pyramid-slide-down/greedy/index.html @@ -16,7 +16,7 @@ - + diff --git a/algorithms/recursion/pyramid-slide-down/index.html b/algorithms/recursion/pyramid-slide-down/index.html index 05a0b58..c24925b 100644 --- a/algorithms/recursion/pyramid-slide-down/index.html +++ b/algorithms/recursion/pyramid-slide-down/index.html @@ -16,7 +16,7 @@ - + diff --git a/algorithms/recursion/pyramid-slide-down/naive/index.html b/algorithms/recursion/pyramid-slide-down/naive/index.html index 835fcce..9daeda7 100644 --- a/algorithms/recursion/pyramid-slide-down/naive/index.html +++ b/algorithms/recursion/pyramid-slide-down/naive/index.html @@ -16,7 +16,7 @@ - + diff --git a/algorithms/recursion/pyramid-slide-down/top-down-dp/index.html b/algorithms/recursion/pyramid-slide-down/top-down-dp/index.html index 787c161..9e6698d 100644 --- a/algorithms/recursion/pyramid-slide-down/top-down-dp/index.html +++ b/algorithms/recursion/pyramid-slide-down/top-down-dp/index.html @@ -16,7 +16,7 @@ - + diff --git a/algorithms/tags/a-star/index.html b/algorithms/tags/a-star/index.html index 431fa40..3637405 100644 --- a/algorithms/tags/a-star/index.html +++ b/algorithms/tags/a-star/index.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/tags/applications/index.html b/algorithms/tags/applications/index.html index e29794e..cd58f2a 100644 --- a/algorithms/tags/applications/index.html +++ b/algorithms/tags/applications/index.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/tags/astar/index.html b/algorithms/tags/astar/index.html index b7983e7..eb9a142 100644 --- a/algorithms/tags/astar/index.html +++ b/algorithms/tags/astar/index.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/tags/backtracking/index.html b/algorithms/tags/backtracking/index.html index 8d61ace..dcf4599 100644 --- a/algorithms/tags/backtracking/index.html +++ b/algorithms/tags/backtracking/index.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/tags/balanced-trees/index.html b/algorithms/tags/balanced-trees/index.html index 01a8d3f..608e4f8 100644 --- a/algorithms/tags/balanced-trees/index.html +++ b/algorithms/tags/balanced-trees/index.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/tags/bellman-ford/index.html b/algorithms/tags/bellman-ford/index.html index 7e12f68..9cfec35 100644 --- a/algorithms/tags/bellman-ford/index.html +++ b/algorithms/tags/bellman-ford/index.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/tags/bfs/index.html b/algorithms/tags/bfs/index.html index 2421be4..2478b5c 100644 --- a/algorithms/tags/bfs/index.html +++ b/algorithms/tags/bfs/index.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/tags/bottom-up-dp/index.html b/algorithms/tags/bottom-up-dp/index.html index c7e9e7a..1168caa 100644 --- a/algorithms/tags/bottom-up-dp/index.html +++ b/algorithms/tags/bottom-up-dp/index.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/tags/brute-force/index.html b/algorithms/tags/brute-force/index.html index ee453c9..c8ae685 100644 --- a/algorithms/tags/brute-force/index.html +++ b/algorithms/tags/brute-force/index.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/tags/c/index.html b/algorithms/tags/c/index.html index 0a2aef2..90faa96 100644 --- a/algorithms/tags/c/index.html +++ b/algorithms/tags/c/index.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/tags/cpp/index.html b/algorithms/tags/cpp/index.html index 805e190..c186b1d 100644 --- a/algorithms/tags/cpp/index.html +++ b/algorithms/tags/cpp/index.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/tags/csharp/index.html b/algorithms/tags/csharp/index.html index b180c87..2be24e8 100644 --- a/algorithms/tags/csharp/index.html +++ b/algorithms/tags/csharp/index.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/tags/dijkstra/index.html b/algorithms/tags/dijkstra/index.html index 0def4d2..5aa7618 100644 --- a/algorithms/tags/dijkstra/index.html +++ b/algorithms/tags/dijkstra/index.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/tags/dynamic-array/index.html b/algorithms/tags/dynamic-array/index.html index a616811..4749cd5 100644 --- a/algorithms/tags/dynamic-array/index.html +++ b/algorithms/tags/dynamic-array/index.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/tags/dynamic-programming/index.html b/algorithms/tags/dynamic-programming/index.html index 446f06b..9ae1a5e 100644 --- a/algorithms/tags/dynamic-programming/index.html +++ b/algorithms/tags/dynamic-programming/index.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/tags/exponential/index.html b/algorithms/tags/exponential/index.html index e93b067..af52743 100644 --- a/algorithms/tags/exponential/index.html +++ b/algorithms/tags/exponential/index.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/tags/graphs/index.html b/algorithms/tags/graphs/index.html index 482900a..ba2efc3 100644 --- a/algorithms/tags/graphs/index.html +++ b/algorithms/tags/graphs/index.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/tags/greedy/index.html b/algorithms/tags/greedy/index.html index 1a5424f..8f6126b 100644 --- a/algorithms/tags/greedy/index.html +++ b/algorithms/tags/greedy/index.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/tags/hash-tables/index.html b/algorithms/tags/hash-tables/index.html index 99f15c9..06a3508 100644 --- a/algorithms/tags/hash-tables/index.html +++ b/algorithms/tags/hash-tables/index.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/tags/index.html b/algorithms/tags/index.html index ad8f329..5526f2d 100644 --- a/algorithms/tags/index.html +++ b/algorithms/tags/index.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/tags/iterative/index.html b/algorithms/tags/iterative/index.html index 46cff49..ea1c4d0 100644 --- a/algorithms/tags/iterative/index.html +++ b/algorithms/tags/iterative/index.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/tags/iterators/index.html b/algorithms/tags/iterators/index.html index 1432ba3..92efb44 100644 --- a/algorithms/tags/iterators/index.html +++ b/algorithms/tags/iterators/index.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/tags/java/index.html b/algorithms/tags/java/index.html index 12c8f47..fb26970 100644 --- a/algorithms/tags/java/index.html +++ b/algorithms/tags/java/index.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/tags/karel/index.html b/algorithms/tags/karel/index.html index 73e4fc0..276c9f1 100644 --- a/algorithms/tags/karel/index.html +++ b/algorithms/tags/karel/index.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/tags/postconditions/index.html b/algorithms/tags/postconditions/index.html index 3a803ed..aa3d4e4 100644 --- a/algorithms/tags/postconditions/index.html +++ b/algorithms/tags/postconditions/index.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/tags/python/index.html b/algorithms/tags/python/index.html index a25e9a1..3bd02e3 100644 --- a/algorithms/tags/python/index.html +++ b/algorithms/tags/python/index.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/tags/recursion/index.html b/algorithms/tags/recursion/index.html index 9044d56..e9cba44 100644 --- a/algorithms/tags/recursion/index.html +++ b/algorithms/tags/recursion/index.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/tags/red-black-trees/index.html b/algorithms/tags/red-black-trees/index.html index fa05a57..5d962f6 100644 --- a/algorithms/tags/red-black-trees/index.html +++ b/algorithms/tags/red-black-trees/index.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/tags/solution/index.html b/algorithms/tags/solution/index.html index 8923f0a..6409b75 100644 --- a/algorithms/tags/solution/index.html +++ b/algorithms/tags/solution/index.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/tags/sorting/index.html b/algorithms/tags/sorting/index.html index 4c8828d..9b414bc 100644 --- a/algorithms/tags/sorting/index.html +++ b/algorithms/tags/sorting/index.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/tags/testing/index.html b/algorithms/tags/testing/index.html index 1fee8ab..42607ac 100644 --- a/algorithms/tags/testing/index.html +++ b/algorithms/tags/testing/index.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/tags/time-complexity/index.html b/algorithms/tags/time-complexity/index.html index 1335d14..57c3cc1 100644 --- a/algorithms/tags/time-complexity/index.html +++ b/algorithms/tags/time-complexity/index.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/tags/top-down-dp/index.html b/algorithms/tags/top-down-dp/index.html index 3f1e22c..9bedb27 100644 --- a/algorithms/tags/top-down-dp/index.html +++ b/algorithms/tags/top-down-dp/index.html @@ -14,7 +14,7 @@ - + diff --git a/algorithms/time-complexity/extend/index.html b/algorithms/time-complexity/extend/index.html index 6ff6278..b01eda3 100644 --- a/algorithms/time-complexity/extend/index.html +++ b/algorithms/time-complexity/extend/index.html @@ -16,7 +16,7 @@ - + diff --git a/assets/js/1535ede8.102142f5.js b/assets/js/1535ede8.3c894b1e.js similarity index 99% rename from assets/js/1535ede8.102142f5.js rename to assets/js/1535ede8.3c894b1e.js index 94b5cab..d8aa4f0 100644 --- a/assets/js/1535ede8.102142f5.js +++ b/assets/js/1535ede8.3c894b1e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[5376],{44969:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var s=t(85893),i=t(11151);const r={id:"seminar-10",title:"10th seminar",description:"Finding bugs in a hangman.\n"},o=void 0,a={id:"bonuses/seminar-10",title:"10th seminar",description:"Finding bugs in a hangman.\n",source:"@site/c/bonuses/10.md",sourceDirName:"bonuses",slug:"/bonuses/seminar-10",permalink:"/c/bonuses/seminar-10",draft:!1,unlisted:!1,editUrl:"https://github.com/mfocko/blog/tree/main/c/bonuses/10.md",tags:[],version:"current",lastUpdatedAt:1704291155,formattedLastUpdatedAt:"Jan 3, 2024",frontMatter:{id:"seminar-10",title:"10th seminar",description:"Finding bugs in a hangman.\n"},sidebar:"autogeneratedBar",previous:{title:"8th seminar",permalink:"/c/bonuses/seminar-08"},next:{title:"Practice Exams",permalink:"/c/category/practice-exams"}},c={},l=[{value:"Introduction",id:"introduction",level:2},{value:"Project",id:"project",level:2},{value:"Summary of the gameplay",id:"summary-of-the-gameplay",level:3},{value:"Suggested workflow",id:"suggested-workflow",level:2},{value:"Tasks",id:"tasks",level:2},{value:"Dictionary",id:"dictionary",level:2},{value:"Submitting",id:"submitting",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",em:"em",h2:"h2",h3:"h3",hr:"hr",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"pathname:///files/c/bonuses/10.tar.gz",children:"Source"})}),"\n",(0,s.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,s.jsx)(n.p,{children:"For this bonus you are given almost finished project - The Hangman Game. Your\ntask is to try the game, in case you find any bugs point them out and cover as\nmuch of the game as possible with tests."}),"\n",(0,s.jsx)(n.p,{children:"For this bonus you can get at maximum 2 K\u20a1."}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Item"}),(0,s.jsx)(n.th,{children:"Bonus"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Fixing bugs from failing tests"}),(0,s.jsx)(n.td,{children:"0.25"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"word_guessed"})}),(0,s.jsx)(n.td,{children:"0.50"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Hidden bug"}),(0,s.jsx)(n.td,{children:"0.50"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Extending tests, undetectable bugs or evil bug"}),(0,s.jsx)(n.td,{children:"0.37"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Refactor"}),(0,s.jsx)(n.td,{children:"0.38"})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"project",children:"Project"}),"\n",(0,s.jsxs)(n.p,{children:["Project consists of 2 source files - ",(0,s.jsx)(n.code,{children:"hangman.c"})," and ",(0,s.jsx)(n.code,{children:"main.c"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"main.c"})," is quite short and concise, there is nothing for you to do."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"hangman.c"})," contains implementation of the game. In case you feel lost, consult\nthe documentation in ",(0,s.jsx)(n.code,{children:"hangman.h"})," that represents an interface that can be used\nfor implementing the game."]}),"\n",(0,s.jsxs)(n.p,{children:["Apart from those sources this project is a bit more complicated. ",(0,s.jsx)(n.em,{children:"Game loop"})," is\nrealised via single encapsulated function that complicates the testing. Because\nof that, there are 2 kinds of tests:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.em,{children:"Unit tests"})," - that are present in ",(0,s.jsx)(n.code,{children:"test_hangman.c"})," and can be run via:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ make check-unit\n"})}),"\n",(0,s.jsx)(n.p,{children:"They cover majorly functions that can be tested easily via testing framework."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.em,{children:"Functional tests"})," - same as in ",(0,s.jsx)(n.code,{children:"seminar-08"})," and are focused on testing the\nprogram as whole. Basic smoke test is already included in ",(0,s.jsx)(n.code,{children:"usage"})," test case."]}),"\n",(0,s.jsx)(n.p,{children:"They can be run via:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ make check-functional\n"})}),"\n",(0,s.jsxs)(n.p,{children:["When testing ",(0,s.jsx)(n.code,{children:"hangman"})," function (the game loop), it is suggested to create\nfunctional tests."]}),"\n",(0,s.jsx)(n.p,{children:"When submitting the files for review, please leave out functional tests that\nwere given as a part of the assignment, so that it is easier to navigate, I\nwill drag the common files myself. :)"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"Whole test suite can be run via:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ make check\n"})}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"summary-of-the-gameplay",children:"Summary of the gameplay"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Secret word gets chosen from the file that's path is given as an argument."}),"\n",(0,s.jsx)(n.li,{children:"You get 8 guesses."}),"\n",(0,s.jsx)(n.li,{children:"Invalid characters don't count."}),"\n",(0,s.jsx)(n.li,{children:"Already guessed characters don't count, even if not included in the secret."}),"\n",(0,s.jsxs)(n.li,{children:["You can guess the whole word at once","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"If you get it right, you won, game ends."}),"\n",(0,s.jsx)(n.li,{children:"If you don't get it right, you get to see the secret, game ends."}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.li,{children:"In case of end of input, game finishes via force."}),"\n",(0,s.jsx)(n.li,{children:"In case of invalid input, no guesses are subtracted, game carries on."}),"\n",(0,s.jsx)(n.li,{children:"Letters and words are not case sensitive."}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"suggested-workflow",children:"Suggested workflow"}),"\n",(0,s.jsxs)(n.p,{children:["As we have talked about on the seminar, I suggest you to follow\n",(0,s.jsx)(n.em,{children:"Test-Driven Development"}),"\nin this case."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"TDD workflow",src:t(27420).Z+"",width:"2814",height:"1652"})}),"\n",(0,s.jsx)(n.p,{children:"In our current scenario we are already in the stage of refactoring and fixing the\nbugs. Therefore try to follow this succession of steps:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Try to reproduce the bug."}),"\n",(0,s.jsx)(n.li,{children:"Create a test that proves the presence of the bug."}),"\n",(0,s.jsx)(n.li,{children:"Fix the bug."}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["In case you are submitting the bonus via GitLab, it is helpful to commit tests\nbefore commiting the fixes, so that it is apparent that the bug is manifested.\nExample of ",(0,s.jsx)(n.code,{children:"git log"})," (notice that the first line represents latest commit):"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"feat: Implement fizz_buzzer\ntest: Add tests for fizz_buzzer\nfix: Fix NULL-check in print_name\ntest: Add test for NULL in print_name\n"})}),"\n",(0,s.jsx)(n.h2,{id:"tasks",children:"Tasks"}),"\n",(0,s.jsx)(n.p,{children:"As to your tasks, there are multiple things wrong in this project."}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:'There are 2 "bugs" that cannot be detected via tests, i.e. they are not bugs\nthat affect functionality of the game.'}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["There is one evil bug in ",(0,s.jsx)(n.code,{children:"get_word"}),". It is not required to be fixed ;) Assign\nit the lowest priority."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"There are some tests failing. Please try to figure it out, so you have green\ntests for the rest :)"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["We have gotten a bug report for ",(0,s.jsx)(n.code,{children:"word_guessed"}),", all we got is"]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["doesn't work when there are too many ",(0,s.jsx)(n.code,{children:"a"}),"s"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Please try to replicate the bug and create a tests, so we don't get any\nregression later on."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"One hidden bug :) Closely non-specified, we cannot reproduce it and we were\ndrunk while playing the game, so we don't remember a thing. :/"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Try to cover as much code via the tests as possible. We are not going to look\nat the metrics, but DRY is violated a lot, so as a last task try to remove as\nmuch of the duplicit code as possible."}),"\n",(0,s.jsx)(n.p,{children:"Tests should help you a lot in case there are some regressions."}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsxs)(n.p,{children:["In case you wonder why there are always 3 same words in the file with words, it\nis because of the ",(0,s.jsx)(n.code,{children:"get_word"})," bug. It is not a bug that can be easily fixed, so\nit is a not requirement at all and you can still get all points for the bonus ;)"]}),"\n",(0,s.jsx)(n.h2,{id:"dictionary",children:"Dictionary"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Functional_testing",children:"Functional tests"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Smoke_testing_%28software%29",children:"Smoke test"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Don%27t_repeat_yourself",children:"DRY"})}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"submitting",children:"Submitting"}),"\n",(0,s.jsx)(n.p,{children:"In case you have any questions, feel free to reach out to me."}),"\n",(0,s.jsx)(n.hr,{})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},27420:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/tdd_lifecycle-327ad9ee0ed8318ed11e19a28e02b2cc.png"},11151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>o});var s=t(67294);const i={},r=s.createContext(i);function o(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[5376],{44969:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var s=t(85893),i=t(11151);const r={id:"seminar-10",title:"10th seminar",description:"Finding bugs in a hangman.\n"},o=void 0,a={id:"bonuses/seminar-10",title:"10th seminar",description:"Finding bugs in a hangman.\n",source:"@site/c/bonuses/10.md",sourceDirName:"bonuses",slug:"/bonuses/seminar-10",permalink:"/c/bonuses/seminar-10",draft:!1,unlisted:!1,editUrl:"https://github.com/mfocko/blog/tree/main/c/bonuses/10.md",tags:[],version:"current",lastUpdatedAt:1704558496,formattedLastUpdatedAt:"Jan 6, 2024",frontMatter:{id:"seminar-10",title:"10th seminar",description:"Finding bugs in a hangman.\n"},sidebar:"autogeneratedBar",previous:{title:"8th seminar",permalink:"/c/bonuses/seminar-08"},next:{title:"Practice Exams",permalink:"/c/category/practice-exams"}},c={},l=[{value:"Introduction",id:"introduction",level:2},{value:"Project",id:"project",level:2},{value:"Summary of the gameplay",id:"summary-of-the-gameplay",level:3},{value:"Suggested workflow",id:"suggested-workflow",level:2},{value:"Tasks",id:"tasks",level:2},{value:"Dictionary",id:"dictionary",level:2},{value:"Submitting",id:"submitting",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",em:"em",h2:"h2",h3:"h3",hr:"hr",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"pathname:///files/c/bonuses/10.tar.gz",children:"Source"})}),"\n",(0,s.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,s.jsx)(n.p,{children:"For this bonus you are given almost finished project - The Hangman Game. Your\ntask is to try the game, in case you find any bugs point them out and cover as\nmuch of the game as possible with tests."}),"\n",(0,s.jsx)(n.p,{children:"For this bonus you can get at maximum 2 K\u20a1."}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Item"}),(0,s.jsx)(n.th,{children:"Bonus"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Fixing bugs from failing tests"}),(0,s.jsx)(n.td,{children:"0.25"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"word_guessed"})}),(0,s.jsx)(n.td,{children:"0.50"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Hidden bug"}),(0,s.jsx)(n.td,{children:"0.50"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Extending tests, undetectable bugs or evil bug"}),(0,s.jsx)(n.td,{children:"0.37"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Refactor"}),(0,s.jsx)(n.td,{children:"0.38"})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"project",children:"Project"}),"\n",(0,s.jsxs)(n.p,{children:["Project consists of 2 source files - ",(0,s.jsx)(n.code,{children:"hangman.c"})," and ",(0,s.jsx)(n.code,{children:"main.c"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"main.c"})," is quite short and concise, there is nothing for you to do."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"hangman.c"})," contains implementation of the game. In case you feel lost, consult\nthe documentation in ",(0,s.jsx)(n.code,{children:"hangman.h"})," that represents an interface that can be used\nfor implementing the game."]}),"\n",(0,s.jsxs)(n.p,{children:["Apart from those sources this project is a bit more complicated. ",(0,s.jsx)(n.em,{children:"Game loop"})," is\nrealised via single encapsulated function that complicates the testing. Because\nof that, there are 2 kinds of tests:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.em,{children:"Unit tests"})," - that are present in ",(0,s.jsx)(n.code,{children:"test_hangman.c"})," and can be run via:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ make check-unit\n"})}),"\n",(0,s.jsx)(n.p,{children:"They cover majorly functions that can be tested easily via testing framework."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.em,{children:"Functional tests"})," - same as in ",(0,s.jsx)(n.code,{children:"seminar-08"})," and are focused on testing the\nprogram as whole. Basic smoke test is already included in ",(0,s.jsx)(n.code,{children:"usage"})," test case."]}),"\n",(0,s.jsx)(n.p,{children:"They can be run via:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ make check-functional\n"})}),"\n",(0,s.jsxs)(n.p,{children:["When testing ",(0,s.jsx)(n.code,{children:"hangman"})," function (the game loop), it is suggested to create\nfunctional tests."]}),"\n",(0,s.jsx)(n.p,{children:"When submitting the files for review, please leave out functional tests that\nwere given as a part of the assignment, so that it is easier to navigate, I\nwill drag the common files myself. :)"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"Whole test suite can be run via:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ make check\n"})}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"summary-of-the-gameplay",children:"Summary of the gameplay"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Secret word gets chosen from the file that's path is given as an argument."}),"\n",(0,s.jsx)(n.li,{children:"You get 8 guesses."}),"\n",(0,s.jsx)(n.li,{children:"Invalid characters don't count."}),"\n",(0,s.jsx)(n.li,{children:"Already guessed characters don't count, even if not included in the secret."}),"\n",(0,s.jsxs)(n.li,{children:["You can guess the whole word at once","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"If you get it right, you won, game ends."}),"\n",(0,s.jsx)(n.li,{children:"If you don't get it right, you get to see the secret, game ends."}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.li,{children:"In case of end of input, game finishes via force."}),"\n",(0,s.jsx)(n.li,{children:"In case of invalid input, no guesses are subtracted, game carries on."}),"\n",(0,s.jsx)(n.li,{children:"Letters and words are not case sensitive."}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"suggested-workflow",children:"Suggested workflow"}),"\n",(0,s.jsxs)(n.p,{children:["As we have talked about on the seminar, I suggest you to follow\n",(0,s.jsx)(n.em,{children:"Test-Driven Development"}),"\nin this case."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"TDD workflow",src:t(27420).Z+"",width:"2814",height:"1652"})}),"\n",(0,s.jsx)(n.p,{children:"In our current scenario we are already in the stage of refactoring and fixing the\nbugs. Therefore try to follow this succession of steps:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Try to reproduce the bug."}),"\n",(0,s.jsx)(n.li,{children:"Create a test that proves the presence of the bug."}),"\n",(0,s.jsx)(n.li,{children:"Fix the bug."}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["In case you are submitting the bonus via GitLab, it is helpful to commit tests\nbefore commiting the fixes, so that it is apparent that the bug is manifested.\nExample of ",(0,s.jsx)(n.code,{children:"git log"})," (notice that the first line represents latest commit):"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"feat: Implement fizz_buzzer\ntest: Add tests for fizz_buzzer\nfix: Fix NULL-check in print_name\ntest: Add test for NULL in print_name\n"})}),"\n",(0,s.jsx)(n.h2,{id:"tasks",children:"Tasks"}),"\n",(0,s.jsx)(n.p,{children:"As to your tasks, there are multiple things wrong in this project."}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:'There are 2 "bugs" that cannot be detected via tests, i.e. they are not bugs\nthat affect functionality of the game.'}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["There is one evil bug in ",(0,s.jsx)(n.code,{children:"get_word"}),". It is not required to be fixed ;) Assign\nit the lowest priority."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"There are some tests failing. Please try to figure it out, so you have green\ntests for the rest :)"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["We have gotten a bug report for ",(0,s.jsx)(n.code,{children:"word_guessed"}),", all we got is"]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["doesn't work when there are too many ",(0,s.jsx)(n.code,{children:"a"}),"s"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Please try to replicate the bug and create a tests, so we don't get any\nregression later on."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"One hidden bug :) Closely non-specified, we cannot reproduce it and we were\ndrunk while playing the game, so we don't remember a thing. :/"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Try to cover as much code via the tests as possible. We are not going to look\nat the metrics, but DRY is violated a lot, so as a last task try to remove as\nmuch of the duplicit code as possible."}),"\n",(0,s.jsx)(n.p,{children:"Tests should help you a lot in case there are some regressions."}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsxs)(n.p,{children:["In case you wonder why there are always 3 same words in the file with words, it\nis because of the ",(0,s.jsx)(n.code,{children:"get_word"})," bug. It is not a bug that can be easily fixed, so\nit is a not requirement at all and you can still get all points for the bonus ;)"]}),"\n",(0,s.jsx)(n.h2,{id:"dictionary",children:"Dictionary"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Functional_testing",children:"Functional tests"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Smoke_testing_%28software%29",children:"Smoke test"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Don%27t_repeat_yourself",children:"DRY"})}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"submitting",children:"Submitting"}),"\n",(0,s.jsx)(n.p,{children:"In case you have any questions, feel free to reach out to me."}),"\n",(0,s.jsx)(n.hr,{})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},27420:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/tdd_lifecycle-327ad9ee0ed8318ed11e19a28e02b2cc.png"},11151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>o});var s=t(67294);const i={},r=s.createContext(i);function o(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/22a175ec.504e3826.js b/assets/js/22a175ec.92356088.js similarity index 62% rename from assets/js/22a175ec.504e3826.js rename to assets/js/22a175ec.92356088.js index b5e67ec..f4a9070 100644 --- a/assets/js/22a175ec.504e3826.js +++ b/assets/js/22a175ec.92356088.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[6890],{40707:(e,t,i)=>{i.r(t),i.d(t,{default:()=>x});var r=i(67294),o=i(80647),s=i(86010);const n="card_n_Wj",a="contributionsContainer_vdAK",l="buttons_UAd1";var c,h;function d(){return d=Object.assign?Object.assign.bind():function(e){for(var t=1;t{let{title:t,titleId:i,...o}=e;return r.createElement("svg",d({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24","aria-labelledby":i},o),t?r.createElement("title",{id:i},t):null,c||(c=r.createElement("path",{fill:"none",d:"M0 0h24v24H0z"})),h||(h=r.createElement("path",{d:"M13 21v2.5l-3-2-3 2V21h-.5A3.5 3.5 0 0 1 3 17.5V5a3 3 0 0 1 3-3h14a1 1 0 0 1 1 1v17a1 1 0 0 1-1 1h-7zm0-2h6v-3H6.5a1.5 1.5 0 0 0 0 3H7v-2h6v2zm6-5V4H6v10.035A3.53 3.53 0 0 1 6.5 14H19zM7 5h2v2H7V5zm0 3h2v2H7V8zm0 3h2v2H7v-2z"})))};var u=i(85893);const b=e=>{let{title:t,description:i,contribution:r,repoURL:o}=e;return(0,u.jsx)("div",{className:"col col--12",children:(0,u.jsxs)("div",{className:(0,s.Z)("card",n),children:[(0,u.jsx)("div",{className:"card__header",children:(0,u.jsx)("h2",{children:t})}),(0,u.jsx)("div",{className:"card__body",children:(0,u.jsxs)("div",{className:"row",children:[(0,u.jsxs)("div",{className:"col col--6",children:[(0,u.jsx)("h6",{children:"Description"}),i]}),(0,u.jsxs)("div",{className:(0,s.Z)("col col--6",a),children:[(0,u.jsx)("h6",{children:"Contribution"}),r]})]})}),(0,u.jsx)("div",{className:"card__footer",children:(0,u.jsx)("div",{className:l,children:(0,u.jsxs)("a",{href:o,target:"_blank",className:"button button--secondary button--outline",children:[(0,u.jsx)("span",{className:"button__icon",children:(0,u.jsx)(p,{})}),"See repository"]})})})]})})},g=[{title:"tmt",description:(0,u.jsx)("p",{children:"The `tmt` tool provides a user-friendly way to work with tests. You can comfortably create new tests, safely and easily run tests across different environments, review test results, debug test code and enable tests in the CI using a consistent and concise config."}),contribution:(0,u.jsx)("p",{children:"Just a smallish contribution to the docs related to the changes implemented on the Packit side."}),repoURL:"https://github.com/teemtee/tmt"},{title:"Fedora Infrastructure Ansible",description:(0,u.jsx)("p",{children:"Collection of Ansible playbooks that powers the Fedora Infrastructure."}),contribution:(0,u.jsx)("p",{children:"I have adjusted the groups in the Bodhi playbooks after Packit has been granted the privileges to propose updates without restrictions."}),repoURL:"https://pagure.io/fedora-infra/ansible"},{title:"Bodhi",description:(0,u.jsx)("p",{children:"Bodhi is a web-system that facilitates the process of publishing updates for a Fedora-based software distribution."}),contribution:(0,u.jsx)("p",{children:"I have adjusted the client, so that it doesn't show secrets in terminal when you log in to the Bodhi via browser."}),repoURL:"https://github.com/fedora-infra/bodhi"},{title:"Gluetool Modules Collection",description:(0,u.jsxs)("p",{children:["Modules for ",(0,u.jsx)("code",{children:"gluetool"})," \u2014 a command line centric framework usable for glueing modules into a pipeline."]}),contribution:(0,u.jsxs)("ul",{children:[(0,u.jsx)("li",{children:"I have proposed a possible implementation of git merging that was later on extended."}),(0,u.jsx)("li",{children:"I have tried to help out with Copr module after they deprecated older version of their API."})]}),repoURL:"https://gitlab.com/testing-farm/gluetool-modules"},{title:"Pagure",description:(0,u.jsx)("p",{children:"Pagure is a git-centered forge, python based using pygit2."}),contribution:(0,u.jsx)("p",{children:"I have added an API endpoint for reopening pull requests."}),repoURL:"https://pagure.io/pagure"},{title:"Copr",description:(0,u.jsxs)("p",{children:["RPM build system - upstream for"," ",(0,u.jsx)("a",{target:"_blank",href:"https://copr.fedorainfracloud.org/",children:"Copr"}),"."]}),contribution:(0,u.jsxs)("ul",{children:[(0,u.jsx)("li",{children:"Supporting external repositories for custom SRPM build method."}),(0,u.jsxs)("li",{children:["Allowing admins of Copr repositories to build without the need to ask for explicit ",(0,u.jsx)("code",{children:"builder"})," permissions."]})]}),repoURL:"https://github.com/fedora-copr/copr"},{title:"python-gitlab",description:(0,u.jsx)("p",{children:"A python wrapper for the GitLab API."}),contribution:(0,u.jsxs)("p",{children:["I have contributed support for the ",(0,u.jsx)("code",{children:"merge_ref"})," on merge requests that hasn't been supported, yet it was present in the GitLab API."]}),repoURL:"https://github.com/python-gitlab/python-gitlab"},{title:"PatternFly React",description:(0,u.jsx)("p",{children:"A set of React components for the PatternFly project."}),contribution:(0,u.jsx)("p",{children:"When working on Packit Dashboard, I have spotted smaller bugs that were present in this project and fixed them upstream to provide better experience for our users."}),repoURL:"https://github.com/patternfly/patternfly-react"},{title:"Fira Code",description:(0,u.jsx)("p",{children:"Free monospaced font with programming ligatures."}),contribution:(0,u.jsxs)("p",{children:["I have set up a GitHub Action for building the font on each push to the default branch allowing users to install ",(0,u.jsx)("i",{children:"bleeding edge"})," ","version of the font."]}),repoURL:"https://github.com/tonsky/FiraCode"},{title:"nixpkgs",description:(0,u.jsx)("p",{children:"Nixpkgs is a collection of over 80,000 software packages that can be installed with the Nix package manager. It also implements NixOS, a purely-functional Linux distribution."}),contribution:(0,u.jsx)("p",{children:"When I was trying out the nixpkgs, I have tried to bump .NET Core to the latest version. My changes haven't been accepted as they required bumping of multiple more packages that depended upon the .NET Core."}),repoURL:"https://github.com/NixOS/nixpkgs"},{title:"Darcula",description:(0,u.jsx)("p",{children:"A theme for Visual Studio Code based on Darcula theme from Jetbrains IDEs."}),contribution:(0,u.jsx)("p",{children:"I have contributed support for diff files, though the project doesn't seem to be live anymore, so it hasn't been accepted as of now."}),repoURL:"https://github.com/rokoroku/vscode-theme-darcula"},{title:"Packit",description:(0,u.jsx)("p",{children:"An open source project aiming to ease the integration of your project with Fedora Linux, CentOS Stream and other distributions."}),contribution:(0,u.jsxs)("p",{children:["Have a look at my"," ",(0,u.jsx)("a",{href:"https://github.com/search?q=is%3Apr%20author%3Amfocko%20org%3Apackit&type=pullrequests",target:"_blank",children:"pull requests"}),"."]}),repoURL:"https://github.com/packit"},{title:"Snitch",description:(0,u.jsx)(u.Fragment,{children:(0,u.jsx)("p",{children:"Language agnostic tool that collects TODOs in the source code and reports them as Issues."})}),contribution:(0,u.jsxs)("ul",{children:[(0,u.jsx)("li",{children:"Environment variable support for self-hosted GitLab instances"}),(0,u.jsx)("li",{children:"GitLab support"})]}),repoURL:"https://github.com/tsoding/snitch"},{title:"Karel the Robot",description:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsxs)("p",{children:["Karel the robot is in general an educational programming language for beginners, created by ",(0,u.jsx)("i",{children:"Richard E. Pattis"}),". This is implementation of ",(0,u.jsx)("i",{children:"Karel the Robot"})," for"," ",(0,u.jsx)("i",{children:"C programming language"}),"."]}),(0,u.jsxs)("p",{children:["This project is used for educational purposes at"," ",(0,u.jsx)("a",{target:"_blank",href:"https://fei.tuke.sk",children:"TUKE"}),"."]})]}),contribution:(0,u.jsx)("p",{children:"I have contributed some refactoring tips to the author of the library."}),repoURL:"https://git.kpi.fei.tuke.sk/kpi/karel-the-robot"}],m="Contributions",f="Many of my contributions to open-source projects.";function x(){return(0,u.jsx)(o.Z,{title:m,description:f,children:(0,u.jsxs)("main",{className:"container container--fluid margin-vert--lg",children:[(0,u.jsx)("h1",{children:m}),(0,u.jsx)("p",{children:f}),(0,u.jsx)("div",{className:"row",children:g.map((e=>(0,u.jsx)(b,{...e},e.project)))})]})})}},86010:(e,t,i)=>{function r(e){var t,i,o="";if("string"==typeof e||"number"==typeof e)o+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;to});const o=function(){for(var e,t,i=0,o="";i{i.r(t),i.d(t,{default:()=>x});var r=i(67294),o=i(80647),s=i(86010);const n="card_n_Wj",a="contributionsContainer_vdAK",l="buttons_UAd1";var c,h;function d(){return d=Object.assign?Object.assign.bind():function(e){for(var t=1;t{let{title:t,titleId:i,...o}=e;return r.createElement("svg",d({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24","aria-labelledby":i},o),t?r.createElement("title",{id:i},t):null,c||(c=r.createElement("path",{fill:"none",d:"M0 0h24v24H0z"})),h||(h=r.createElement("path",{d:"M13 21v2.5l-3-2-3 2V21h-.5A3.5 3.5 0 0 1 3 17.5V5a3 3 0 0 1 3-3h14a1 1 0 0 1 1 1v17a1 1 0 0 1-1 1h-7zm0-2h6v-3H6.5a1.5 1.5 0 0 0 0 3H7v-2h6v2zm6-5V4H6v10.035A3.53 3.53 0 0 1 6.5 14H19zM7 5h2v2H7V5zm0 3h2v2H7V8zm0 3h2v2H7v-2z"})))};var u=i(85893);const b=e=>{let{title:t,description:i,contribution:r,repoURL:o}=e;return(0,u.jsx)("div",{className:"col col--12",children:(0,u.jsxs)("div",{className:(0,s.Z)("card",n),children:[(0,u.jsx)("div",{className:"card__header",children:(0,u.jsx)("h2",{children:t})}),(0,u.jsx)("div",{className:"card__body",children:(0,u.jsxs)("div",{className:"row",children:[(0,u.jsxs)("div",{className:"col col--6",children:[(0,u.jsx)("h6",{children:"Description"}),i]}),(0,u.jsxs)("div",{className:(0,s.Z)("col col--6",a),children:[(0,u.jsx)("h6",{children:"Contribution"}),r]})]})}),(0,u.jsx)("div",{className:"card__footer",children:(0,u.jsx)("div",{className:l,children:(0,u.jsxs)("a",{href:o,target:"_blank",className:"button button--secondary button--outline",children:[(0,u.jsx)("span",{className:"button__icon",children:(0,u.jsx)(p,{})}),"See repository"]})})})]})})},g=[{title:"tmt",description:(0,u.jsx)("p",{children:"The `tmt` tool provides a user-friendly way to work with tests. You can comfortably create new tests, safely and easily run tests across different environments, review test results, debug test code and enable tests in the CI using a consistent and concise config."}),contribution:(0,u.jsx)("p",{children:"Just a smallish contribution to the docs related to the changes implemented on the Packit side."}),repoURL:"https://github.com/teemtee/tmt"},{title:"Fedora Infrastructure Ansible",description:(0,u.jsx)("p",{children:"Collection of Ansible playbooks that powers the Fedora Infrastructure."}),contribution:(0,u.jsx)("p",{children:"I have adjusted the groups in the Bodhi playbooks after Packit has been granted the privileges to propose updates without restrictions."}),repoURL:"https://pagure.io/fedora-infra/ansible"},{title:"Bodhi",description:(0,u.jsx)("p",{children:"Bodhi is a web-system that facilitates the process of publishing updates for a Fedora-based software distribution."}),contribution:(0,u.jsx)("p",{children:"I have adjusted the client, so that it doesn't show secrets in terminal when you log in to the Bodhi via browser."}),repoURL:"https://github.com/fedora-infra/bodhi"},{title:"Gluetool Modules Collection",description:(0,u.jsxs)("p",{children:["Modules for ",(0,u.jsx)("code",{children:"gluetool"})," \u2014 a command line centric framework usable for glueing modules into a pipeline."]}),contribution:(0,u.jsxs)("ul",{children:[(0,u.jsx)("li",{children:"I have proposed a possible implementation of git merging that was later on extended."}),(0,u.jsx)("li",{children:"I have tried to help out with Copr module after they deprecated older version of their API."})]}),repoURL:"https://gitlab.com/testing-farm/gluetool-modules"},{title:"Pagure",description:(0,u.jsx)("p",{children:"Pagure is a git-centered forge, python based using pygit2."}),contribution:(0,u.jsx)("p",{children:"I have added an API endpoint for reopening pull requests."}),repoURL:"https://pagure.io/pagure"},{title:"Copr",description:(0,u.jsxs)("p",{children:["RPM build system - upstream for"," ",(0,u.jsx)("a",{target:"_blank",href:"https://copr.fedorainfracloud.org/",children:"Copr"}),"."]}),contribution:(0,u.jsxs)("ul",{children:[(0,u.jsx)("li",{children:"Supporting external repositories for custom SRPM build method."}),(0,u.jsxs)("li",{children:["Allowing admins of Copr repositories to build without the need to ask for explicit ",(0,u.jsx)("code",{children:"builder"})," permissions."]})]}),repoURL:"https://github.com/fedora-copr/copr"},{title:"python-gitlab",description:(0,u.jsx)("p",{children:"A python wrapper for the GitLab API."}),contribution:(0,u.jsxs)("p",{children:["I have contributed support for the ",(0,u.jsx)("code",{children:"merge_ref"})," on merge requests that hasn't been supported, yet it was present in the GitLab API."]}),repoURL:"https://github.com/python-gitlab/python-gitlab"},{title:"PatternFly React",description:(0,u.jsx)("p",{children:"A set of React components for the PatternFly project."}),contribution:(0,u.jsx)("p",{children:"When working on Packit Dashboard, I have spotted smaller bugs that were present in this project and fixed them upstream to provide better experience for our users."}),repoURL:"https://github.com/patternfly/patternfly-react"},{title:"Fira Code",description:(0,u.jsx)("p",{children:"Free monospaced font with programming ligatures."}),contribution:(0,u.jsxs)("p",{children:["I have set up a GitHub Action for building the font on each push to the default branch allowing users to install ",(0,u.jsx)("i",{children:"bleeding edge"})," version of the font."]}),repoURL:"https://github.com/tonsky/FiraCode"},{title:"nixpkgs",description:(0,u.jsx)("p",{children:"Nixpkgs is a collection of over 80,000 software packages that can be installed with the Nix package manager. It also implements NixOS, a purely-functional Linux distribution."}),contribution:(0,u.jsx)("p",{children:"When I was trying out the nixpkgs, I have tried to bump .NET Core to the latest version. My changes haven't been accepted as they required bumping of multiple more packages that depended upon the .NET Core."}),repoURL:"https://github.com/NixOS/nixpkgs"},{title:"Darcula",description:(0,u.jsx)("p",{children:"A theme for Visual Studio Code based on Darcula theme from Jetbrains IDEs."}),contribution:(0,u.jsx)("p",{children:"I have contributed support for diff files, though the project doesn't seem to be live anymore, so it hasn't been accepted as of now."}),repoURL:"https://github.com/rokoroku/vscode-theme-darcula"},{title:"Packit",description:(0,u.jsx)("p",{children:"An open source project aiming to ease the integration of your project with Fedora Linux, CentOS Stream and other distributions."}),contribution:(0,u.jsxs)("p",{children:["Have a look at my"," ",(0,u.jsx)("a",{href:"https://github.com/search?q=is%3Apr%20author%3Amfocko%20org%3Apackit&type=pullrequests",target:"_blank",children:"pull requests"}),"."]}),repoURL:"https://github.com/packit"},{title:"Snitch",description:(0,u.jsx)(u.Fragment,{children:(0,u.jsx)("p",{children:"Language agnostic tool that collects TODOs in the source code and reports them as Issues."})}),contribution:(0,u.jsxs)("ul",{children:[(0,u.jsx)("li",{children:"Environment variable support for self-hosted GitLab instances"}),(0,u.jsx)("li",{children:"GitLab support"})]}),repoURL:"https://github.com/tsoding/snitch"},{title:"Karel the Robot",description:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsxs)("p",{children:["Karel the robot is in general an educational programming language for beginners, created by ",(0,u.jsx)("i",{children:"Richard E. Pattis"}),". This is implementation of ",(0,u.jsx)("i",{children:"Karel the Robot"})," for ",(0,u.jsx)("i",{children:"C programming language"}),"."]}),(0,u.jsxs)("p",{children:["This project is used for educational purposes at"," ",(0,u.jsx)("a",{target:"_blank",href:"https://fei.tuke.sk",children:"TUKE"}),"."]})]}),contribution:(0,u.jsx)("p",{children:"I have contributed some refactoring tips to the author of the library."}),repoURL:"https://git.kpi.fei.tuke.sk/kpi/karel-the-robot"}],m="Contributions",f="Many of my contributions to open-source projects.";function x(){return(0,u.jsx)(o.Z,{title:m,description:f,children:(0,u.jsxs)("main",{className:"container container--fluid margin-vert--lg",children:[(0,u.jsx)("h1",{children:m}),(0,u.jsx)("p",{children:f}),(0,u.jsx)("div",{className:"row",children:g.map((e=>(0,u.jsx)(b,{...e},e.project)))})]})})}},86010:(e,t,i)=>{function r(e){var t,i,o="";if("string"==typeof e||"number"==typeof e)o+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;to});const o=function(){for(var e,t,i=0,o="";i{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var i=t(85893),s=t(11151);const r={title:"2nd week of Advent of Code '22 in Rust",description:"Surviving second week in Rust.",date:"2022-12-25T23:15",slug:"aoc-2022/2nd-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},o=void 0,a={permalink:"/blog/aoc-2022/2nd-week",editUrl:"https://github.com/mfocko/blog/tree/main/blog/aoc-2022/02-week-2.md",source:"@site/blog/aoc-2022/02-week-2.md",title:"2nd week of Advent of Code '22 in Rust",description:"Surviving second week in Rust.",date:"2022-12-25T23:15:00.000Z",formattedDate:"December 25, 2022",tags:[{label:"advent-of-code",permalink:"/blog/tags/advent-of-code"},{label:"advent-of-code-2022",permalink:"/blog/tags/advent-of-code-2022"},{label:"rust",permalink:"/blog/tags/rust"}],readingTime:20.875,hasTruncateMarker:!0,authors:[{name:"Matej Focko",email:"me+blog@mfocko.xyz",title:"a.k.a. @mf",url:"https://gitlab.com/mfocko",imageURL:"https://github.com/mfocko.png",key:"mf"}],frontMatter:{title:"2nd week of Advent of Code '22 in Rust",description:"Surviving second week in Rust.",date:"2022-12-25T23:15",slug:"aoc-2022/2nd-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Sort the matrix diagonally",permalink:"/blog/leetcode/sort-diagonally"},nextItem:{title:"1st week of Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/1st-week"}},d={authorsImageUrls:[void 0]},l=[{value:"Day 8: Treetop Tree House",id:"day-8-treetop-tree-house",level:2},{value:"Swapping indices",id:"swapping-indices",level:4},{value:"Indexing Vec",id:"indexing-vec",level:4},{value:"Issues",id:"issues",level:5},{value:"Checking bounds",id:"checking-bounds",level:4},{value:"Solution",id:"solution",level:3},{value:"Day 9: Rope Bridge",id:"day-9-rope-bridge",level:2},{value:"Solution",id:"solution-1",level:3},{value:"Day 10: Cathode-Ray Tube",id:"day-10-cathode-ray-tube",level:2},{value:"What does that mean though?",id:"what-does-that-mean-though",level:6},{value:"Solution",id:"solution-2",level:3},{value:"Day 11: Monkey in the Middle",id:"day-11-monkey-in-the-middle",level:2},{value:"Solution",id:"solution-3",level:3},{value:"Day 12: Hill Climbing Algorithm",id:"day-12-hill-climbing-algorithm",level:2},{value:"Solution",id:"solution-4",level:3},{value:"Day 13: Distress Signal",id:"day-13-distress-signal",level:2},{value:"Solution",id:"solution-5",level:3},{value:"Day 14: Regolith Reservoir",id:"day-14-regolith-reservoir",level:2},{value:"Solution",id:"solution-6",level:3},{value:"Post Mortem",id:"post-mortem",level:2},{value:"Indexing",id:"indexing",level:3},{value:"Cause of the problem",id:"cause-of-the-problem",level:4}];function c(e){const n={a:"a",admonition:"admonition",annotation:"annotation",blockquote:"blockquote",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",h5:"h5",h6:"h6",li:"li",math:"math",mdxAdmonitionTitle:"mdxAdmonitionTitle",mi:"mi",mn:"mn",mo:"mo",mrow:"mrow",p:"p",pre:"pre",semantics:"semantics",span:"span",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.p,{children:["Let's go through the second week of ",(0,i.jsx)(n.a,{href:"https://adventofcode.com",children:(0,i.jsx)(n.em,{children:"Advent of Code"})})," in Rust."]}),"\n",(0,i.jsx)(n.h2,{id:"day-8-treetop-tree-house",children:(0,i.jsx)(n.a,{href:"https://adventofcode.com/2022/day/8",children:"Day 8: Treetop Tree House"})}),"\n",(0,i.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,i.jsx)(n.p,{children:"We get a forest and we want to know how many trees are visible from the outside.\nApart from that we want to find the best view."})}),"\n",(0,i.jsxs)(n.p,{children:["Nothing interesting. We are moving around 2D map though. And indexing can get a\nbit painful when doing so, let's refactor it a bit ;) During the preparation for\nthe AoC, I have written ",(0,i.jsx)(n.code,{children:"Vector2D"})," and now it's time to extend it with indexing\nof ",(0,i.jsx)(n.code,{children:"Vec"})," of ",(0,i.jsx)(n.code,{children:"Vec"}),"s. In my solution I was manipulating with indices in the following\nway:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"swapping them"}),"\n",(0,i.jsxs)(n.li,{children:["checking whether they are correct indices for the ",(0,i.jsx)(n.code,{children:"Vec>"})]}),"\n",(0,i.jsxs)(n.li,{children:["indexing ",(0,i.jsx)(n.code,{children:"Vec>"})," with them"]}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{type:"caution",children:(0,i.jsxs)(n.p,{children:["I'm getting familiar with Rust and starting to \u201cabuse\u201d it\u2026 While doing so, I'm\nalso uncovering some \u201cfeatures\u201d that I don't really like. Therefore I will mark\nall of my rants with ",(0,i.jsx)(n.em,{children:"thicc"})," ",(0,i.jsx)(n.strong,{children:"\xab\u21af\xbb"})," mark and will try to \u201clock\u201d them into their\nown \u201cbox of hell\u201d."]})}),"\n",(0,i.jsx)(n.h4,{id:"swapping-indices",children:"Swapping indices"}),"\n",(0,i.jsx)(n.p,{children:"Relatively simple implementation, just take the values, swap them and return new\nvector."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"impl Vector2D {\n pub fn swap(&self) -> Self {\n Self {\n x: self.y,\n y: self.x,\n }\n }\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Pretty straight-forward implementation, but let's talk about the ",(0,i.jsx)(n.code,{children:"T: Copy"}),". We\nneed to use it, since we are returning a ",(0,i.jsx)(n.strong,{children:"new"})," vector, with swapped ",(0,i.jsx)(n.strong,{children:"values"}),".\nIf we had values that cannot be copied, the only thing we could do, would be a\nvector of references (and it would also introduce a lifetime, to which we'll get\nlater on). This is pretty similar with the operations on sets from the first week."]}),"\n",(0,i.jsxs)(n.h4,{id:"indexing-vec",children:["Indexing ",(0,i.jsx)(n.code,{children:"Vec"})]}),"\n",(0,i.jsx)(n.p,{children:"I will start with the indexing, cause bound-checking is a bit more\u2026 complicated\nthan I would like to."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"pub fn index<'a, T, U>(v: &'a [Vec], idx: &Vector2D) -> &'a U\nwhere\n usize: TryFrom,\n >::Error: Debug,\n T: Copy,\n{\n let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());\n &v[y][x]\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Let's talk about this mess\u2026 Body of the function is probably the most easy part\nand should not be hard to understand, we just take the ",(0,i.jsx)(n.code,{children:"x"})," and ",(0,i.jsx)(n.code,{children:"y"})," and convert\nthem both to ",(0,i.jsx)(n.code,{children:"usize"})," type that can be used later on for indexing."]}),"\n",(0,i.jsxs)(n.p,{children:["The type signature of the function is where the fun is at ","\ud83d\ude09"," We are trying\nto convert unknown type to ",(0,i.jsx)(n.code,{children:"usize"}),", so we must bound the ",(0,i.jsx)(n.code,{children:"T"})," as a type that can\nbe converted to ",(0,i.jsx)(n.code,{children:"usize"}),", that's how we got ",(0,i.jsx)(n.code,{children:"usize: TryFrom"})," which basically\nsays that ",(0,i.jsx)(n.code,{children:"usize"})," must implement ",(0,i.jsx)(n.code,{children:"TryFrom"})," trait and therefore allows us to\nconvert the indices to actual ",(0,i.jsx)(n.code,{children:"usize"})," indices. Using ",(0,i.jsx)(n.code,{children:".unwrap()"})," also forces us\nto bound the error that can occur when converting ",(0,i.jsx)(n.code,{children:"T"})," into ",(0,i.jsx)(n.code,{children:"usize"}),", that's how\nwe get ",(0,i.jsx)(n.code,{children:">::Error: Debug"})," which loosely means"]}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:["error during conversion of ",(0,i.jsx)(n.code,{children:"T"})," into ",(0,i.jsx)(n.code,{children:"usize"})," must implement ",(0,i.jsx)(n.code,{children:"Debug"}),",\ni.e. can be printed in some way or other"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"T: Copy"})," is required by ",(0,i.jsx)(n.code,{children:".try_into()"})," which takes ",(0,i.jsx)(n.code,{children:"T"})," by-value."]}),"\n",(0,i.jsx)(n.p,{children:"And now we are left only with the first line of the definition."}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"Skilled Rustaceans might notice that this implementation is rather flaky and can\nbreak in multiple places at once. I'll get back to it\u2026"})}),"\n",(0,i.jsx)(n.p,{children:"Let's split it in multiple parts:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"v: &'a [Vec]"})," represents the 2D ",(0,i.jsx)(n.code,{children:"Vec"}),", we are indexing, ",(0,i.jsx)(n.code,{children:"Vec"})," implements\n",(0,i.jsx)(n.code,{children:"Slice"})," trait and ",(0,i.jsx)(n.em,{children:"clippy"})," recommends using ",(0,i.jsx)(n.code,{children:"&[T]"})," to ",(0,i.jsx)(n.code,{children:"&Vec"}),", exact details\nare unknown to me"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"idx: &Vector2D"})," represents the ",(0,i.jsx)(n.em,{children:"indices"})," which we use, we take them by\nreference to avoid an unnecessary copy"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"-> &'a U"})," means that we are returning a ",(0,i.jsx)(n.em,{children:"reference"})," to some value of type ",(0,i.jsx)(n.code,{children:"U"}),".\nNow the question is what does the ",(0,i.jsx)(n.code,{children:"'a"})," mean, we can also see it as a generic\ntype declared along ",(0,i.jsx)(n.code,{children:"T"})," and ",(0,i.jsx)(n.code,{children:"U"}),". And the answer is ",(0,i.jsx)(n.em,{children:"relatively"})," simple, ",(0,i.jsx)(n.code,{children:"'a"}),"\nrepresents a ",(0,i.jsx)(n.em,{children:"lifetime"}),". We take the ",(0,i.jsx)(n.code,{children:"v"})," by a reference and return a reference,\nborrow checker validates all of the ",(0,i.jsx)(n.em,{children:"borrows"})," (or references), so we need to\nspecify that our returned value has ",(0,i.jsx)(n.em,{children:"the same lifetime"})," as the vector we have\ntaken by a reference, i.e. returned reference must live at least as long as the\n",(0,i.jsx)(n.code,{children:"v"}),". This way we can \u201cbe sure\u201d that the returned reference is valid."]}),"\n"]}),"\n",(0,i.jsx)(n.h5,{id:"issues",children:"Issues"}),"\n",(0,i.jsxs)(n.p,{children:["First issue that our implementation has is the fact that we cannot get a mutable\nreference out of that function. This could be easily resolved by introducing new\nfunction, e.g. ",(0,i.jsx)(n.code,{children:"index_mut"}),". Which I have actually done while writing this part:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"pub fn index_mut<'a, T, U>(v: &'a mut [Vec], idx: &Vector2D) -> &'a mut U\nwhere\n usize: TryFrom,\n >::Error: Debug,\n T: Copy,\n{\n let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());\n &mut v[y][x]\n}\n"})}),"\n",(0,i.jsxs)(n.admonition,{type:"caution",children:[(0,i.jsxs)(n.mdxAdmonitionTitle,{children:[(0,i.jsx)(n.strong,{children:"\xab\u21af\xbb"})," Why can't we use one function?"]}),(0,i.jsxs)(n.p,{children:["When we consider a ",(0,i.jsx)(n.code,{children:"Vec"}),", we don't need to consider containers as ",(0,i.jsx)(n.code,{children:"T"}),", Rust\nimplements indexing as traits ",(0,i.jsx)(n.code,{children:"Index"})," and ",(0,i.jsx)(n.code,{children:"IndexMut"})," that do the dirty work\nbehind syntactic sugar of ",(0,i.jsx)(n.code,{children:"container[idx]"}),"."]}),(0,i.jsxs)(n.p,{children:["However, implementing of traits is not allowed for ",(0,i.jsx)(n.em,{children:"external"})," types, i.e. types\nthat you haven't defined yourself. This means that you can implement indexing\nover containers that you have implemented yourself, but you cannot use your own\ntypes for indexing \u201cbuilt-in\u201d types."]}),(0,i.jsxs)(n.p,{children:["Another part of this rabbit hole is trait ",(0,i.jsx)(n.code,{children:"SliceIndex"})," that is of a relevance\nbecause of"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"impl Index for [T]\nwhere\n I: SliceIndex<[T]>\n\nimpl Index for Vec\nwhere\n I: SliceIndex<[T]>,\n A: Allocator\n\nimpl Index for [T; N]\nwhere\n [T]: Index\n"})}),(0,i.jsxs)(n.p,{children:["In other words, if your type implements ",(0,i.jsx)(n.code,{children:"SliceIndex"})," trait, it can be used\nfor indexing. As of now, this trait has all of its required methods experimental\nand is marked as ",(0,i.jsx)(n.code,{children:"unsafe"}),"."]})]}),"\n",(0,i.jsxs)(n.p,{children:["Another problem is a requirement for indexing either ",(0,i.jsx)(n.code,{children:"[Vec]"})," or ",(0,i.jsx)(n.code,{children:"Vec>"}),".\nThis requirement could be countered by removing inner type ",(0,i.jsx)(n.code,{children:"Vec"})," and constraining\nit by a trait ",(0,i.jsx)(n.code,{children:"Index"})," (or ",(0,i.jsx)(n.code,{children:"IndexMut"})," respectively) in a following way"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"pub fn index<'a, C, T>(v: &'a [C], idx: &Vector2D) -> &'a C::Output\nwhere\n usize: TryFrom,\n >::Error: Debug,\n T: Copy,\n C: Index\n{\n let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());\n &v[y][x]\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Given this, we can also give a more meaningful typename for indexing type, such\nas ",(0,i.jsx)(n.code,{children:"I"}),"."]}),"\n",(0,i.jsx)(n.h4,{id:"checking-bounds",children:"Checking bounds"}),"\n",(0,i.jsxs)(n.p,{children:["Now we can get to the boundary checks, it is very similar, but a more\u2026 dirty.\nFirst approach that came up was to convert the indices in ",(0,i.jsx)(n.code,{children:"Vector2D"})," to ",(0,i.jsx)(n.code,{children:"usize"}),",\nbut when you add the indices up, e.g. when checking the neighbors, you can end\nup with negative values which, unlike in C++, causes an error (instead of underflow\nthat you can use to your advantage; you can easily guess how)."]}),"\n",(0,i.jsx)(n.p,{children:"So how can we approach this then? Well\u2026 we will convert the bounds instead of\nthe indices and that lead us to:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"pub fn in_range(v: &[Vec], idx: &Vector2D) -> bool\nwhere\n usize: TryInto,\n >::Error: Debug,\n T: PartialOrd + Copy,\n{\n idx.y >= 0.try_into().unwrap()\n && idx.y < v.len().try_into().unwrap()\n && idx.x >= 0.try_into().unwrap()\n && idx.x\n < v[TryInto::::try_into(idx.y).unwrap()]\n .len()\n .try_into()\n .unwrap()\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["You can tell that it's definitely a shitty code. Let's improve it now! We will\nget back to the original idea, but do it better. We know that we cannot convert\nnegative values into ",(0,i.jsx)(n.code,{children:"usize"}),", ",(0,i.jsx)(n.strong,{children:"but"})," we also know that conversion like that\nreturns a ",(0,i.jsx)(n.code,{children:"Result"})," which we can use to our advantage."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"pub fn in_range(v: &[Vec], idx: &Vector2D) -> bool\nwhere\n T: Copy,\n usize: TryFrom,\n{\n usize::try_from(idx.y)\n .and_then(|y| usize::try_from(idx.x).map(|x| y < v.len() && x < v[y].len()))\n .unwrap_or(false)\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"Result"})," is a type similar to ",(0,i.jsx)(n.code,{children:"Either"})," in Haskell and it allows us to chain\nmultiple operations on correct results or propagate the original error without\ndoing anything. Let's dissect it one-by-one."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"try_from"})," is a method implemented in ",(0,i.jsx)(n.code,{children:"TryFrom"})," trait, that allows you to convert\ntypes and either successfully convert them or fail (with a reasonable error). This\nmethod returns ",(0,i.jsx)(n.code,{children:"Result"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["We call ",(0,i.jsx)(n.code,{children:"and_then"})," on that ",(0,i.jsx)(n.em,{children:"result"}),", let's have a look at the type signature of\n",(0,i.jsx)(n.code,{children:"and_then"}),", IMO it explains more than enough:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"pub fn and_then(self, op: F) -> Result\nwhere\n F: FnOnce(T) -> Result\n"})}),"\n",(0,i.jsx)(n.p,{children:"OK\u2026 So it takes the result and a function and returns another result with\ndifferent value and different error. However we can see that the function, which\nrepresents an operation on a result, takes just the value, i.e. it doesn't care\nabout any previous error. To make it short:"}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"and_then"})," allows us to run an operation, which can fail, on the correct result"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["We parsed a ",(0,i.jsx)(n.code,{children:"y"})," index and now we try to convert the ",(0,i.jsx)(n.code,{children:"x"})," index with ",(0,i.jsx)(n.code,{children:"try_from"}),"\nagain, but on that result we use ",(0,i.jsx)(n.code,{children:"map"})," rather than ",(0,i.jsx)(n.code,{children:"and_then"}),", why would that be?"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"pub fn map(self, op: F) -> Result\nwhere\n F: FnOnce(T) -> U\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Huh\u2026 ",(0,i.jsx)(n.code,{children:"map"})," performs an operation that ",(0,i.jsx)(n.strong,{children:"cannot"})," fail. And finally we use\n",(0,i.jsx)(n.code,{children:"unwrap_or"})," which takes the value from result, or in case of an error returns the\ndefault that we define."]}),"\n",(0,i.jsxs)(n.p,{children:["How does this work then? If ",(0,i.jsx)(n.code,{children:"y"})," is negative, the conversion fails and the error\npropagates all the way to ",(0,i.jsx)(n.code,{children:"unwrap_or"}),", if ",(0,i.jsx)(n.code,{children:"y"})," can be a correct ",(0,i.jsx)(n.code,{children:"usize"})," value, then\nwe do the same with ",(0,i.jsx)(n.code,{children:"x"}),". If ",(0,i.jsx)(n.code,{children:"x"})," is negative, we propagate the error as with ",(0,i.jsx)(n.code,{children:"y"}),",\nand if it's not, then we check whether it exceeds the higher bounds or not."]}),"\n",(0,i.jsx)(n.h3,{id:"solution",children:"Solution"}),"\n",(0,i.jsx)(n.p,{children:"Relatively simple, you just need follow the rules and not get too smart, otherwise\nit will get back at you."}),"\n",(0,i.jsx)(n.h2,{id:"day-9-rope-bridge",children:(0,i.jsx)(n.a,{href:"https://adventofcode.com/2022/day/9",children:"Day 9: Rope Bridge"})}),"\n",(0,i.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,i.jsx)(n.p,{children:"We get a rope with knots and we want to track how many different positions are\nvisited with the rope's tail."})}),"\n",(0,i.jsx)(n.p,{children:"By this day, I have come to a conclusion that current skeleton for each day\ngenerates a lot of boilerplate. And even though it can be easily copied, it's\njust a waste of space and unnecessary code. Let's \u201csimplify\u201d this (on one end\nwhile creating monster on the other end). I've gone through what we need in the\npreparations for the AoC. Let's sum up our requirements:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"parsing"}),"\n",(0,i.jsx)(n.li,{children:"part 1 & 2"}),"\n",(0,i.jsx)(n.li,{children:"running on sample / input"}),"\n",(0,i.jsx)(n.li,{children:"tests"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Parsing and implementation of both parts is code that changes each day and we\ncannot do anything about it. However running and testing can be simplified!"}),"\n",(0,i.jsxs)(n.p,{children:["Let's introduce and export a new module ",(0,i.jsx)(n.code,{children:"solution"})," that will take care of all of\nthis. We will start by introducing a trait for each day."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"pub trait Solution {\n fn parse_input>(pathname: P) -> Input;\n\n fn part_1(input: &Input) -> Output;\n fn part_2(input: &Input) -> Output;\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["This does a lot of work for us already, we have defined a trait and for each day\nwe will create a structure representing a specific day. That structure will also\nimplement the ",(0,i.jsx)(n.code,{children:"Solution"})," trait."]}),"\n",(0,i.jsxs)(n.p,{children:["Now we need to get rid of the boilerplate, we can't get rid of the ",(0,i.jsx)(n.code,{children:"main"})," function,\nbut we can at least move out the functionality."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:'fn run(type_of_input: &str) -> Result<()>\nwhere\n Self: Sized,\n{\n tracing_subscriber::fmt()\n .with_env_filter(EnvFilter::from_default_env())\n .with_target(false)\n .with_file(true)\n .with_line_number(true)\n .without_time()\n .compact()\n .init();\n color_eyre::install()?;\n\n let input = Self::parse_input(format!("{}s/{}.txt", type_of_input, Self::day()));\n\n info!("Part 1: {}", Self::part_1(&input));\n info!("Part 2: {}", Self::part_2(&input));\n\n Ok(())\n}\n\nfn main() -> Result<()>\nwhere\n Self: Sized,\n{\n Self::run("input")\n}\n'})}),"\n",(0,i.jsxs)(n.p,{children:["This is all part of the ",(0,i.jsx)(n.code,{children:"Solution"})," trait, which can implement methods while being\ndependent on what is provided by the implementing types. In this case, we just\nneed to bound the ",(0,i.jsx)(n.code,{children:"Output"})," type to implement ",(0,i.jsx)(n.code,{children:"Display"})," that is necessary for the\n",(0,i.jsx)(n.code,{children:"info!"})," and format string there."]}),"\n",(0,i.jsxs)(n.p,{children:["Now we can get to first of the nasty things we are going to do\u2026 And it is the\n",(0,i.jsx)(n.code,{children:"day()"})," method that you can see being used when constructing path to the input\nfile. That method will generate a name of the file, e.g. ",(0,i.jsx)(n.code,{children:"day01"})," and we know that\nwe can ",(0,i.jsx)(n.em,{children:"somehow"})," deduce it from the structure name, given we name it reasonably."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:'fn day() -> String {\n let mut day = String::from(type_name::().split("::").next().unwrap());\n day.make_ascii_lowercase();\n\n day.to_string()\n}\n'})}),"\n",(0,i.jsxs)(n.admonition,{type:"caution",children:[(0,i.jsx)(n.mdxAdmonitionTitle,{children:(0,i.jsx)(n.code,{children:"type_name"})}),(0,i.jsx)(n.p,{children:"This feature is still experimental and considered to be internal, it is not\nadvised to use it any production code."})]}),"\n",(0,i.jsxs)(n.p,{children:["And now we can get to the nastiest stuff ","\ud83d\ude29"," We will ",(0,i.jsx)(n.strong,{children:"generate"})," the tests!"]}),"\n",(0,i.jsx)(n.p,{children:"We want to be able to generate tests for sample input in a following way:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"test_sample!(day_01, Day01, 42, 69);\n"})}),"\n",(0,i.jsx)(n.p,{children:"There's not much we can do, so we will write a macro to generate the tests for us."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:'#[macro_export]\nmacro_rules! test_sample {\n ($mod_name:ident, $day_struct:tt, $part_1:expr, $part_2:expr) => {\n #[cfg(test)]\n mod $mod_name {\n use super::*;\n\n #[test]\n fn test_part_1() {\n let sample =\n $day_struct::parse_input(&format!("samples/{}.txt", $day_struct::day()));\n assert_eq!($day_struct::part_1(&sample), $part_1);\n }\n\n #[test]\n fn test_part_2() {\n let sample =\n $day_struct::parse_input(&format!("samples/{}.txt", $day_struct::day()));\n assert_eq!($day_struct::part_2(&sample), $part_2);\n }\n }\n };\n}\n'})}),"\n",(0,i.jsxs)(n.p,{children:["We have used it in a similar way as macros in C/C++, one of the things that we\ncan use to our advantage is defining \u201ctype\u201d of the parameters for the macro. All\nparameters have their name prefixed with ",(0,i.jsx)(n.code,{children:"$"})," sign and you can define various \u201cforms\u201d\nof your macro. Let's go through it!"]}),"\n",(0,i.jsx)(n.p,{children:"We have following parameters:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"$mod_name"})," which represents the name for the module with tests, it is typed\nwith ",(0,i.jsx)(n.code,{children:"ident"})," which means that we want a valid identifier to be passed in."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"$day_struct"})," represents the structure that will be used for tests, it is typed\nwith ",(0,i.jsx)(n.code,{children:"tt"})," which represents a ",(0,i.jsx)(n.em,{children:"token tree"}),", in our case it is a type."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"$part_X"})," represents the expected output for the ",(0,i.jsx)(n.code,{children:"X"}),"th part and is of type ",(0,i.jsx)(n.code,{children:"expr"}),"\nwhich literally means an ",(0,i.jsx)(n.em,{children:"expression"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["Apart from that we need to use ",(0,i.jsx)(n.code,{children:"#[macro_export]"})," to mark the macro as exported\nfor usage outside of the module. Now our skeleton looks like:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:'use aoc_2022::*;\n\ntype Input = String;\ntype Output = String;\n\nstruct DayXX;\nimpl Solution for DayXX {\n fn parse_input>(pathname: P) -> Input {\n file_to_string(pathname)\n }\n\n fn part_1(input: &Input) -> Output {\n todo!()\n }\n\n fn part_2(input: &Input) -> Output {\n todo!()\n }\n}\n\nfn main() -> Result<()> {\n // DayXX::run("sample")\n DayXX::main()\n}\n\n// test_sample!(day_XX, DayXX, , );\n'})}),"\n",(0,i.jsx)(n.h3,{id:"solution-1",children:"Solution"}),"\n",(0,i.jsx)(n.p,{children:"Not much to talk about, it is relatively easy to simulate."}),"\n",(0,i.jsx)(n.h2,{id:"day-10-cathode-ray-tube",children:(0,i.jsx)(n.a,{href:"https://adventofcode.com/2022/day/10",children:"Day 10: Cathode-Ray Tube"})}),"\n",(0,i.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,i.jsx)(n.p,{children:"Emulating basic arithmetic operations on a CPU and drawing on CRT based on the\nCPU's accumulator."})}),"\n",(0,i.jsxs)(n.p,{children:["In this day I have discovered an issue with my design of the ",(0,i.jsx)(n.code,{children:"Solution"})," trait.\nAnd the issue is caused by different types of ",(0,i.jsx)(n.code,{children:"Output"})," for the part 1 and part 2."]}),"\n",(0,i.jsx)(n.p,{children:"Problem is relatively simple and consists of simulating a CPU, I have approached\nit in a following way:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"fn evaluate_instructions(instructions: &[Instruction], mut out: Output) -> Output {\n instructions\n .iter()\n .fold(State::new(), |state, instruction| {\n state.execute(instruction, &mut out)\n });\n\n out\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["We just take the instructions, we have some state of the CPU and we execute the\ninstructions one-by-one. Perfect usage of the ",(0,i.jsx)(n.code,{children:"fold"})," (or ",(0,i.jsx)(n.code,{children:"reduce"})," as you may know\nit from other languages)."]}),"\n",(0,i.jsxs)(n.p,{children:["You can also see that we have an ",(0,i.jsx)(n.code,{children:"Output"})," type, so the question is how can we fix\nthat problem. And the answer is very simple and ",(0,i.jsx)(n.em,{children:"functional"}),". Rust allows you to\nhave an ",(0,i.jsx)(n.code,{children:"enumeration"})," that can ",(0,i.jsx)(n.em,{children:"bear"})," some other values apart from the type itself."]}),"\n",(0,i.jsxs)(n.admonition,{type:"tip",children:[(0,i.jsxs)(n.p,{children:["We could've seen something like this with the ",(0,i.jsx)(n.code,{children:"Result"})," type that can be\ndefined as"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"enum Result {\n Ok(T),\n Err(E)\n}\n"})}),(0,i.jsx)(n.h6,{id:"what-does-that-mean-though",children:"What does that mean though?"}),(0,i.jsxs)(n.p,{children:["When we have an ",(0,i.jsx)(n.code,{children:"Ok"})," value, it has the result itself, and when we get an ",(0,i.jsx)(n.code,{children:"Err"}),"\nvalue, it has the error. This also allows us to handle ",(0,i.jsx)(n.em,{children:"results"})," in a rather\npretty way:"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:'match do_something(x) {\n Ok(y) => {\n println!("SUCCESS: {}", y);\n },\n Err(y) => {\n eprintln!("ERROR: {}", y);\n }\n}\n'})})]}),"\n",(0,i.jsx)(n.p,{children:"My solution has a following outline:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"fn execute(&self, i: &Instruction, output: &mut Output) -> State {\n // execute the instruction\n\n // collect results if necessary\n match output {\n Output::Part1(x) => self.execute_part_1(y, x),\n Output::Part2(x) => self.execute_part_2(y, x),\n }\n\n // return the obtained state\n new_state\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["You might think that it's a perfectly reasonable thing to do. Yes, ",(0,i.jsx)(n.strong,{children:"but"})," notice\nthat the ",(0,i.jsx)(n.code,{children:"match"})," statement doesn't ",(0,i.jsx)(n.em,{children:"collect"})," the changes in any way and also we\npass ",(0,i.jsx)(n.code,{children:"output"})," by ",(0,i.jsx)(n.code,{children:"&mut"}),", so it is shared across each ",(0,i.jsx)(n.em,{children:"iteration"})," of the ",(0,i.jsx)(n.code,{children:"fold"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["The dirty and ingenious thing is that ",(0,i.jsx)(n.code,{children:"x"}),"s are passed by ",(0,i.jsx)(n.code,{children:"&mut"})," too and therefore\nthey are directly modified by the helper functions. To sum it up and let it sit"]}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:["We are ",(0,i.jsx)(n.strong,{children:"collecting"})," the result ",(0,i.jsx)(n.strong,{children:"into"})," an ",(0,i.jsx)(n.strong,{children:"enumeration"})," that is ",(0,i.jsx)(n.strong,{children:"shared"}),"\nacross ",(0,i.jsx)(n.strong,{children:"all"})," iterations of ",(0,i.jsx)(n.code,{children:"fold"}),"."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"solution-2",children:"Solution"}),"\n",(0,i.jsxs)(n.p,{children:["Similar to ",(0,i.jsx)(n.em,{children:"Day 9"}),", but there are some technical details that can get you."]}),"\n",(0,i.jsx)(n.h2,{id:"day-11-monkey-in-the-middle",children:(0,i.jsx)(n.a,{href:"https://adventofcode.com/2022/day/11",children:"Day 11: Monkey in the Middle"})}),"\n",(0,i.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,i.jsx)(n.p,{children:"Simulation of monkeys throwing stuff around and measuring your stress levels\nwhile your stuff is being passed around."})}),"\n",(0,i.jsx)(n.p,{children:"I think I decided to use regular expressions here for the first time, cause\nparsing the input was a pain."}),"\n",(0,i.jsx)(n.p,{children:"Also I didn't expect to implement Euclidean algorithm in Rust\u2026"}),"\n",(0,i.jsx)(n.h3,{id:"solution-3",children:"Solution"}),"\n",(0,i.jsx)(n.p,{children:"Again, we're just running a simulation. Though I must admit it was very easy to\nmake a small technical mistakes that could affect the final results very late."}),"\n",(0,i.jsx)(n.h2,{id:"day-12-hill-climbing-algorithm",children:(0,i.jsx)(n.a,{href:"https://adventofcode.com/2022/day/12",children:"Day 12: Hill Climbing Algorithm"})}),"\n",(0,i.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,i.jsx)(n.p,{children:"Finding shortest path up the hill and also shortest path down to the ground while\nalso rolling down the hill\u2026"})}),"\n",(0,i.jsxs)(n.p,{children:["As I have said in the ",(0,i.jsx)(n.em,{children:"tl;dr"}),", we are looking for the shortest path, but the start\nand goal differ for the part 1 and 2. So I have decided to refactor my solution\nto a BFS algorithm that takes necessary parameters via functions:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"fn bfs(\n graph: &[Vec], start: &Position, has_edge: F, is_target: G\n) -> Option\nwhere\n F: Fn(&[Vec], &Position, &Position) -> bool,\n G: Fn(&[Vec], &Position) -> bool\n"})}),"\n",(0,i.jsxs)(n.p,{children:["We pass the initial vertex from the caller and everything else is left to the BFS\nalgorithm, based on the ",(0,i.jsx)(n.code,{children:"has_edge"})," and ",(0,i.jsx)(n.code,{children:"is_target"})," functions."]}),"\n",(0,i.jsxs)(n.p,{children:["This was easy! And that is not very usual in Rust once you want to pass around\nfunctions. ","\ud83d\udc40"]}),"\n",(0,i.jsx)(n.h3,{id:"solution-4",children:"Solution"}),"\n",(0,i.jsxs)(n.p,{children:["Looking for the shortest path\u2026 Must be Dijkstra, right? ",(0,i.jsx)(n.strong,{children:"Nope!"})," Half of the\nReddit got jebaited though. In all fairness, nothing stops you from implementing\nthe Dijkstra's algorithm for finding the shortest path, ",(0,i.jsx)(n.strong,{children:"but"})," if you know that\nall connected vertices are in a unit (actually ",(0,i.jsxs)(n.span,{className:"katex",children:[(0,i.jsx)(n.span,{className:"katex-mathml",children:(0,i.jsx)(n.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,i.jsxs)(n.semantics,{children:[(0,i.jsxs)(n.mrow,{children:[(0,i.jsx)(n.mi,{children:"d"}),(0,i.jsx)(n.mo,{children:"="}),(0,i.jsx)(n.mn,{children:"1"})]}),(0,i.jsx)(n.annotation,{encoding:"application/x-tex",children:"d = 1"})]})})}),(0,i.jsxs)(n.span,{className:"katex-html","aria-hidden":"true",children:[(0,i.jsxs)(n.span,{className:"base",children:[(0,i.jsx)(n.span,{className:"strut",style:{height:"0.6944em"}}),(0,i.jsx)(n.span,{className:"mord mathnormal",children:"d"}),(0,i.jsx)(n.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,i.jsx)(n.span,{className:"mrel",children:"="}),(0,i.jsx)(n.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,i.jsxs)(n.span,{className:"base",children:[(0,i.jsx)(n.span,{className:"strut",style:{height:"0.6444em"}}),(0,i.jsx)(n.span,{className:"mord",children:"1"})]})]})]}),") distance from each other,\nthen you know that running Dijkstra is equivalent to running BFS, only with worse\ntime complexity, because of the priority heap instead of the queue."]}),"\n",(0,i.jsx)(n.h2,{id:"day-13-distress-signal",children:(0,i.jsx)(n.a,{href:"https://adventofcode.com/2022/day/13",children:"Day 13: Distress Signal"})}),"\n",(0,i.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,i.jsx)(n.p,{children:"Processing packets with structured data from the distress signal."})}),"\n",(0,i.jsxs)(n.p,{children:["You can implement a lot of traits if you want to. It is ",(0,i.jsx)(n.em,{children:"imperative"})," to implement\nordering on the packets. I had a typo, so I also proceeded to implement a ",(0,i.jsx)(n.code,{children:"Display"}),"\ntrait for debugging purposes:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:'impl Display for Packet {\n fn fmt(&self, f: &mut std::fmt::Formatter<\'_>) -> std::fmt::Result {\n match self {\n Packet::Integer(x) => write!(f, "{x}"),\n Packet::List(lst) => write!(f, "[{}]", lst.iter().map(|p| format!("{p}")).join(",")),\n }\n }\n}\n'})}),"\n",(0,i.jsx)(n.h3,{id:"solution-5",children:"Solution"}),"\n",(0,i.jsx)(n.p,{children:"A lot of technical details\u2026 Parsing is nasty too\u2026"}),"\n",(0,i.jsx)(n.h2,{id:"day-14-regolith-reservoir",children:(0,i.jsx)(n.a,{href:"https://adventofcode.com/2022/day/14",children:"Day 14: Regolith Reservoir"})}),"\n",(0,i.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,i.jsx)(n.p,{children:"Let's simulate falling sand grain-by-grain."})}),"\n",(0,i.jsxs)(n.p,{children:["Again, both parts are relatively similar with minimal changes, so it is a good\nidea to refactor it a bit. Similar approach to the ",(0,i.jsx)(n.a,{href:"#day-12-hill-climbing-algorithm",children:"BFS above"}),". Also this is the\nfirst day where I ran into efficiency issues and had to redo my solution to speed\nit up just a bit."]}),"\n",(0,i.jsx)(n.h3,{id:"solution-6",children:"Solution"}),"\n",(0,i.jsx)(n.p,{children:"Tedious."}),"\n",(0,i.jsx)(n.h2,{id:"post-mortem",children:"Post Mortem"}),"\n",(0,i.jsx)(n.h3,{id:"indexing",children:"Indexing"}),"\n",(0,i.jsxs)(n.p,{children:["I was asked about the indexing after publishing the blog. And truly it is rather\ncomplicated topic, especially after releasing ",(0,i.jsx)(n.code,{children:"SliceIndex"})," trait. I couldn't\nleave it be, so I tried to implement the ",(0,i.jsx)(n.code,{children:"Index"})," and ",(0,i.jsx)(n.code,{children:"IndexMut"})," trait."]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["I have also mentioned that the ",(0,i.jsx)(n.code,{children:"SliceIndex"})," trait is ",(0,i.jsx)(n.code,{children:"unsafe"}),", but truth be told,\nonly ",(0,i.jsx)(n.em,{children:"unsafe"})," part are the 2 methods that are named ",(0,i.jsx)(n.code,{children:"*unchecked*"}),". Anyways, I will\nbe implementing the ",(0,i.jsx)(n.code,{children:"Index*"})," traits for now, rather than the ",(0,i.jsx)(n.code,{children:"SliceIndex"}),"."]})}),"\n",(0,i.jsx)(n.p,{children:"It's relatively straightforward\u2026"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"impl Index> for [C]\nwhere\n I: Copy + TryInto,\n >::Error: Debug,\n C: Index,\n{\n type Output = C::Output;\n\n fn index(&self, index: Vector2D) -> &Self::Output {\n let (x, y): (usize, usize) =\n (index.x.try_into().unwrap(), index.y.try_into().unwrap());\n &self[y][x]\n }\n}\n\nimpl IndexMut> for [C]\nwhere\n I: Copy + TryInto,\n >::Error: Debug,\n C: IndexMut,\n{\n fn index_mut(&mut self, index: Vector2D) -> &mut Self::Output {\n let (x, y): (usize, usize) =\n (index.x.try_into().unwrap(), index.y.try_into().unwrap());\n &mut self[y][x]\n }\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["We can see a lot of similarities to the implementation of ",(0,i.jsx)(n.code,{children:"index"})," and ",(0,i.jsx)(n.code,{children:"index_mut"}),"\nfunctions. In the end, they are 1:1, just wrapped in the trait that provides a\nsyntax sugar for ",(0,i.jsx)(n.code,{children:"container[idx]"}),"."]}),"\n",(0,i.jsxs)(n.admonition,{type:"note",children:[(0,i.jsxs)(n.p,{children:["I have also switched from using the ",(0,i.jsx)(n.code,{children:"TryFrom"})," to ",(0,i.jsx)(n.code,{children:"TryInto"})," trait, since it better\nmatches what we are using, the ",(0,i.jsx)(n.code,{children:".try_into"})," rather than ",(0,i.jsx)(n.code,{children:"usize::try_from"}),"."]}),(0,i.jsxs)(n.p,{children:["Also implementing ",(0,i.jsx)(n.code,{children:"TryFrom"})," automatically provides you with a ",(0,i.jsx)(n.code,{children:"TryInto"})," trait,\nsince it is relatively easy to implement. Just compare the following:"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"pub trait TryFrom: Sized {\n type Error;\n\n fn try_from(value: T) -> Result;\n}\n\npub trait TryInto: Sized {\n type Error;\n\n fn try_into(self) -> Result;\n}\n"})})]}),"\n",(0,i.jsxs)(n.p,{children:["OK, so we have our trait implemented, we should be able to use ",(0,i.jsx)(n.code,{children:"container[index]"}),",\nright? Yes\u2026 but actually no ","\ud83d\ude26"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"error[E0277]: the type `[std::vec::Vec]` cannot be indexed by `aoc_2022::Vector2D`\n --\x3e src/bin/day08.rs:26:18\n |\n26 | if trees[pos] > tallest {\n | ^^^ slice indices are of type `usize` or ranges of `usize`\n |\n = help: the trait `std::slice::SliceIndex<[std::vec::Vec]>` is not implemented for `aoc_2022::Vector2D`\n = note: required for `std::vec::Vec>` to implement `std::ops::Index>`\n\nerror[E0277]: the type `[std::vec::Vec]` cannot be indexed by `aoc_2022::Vector2D`\n --\x3e src/bin/day08.rs:30:28\n |\n30 | max(tallest, trees[pos])\n | ^^^ slice indices are of type `usize` or ranges of `usize`\n |\n = help: the trait `std::slice::SliceIndex<[std::vec::Vec]>` is not implemented for `aoc_2022::Vector2D`\n = note: required for `std::vec::Vec>` to implement `std::ops::Index>`\n\nerror[E0277]: the type `[std::vec::Vec]` cannot be indexed by `aoc_2022::Vector2D`\n --\x3e src/bin/day08.rs:52:28\n |\n52 | let max_height = trees[position];\n | ^^^^^^^^ slice indices are of type `usize` or ranges of `usize`\n |\n = help: the trait `std::slice::SliceIndex<[std::vec::Vec]>` is not implemented for `aoc_2022::Vector2D`\n = note: required for `std::vec::Vec>` to implement `std::ops::Index>`\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Why? We have it implemented for the slices (",(0,i.jsx)(n.code,{children:"[C]"}),"), why doesn't it work? Well,\nthe fun part consists of the fact that in other place, where we were using it,\nwe were passing the ",(0,i.jsx)(n.code,{children:"&[Vec]"}),", but this is coming from a helper functions that\ntake ",(0,i.jsx)(n.code,{children:"&Vec>"})," instead. And\u2026 we don't implement ",(0,i.jsx)(n.code,{children:"Index"})," and ",(0,i.jsx)(n.code,{children:"IndexMut"})," for\nthose. Just for the slices. ","\ud83e\udd2f"," ",(0,i.jsx)(n.em,{children:"What are we going to do about it?"})]}),"\n",(0,i.jsxs)(n.p,{children:["We can either start copy-pasting or be smarter about it\u2026 I choose to be smarter,\nso let's implement a macro! The only difference across the implementations are\nthe types of the outer containers. Implementation doesn't differ ",(0,i.jsx)(n.strong,{children:"at all"}),"!"]}),"\n",(0,i.jsx)(n.p,{children:"Implementing the macro can be done in a following way:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"macro_rules! generate_indices {\n ($container:ty) => {\n impl Index> for $container\n where\n I: Copy + TryInto,\n >::Error: Debug,\n C: Index,\n {\n type Output = C::Output;\n\n fn index(&self, index: Vector2D) -> &Self::Output {\n let (x, y): (usize, usize) =\n (index.x.try_into().unwrap(), index.y.try_into().unwrap());\n &self[y][x]\n }\n }\n\n impl IndexMut> for $container\n where\n I: Copy + TryInto,\n >::Error: Debug,\n C: IndexMut,\n {\n fn index_mut(&mut self, index: Vector2D) -> &mut Self::Output {\n let (x, y): (usize, usize) =\n (index.x.try_into().unwrap(), index.y.try_into().unwrap());\n &mut self[y][x]\n }\n }\n };\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"And now we can simply do"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"generate_indices!(VecDeque);\ngenerate_indices!([C]);\ngenerate_indices!(Vec);\n// generate_indices!([C; N], const N: usize);\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The last type (I took the inspiration from the implementations of the ",(0,i.jsx)(n.code,{children:"Index"})," and\n",(0,i.jsx)(n.code,{children:"IndexMut"})," traits) is a bit problematic, because of the ",(0,i.jsx)(n.code,{children:"const N: usize"})," part,\nwhich I haven't managed to be able to parse. And that's how I got rid of the error."]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["If I were to use 2D-indexing over ",(0,i.jsx)(n.code,{children:"[C; N]"})," slices, I'd probably just go with the\ncopy-paste, cause the cost of this \u201cmonstrosity\u201d outweighs the benefits of no DRY."]})}),"\n",(0,i.jsx)(n.h4,{id:"cause-of-the-problem",children:"Cause of the problem"}),"\n",(0,i.jsxs)(n.p,{children:["This issue is relatively funny. If you don't use any type aliases, just the raw\ntypes, you'll get suggested certain changes by the ",(0,i.jsx)(n.em,{children:"clippy"}),". For example if you\nconsider the following piece of code"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:'fn get_sum(nums: &Vec) -> i32 {\n nums.iter().sum()\n}\n\nfn main() {\n let nums = vec![1, 2, 3];\n println!("Sum: {}", get_sum(&nums));\n}\n'})}),"\n",(0,i.jsxs)(n.p,{children:["and you run ",(0,i.jsx)(n.em,{children:"clippy"})," on it, you will get"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:'Checking playground v0.0.1 (/playground)\nwarning: writing `&Vec` instead of `&[_]` involves a new object where a slice will do\n --\x3e src/main.rs:1:18\n |\n1 | fn get_sum(nums: &Vec) -> i32 {\n | ^^^^^^^^^ help: change this to: `&[i32]`\n |\n = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg\n = note: `#[warn(clippy::ptr_arg)]` on by default\n\nwarning: `playground` (bin "playground") generated 1 warning\n Finished dev [unoptimized + debuginfo] target(s) in 0.61s\n'})}),"\n",(0,i.jsx)(n.p,{children:"However, if you introduce a type alias, such as"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"type Numbers = Vec;\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Then ",(0,i.jsx)(n.em,{children:"clippy"})," won't say anything, cause there is literally nothing to suggest.\nHowever the outcome is not the same\u2026"]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>o});var i=t(67294);const s={},r=i.createContext(s);function o(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[1011],{7582:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var i=t(85893),s=t(11151);const r={title:"2nd week of Advent of Code '22 in Rust",description:"Surviving second week in Rust.",date:"2022-12-25T23:15",slug:"aoc-2022/2nd-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},o=void 0,a={permalink:"/blog/aoc-2022/2nd-week",editUrl:"https://github.com/mfocko/blog/tree/main/blog/aoc-2022/02-week-2.md",source:"@site/blog/aoc-2022/02-week-2.md",title:"2nd week of Advent of Code '22 in Rust",description:"Surviving second week in Rust.",date:"2022-12-25T23:15:00.000Z",formattedDate:"December 25, 2022",tags:[{label:"advent-of-code",permalink:"/blog/tags/advent-of-code"},{label:"advent-of-code-2022",permalink:"/blog/tags/advent-of-code-2022"},{label:"rust",permalink:"/blog/tags/rust"}],readingTime:20.875,hasTruncateMarker:!0,authors:[{name:"Matej Focko",email:"me+blog@mfocko.xyz",title:"a.k.a. @mf",url:"https://gitlab.com/mfocko",imageURL:"https://github.com/mfocko.png",key:"mf"}],frontMatter:{title:"2nd week of Advent of Code '22 in Rust",description:"Surviving second week in Rust.",date:"2022-12-25T23:15",slug:"aoc-2022/2nd-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Sort the matrix diagonally",permalink:"/blog/leetcode/sort-diagonally"},nextItem:{title:"1st week of Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/1st-week"}},d={authorsImageUrls:[void 0]},l=[{value:"Day 8: Treetop Tree House",id:"day-8-treetop-tree-house",level:2},{value:"Swapping indices",id:"swapping-indices",level:4},{value:"Indexing Vec",id:"indexing-vec",level:4},{value:"Issues",id:"issues",level:5},{value:"Checking bounds",id:"checking-bounds",level:4},{value:"Solution",id:"solution",level:3},{value:"Day 9: Rope Bridge",id:"day-9-rope-bridge",level:2},{value:"Solution",id:"solution-1",level:3},{value:"Day 10: Cathode-Ray Tube",id:"day-10-cathode-ray-tube",level:2},{value:"What does that mean though?",id:"what-does-that-mean-though",level:6},{value:"Solution",id:"solution-2",level:3},{value:"Day 11: Monkey in the Middle",id:"day-11-monkey-in-the-middle",level:2},{value:"Solution",id:"solution-3",level:3},{value:"Day 12: Hill Climbing Algorithm",id:"day-12-hill-climbing-algorithm",level:2},{value:"Solution",id:"solution-4",level:3},{value:"Day 13: Distress Signal",id:"day-13-distress-signal",level:2},{value:"Solution",id:"solution-5",level:3},{value:"Day 14: Regolith Reservoir",id:"day-14-regolith-reservoir",level:2},{value:"Solution",id:"solution-6",level:3},{value:"Post Mortem",id:"post-mortem",level:2},{value:"Indexing",id:"indexing",level:3},{value:"Cause of the problem",id:"cause-of-the-problem",level:4}];function c(e){const n={a:"a",admonition:"admonition",annotation:"annotation",blockquote:"blockquote",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",h5:"h5",h6:"h6",li:"li",math:"math",mdxAdmonitionTitle:"mdxAdmonitionTitle",mi:"mi",mn:"mn",mo:"mo",mrow:"mrow",p:"p",pre:"pre",semantics:"semantics",span:"span",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.p,{children:["Let's go through the second week of ",(0,i.jsx)(n.a,{href:"https://adventofcode.com",children:(0,i.jsx)(n.em,{children:"Advent of Code"})})," in Rust."]}),"\n",(0,i.jsx)(n.h2,{id:"day-8-treetop-tree-house",children:(0,i.jsx)(n.a,{href:"https://adventofcode.com/2022/day/8",children:"Day 8: Treetop Tree House"})}),"\n",(0,i.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,i.jsx)(n.p,{children:"We get a forest and we want to know how many trees are visible from the outside.\nApart from that we want to find the best view."})}),"\n",(0,i.jsxs)(n.p,{children:["Nothing interesting. We are moving around 2D map though. And indexing can get a\nbit painful when doing so, let's refactor it a bit ;) During the preparation for\nthe AoC, I have written ",(0,i.jsx)(n.code,{children:"Vector2D"})," and now it's time to extend it with indexing\nof ",(0,i.jsx)(n.code,{children:"Vec"})," of ",(0,i.jsx)(n.code,{children:"Vec"}),"s. In my solution I was manipulating with indices in the following\nway:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"swapping them"}),"\n",(0,i.jsxs)(n.li,{children:["checking whether they are correct indices for the ",(0,i.jsx)(n.code,{children:"Vec>"})]}),"\n",(0,i.jsxs)(n.li,{children:["indexing ",(0,i.jsx)(n.code,{children:"Vec>"})," with them"]}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{type:"caution",children:(0,i.jsxs)(n.p,{children:["I'm getting familiar with Rust and starting to \u201cabuse\u201d it\u2026 While doing so, I'm\nalso uncovering some \u201cfeatures\u201d that I don't really like. Therefore I will mark\nall of my rants with ",(0,i.jsx)(n.em,{children:"thicc"})," ",(0,i.jsx)(n.strong,{children:"\xab\u21af\xbb"})," mark and will try to \u201clock\u201d them into their\nown \u201cbox of hell\u201d."]})}),"\n",(0,i.jsx)(n.h4,{id:"swapping-indices",children:"Swapping indices"}),"\n",(0,i.jsx)(n.p,{children:"Relatively simple implementation, just take the values, swap them and return new\nvector."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"impl Vector2D {\n pub fn swap(&self) -> Self {\n Self {\n x: self.y,\n y: self.x,\n }\n }\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Pretty straight-forward implementation, but let's talk about the ",(0,i.jsx)(n.code,{children:"T: Copy"}),". We\nneed to use it, since we are returning a ",(0,i.jsx)(n.strong,{children:"new"})," vector, with swapped ",(0,i.jsx)(n.strong,{children:"values"}),".\nIf we had values that cannot be copied, the only thing we could do, would be a\nvector of references (and it would also introduce a lifetime, to which we'll get\nlater on). This is pretty similar with the operations on sets from the first week."]}),"\n",(0,i.jsxs)(n.h4,{id:"indexing-vec",children:["Indexing ",(0,i.jsx)(n.code,{children:"Vec"})]}),"\n",(0,i.jsx)(n.p,{children:"I will start with the indexing, cause bound-checking is a bit more\u2026 complicated\nthan I would like to."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"pub fn index<'a, T, U>(v: &'a [Vec], idx: &Vector2D) -> &'a U\nwhere\n usize: TryFrom,\n >::Error: Debug,\n T: Copy,\n{\n let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());\n &v[y][x]\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Let's talk about this mess\u2026 Body of the function is probably the most easy part\nand should not be hard to understand, we just take the ",(0,i.jsx)(n.code,{children:"x"})," and ",(0,i.jsx)(n.code,{children:"y"})," and convert\nthem both to ",(0,i.jsx)(n.code,{children:"usize"})," type that can be used later on for indexing."]}),"\n",(0,i.jsxs)(n.p,{children:["The type signature of the function is where the fun is at ","\ud83d\ude09"," We are trying\nto convert unknown type to ",(0,i.jsx)(n.code,{children:"usize"}),", so we must bound the ",(0,i.jsx)(n.code,{children:"T"})," as a type that can\nbe converted to ",(0,i.jsx)(n.code,{children:"usize"}),", that's how we got ",(0,i.jsx)(n.code,{children:"usize: TryFrom"})," which basically\nsays that ",(0,i.jsx)(n.code,{children:"usize"})," must implement ",(0,i.jsx)(n.code,{children:"TryFrom"})," trait and therefore allows us to\nconvert the indices to actual ",(0,i.jsx)(n.code,{children:"usize"})," indices. Using ",(0,i.jsx)(n.code,{children:".unwrap()"})," also forces us\nto bound the error that can occur when converting ",(0,i.jsx)(n.code,{children:"T"})," into ",(0,i.jsx)(n.code,{children:"usize"}),", that's how\nwe get ",(0,i.jsx)(n.code,{children:">::Error: Debug"})," which loosely means"]}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:["error during conversion of ",(0,i.jsx)(n.code,{children:"T"})," into ",(0,i.jsx)(n.code,{children:"usize"})," must implement ",(0,i.jsx)(n.code,{children:"Debug"}),",\ni.e. can be printed in some way or other"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"T: Copy"})," is required by ",(0,i.jsx)(n.code,{children:".try_into()"})," which takes ",(0,i.jsx)(n.code,{children:"T"})," by-value."]}),"\n",(0,i.jsx)(n.p,{children:"And now we are left only with the first line of the definition."}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"Skilled Rustaceans might notice that this implementation is rather flaky and can\nbreak in multiple places at once. I'll get back to it\u2026"})}),"\n",(0,i.jsx)(n.p,{children:"Let's split it in multiple parts:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"v: &'a [Vec]"})," represents the 2D ",(0,i.jsx)(n.code,{children:"Vec"}),", we are indexing, ",(0,i.jsx)(n.code,{children:"Vec"})," implements\n",(0,i.jsx)(n.code,{children:"Slice"})," trait and ",(0,i.jsx)(n.em,{children:"clippy"})," recommends using ",(0,i.jsx)(n.code,{children:"&[T]"})," to ",(0,i.jsx)(n.code,{children:"&Vec"}),", exact details\nare unknown to me"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"idx: &Vector2D"})," represents the ",(0,i.jsx)(n.em,{children:"indices"})," which we use, we take them by\nreference to avoid an unnecessary copy"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"-> &'a U"})," means that we are returning a ",(0,i.jsx)(n.em,{children:"reference"})," to some value of type ",(0,i.jsx)(n.code,{children:"U"}),".\nNow the question is what does the ",(0,i.jsx)(n.code,{children:"'a"})," mean, we can also see it as a generic\ntype declared along ",(0,i.jsx)(n.code,{children:"T"})," and ",(0,i.jsx)(n.code,{children:"U"}),". And the answer is ",(0,i.jsx)(n.em,{children:"relatively"})," simple, ",(0,i.jsx)(n.code,{children:"'a"}),"\nrepresents a ",(0,i.jsx)(n.em,{children:"lifetime"}),". We take the ",(0,i.jsx)(n.code,{children:"v"})," by a reference and return a reference,\nborrow checker validates all of the ",(0,i.jsx)(n.em,{children:"borrows"})," (or references), so we need to\nspecify that our returned value has ",(0,i.jsx)(n.em,{children:"the same lifetime"})," as the vector we have\ntaken by a reference, i.e. returned reference must live at least as long as the\n",(0,i.jsx)(n.code,{children:"v"}),". This way we can \u201cbe sure\u201d that the returned reference is valid."]}),"\n"]}),"\n",(0,i.jsx)(n.h5,{id:"issues",children:"Issues"}),"\n",(0,i.jsxs)(n.p,{children:["First issue that our implementation has is the fact that we cannot get a mutable\nreference out of that function. This could be easily resolved by introducing new\nfunction, e.g. ",(0,i.jsx)(n.code,{children:"index_mut"}),". Which I have actually done while writing this part:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"pub fn index_mut<'a, T, U>(v: &'a mut [Vec], idx: &Vector2D) -> &'a mut U\nwhere\n usize: TryFrom,\n >::Error: Debug,\n T: Copy,\n{\n let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());\n &mut v[y][x]\n}\n"})}),"\n",(0,i.jsxs)(n.admonition,{type:"caution",children:[(0,i.jsxs)(n.mdxAdmonitionTitle,{children:[(0,i.jsx)(n.strong,{children:"\xab\u21af\xbb"})," Why can't we use one function?"]}),(0,i.jsxs)(n.p,{children:["When we consider a ",(0,i.jsx)(n.code,{children:"Vec"}),", we don't need to consider containers as ",(0,i.jsx)(n.code,{children:"T"}),", Rust\nimplements indexing as traits ",(0,i.jsx)(n.code,{children:"Index"})," and ",(0,i.jsx)(n.code,{children:"IndexMut"})," that do the dirty work\nbehind syntactic sugar of ",(0,i.jsx)(n.code,{children:"container[idx]"}),"."]}),(0,i.jsxs)(n.p,{children:["However, implementing of traits is not allowed for ",(0,i.jsx)(n.em,{children:"external"})," types, i.e. types\nthat you haven't defined yourself. This means that you can implement indexing\nover containers that you have implemented yourself, but you cannot use your own\ntypes for indexing \u201cbuilt-in\u201d types."]}),(0,i.jsxs)(n.p,{children:["Another part of this rabbit hole is trait ",(0,i.jsx)(n.code,{children:"SliceIndex"})," that is of a relevance\nbecause of"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"impl Index for [T]\nwhere\n I: SliceIndex<[T]>\n\nimpl Index for Vec\nwhere\n I: SliceIndex<[T]>,\n A: Allocator\n\nimpl Index for [T; N]\nwhere\n [T]: Index\n"})}),(0,i.jsxs)(n.p,{children:["In other words, if your type implements ",(0,i.jsx)(n.code,{children:"SliceIndex"})," trait, it can be used\nfor indexing. As of now, this trait has all of its required methods experimental\nand is marked as ",(0,i.jsx)(n.code,{children:"unsafe"}),"."]})]}),"\n",(0,i.jsxs)(n.p,{children:["Another problem is a requirement for indexing either ",(0,i.jsx)(n.code,{children:"[Vec]"})," or ",(0,i.jsx)(n.code,{children:"Vec>"}),".\nThis requirement could be countered by removing inner type ",(0,i.jsx)(n.code,{children:"Vec"})," and constraining\nit by a trait ",(0,i.jsx)(n.code,{children:"Index"})," (or ",(0,i.jsx)(n.code,{children:"IndexMut"})," respectively) in a following way"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"pub fn index<'a, C, T>(v: &'a [C], idx: &Vector2D) -> &'a C::Output\nwhere\n usize: TryFrom,\n >::Error: Debug,\n T: Copy,\n C: Index\n{\n let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());\n &v[y][x]\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Given this, we can also give a more meaningful typename for indexing type, such\nas ",(0,i.jsx)(n.code,{children:"I"}),"."]}),"\n",(0,i.jsx)(n.h4,{id:"checking-bounds",children:"Checking bounds"}),"\n",(0,i.jsxs)(n.p,{children:["Now we can get to the boundary checks, it is very similar, but a more\u2026 dirty.\nFirst approach that came up was to convert the indices in ",(0,i.jsx)(n.code,{children:"Vector2D"})," to ",(0,i.jsx)(n.code,{children:"usize"}),",\nbut when you add the indices up, e.g. when checking the neighbors, you can end\nup with negative values which, unlike in C++, causes an error (instead of underflow\nthat you can use to your advantage; you can easily guess how)."]}),"\n",(0,i.jsx)(n.p,{children:"So how can we approach this then? Well\u2026 we will convert the bounds instead of\nthe indices and that lead us to:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"pub fn in_range(v: &[Vec], idx: &Vector2D) -> bool\nwhere\n usize: TryInto,\n >::Error: Debug,\n T: PartialOrd + Copy,\n{\n idx.y >= 0.try_into().unwrap()\n && idx.y < v.len().try_into().unwrap()\n && idx.x >= 0.try_into().unwrap()\n && idx.x\n < v[TryInto::::try_into(idx.y).unwrap()]\n .len()\n .try_into()\n .unwrap()\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["You can tell that it's definitely a shitty code. Let's improve it now! We will\nget back to the original idea, but do it better. We know that we cannot convert\nnegative values into ",(0,i.jsx)(n.code,{children:"usize"}),", ",(0,i.jsx)(n.strong,{children:"but"})," we also know that conversion like that\nreturns a ",(0,i.jsx)(n.code,{children:"Result"})," which we can use to our advantage."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"pub fn in_range(v: &[Vec], idx: &Vector2D) -> bool\nwhere\n T: Copy,\n usize: TryFrom,\n{\n usize::try_from(idx.y)\n .and_then(|y| usize::try_from(idx.x).map(|x| y < v.len() && x < v[y].len()))\n .unwrap_or(false)\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"Result"})," is a type similar to ",(0,i.jsx)(n.code,{children:"Either"})," in Haskell and it allows us to chain\nmultiple operations on correct results or propagate the original error without\ndoing anything. Let's dissect it one-by-one."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"try_from"})," is a method implemented in ",(0,i.jsx)(n.code,{children:"TryFrom"})," trait, that allows you to convert\ntypes and either successfully convert them or fail (with a reasonable error). This\nmethod returns ",(0,i.jsx)(n.code,{children:"Result"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["We call ",(0,i.jsx)(n.code,{children:"and_then"})," on that ",(0,i.jsx)(n.em,{children:"result"}),", let's have a look at the type signature of\n",(0,i.jsx)(n.code,{children:"and_then"}),", IMO it explains more than enough:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"pub fn and_then(self, op: F) -> Result\nwhere\n F: FnOnce(T) -> Result\n"})}),"\n",(0,i.jsx)(n.p,{children:"OK\u2026 So it takes the result and a function and returns another result with\ndifferent value and different error. However we can see that the function, which\nrepresents an operation on a result, takes just the value, i.e. it doesn't care\nabout any previous error. To make it short:"}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"and_then"})," allows us to run an operation, which can fail, on the correct result"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["We parsed a ",(0,i.jsx)(n.code,{children:"y"})," index and now we try to convert the ",(0,i.jsx)(n.code,{children:"x"})," index with ",(0,i.jsx)(n.code,{children:"try_from"}),"\nagain, but on that result we use ",(0,i.jsx)(n.code,{children:"map"})," rather than ",(0,i.jsx)(n.code,{children:"and_then"}),", why would that be?"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"pub fn map(self, op: F) -> Result\nwhere\n F: FnOnce(T) -> U\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Huh\u2026 ",(0,i.jsx)(n.code,{children:"map"})," performs an operation that ",(0,i.jsx)(n.strong,{children:"cannot"})," fail. And finally we use\n",(0,i.jsx)(n.code,{children:"unwrap_or"})," which takes the value from result, or in case of an error returns the\ndefault that we define."]}),"\n",(0,i.jsxs)(n.p,{children:["How does this work then? If ",(0,i.jsx)(n.code,{children:"y"})," is negative, the conversion fails and the error\npropagates all the way to ",(0,i.jsx)(n.code,{children:"unwrap_or"}),", if ",(0,i.jsx)(n.code,{children:"y"})," can be a correct ",(0,i.jsx)(n.code,{children:"usize"})," value, then\nwe do the same with ",(0,i.jsx)(n.code,{children:"x"}),". If ",(0,i.jsx)(n.code,{children:"x"})," is negative, we propagate the error as with ",(0,i.jsx)(n.code,{children:"y"}),",\nand if it's not, then we check whether it exceeds the higher bounds or not."]}),"\n",(0,i.jsx)(n.h3,{id:"solution",children:"Solution"}),"\n",(0,i.jsx)(n.p,{children:"Relatively simple, you just need follow the rules and not get too smart, otherwise\nit will get back at you."}),"\n",(0,i.jsx)(n.h2,{id:"day-9-rope-bridge",children:(0,i.jsx)(n.a,{href:"https://adventofcode.com/2022/day/9",children:"Day 9: Rope Bridge"})}),"\n",(0,i.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,i.jsx)(n.p,{children:"We get a rope with knots and we want to track how many different positions are\nvisited with the rope's tail."})}),"\n",(0,i.jsx)(n.p,{children:"By this day, I have come to a conclusion that current skeleton for each day\ngenerates a lot of boilerplate. And even though it can be easily copied, it's\njust a waste of space and unnecessary code. Let's \u201csimplify\u201d this (on one end\nwhile creating monster on the other end). I've gone through what we need in the\npreparations for the AoC. Let's sum up our requirements:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"parsing"}),"\n",(0,i.jsx)(n.li,{children:"part 1 & 2"}),"\n",(0,i.jsx)(n.li,{children:"running on sample / input"}),"\n",(0,i.jsx)(n.li,{children:"tests"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Parsing and implementation of both parts is code that changes each day and we\ncannot do anything about it. However running and testing can be simplified!"}),"\n",(0,i.jsxs)(n.p,{children:["Let's introduce and export a new module ",(0,i.jsx)(n.code,{children:"solution"})," that will take care of all of\nthis. We will start by introducing a trait for each day."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"pub trait Solution {\n fn parse_input>(pathname: P) -> Input;\n\n fn part_1(input: &Input) -> Output;\n fn part_2(input: &Input) -> Output;\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["This does a lot of work for us already, we have defined a trait and for each day\nwe will create a structure representing a specific day. That structure will also\nimplement the ",(0,i.jsx)(n.code,{children:"Solution"})," trait."]}),"\n",(0,i.jsxs)(n.p,{children:["Now we need to get rid of the boilerplate, we can't get rid of the ",(0,i.jsx)(n.code,{children:"main"})," function,\nbut we can at least move out the functionality."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:'fn run(type_of_input: &str) -> Result<()>\nwhere\n Self: Sized,\n{\n tracing_subscriber::fmt()\n .with_env_filter(EnvFilter::from_default_env())\n .with_target(false)\n .with_file(true)\n .with_line_number(true)\n .without_time()\n .compact()\n .init();\n color_eyre::install()?;\n\n let input = Self::parse_input(format!("{}s/{}.txt", type_of_input, Self::day()));\n\n info!("Part 1: {}", Self::part_1(&input));\n info!("Part 2: {}", Self::part_2(&input));\n\n Ok(())\n}\n\nfn main() -> Result<()>\nwhere\n Self: Sized,\n{\n Self::run("input")\n}\n'})}),"\n",(0,i.jsxs)(n.p,{children:["This is all part of the ",(0,i.jsx)(n.code,{children:"Solution"})," trait, which can implement methods while being\ndependent on what is provided by the implementing types. In this case, we just\nneed to bound the ",(0,i.jsx)(n.code,{children:"Output"})," type to implement ",(0,i.jsx)(n.code,{children:"Display"})," that is necessary for the\n",(0,i.jsx)(n.code,{children:"info!"})," and format string there."]}),"\n",(0,i.jsxs)(n.p,{children:["Now we can get to first of the nasty things we are going to do\u2026 And it is the\n",(0,i.jsx)(n.code,{children:"day()"})," method that you can see being used when constructing path to the input\nfile. That method will generate a name of the file, e.g. ",(0,i.jsx)(n.code,{children:"day01"})," and we know that\nwe can ",(0,i.jsx)(n.em,{children:"somehow"})," deduce it from the structure name, given we name it reasonably."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:'fn day() -> String {\n let mut day = String::from(type_name::().split("::").next().unwrap());\n day.make_ascii_lowercase();\n\n day.to_string()\n}\n'})}),"\n",(0,i.jsxs)(n.admonition,{type:"caution",children:[(0,i.jsx)(n.mdxAdmonitionTitle,{children:(0,i.jsx)(n.code,{children:"type_name"})}),(0,i.jsx)(n.p,{children:"This feature is still experimental and considered to be internal, it is not\nadvised to use it any production code."})]}),"\n",(0,i.jsxs)(n.p,{children:["And now we can get to the nastiest stuff ","\ud83d\ude29"," We will ",(0,i.jsx)(n.strong,{children:"generate"})," the tests!"]}),"\n",(0,i.jsx)(n.p,{children:"We want to be able to generate tests for sample input in a following way:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"test_sample!(day_01, Day01, 42, 69);\n"})}),"\n",(0,i.jsx)(n.p,{children:"There's not much we can do, so we will write a macro to generate the tests for us."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:'#[macro_export]\nmacro_rules! test_sample {\n ($mod_name:ident, $day_struct:tt, $part_1:expr, $part_2:expr) => {\n #[cfg(test)]\n mod $mod_name {\n use super::*;\n\n #[test]\n fn test_part_1() {\n let sample =\n $day_struct::parse_input(&format!("samples/{}.txt", $day_struct::day()));\n assert_eq!($day_struct::part_1(&sample), $part_1);\n }\n\n #[test]\n fn test_part_2() {\n let sample =\n $day_struct::parse_input(&format!("samples/{}.txt", $day_struct::day()));\n assert_eq!($day_struct::part_2(&sample), $part_2);\n }\n }\n };\n}\n'})}),"\n",(0,i.jsxs)(n.p,{children:["We have used it in a similar way as macros in C/C++, one of the things that we\ncan use to our advantage is defining \u201ctype\u201d of the parameters for the macro. All\nparameters have their name prefixed with ",(0,i.jsx)(n.code,{children:"$"})," sign and you can define various \u201cforms\u201d\nof your macro. Let's go through it!"]}),"\n",(0,i.jsx)(n.p,{children:"We have following parameters:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"$mod_name"})," which represents the name for the module with tests, it is typed\nwith ",(0,i.jsx)(n.code,{children:"ident"})," which means that we want a valid identifier to be passed in."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"$day_struct"})," represents the structure that will be used for tests, it is typed\nwith ",(0,i.jsx)(n.code,{children:"tt"})," which represents a ",(0,i.jsx)(n.em,{children:"token tree"}),", in our case it is a type."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"$part_X"})," represents the expected output for the ",(0,i.jsx)(n.code,{children:"X"}),"th part and is of type ",(0,i.jsx)(n.code,{children:"expr"}),"\nwhich literally means an ",(0,i.jsx)(n.em,{children:"expression"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["Apart from that we need to use ",(0,i.jsx)(n.code,{children:"#[macro_export]"})," to mark the macro as exported\nfor usage outside of the module. Now our skeleton looks like:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:'use aoc_2022::*;\n\ntype Input = String;\ntype Output = String;\n\nstruct DayXX;\nimpl Solution for DayXX {\n fn parse_input>(pathname: P) -> Input {\n file_to_string(pathname)\n }\n\n fn part_1(input: &Input) -> Output {\n todo!()\n }\n\n fn part_2(input: &Input) -> Output {\n todo!()\n }\n}\n\nfn main() -> Result<()> {\n // DayXX::run("sample")\n DayXX::main()\n}\n\n// test_sample!(day_XX, DayXX, , );\n'})}),"\n",(0,i.jsx)(n.h3,{id:"solution-1",children:"Solution"}),"\n",(0,i.jsx)(n.p,{children:"Not much to talk about, it is relatively easy to simulate."}),"\n",(0,i.jsx)(n.h2,{id:"day-10-cathode-ray-tube",children:(0,i.jsx)(n.a,{href:"https://adventofcode.com/2022/day/10",children:"Day 10: Cathode-Ray Tube"})}),"\n",(0,i.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,i.jsx)(n.p,{children:"Emulating basic arithmetic operations on a CPU and drawing on CRT based on the\nCPU's accumulator."})}),"\n",(0,i.jsxs)(n.p,{children:["In this day I have discovered an issue with my design of the ",(0,i.jsx)(n.code,{children:"Solution"})," trait.\nAnd the issue is caused by different types of ",(0,i.jsx)(n.code,{children:"Output"})," for the part 1 and part 2."]}),"\n",(0,i.jsx)(n.p,{children:"Problem is relatively simple and consists of simulating a CPU, I have approached\nit in a following way:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"fn evaluate_instructions(instructions: &[Instruction], mut out: Output) -> Output {\n instructions\n .iter()\n .fold(State::new(), |state, instruction| {\n state.execute(instruction, &mut out)\n });\n\n out\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["We just take the instructions, we have some state of the CPU and we execute the\ninstructions one-by-one. Perfect usage of the ",(0,i.jsx)(n.code,{children:"fold"})," (or ",(0,i.jsx)(n.code,{children:"reduce"})," as you may know\nit from other languages)."]}),"\n",(0,i.jsxs)(n.p,{children:["You can also see that we have an ",(0,i.jsx)(n.code,{children:"Output"})," type, so the question is how can we fix\nthat problem. And the answer is very simple and ",(0,i.jsx)(n.em,{children:"functional"}),". Rust allows you to\nhave an ",(0,i.jsx)(n.code,{children:"enumeration"})," that can ",(0,i.jsx)(n.em,{children:"bear"})," some other values apart from the type itself."]}),"\n",(0,i.jsxs)(n.admonition,{type:"tip",children:[(0,i.jsxs)(n.p,{children:["We could've seen something like this with the ",(0,i.jsx)(n.code,{children:"Result"})," type that can be\ndefined as"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"enum Result {\n Ok(T),\n Err(E)\n}\n"})}),(0,i.jsx)(n.h6,{id:"what-does-that-mean-though",children:"What does that mean though?"}),(0,i.jsxs)(n.p,{children:["When we have an ",(0,i.jsx)(n.code,{children:"Ok"})," value, it has the result itself, and when we get an ",(0,i.jsx)(n.code,{children:"Err"}),"\nvalue, it has the error. This also allows us to handle ",(0,i.jsx)(n.em,{children:"results"})," in a rather\npretty way:"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:'match do_something(x) {\n Ok(y) => {\n println!("SUCCESS: {}", y);\n },\n Err(y) => {\n eprintln!("ERROR: {}", y);\n }\n}\n'})})]}),"\n",(0,i.jsx)(n.p,{children:"My solution has a following outline:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"fn execute(&self, i: &Instruction, output: &mut Output) -> State {\n // execute the instruction\n\n // collect results if necessary\n match output {\n Output::Part1(x) => self.execute_part_1(y, x),\n Output::Part2(x) => self.execute_part_2(y, x),\n }\n\n // return the obtained state\n new_state\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["You might think that it's a perfectly reasonable thing to do. Yes, ",(0,i.jsx)(n.strong,{children:"but"})," notice\nthat the ",(0,i.jsx)(n.code,{children:"match"})," statement doesn't ",(0,i.jsx)(n.em,{children:"collect"})," the changes in any way and also we\npass ",(0,i.jsx)(n.code,{children:"output"})," by ",(0,i.jsx)(n.code,{children:"&mut"}),", so it is shared across each ",(0,i.jsx)(n.em,{children:"iteration"})," of the ",(0,i.jsx)(n.code,{children:"fold"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["The dirty and ingenious thing is that ",(0,i.jsx)(n.code,{children:"x"}),"s are passed by ",(0,i.jsx)(n.code,{children:"&mut"})," too and therefore\nthey are directly modified by the helper functions. To sum it up and let it sit"]}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:["We are ",(0,i.jsx)(n.strong,{children:"collecting"})," the result ",(0,i.jsx)(n.strong,{children:"into"})," an ",(0,i.jsx)(n.strong,{children:"enumeration"})," that is ",(0,i.jsx)(n.strong,{children:"shared"}),"\nacross ",(0,i.jsx)(n.strong,{children:"all"})," iterations of ",(0,i.jsx)(n.code,{children:"fold"}),"."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"solution-2",children:"Solution"}),"\n",(0,i.jsxs)(n.p,{children:["Similar to ",(0,i.jsx)(n.em,{children:"Day 9"}),", but there are some technical details that can get you."]}),"\n",(0,i.jsx)(n.h2,{id:"day-11-monkey-in-the-middle",children:(0,i.jsx)(n.a,{href:"https://adventofcode.com/2022/day/11",children:"Day 11: Monkey in the Middle"})}),"\n",(0,i.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,i.jsx)(n.p,{children:"Simulation of monkeys throwing stuff around and measuring your stress levels\nwhile your stuff is being passed around."})}),"\n",(0,i.jsx)(n.p,{children:"I think I decided to use regular expressions here for the first time, cause\nparsing the input was a pain."}),"\n",(0,i.jsx)(n.p,{children:"Also I didn't expect to implement Euclidean algorithm in Rust\u2026"}),"\n",(0,i.jsx)(n.h3,{id:"solution-3",children:"Solution"}),"\n",(0,i.jsx)(n.p,{children:"Again, we're just running a simulation. Though I must admit it was very easy to\nmake a small technical mistakes that could affect the final results very late."}),"\n",(0,i.jsx)(n.h2,{id:"day-12-hill-climbing-algorithm",children:(0,i.jsx)(n.a,{href:"https://adventofcode.com/2022/day/12",children:"Day 12: Hill Climbing Algorithm"})}),"\n",(0,i.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,i.jsx)(n.p,{children:"Finding shortest path up the hill and also shortest path down to the ground while\nalso rolling down the hill\u2026"})}),"\n",(0,i.jsxs)(n.p,{children:["As I have said in the ",(0,i.jsx)(n.em,{children:"tl;dr"}),", we are looking for the shortest path, but the start\nand goal differ for the part 1 and 2. So I have decided to refactor my solution\nto a BFS algorithm that takes necessary parameters via functions:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"fn bfs(\n graph: &[Vec], start: &Position, has_edge: F, is_target: G\n) -> Option\nwhere\n F: Fn(&[Vec], &Position, &Position) -> bool,\n G: Fn(&[Vec], &Position) -> bool\n"})}),"\n",(0,i.jsxs)(n.p,{children:["We pass the initial vertex from the caller and everything else is left to the BFS\nalgorithm, based on the ",(0,i.jsx)(n.code,{children:"has_edge"})," and ",(0,i.jsx)(n.code,{children:"is_target"})," functions."]}),"\n",(0,i.jsxs)(n.p,{children:["This was easy! And that is not very usual in Rust once you want to pass around\nfunctions. ","\ud83d\udc40"]}),"\n",(0,i.jsx)(n.h3,{id:"solution-4",children:"Solution"}),"\n",(0,i.jsxs)(n.p,{children:["Looking for the shortest path\u2026 Must be Dijkstra, right? ",(0,i.jsx)(n.strong,{children:"Nope!"})," Half of the\nReddit got jebaited though. In all fairness, nothing stops you from implementing\nthe Dijkstra's algorithm for finding the shortest path, ",(0,i.jsx)(n.strong,{children:"but"})," if you know that\nall connected vertices are in a unit (actually ",(0,i.jsxs)(n.span,{className:"katex",children:[(0,i.jsx)(n.span,{className:"katex-mathml",children:(0,i.jsx)(n.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,i.jsxs)(n.semantics,{children:[(0,i.jsxs)(n.mrow,{children:[(0,i.jsx)(n.mi,{children:"d"}),(0,i.jsx)(n.mo,{children:"="}),(0,i.jsx)(n.mn,{children:"1"})]}),(0,i.jsx)(n.annotation,{encoding:"application/x-tex",children:"d = 1"})]})})}),(0,i.jsxs)(n.span,{className:"katex-html","aria-hidden":"true",children:[(0,i.jsxs)(n.span,{className:"base",children:[(0,i.jsx)(n.span,{className:"strut",style:{height:"0.6944em"}}),(0,i.jsx)(n.span,{className:"mord mathnormal",children:"d"}),(0,i.jsx)(n.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,i.jsx)(n.span,{className:"mrel",children:"="}),(0,i.jsx)(n.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,i.jsxs)(n.span,{className:"base",children:[(0,i.jsx)(n.span,{className:"strut",style:{height:"0.6444em"}}),(0,i.jsx)(n.span,{className:"mord",children:"1"})]})]})]}),") distance from each other,\nthen you know that running Dijkstra is equivalent to running BFS, only with worse\ntime complexity, because of the priority heap instead of the queue."]}),"\n",(0,i.jsx)(n.h2,{id:"day-13-distress-signal",children:(0,i.jsx)(n.a,{href:"https://adventofcode.com/2022/day/13",children:"Day 13: Distress Signal"})}),"\n",(0,i.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,i.jsx)(n.p,{children:"Processing packets with structured data from the distress signal."})}),"\n",(0,i.jsxs)(n.p,{children:["You can implement a lot of traits if you want to. It is ",(0,i.jsx)(n.em,{children:"imperative"})," to implement\nordering on the packets. I had a typo, so I also proceeded to implement a ",(0,i.jsx)(n.code,{children:"Display"}),"\ntrait for debugging purposes:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:'impl Display for Packet {\n fn fmt(&self, f: &mut std::fmt::Formatter<\'_>) -> std::fmt::Result {\n match self {\n Packet::Integer(x) => write!(f, "{x}"),\n Packet::List(lst) => write!(f, "[{}]", lst.iter().map(|p| format!("{p}")).join(",")),\n }\n }\n}\n'})}),"\n",(0,i.jsx)(n.h3,{id:"solution-5",children:"Solution"}),"\n",(0,i.jsx)(n.p,{children:"A lot of technical details\u2026 Parsing is nasty too\u2026"}),"\n",(0,i.jsx)(n.h2,{id:"day-14-regolith-reservoir",children:(0,i.jsx)(n.a,{href:"https://adventofcode.com/2022/day/14",children:"Day 14: Regolith Reservoir"})}),"\n",(0,i.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,i.jsx)(n.p,{children:"Let's simulate falling sand grain-by-grain."})}),"\n",(0,i.jsxs)(n.p,{children:["Again, both parts are relatively similar with minimal changes, so it is a good\nidea to refactor it a bit. Similar approach to the ",(0,i.jsx)(n.a,{href:"#day-12-hill-climbing-algorithm",children:"BFS above"}),". Also this is the\nfirst day where I ran into efficiency issues and had to redo my solution to speed\nit up just a bit."]}),"\n",(0,i.jsx)(n.h3,{id:"solution-6",children:"Solution"}),"\n",(0,i.jsx)(n.p,{children:"Tedious."}),"\n",(0,i.jsx)(n.h2,{id:"post-mortem",children:"Post Mortem"}),"\n",(0,i.jsx)(n.h3,{id:"indexing",children:"Indexing"}),"\n",(0,i.jsxs)(n.p,{children:["I was asked about the indexing after publishing the blog. And truly it is rather\ncomplicated topic, especially after releasing ",(0,i.jsx)(n.code,{children:"SliceIndex"})," trait. I couldn't\nleave it be, so I tried to implement the ",(0,i.jsx)(n.code,{children:"Index"})," and ",(0,i.jsx)(n.code,{children:"IndexMut"})," trait."]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["I have also mentioned that the ",(0,i.jsx)(n.code,{children:"SliceIndex"})," trait is ",(0,i.jsx)(n.code,{children:"unsafe"}),", but truth be told,\nonly ",(0,i.jsx)(n.em,{children:"unsafe"})," part are the 2 methods that are named ",(0,i.jsx)(n.code,{children:"*unchecked*"}),". Anyways, I will\nbe implementing the ",(0,i.jsx)(n.code,{children:"Index*"})," traits for now, rather than the ",(0,i.jsx)(n.code,{children:"SliceIndex"}),"."]})}),"\n",(0,i.jsx)(n.p,{children:"It's relatively straightforward\u2026"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"impl Index> for [C]\nwhere\n I: Copy + TryInto,\n >::Error: Debug,\n C: Index,\n{\n type Output = C::Output;\n\n fn index(&self, index: Vector2D) -> &Self::Output {\n let (x, y): (usize, usize) =\n (index.x.try_into().unwrap(), index.y.try_into().unwrap());\n &self[y][x]\n }\n}\n\nimpl IndexMut> for [C]\nwhere\n I: Copy + TryInto,\n >::Error: Debug,\n C: IndexMut,\n{\n fn index_mut(&mut self, index: Vector2D) -> &mut Self::Output {\n let (x, y): (usize, usize) =\n (index.x.try_into().unwrap(), index.y.try_into().unwrap());\n &mut self[y][x]\n }\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["We can see a lot of similarities to the implementation of ",(0,i.jsx)(n.code,{children:"index"})," and ",(0,i.jsx)(n.code,{children:"index_mut"}),"\nfunctions. In the end, they are 1:1, just wrapped in the trait that provides a\nsyntax sugar for ",(0,i.jsx)(n.code,{children:"container[idx]"}),"."]}),"\n",(0,i.jsxs)(n.admonition,{type:"note",children:[(0,i.jsxs)(n.p,{children:["I have also switched from using the ",(0,i.jsx)(n.code,{children:"TryFrom"})," to ",(0,i.jsx)(n.code,{children:"TryInto"})," trait, since it better\nmatches what we are using, the ",(0,i.jsx)(n.code,{children:".try_into"})," rather than ",(0,i.jsx)(n.code,{children:"usize::try_from"}),"."]}),(0,i.jsxs)(n.p,{children:["Also implementing ",(0,i.jsx)(n.code,{children:"TryFrom"})," automatically provides you with a ",(0,i.jsx)(n.code,{children:"TryInto"})," trait,\nsince it is relatively easy to implement. Just compare the following:"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"pub trait TryFrom: Sized {\n type Error;\n\n fn try_from(value: T) -> Result;\n}\n\npub trait TryInto: Sized {\n type Error;\n\n fn try_into(self) -> Result;\n}\n"})})]}),"\n",(0,i.jsxs)(n.p,{children:["OK, so we have our trait implemented, we should be able to use ",(0,i.jsx)(n.code,{children:"container[index]"}),",\nright? Yes\u2026 but actually no ","\ud83d\ude26"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"error[E0277]: the type `[std::vec::Vec]` cannot be indexed by `aoc_2022::Vector2D`\n --\x3e src/bin/day08.rs:26:18\n |\n26 | if trees[pos] > tallest {\n | ^^^ slice indices are of type `usize` or ranges of `usize`\n |\n = help: the trait `std::slice::SliceIndex<[std::vec::Vec]>` is not implemented for `aoc_2022::Vector2D`\n = note: required for `std::vec::Vec>` to implement `std::ops::Index>`\n\nerror[E0277]: the type `[std::vec::Vec]` cannot be indexed by `aoc_2022::Vector2D`\n --\x3e src/bin/day08.rs:30:28\n |\n30 | max(tallest, trees[pos])\n | ^^^ slice indices are of type `usize` or ranges of `usize`\n |\n = help: the trait `std::slice::SliceIndex<[std::vec::Vec]>` is not implemented for `aoc_2022::Vector2D`\n = note: required for `std::vec::Vec>` to implement `std::ops::Index>`\n\nerror[E0277]: the type `[std::vec::Vec]` cannot be indexed by `aoc_2022::Vector2D`\n --\x3e src/bin/day08.rs:52:28\n |\n52 | let max_height = trees[position];\n | ^^^^^^^^ slice indices are of type `usize` or ranges of `usize`\n |\n = help: the trait `std::slice::SliceIndex<[std::vec::Vec]>` is not implemented for `aoc_2022::Vector2D`\n = note: required for `std::vec::Vec>` to implement `std::ops::Index>`\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Why? We have it implemented for the slices (",(0,i.jsx)(n.code,{children:"[C]"}),"), why doesn't it work? Well,\nthe fun part consists of the fact that in other place, where we were using it,\nwe were passing the ",(0,i.jsx)(n.code,{children:"&[Vec]"}),", but this is coming from a helper functions that\ntake ",(0,i.jsx)(n.code,{children:"&Vec>"})," instead. And\u2026 we don't implement ",(0,i.jsx)(n.code,{children:"Index"})," and ",(0,i.jsx)(n.code,{children:"IndexMut"})," for\nthose. Just for the slices. \ud83e\udd2f ",(0,i.jsx)(n.em,{children:"What are we going to do about it?"})]}),"\n",(0,i.jsxs)(n.p,{children:["We can either start copy-pasting or be smarter about it\u2026 I choose to be smarter,\nso let's implement a macro! The only difference across the implementations are\nthe types of the outer containers. Implementation doesn't differ ",(0,i.jsx)(n.strong,{children:"at all"}),"!"]}),"\n",(0,i.jsx)(n.p,{children:"Implementing the macro can be done in a following way:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"macro_rules! generate_indices {\n ($container:ty) => {\n impl Index> for $container\n where\n I: Copy + TryInto,\n >::Error: Debug,\n C: Index,\n {\n type Output = C::Output;\n\n fn index(&self, index: Vector2D) -> &Self::Output {\n let (x, y): (usize, usize) =\n (index.x.try_into().unwrap(), index.y.try_into().unwrap());\n &self[y][x]\n }\n }\n\n impl IndexMut> for $container\n where\n I: Copy + TryInto,\n >::Error: Debug,\n C: IndexMut,\n {\n fn index_mut(&mut self, index: Vector2D) -> &mut Self::Output {\n let (x, y): (usize, usize) =\n (index.x.try_into().unwrap(), index.y.try_into().unwrap());\n &mut self[y][x]\n }\n }\n };\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"And now we can simply do"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"generate_indices!(VecDeque);\ngenerate_indices!([C]);\ngenerate_indices!(Vec);\n// generate_indices!([C; N], const N: usize);\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The last type (I took the inspiration from the implementations of the ",(0,i.jsx)(n.code,{children:"Index"})," and\n",(0,i.jsx)(n.code,{children:"IndexMut"})," traits) is a bit problematic, because of the ",(0,i.jsx)(n.code,{children:"const N: usize"})," part,\nwhich I haven't managed to be able to parse. And that's how I got rid of the error."]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["If I were to use 2D-indexing over ",(0,i.jsx)(n.code,{children:"[C; N]"})," slices, I'd probably just go with the\ncopy-paste, cause the cost of this \u201cmonstrosity\u201d outweighs the benefits of no DRY."]})}),"\n",(0,i.jsx)(n.h4,{id:"cause-of-the-problem",children:"Cause of the problem"}),"\n",(0,i.jsxs)(n.p,{children:["This issue is relatively funny. If you don't use any type aliases, just the raw\ntypes, you'll get suggested certain changes by the ",(0,i.jsx)(n.em,{children:"clippy"}),". For example if you\nconsider the following piece of code"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:'fn get_sum(nums: &Vec) -> i32 {\n nums.iter().sum()\n}\n\nfn main() {\n let nums = vec![1, 2, 3];\n println!("Sum: {}", get_sum(&nums));\n}\n'})}),"\n",(0,i.jsxs)(n.p,{children:["and you run ",(0,i.jsx)(n.em,{children:"clippy"})," on it, you will get"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:'Checking playground v0.0.1 (/playground)\nwarning: writing `&Vec` instead of `&[_]` involves a new object where a slice will do\n --\x3e src/main.rs:1:18\n |\n1 | fn get_sum(nums: &Vec) -> i32 {\n | ^^^^^^^^^ help: change this to: `&[i32]`\n |\n = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg\n = note: `#[warn(clippy::ptr_arg)]` on by default\n\nwarning: `playground` (bin "playground") generated 1 warning\n Finished dev [unoptimized + debuginfo] target(s) in 0.61s\n'})}),"\n",(0,i.jsx)(n.p,{children:"However, if you introduce a type alias, such as"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"type Numbers = Vec;\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Then ",(0,i.jsx)(n.em,{children:"clippy"})," won't say anything, cause there is literally nothing to suggest.\nHowever the outcome is not the same\u2026"]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>o});var i=t(67294);const s={},r=i.createContext(s);function o(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3da4b779.1354e52a.js b/assets/js/3da4b779.0020fbfc.js similarity index 89% rename from assets/js/3da4b779.1354e52a.js rename to assets/js/3da4b779.0020fbfc.js index bb12bc2..1c11d1a 100644 --- a/assets/js/3da4b779.1354e52a.js +++ b/assets/js/3da4b779.0020fbfc.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[2177],{28737:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>c,frontMatter:()=>o,metadata:()=>r,toc:()=>d});var i=t(85893),s=t(11151);const o={title:"4th week of Advent of Code '22 in Rust",description:"Surviving fourth week in Rust.",date:"2023-07-07T15:14",slug:"aoc-2022/4th-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},a=void 0,r={permalink:"/blog/aoc-2022/4th-week",editUrl:"https://github.com/mfocko/blog/tree/main/blog/aoc-2022/04-week-4.md",source:"@site/blog/aoc-2022/04-week-4.md",title:"4th week of Advent of Code '22 in Rust",description:"Surviving fourth week in Rust.",date:"2023-07-07T15:14:00.000Z",formattedDate:"July 7, 2023",tags:[{label:"advent-of-code",permalink:"/blog/tags/advent-of-code"},{label:"advent-of-code-2022",permalink:"/blog/tags/advent-of-code-2022"},{label:"rust",permalink:"/blog/tags/rust"}],readingTime:15.175,hasTruncateMarker:!0,authors:[{name:"Matej Focko",email:"me+blog@mfocko.xyz",title:"a.k.a. @mf",url:"https://gitlab.com/mfocko",imageURL:"https://github.com/mfocko.png",key:"mf"}],frontMatter:{title:"4th week of Advent of Code '22 in Rust",description:"Surviving fourth week in Rust.",date:"2023-07-07T15:14",slug:"aoc-2022/4th-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"How can Copr help with broken dependencies",permalink:"/blog/2023/08/02/copr"},nextItem:{title:"3rd week of Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/3rd-week"}},l={authorsImageUrls:[void 0]},d=[{value:"Day 22: Monkey Map",id:"day-22-monkey-map",level:2},{value:"Solution",id:"solution",level:3},{value:"Column iterator",id:"column-iterator",level:4},{value:"Walking around the map",id:"walking-around-the-map",level:4},{value:"Problems",id:"problems",level:4},{value:"Clippy",id:"clippy",level:4},{value:"Day 23: Unstable Diffusion",id:"day-23-unstable-diffusion",level:2},{value:"Solution",id:"solution-1",level:3},{value:"Day 24: Blizzard Basin",id:"day-24-blizzard-basin",level:2},{value:"Solution",id:"solution-2",level:3},{value:"Breakdown",id:"breakdown",level:4},{value:"Evaluating the blizzards",id:"evaluating-the-blizzards",level:4},{value:"Shortest-path algorithm",id:"shortest-path-algorithm",level:4},{value:"Min-heap",id:"min-heap",level:4},{value:"Day 25: Full of Hot Air",id:"day-25-full-of-hot-air",level:2},{value:"Solution",id:"solution-3",level:3},{value:"Converting from &str",id:"converting-from-str",level:4},{value:"Converting to String",id:"converting-to-string",level:4},{value:"Adjusting the code",id:"adjusting-the-code",level:4},{value:"Summary",id:"summary",level:2},{value:"Advent of Code",id:"advent-of-code",level:3},{value:"with Rust",id:"with-rust",level:3}];function h(e){const n={a:"a",admonition:"admonition",annotation:"annotation",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",hr:"hr",img:"img",li:"li",math:"math",mi:"mi",mrow:"mrow",p:"p",pre:"pre",semantics:"semantics",span:"span",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.p,{children:["Let's go through the fourth week of ",(0,i.jsx)(n.a,{href:"https://adventofcode.com",children:(0,i.jsx)(n.em,{children:"Advent of Code"})})," in Rust."]}),"\n",(0,i.jsx)(n.h2,{id:"day-22-monkey-map",children:(0,i.jsx)(n.a,{href:"https://adventofcode.com/2022/day/22",children:"Day 22: Monkey Map"})}),"\n",(0,i.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,i.jsx)(n.p,{children:"Simulating a movement on a 2D map with given instructions. Map becomes a cube in\nthe 2nd part\u2026"})}),"\n",(0,i.jsx)(n.admonition,{title:"Rant",type:"caution",children:(0,i.jsx)(n.p,{children:"This was the most obnoxious problem of this year\u2026 and a lot of Rust issues have\nbeen hit."})}),"\n",(0,i.jsx)(n.h3,{id:"solution",children:"Solution"}),"\n",(0,i.jsx)(n.p,{children:"It seems like a very simple problem to solve, but with very obnoxious changes in\nthe 2nd part and also it's relatively hard to decompose \xbbproperly\xab."}),"\n",(0,i.jsx)(n.h4,{id:"column-iterator",children:"Column iterator"}),"\n",(0,i.jsxs)(n.p,{children:["In the first part of the problem it was needed to know the boundaries of each\nrow and column, since I stored them in ",(0,i.jsx)(n.code,{children:"Vec>"})," and padded with spaces\nto ensure I have a rectangular 2D \u201carray\u201d. However when you wanted to go through\neach row and column to determine the boundaries, it was very easy to do for the\nrows (cause each row is a ",(0,i.jsx)(n.code,{children:"Vec"})," element), but not for the columns, since they\nspan multiple rows."]}),"\n",(0,i.jsxs)(n.p,{children:["For this use case I have implemented my own ",(0,i.jsx)(n.em,{children:"column iterator"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"pub struct ColumnIterator<'a, T> {\n map: &'a [Vec],\n column: usize,\n\n i: usize,\n}\n\nimpl<'a, T> ColumnIterator<'a, T> {\n pub fn new(map: &'a [Vec], column: usize) -> ColumnIterator<'a, T> {\n Self { map, column, i: 0 }\n }\n}\n\nimpl<'a, T> Iterator for ColumnIterator<'a, T> {\n type Item = &'a T;\n\n fn next(&mut self) -> Option {\n if self.i >= self.map.len() {\n return None;\n }\n\n self.i += 1;\n Some(&self.map[self.i - 1][self.column])\n }\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"Given this piece of an iterator, it is very easy to factor out the common\nfunctionality between the rows and columns into:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"let mut find_boundaries = |constructor: fn(usize) -> Orientation,\n iterator: &mut dyn Iterator,\n upper_bound,\n i| {\n let mut first_non_empty = iterator.enumerate().skip_while(|&(_, &c)| c == ' ');\n let start = first_non_empty.next().unwrap().0 as isize;\n\n let mut last_non_empty = first_non_empty.skip_while(|&(_, &c)| c != ' ');\n let end = last_non_empty.next().unwrap_or((upper_bound, &'_')).0 as isize;\n\n boundaries.insert(constructor(i), start..end);\n};\n"})}),"\n",(0,i.jsx)(n.p,{children:"And then use it as such:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"// construct all horizontal boundaries\n(0..map.len()).for_each(|row| {\n find_boundaries(\n Orientation::horizontal,\n &mut map[row].iter(),\n map[row].len(),\n row,\n );\n});\n\n// construct all vertical boundaries\n(0..map[0].len()).for_each(|col| {\n find_boundaries(\n Orientation::vertical,\n &mut ColumnIterator::new(&map, col),\n map.len(),\n col,\n );\n});\n"})}),"\n",(0,i.jsx)(n.h4,{id:"walking-around-the-map",children:"Walking around the map"}),"\n",(0,i.jsxs)(n.p,{children:["Once the 2nd part got introduced, you start to think about a way how not to\ncopy-paste a lot of stuff (I haven't avoided it anyways\u2026). In this problem, I've\nchosen to introduce a trait (i.e. ",(0,i.jsx)(n.em,{children:"interface"}),") for 2D and 3D walker."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"trait Wrap: Clone {\n type State;\n\n // simulation\n fn is_blocked(&self) -> bool;\n fn step(&mut self, steps: isize);\n fn turn_left(&mut self);\n fn turn_right(&mut self);\n\n // movement\n fn next(&self) -> (Self::State, Direction);\n\n // final answer\n fn answer(&self) -> Output;\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"Each walker maintains its own state and also provides the functions that are\nused during the simulation. The \u201cpromised\u201d methods are separated into:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.em,{children:"simulation"}),"-related: that are used during the simulation from the ",(0,i.jsx)(n.code,{children:".fold()"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.em,{children:"movement"}),"-related: just a one method that holds most of the logic differences\nbetween 2D and 3D"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.em,{children:"final answer"}),": which extracts the ",(0,i.jsx)(n.em,{children:"proof of solution"})," from the\nimplementation-specific walker"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Both 2D and 3D versions borrow the original input and therefore you must\nannotate the lifetime of it:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"struct Wrap2D<'a> {\n input: &'a Input,\n position: Position,\n direction: Direction,\n}\nimpl<'a> Wrap2D<'a> {\n fn new(input: &'a Input) -> Wrap2D<'a> {\n// \u2026\n"})}),"\n",(0,i.jsx)(n.h4,{id:"problems",children:"Problems"}),"\n",(0,i.jsx)(n.p,{children:"I have used a lot of closures for this problem and once I introduced a parameter\nthat was of unknown type (apart from the fact it implements a specific trait), I\ngot suggested a \u201cfix\u201d for the compilation error that resulted in something that\nwas not possible to parse, cause it, more than likely, violated the grammar."}),"\n",(0,i.jsxs)(n.p,{children:["In a similar fashion, I have been suggested changes that led to a code that\ndidn't make sense by just looking at it (there was no need to try the changes),\nfor example one suggested change in the closure parameter caused disapperance of\nthe parameter name. ","\ud83d\ude04"]}),"\n",(0,i.jsx)(n.h4,{id:"clippy",children:"Clippy"}),"\n",(0,i.jsx)(n.p,{children:"I have to admit that Clippy was rather helpful here, I'll include two examples\nof rather smart suggestions."}),"\n",(0,i.jsxs)(n.p,{children:["When writing the parsing for this problem, the first thing I have spotted on the\n",(0,i.jsx)(n.code,{children:"char"})," was the ",(0,i.jsx)(n.code,{children:".is_digit()"})," function that takes a radix as a parameter. Clippy\nnoticed that I use ",(0,i.jsx)(n.code,{children:"radix = 10"})," and suggested switching to ",(0,i.jsx)(n.code,{children:".is_ascii_digit()"}),"\nthat does exactly the same thing:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-diff",children:"- .take_while(|c| c.is_digit(10))\n+ .take_while(|c| c.is_ascii_digit())\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Another useful suggestion appeared when working with the iterators and I wanted\nto get the ",(0,i.jsxs)(n.span,{className:"katex",children:[(0,i.jsx)(n.span,{className:"katex-mathml",children:(0,i.jsx)(n.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,i.jsxs)(n.semantics,{children:[(0,i.jsx)(n.mrow,{children:(0,i.jsx)(n.mi,{children:"n"})}),(0,i.jsx)(n.annotation,{encoding:"application/x-tex",children:"n"})]})})}),(0,i.jsx)(n.span,{className:"katex-html","aria-hidden":"true",children:(0,i.jsxs)(n.span,{className:"base",children:[(0,i.jsx)(n.span,{className:"strut",style:{height:"0.4306em"}}),(0,i.jsx)(n.span,{className:"mord mathnormal",children:"n"})]})})]}),"-th element from it. You know the ",(0,i.jsx)(n.code,{children:".skip()"}),", you know the\n",(0,i.jsx)(n.code,{children:".next()"}),", just \u201cslap\u201d them together and we're done for ","\ud83d\ude01"," Well, I got\nsuggested to use ",(0,i.jsx)(n.code,{children:".nth()"})," that does exactly the combination of the two mentioned\nmethods on iterators:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-diff",children:"- match it.clone().skip(skip).next().unwrap() {\n+ match it.clone().nth(skip).unwrap() {\n"})}),"\n",(0,i.jsx)(n.h2,{id:"day-23-unstable-diffusion",children:(0,i.jsx)(n.a,{href:"https://adventofcode.com/2022/day/23",children:"Day 23: Unstable Diffusion"})}),"\n",(0,i.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,i.jsx)(n.p,{children:"Simulating movement of elves around with a set of specific rules."})}),"\n",(0,i.jsx)(n.h3,{id:"solution-1",children:"Solution"}),"\n",(0,i.jsxs)(n.p,{children:["There's not much to mention since it's just a cellular automaton simulation\n(even though the AoC rules for cellular automatons usually get out of hand\n","\ud83d\ude09",")."]}),"\n",(0,i.jsx)(n.p,{children:"Although I had a need to determine boundaries of the elves' positions and ended\nup with a nasty DRY violation. Knowing that you you're looking for maximum and\nminimum that are, of course, exactly the same except for initial values and\ncomparators, it looks like a rather simple fix, but typing in Rust is something\nelse, right? In the end I settled for a function that computes both boundaries\nwithout any duplication while using a closure:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"fn get_bounds(positions: &Input) -> (Vector2D, Vector2D) {\n let f = |init, cmp: &dyn Fn(isize, isize) -> isize| {\n positions\n .iter()\n .fold(Vector2D::new(init, init), |acc, elf| {\n Vector2D::new(cmp(acc.x(), elf.x()), cmp(acc.y(), elf.y()))\n })\n };\n\n (f(isize::MAX, &min::), f(isize::MIN, &max::))\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"This function returns a pair of 2D vectors that represent opposite points of the\nbounding rectangle of all elves."}),"\n",(0,i.jsxs)(n.p,{children:["You might ask why would we need a closure and the answer is that ",(0,i.jsx)(n.code,{children:"positions"}),"\ncannot be captured from within the nested function, only via closure. One more\nfun fact on top of that is the type of the comparator"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"&dyn Fn(isize, isize) -> isize\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Once we remove the ",(0,i.jsx)(n.code,{children:"dyn"})," keyword, compiler yells at us and also includes a way\nhow to get a more thorough explanation of the error by running"]}),"\n",(0,i.jsx)(n.p,{children:"$ rustc --explain E0782"}),"\n",(0,i.jsx)(n.p,{children:"which shows us"}),"\n",(0,i.jsxs)(n.p,{children:["Trait objects must include the ",(0,i.jsx)(n.code,{children:"dyn"})," keyword."]}),"\n",(0,i.jsx)(n.p,{children:"Erroneous code example:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"trait Foo {}\nfn test(arg: Box) {} // error!\n"})}),"\n",(0,i.jsx)(n.p,{children:"Trait objects are a way to call methods on types that are not known until\nruntime but conform to some trait."}),"\n",(0,i.jsxs)(n.p,{children:["Trait objects should be formed with ",(0,i.jsx)(n.code,{children:"Box"}),", but in the code above\n",(0,i.jsx)(n.code,{children:"dyn"})," is left off."]}),"\n",(0,i.jsxs)(n.p,{children:["This makes it harder to see that ",(0,i.jsx)(n.code,{children:"arg"})," is a trait object and not a\nsimply a heap allocated type called ",(0,i.jsx)(n.code,{children:"Foo"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["To fix this issue, add ",(0,i.jsx)(n.code,{children:"dyn"})," before the trait name."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"trait Foo {}\nfn test(arg: Box) {} // ok!\n"})}),"\n",(0,i.jsx)(n.p,{children:"This used to be allowed before edition 2021, but is now an error."}),"\n",(0,i.jsxs)(n.admonition,{title:"Rant",type:"danger",children:[(0,i.jsxs)(n.p,{children:["Not all of the explanations are helpful though, in some cases they might be even\nmore confusing than helpful, since they address ",(0,i.jsx)(n.em,{children:"very simple"})," use cases."]}),(0,i.jsx)(n.p,{children:"As you can see, even in this case there are two sides to the explanations:"}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["it explains why you need to use ",(0,i.jsx)(n.code,{children:"dyn"}),", but"]}),"\n",(0,i.jsxs)(n.li,{children:["it still mentions that trait objects need to be heap-allocated via ",(0,i.jsx)(n.code,{children:"Box"}),"\nthat, as you can see in my snippet, ",(0,i.jsx)(n.strong,{children:"does not"})," apply here ","\ud83d\ude04"," IMO it's\ncaused by the fact that we are borrowing it and therefore we don't need to\ncare about the size or whereabouts of it."]}),"\n"]})]}),"\n",(0,i.jsxs)(n.admonition,{title:"C++ parallel",type:"info",children:[(0,i.jsxs)(n.p,{children:["If you dive into the explanation above, you can notice that the ",(0,i.jsx)(n.code,{children:"Box"}),"\npattern is very helpful for using types that are not known during compile-time.\nYou would use a very similar approach in C++ when parsing some data structure\nfrom input (let's say JSON for example)."]}),(0,i.jsxs)(n.p,{children:["On the other hand, in this case, it doesn't really make much sense, cause you\ncan clearly see that the types ",(0,i.jsx)(n.strong,{children:"are known"})," during the compile-time, which in\nC++ could be easily resolved by templating the helper function."]})]}),"\n",(0,i.jsx)(n.h2,{id:"day-24-blizzard-basin",children:(0,i.jsx)(n.a,{href:"https://adventofcode.com/2022/day/24",children:"Day 24: Blizzard Basin"})}),"\n",(0,i.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,i.jsx)(n.p,{children:"Navigating your way through a basin with series of blizzards that move around\nyou as you move."})}),"\n",(0,i.jsx)(n.admonition,{type:"caution",children:(0,i.jsxs)(n.p,{children:["It's second to last day and I went \u201c",(0,i.jsx)(n.em,{children:"bonkers"}),"\u201d on the Rust ","\ud83d\ude04"," Proceed to\nread ",(0,i.jsx)(n.em,{children:"Solution"})," part on your own risk."]})}),"\n",(0,i.jsx)(n.h3,{id:"solution-2",children:"Solution"}),"\n",(0,i.jsx)(n.p,{children:"You are given a map with blizzards all over the place and you're supposed to\nfind the minimum time it requires you to walk through the basin without getting\nin any of the blizzards."}),"\n",(0,i.jsx)(n.h4,{id:"breakdown",children:"Breakdown"}),"\n",(0,i.jsxs)(n.p,{children:["Relatively simple, yet a bit annoying, approach can be taken. It's technically\na shortest-path algorithm implementation with some relaxation restrictions and\nbeing able to stay on one position for some time, so each ",(0,i.jsx)(n.em,{children:"vertex"})," of the graph\nis determined by the position on the map and the ",(0,i.jsx)(n.em,{children:"timestamp"}),". I have chosen to\nuse ",(0,i.jsx)(n.code,{children:"Vector3D"}),", since ",(0,i.jsx)(n.code,{children:"x"})," and ",(0,i.jsx)(n.code,{children:"y"})," attributes can be used for the position\nand, well, let's use ",(0,i.jsx)(n.code,{children:"z"})," for a timestamp, cause why not, right? ","\ud83d\ude09"]}),"\n",(0,i.jsx)(n.h4,{id:"evaluating-the-blizzards",children:"Evaluating the blizzards"}),"\n",(0,i.jsx)(n.admonition,{type:"caution",children:(0,i.jsx)(n.p,{children:"I think that this is the most perverted abuse of the traits in the whole 4 weeks\nof AoC in Rust\u2026"})}),"\n",(0,i.jsxs)(n.p,{children:["The blizzards move along their respective directions in time and loop around in\ntheir respective row/column. Each vertex holds position ",(0,i.jsx)(n.strong,{children:"and"})," time, so we can\n",(0,i.jsx)(n.em,{children:"just"})," index the basin with the vertex itself, right? Yes, we can ","\ud83d\ude08"]}),"\n",(0,i.jsx)(n.admonition,{title:"Fun fact",type:"tip",children:(0,i.jsx)(n.p,{children:"While writing this part, I've recognized unnecessary verbosity in the code and\ncleaned it up a bit. The changed version is shown here and the original was just\nmore verbose."})}),"\n",(0,i.jsxs)(n.p,{children:["I'll skip the boring parts of checking bounds and entry/exit of the basin ","\ud83d\ude09","\nWe can easily calculate positions of the blizzards using a modular arithmetics:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"impl Index for Basin {\n type Output = char;\n\n fn index(&self, index: Position) -> &Self::Output {\n // \u2039skipped boring parts\u203a\n\n // We need to account for the loops of the blizzards\n let width = self.cols - 2;\n let height = self.rows - 2;\n\n let blizzard_origin = |size, d, t, i| ((i - 1 + size + d * (t % size)) % size + 1) as usize;\n [\n (\n index.y() as usize,\n blizzard_origin(width, -1, index.z(), index.x()),\n '>',\n ),\n (\n index.y() as usize,\n blizzard_origin(width, 1, index.z(), index.x()),\n '<',\n ),\n (\n blizzard_origin(height, -1, index.z(), index.y()),\n index.x() as usize,\n 'v',\n ),\n (\n blizzard_origin(height, 1, index.z(), index.y()),\n index.x() as usize,\n '^',\n ),\n ]\n .iter()\n .find_map(|&(y, x, direction)| {\n if self.map[y][x] == direction {\n Some(&self.map[y][x])\n } else {\n None\n }\n })\n .unwrap_or(&'.')\n }\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["As you can see, there is an expression for calculating the original position and\nit's used multiple times, so why not take it out to a lambda, right? ","\ud83d\ude09"]}),"\n",(0,i.jsxs)(n.p,{children:["I couldn't get the ",(0,i.jsx)(n.code,{children:"rustfmt"})," to format the ",(0,i.jsx)(n.code,{children:"for"}),"-loop nicely, so I've just\ndecided to go with iterating over an elements of a slice. I have used, once\nagain, a combination of two functions (",(0,i.jsx)(n.code,{children:"find_map"})," in this case) to do 2 things\nat once and at the end, if we haven't found any blizzard, we just return the\nempty space."]}),"\n",(0,i.jsxs)(n.p,{children:["I think it's a very ",(0,i.jsx)(n.em,{children:"nice"})," (and naughty) way how to use the ",(0,i.jsx)(n.code,{children:"Index"})," trait, don't\nyou think?"]}),"\n",(0,i.jsx)(n.h4,{id:"shortest-path-algorithm",children:"Shortest-path algorithm"}),"\n",(0,i.jsxs)(n.p,{children:["For the shortest path you can choose and adjust any of the common shortest-path\nalgorithms, in my case, I have decided to use ",(0,i.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/A*_search_algorithm",children:(0,i.jsx)(n.em,{children:"A*"})})," instead of Dijkstra's\nalgorithm, since it better reflects the ",(0,i.jsx)(n.em,{children:"cost"})," function."]}),"\n",(0,i.jsxs)(n.admonition,{title:"Comparison of costs",type:"info",children:[(0,i.jsxs)(n.p,{children:["With the Dijkstra's algorithm I would proceed with the ",(0,i.jsx)(n.code,{children:"time"})," attribute used as\na priority for the queue."]}),(0,i.jsxs)(n.p,{children:["Whereas with the ",(0,i.jsx)(n.em,{children:"A*"}),", I have chosen to use both time and Manhattan distance\nthat promotes vertices closer to the exit ",(0,i.jsx)(n.strong,{children:"and"})," with a minimum time taken."]})]}),"\n",(0,i.jsxs)(n.p,{children:["Cost function is, of course, a closure ","\ud83d\ude09"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"let cost = |p: Position| p.z() as usize + exit.y().abs_diff(p.y()) + exit.x().abs_diff(p.x());\n"})}),"\n",(0,i.jsx)(n.p,{children:"And also for checking the possible moves from the current vertex, I have\nimplemented, yet another, closure that yields an iterator with the next moves:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"let next_positions = |p| {\n [(0, 0, 1), (0, -1, 1), (0, 1, 1), (-1, 0, 1), (1, 0, 1)]\n .iter()\n .filter_map(move |&(x, y, t)| {\n let next_p = p + Vector3D::new(x, y, t);\n\n if basin[next_p] == '.' {\n Some(next_p)\n } else {\n None\n }\n })\n};\n"})}),"\n",(0,i.jsx)(n.h4,{id:"min-heap",children:"Min-heap"}),"\n",(0,i.jsxs)(n.p,{children:["In this case I had a need to use the priority queue taking the elements with the\nlowest cost as the prioritized ones. Rust only offers you the ",(0,i.jsx)(n.a,{href:"https://doc.rust-lang.org/std/collections/struct.BinaryHeap.html",children:(0,i.jsx)(n.code,{children:"BinaryHeap"})})," and\nthat is a max-heap. One of the ways how to achieve a min-heap is to put the\nelements in wrapped in a ",(0,i.jsx)(n.a,{href:"https://doc.rust-lang.org/std/cmp/struct.Reverse.html",children:(0,i.jsx)(n.code,{children:"Reverse"})})," (as is even showed in the linked ",(0,i.jsxs)(n.a,{href:"https://doc.rust-lang.org/std/collections/struct.BinaryHeap.html#min-heap",children:["docs of\nthe ",(0,i.jsx)(n.code,{children:"BinaryHeap"})]}),"). However the wrapping affects the type of the heap and also\npopping the most prioritized elements yields values wrapped in the ",(0,i.jsx)(n.code,{children:"Reverse"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"For this purpose I have just taken the max-heap and wrapped it as a whole in a\nseparate structure providing just the desired methods:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"use std::cmp::{Ord, Reverse};\nuse std::collections::BinaryHeap;\n\npub struct MinHeap {\n heap: BinaryHeap>,\n}\n\nimpl MinHeap {\n pub fn new() -> MinHeap {\n MinHeap {\n heap: BinaryHeap::new(),\n }\n }\n\n pub fn push(&mut self, item: T) {\n self.heap.push(Reverse(item))\n }\n\n pub fn pop(&mut self) -> Option {\n self.heap.pop().map(|Reverse(x)| x)\n }\n}\n\nimpl Default for MinHeap {\n fn default() -> Self {\n Self::new()\n }\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"Rest is just the algorithm implementation which is not that interesting."}),"\n",(0,i.jsx)(n.h2,{id:"day-25-full-of-hot-air",children:(0,i.jsx)(n.a,{href:"https://adventofcode.com/2022/day/25",children:"Day 25: Full of Hot Air"})}),"\n",(0,i.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,i.jsxs)(n.p,{children:["Playing around with a numbers in a ",(0,i.jsx)(n.em,{children:"special"})," base."]})}),"\n",(0,i.jsxs)(n.p,{children:["Getting flashbacks to the ",(0,i.jsx)(n.em,{children:"IB111 Foundations of Programming"}),"\u2026 Very nice \u201cproblem\u201d\nwith a rather easy solution, as the last day always seems to be."]}),"\n",(0,i.jsx)(n.h3,{id:"solution-3",children:"Solution"}),"\n",(0,i.jsxs)(n.p,{children:["Implementing 2 functions, converting from the ",(0,i.jsx)(n.em,{children:"SNAFU base"})," and back to the ",(0,i.jsx)(n.em,{children:"SNAFU"}),"\n",(0,i.jsx)(n.em,{children:"base"})," representation. Let's do a bit more though! I have implemented two functions:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"from_snafu"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"to_snafu"})}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Now it is apparent that all I do is number to string and string to number. Hmm\u2026\nthat sounds familiar, doesn't it? Let's introduce a structure for the SNAFU numbers\nand implement the traits that we need."}),"\n",(0,i.jsx)(n.p,{children:"Let's start with a structure:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]\nstruct SNAFU {\n value: i64,\n}\n"})}),"\n",(0,i.jsxs)(n.h4,{id:"converting-from-str",children:["Converting from ",(0,i.jsx)(n.code,{children:"&str"})]}),"\n",(0,i.jsxs)(n.p,{children:["We will start by implementing the ",(0,i.jsx)(n.code,{children:"FromStr"})," trait that will help us parse our input.\nThis is rather simple, I can just take the ",(0,i.jsx)(n.code,{children:"from_snafu"})," function, copy-paste it\ninto the ",(0,i.jsx)(n.code,{children:"from_str"})," method and the number I get will be wrapped in ",(0,i.jsx)(n.code,{children:"Result"})," and\n",(0,i.jsx)(n.code,{children:"SNAFU"})," structure."]}),"\n",(0,i.jsxs)(n.h4,{id:"converting-to-string",children:["Converting to ",(0,i.jsx)(n.code,{children:"String"})]}),"\n",(0,i.jsxs)(n.p,{children:["This is more fun. In some cases you need to implement only one trait and others\nare automatically implemented using that one trait. In our case, if you look in\nthe documentation, you can see that ",(0,i.jsx)(n.code,{children:"ToString"})," trait is automatically implemented\nfor any type that implements ",(0,i.jsx)(n.code,{children:"Display"})," trait."]}),"\n",(0,i.jsxs)(n.p,{children:["Let's implement the ",(0,i.jsx)(n.code,{children:"Display"})," trait then. We should be able to use the ",(0,i.jsx)(n.code,{children:"to_snafu"}),"\nfunction and just take the ",(0,i.jsx)(n.code,{children:"self.value"})," from the ",(0,i.jsx)(n.code,{children:"SNAFU"})," structure."]}),"\n",(0,i.jsxs)(n.p,{children:["And for the convenience of tests, we can also implement a rather simple ",(0,i.jsx)(n.code,{children:"From"}),"\ntrait for the ",(0,i.jsx)(n.code,{children:"SNAFU"}),"."]}),"\n",(0,i.jsx)(n.h4,{id:"adjusting-the-code",children:"Adjusting the code"}),"\n",(0,i.jsx)(n.p,{children:"After those changes we need to adjust the code and tests."}),"\n",(0,i.jsx)(n.p,{children:"Parsing of the input is very easy, before we have used the lines, now we parse\neverything:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-diff",children:" fn parse_input>(pathname: P) -> Input {\n- file_to_lines(pathname)\n+ file_to_structs(pathname)\n }\n"})}),"\n",(0,i.jsx)(n.p,{children:"Part 1 needs to be adjusted a bit too:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-diff",children:" fn part_1(input: &Input) -> Output {\n- to_snafu(input.iter().map(|s| from_snafu(s)).sum())\n+ SNAFU::from(input.iter().map(|s| s.value).sum::()).to_string()\n }\n"})}),"\n",(0,i.jsx)(n.p,{children:"You can also see that it simplifies the meaning a bit and it is more explicit than\nthe previous versions."}),"\n",(0,i.jsx)(n.p,{children:"And for the tests:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-diff",children:" #[test]\n fn test_from() {\n- for (n, s) in EXAMPLES.iter() {\n- assert_eq!(from_snafu(s), *n);\n+ for (&n, s) in EXAMPLES.iter() {\n+ assert_eq!(s.parse::().unwrap().value, n);\n }\n }\n \n #[test]\n fn test_to() {\n- for (n, s) in EXAMPLES.iter() {\n- assert_eq!(to_snafu(*n), s.to_string());\n+ for (&n, s) in EXAMPLES.iter() {\n+ assert_eq!(SNAFU::from(n).to_string(), s.to_string());\n }\n"})}),"\n",(0,i.jsx)(n.h2,{id:"summary",children:"Summary"}),"\n",(0,i.jsx)(n.p,{children:"Let's wrap the whole thing up! Keeping in mind both AoC and the Rust\u2026"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Finished advent calendar :smile:",src:t(63321).Z+"",width:"2417",height:"1984"})}),"\n",(0,i.jsx)(n.h3,{id:"advent-of-code",children:"Advent of Code"}),"\n",(0,i.jsxs)(n.p,{children:["This year was quite fun, even though most of the solutions and posts came in\nlater on (",(0,i.jsx)(n.em,{children:"cough"})," in '23 ",(0,i.jsx)(n.em,{children:"cough"}),"). Day 22 was the most obnoxious one\u2026 And also\nit feels like I used priority queues and tree data structures ",(0,i.jsx)(n.strong,{children:"a lot"})," ","\ud83d\udc40"]}),"\n",(0,i.jsx)(n.h3,{id:"with-rust",children:"with Rust"}),"\n",(0,i.jsx)(n.p,{children:"I must admit that a lot of compiler warnings and errors were very useful. Even\nthough I still found some instances where they didn't help at all or cause even\nworse issues than I had. Compilation times have been addressed with the caching."}),"\n",(0,i.jsx)(n.p,{children:"Building my first tree data structure in Rust has been a very \u201cinteresting\u201d\njourney. Being able to write a more generic BFS algorithm that allows you to not\nduplicate code while still mantaining the desired functionality contributes to\na very readable code."}),"\n",(0,i.jsx)(n.p,{children:"I am definitely much more aware of the basic things that bloated Python is\nmissing, yet Rust has them\u2026"}),"\n",(0,i.jsxs)(n.p,{children:["Using explicit types and writing down placeholder functions with ",(0,i.jsx)(n.code,{children:"todo!()"}),"\nmacros is very pleasant, since it allows you to easily navigate the type system\nduring the development when you don't even need to be sure how are you going to\nput the smaller pieces together."]}),"\n",(0,i.jsx)(n.p,{children:"I have used a plethora of traits and also implemented some of them to either be\nidiomatic, or exploit the syntactic sugar they offer. Deriving the default trait\nimplementation is also very helpful in a lot of cases, e.g. debugging output,\ncopying, equality comparison, etc."}),"\n",(0,i.jsx)(n.p,{children:"I confess to touching more \u201ccursed\u201d parts of the Rust, such as macros to\ndeclutter the copy-paste for tests or writing my own structures that need to\ncarry a lifetime for their own fields."}),"\n",(0,i.jsxs)(n.p,{children:["tl;dr Relatively pleasant language until you hit brick wall ","\ud83d\ude09"]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsxs)(n.p,{children:["See you next year! Maybe in Rust, maybe not ","\ud83d\ude43"]})]})}function c(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},63321:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/calendar-f891b624f3e0efb34bba582100a7d8df.png"},11151:(e,n,t)=>{t.d(n,{Z:()=>r,a:()=>a});var i=t(67294);const s={},o=i.createContext(s);function a(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[2177],{28737:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>c,frontMatter:()=>o,metadata:()=>r,toc:()=>d});var i=t(85893),s=t(11151);const o={title:"4th week of Advent of Code '22 in Rust",description:"Surviving fourth week in Rust.",date:"2023-07-07T15:14",slug:"aoc-2022/4th-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},a=void 0,r={permalink:"/blog/aoc-2022/4th-week",editUrl:"https://github.com/mfocko/blog/tree/main/blog/aoc-2022/04-week-4.md",source:"@site/blog/aoc-2022/04-week-4.md",title:"4th week of Advent of Code '22 in Rust",description:"Surviving fourth week in Rust.",date:"2023-07-07T15:14:00.000Z",formattedDate:"July 7, 2023",tags:[{label:"advent-of-code",permalink:"/blog/tags/advent-of-code"},{label:"advent-of-code-2022",permalink:"/blog/tags/advent-of-code-2022"},{label:"rust",permalink:"/blog/tags/rust"}],readingTime:15.175,hasTruncateMarker:!0,authors:[{name:"Matej Focko",email:"me+blog@mfocko.xyz",title:"a.k.a. @mf",url:"https://gitlab.com/mfocko",imageURL:"https://github.com/mfocko.png",key:"mf"}],frontMatter:{title:"4th week of Advent of Code '22 in Rust",description:"Surviving fourth week in Rust.",date:"2023-07-07T15:14",slug:"aoc-2022/4th-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"How can Copr help with broken dependencies",permalink:"/blog/2023/08/02/copr"},nextItem:{title:"3rd week of Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/3rd-week"}},l={authorsImageUrls:[void 0]},d=[{value:"Day 22: Monkey Map",id:"day-22-monkey-map",level:2},{value:"Solution",id:"solution",level:3},{value:"Column iterator",id:"column-iterator",level:4},{value:"Walking around the map",id:"walking-around-the-map",level:4},{value:"Problems",id:"problems",level:4},{value:"Clippy",id:"clippy",level:4},{value:"Day 23: Unstable Diffusion",id:"day-23-unstable-diffusion",level:2},{value:"Solution",id:"solution-1",level:3},{value:"Day 24: Blizzard Basin",id:"day-24-blizzard-basin",level:2},{value:"Solution",id:"solution-2",level:3},{value:"Breakdown",id:"breakdown",level:4},{value:"Evaluating the blizzards",id:"evaluating-the-blizzards",level:4},{value:"Shortest-path algorithm",id:"shortest-path-algorithm",level:4},{value:"Min-heap",id:"min-heap",level:4},{value:"Day 25: Full of Hot Air",id:"day-25-full-of-hot-air",level:2},{value:"Solution",id:"solution-3",level:3},{value:"Converting from &str",id:"converting-from-str",level:4},{value:"Converting to String",id:"converting-to-string",level:4},{value:"Adjusting the code",id:"adjusting-the-code",level:4},{value:"Summary",id:"summary",level:2},{value:"Advent of Code",id:"advent-of-code",level:3},{value:"with Rust",id:"with-rust",level:3}];function h(e){const n={a:"a",admonition:"admonition",annotation:"annotation",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",hr:"hr",img:"img",li:"li",math:"math",mi:"mi",mrow:"mrow",p:"p",pre:"pre",semantics:"semantics",span:"span",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.p,{children:["Let's go through the fourth week of ",(0,i.jsx)(n.a,{href:"https://adventofcode.com",children:(0,i.jsx)(n.em,{children:"Advent of Code"})})," in Rust."]}),"\n",(0,i.jsx)(n.h2,{id:"day-22-monkey-map",children:(0,i.jsx)(n.a,{href:"https://adventofcode.com/2022/day/22",children:"Day 22: Monkey Map"})}),"\n",(0,i.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,i.jsx)(n.p,{children:"Simulating a movement on a 2D map with given instructions. Map becomes a cube in\nthe 2nd part\u2026"})}),"\n",(0,i.jsx)(n.admonition,{title:"Rant",type:"caution",children:(0,i.jsx)(n.p,{children:"This was the most obnoxious problem of this year\u2026 and a lot of Rust issues have\nbeen hit."})}),"\n",(0,i.jsx)(n.h3,{id:"solution",children:"Solution"}),"\n",(0,i.jsx)(n.p,{children:"It seems like a very simple problem to solve, but with very obnoxious changes in\nthe 2nd part and also it's relatively hard to decompose \xbbproperly\xab."}),"\n",(0,i.jsx)(n.h4,{id:"column-iterator",children:"Column iterator"}),"\n",(0,i.jsxs)(n.p,{children:["In the first part of the problem it was needed to know the boundaries of each\nrow and column, since I stored them in ",(0,i.jsx)(n.code,{children:"Vec>"})," and padded with spaces\nto ensure I have a rectangular 2D \u201carray\u201d. However when you wanted to go through\neach row and column to determine the boundaries, it was very easy to do for the\nrows (cause each row is a ",(0,i.jsx)(n.code,{children:"Vec"})," element), but not for the columns, since they\nspan multiple rows."]}),"\n",(0,i.jsxs)(n.p,{children:["For this use case I have implemented my own ",(0,i.jsx)(n.em,{children:"column iterator"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"pub struct ColumnIterator<'a, T> {\n map: &'a [Vec],\n column: usize,\n\n i: usize,\n}\n\nimpl<'a, T> ColumnIterator<'a, T> {\n pub fn new(map: &'a [Vec], column: usize) -> ColumnIterator<'a, T> {\n Self { map, column, i: 0 }\n }\n}\n\nimpl<'a, T> Iterator for ColumnIterator<'a, T> {\n type Item = &'a T;\n\n fn next(&mut self) -> Option {\n if self.i >= self.map.len() {\n return None;\n }\n\n self.i += 1;\n Some(&self.map[self.i - 1][self.column])\n }\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"Given this piece of an iterator, it is very easy to factor out the common\nfunctionality between the rows and columns into:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"let mut find_boundaries = |constructor: fn(usize) -> Orientation,\n iterator: &mut dyn Iterator,\n upper_bound,\n i| {\n let mut first_non_empty = iterator.enumerate().skip_while(|&(_, &c)| c == ' ');\n let start = first_non_empty.next().unwrap().0 as isize;\n\n let mut last_non_empty = first_non_empty.skip_while(|&(_, &c)| c != ' ');\n let end = last_non_empty.next().unwrap_or((upper_bound, &'_')).0 as isize;\n\n boundaries.insert(constructor(i), start..end);\n};\n"})}),"\n",(0,i.jsx)(n.p,{children:"And then use it as such:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"// construct all horizontal boundaries\n(0..map.len()).for_each(|row| {\n find_boundaries(\n Orientation::horizontal,\n &mut map[row].iter(),\n map[row].len(),\n row,\n );\n});\n\n// construct all vertical boundaries\n(0..map[0].len()).for_each(|col| {\n find_boundaries(\n Orientation::vertical,\n &mut ColumnIterator::new(&map, col),\n map.len(),\n col,\n );\n});\n"})}),"\n",(0,i.jsx)(n.h4,{id:"walking-around-the-map",children:"Walking around the map"}),"\n",(0,i.jsxs)(n.p,{children:["Once the 2nd part got introduced, you start to think about a way how not to\ncopy-paste a lot of stuff (I haven't avoided it anyways\u2026). In this problem, I've\nchosen to introduce a trait (i.e. ",(0,i.jsx)(n.em,{children:"interface"}),") for 2D and 3D walker."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"trait Wrap: Clone {\n type State;\n\n // simulation\n fn is_blocked(&self) -> bool;\n fn step(&mut self, steps: isize);\n fn turn_left(&mut self);\n fn turn_right(&mut self);\n\n // movement\n fn next(&self) -> (Self::State, Direction);\n\n // final answer\n fn answer(&self) -> Output;\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"Each walker maintains its own state and also provides the functions that are\nused during the simulation. The \u201cpromised\u201d methods are separated into:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.em,{children:"simulation"}),"-related: that are used during the simulation from the ",(0,i.jsx)(n.code,{children:".fold()"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.em,{children:"movement"}),"-related: just a one method that holds most of the logic differences\nbetween 2D and 3D"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.em,{children:"final answer"}),": which extracts the ",(0,i.jsx)(n.em,{children:"proof of solution"})," from the\nimplementation-specific walker"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Both 2D and 3D versions borrow the original input and therefore you must\nannotate the lifetime of it:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"struct Wrap2D<'a> {\n input: &'a Input,\n position: Position,\n direction: Direction,\n}\nimpl<'a> Wrap2D<'a> {\n fn new(input: &'a Input) -> Wrap2D<'a> {\n// \u2026\n"})}),"\n",(0,i.jsx)(n.h4,{id:"problems",children:"Problems"}),"\n",(0,i.jsx)(n.p,{children:"I have used a lot of closures for this problem and once I introduced a parameter\nthat was of unknown type (apart from the fact it implements a specific trait), I\ngot suggested a \u201cfix\u201d for the compilation error that resulted in something that\nwas not possible to parse, cause it, more than likely, violated the grammar."}),"\n",(0,i.jsxs)(n.p,{children:["In a similar fashion, I have been suggested changes that led to a code that\ndidn't make sense by just looking at it (there was no need to try the changes),\nfor example one suggested change in the closure parameter caused disapperance of\nthe parameter name. ","\ud83d\ude04"]}),"\n",(0,i.jsx)(n.h4,{id:"clippy",children:"Clippy"}),"\n",(0,i.jsx)(n.p,{children:"I have to admit that Clippy was rather helpful here, I'll include two examples\nof rather smart suggestions."}),"\n",(0,i.jsxs)(n.p,{children:["When writing the parsing for this problem, the first thing I have spotted on the\n",(0,i.jsx)(n.code,{children:"char"})," was the ",(0,i.jsx)(n.code,{children:".is_digit()"})," function that takes a radix as a parameter. Clippy\nnoticed that I use ",(0,i.jsx)(n.code,{children:"radix = 10"})," and suggested switching to ",(0,i.jsx)(n.code,{children:".is_ascii_digit()"}),"\nthat does exactly the same thing:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-diff",children:"- .take_while(|c| c.is_digit(10))\n+ .take_while(|c| c.is_ascii_digit())\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Another useful suggestion appeared when working with the iterators and I wanted\nto get the ",(0,i.jsxs)(n.span,{className:"katex",children:[(0,i.jsx)(n.span,{className:"katex-mathml",children:(0,i.jsx)(n.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,i.jsxs)(n.semantics,{children:[(0,i.jsx)(n.mrow,{children:(0,i.jsx)(n.mi,{children:"n"})}),(0,i.jsx)(n.annotation,{encoding:"application/x-tex",children:"n"})]})})}),(0,i.jsx)(n.span,{className:"katex-html","aria-hidden":"true",children:(0,i.jsxs)(n.span,{className:"base",children:[(0,i.jsx)(n.span,{className:"strut",style:{height:"0.4306em"}}),(0,i.jsx)(n.span,{className:"mord mathnormal",children:"n"})]})})]}),"-th element from it. You know the ",(0,i.jsx)(n.code,{children:".skip()"}),", you know the\n",(0,i.jsx)(n.code,{children:".next()"}),", just \u201cslap\u201d them together and we're done for ","\ud83d\ude01"," Well, I got\nsuggested to use ",(0,i.jsx)(n.code,{children:".nth()"})," that does exactly the combination of the two mentioned\nmethods on iterators:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-diff",children:"- match it.clone().skip(skip).next().unwrap() {\n+ match it.clone().nth(skip).unwrap() {\n"})}),"\n",(0,i.jsx)(n.h2,{id:"day-23-unstable-diffusion",children:(0,i.jsx)(n.a,{href:"https://adventofcode.com/2022/day/23",children:"Day 23: Unstable Diffusion"})}),"\n",(0,i.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,i.jsx)(n.p,{children:"Simulating movement of elves around with a set of specific rules."})}),"\n",(0,i.jsx)(n.h3,{id:"solution-1",children:"Solution"}),"\n",(0,i.jsxs)(n.p,{children:["There's not much to mention since it's just a cellular automaton simulation\n(even though the AoC rules for cellular automatons usually get out of hand\n","\ud83d\ude09",")."]}),"\n",(0,i.jsx)(n.p,{children:"Although I had a need to determine boundaries of the elves' positions and ended\nup with a nasty DRY violation. Knowing that you you're looking for maximum and\nminimum that are, of course, exactly the same except for initial values and\ncomparators, it looks like a rather simple fix, but typing in Rust is something\nelse, right? In the end I settled for a function that computes both boundaries\nwithout any duplication while using a closure:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"fn get_bounds(positions: &Input) -> (Vector2D, Vector2D) {\n let f = |init, cmp: &dyn Fn(isize, isize) -> isize| {\n positions\n .iter()\n .fold(Vector2D::new(init, init), |acc, elf| {\n Vector2D::new(cmp(acc.x(), elf.x()), cmp(acc.y(), elf.y()))\n })\n };\n\n (f(isize::MAX, &min::), f(isize::MIN, &max::))\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"This function returns a pair of 2D vectors that represent opposite points of the\nbounding rectangle of all elves."}),"\n",(0,i.jsxs)(n.p,{children:["You might ask why would we need a closure and the answer is that ",(0,i.jsx)(n.code,{children:"positions"}),"\ncannot be captured from within the nested function, only via closure. One more\nfun fact on top of that is the type of the comparator"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"&dyn Fn(isize, isize) -> isize\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Once we remove the ",(0,i.jsx)(n.code,{children:"dyn"})," keyword, compiler yells at us and also includes a way\nhow to get a more thorough explanation of the error by running"]}),"\n",(0,i.jsx)(n.p,{children:"$ rustc --explain E0782"}),"\n",(0,i.jsx)(n.p,{children:"which shows us"}),"\n",(0,i.jsxs)(n.p,{children:["Trait objects must include the ",(0,i.jsx)(n.code,{children:"dyn"})," keyword."]}),"\n",(0,i.jsx)(n.p,{children:"Erroneous code example:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"trait Foo {}\nfn test(arg: Box) {} // error!\n"})}),"\n",(0,i.jsx)(n.p,{children:"Trait objects are a way to call methods on types that are not known until\nruntime but conform to some trait."}),"\n",(0,i.jsxs)(n.p,{children:["Trait objects should be formed with ",(0,i.jsx)(n.code,{children:"Box"}),", but in the code above\n",(0,i.jsx)(n.code,{children:"dyn"})," is left off."]}),"\n",(0,i.jsxs)(n.p,{children:["This makes it harder to see that ",(0,i.jsx)(n.code,{children:"arg"})," is a trait object and not a\nsimply a heap allocated type called ",(0,i.jsx)(n.code,{children:"Foo"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["To fix this issue, add ",(0,i.jsx)(n.code,{children:"dyn"})," before the trait name."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"trait Foo {}\nfn test(arg: Box) {} // ok!\n"})}),"\n",(0,i.jsx)(n.p,{children:"This used to be allowed before edition 2021, but is now an error."}),"\n",(0,i.jsxs)(n.admonition,{title:"Rant",type:"danger",children:[(0,i.jsxs)(n.p,{children:["Not all of the explanations are helpful though, in some cases they might be even\nmore confusing than helpful, since they address ",(0,i.jsx)(n.em,{children:"very simple"})," use cases."]}),(0,i.jsx)(n.p,{children:"As you can see, even in this case there are two sides to the explanations:"}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["it explains why you need to use ",(0,i.jsx)(n.code,{children:"dyn"}),", but"]}),"\n",(0,i.jsxs)(n.li,{children:["it still mentions that trait objects need to be heap-allocated via ",(0,i.jsx)(n.code,{children:"Box"}),"\nthat, as you can see in my snippet, ",(0,i.jsx)(n.strong,{children:"does not"})," apply here ","\ud83d\ude04"," IMO it's\ncaused by the fact that we are borrowing it and therefore we don't need to\ncare about the size or whereabouts of it."]}),"\n"]})]}),"\n",(0,i.jsxs)(n.admonition,{title:"C++ parallel",type:"info",children:[(0,i.jsxs)(n.p,{children:["If you dive into the explanation above, you can notice that the ",(0,i.jsx)(n.code,{children:"Box"}),"\npattern is very helpful for using types that are not known during compile-time.\nYou would use a very similar approach in C++ when parsing some data structure\nfrom input (let's say JSON for example)."]}),(0,i.jsxs)(n.p,{children:["On the other hand, in this case, it doesn't really make much sense, cause you\ncan clearly see that the types ",(0,i.jsx)(n.strong,{children:"are known"})," during the compile-time, which in\nC++ could be easily resolved by templating the helper function."]})]}),"\n",(0,i.jsx)(n.h2,{id:"day-24-blizzard-basin",children:(0,i.jsx)(n.a,{href:"https://adventofcode.com/2022/day/24",children:"Day 24: Blizzard Basin"})}),"\n",(0,i.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,i.jsx)(n.p,{children:"Navigating your way through a basin with series of blizzards that move around\nyou as you move."})}),"\n",(0,i.jsx)(n.admonition,{type:"caution",children:(0,i.jsxs)(n.p,{children:["It's second to last day and I went \u201c",(0,i.jsx)(n.em,{children:"bonkers"}),"\u201d on the Rust ","\ud83d\ude04"," Proceed to\nread ",(0,i.jsx)(n.em,{children:"Solution"})," part on your own risk."]})}),"\n",(0,i.jsx)(n.h3,{id:"solution-2",children:"Solution"}),"\n",(0,i.jsx)(n.p,{children:"You are given a map with blizzards all over the place and you're supposed to\nfind the minimum time it requires you to walk through the basin without getting\nin any of the blizzards."}),"\n",(0,i.jsx)(n.h4,{id:"breakdown",children:"Breakdown"}),"\n",(0,i.jsxs)(n.p,{children:["Relatively simple, yet a bit annoying, approach can be taken. It's technically\na shortest-path algorithm implementation with some relaxation restrictions and\nbeing able to stay on one position for some time, so each ",(0,i.jsx)(n.em,{children:"vertex"})," of the graph\nis determined by the position on the map and the ",(0,i.jsx)(n.em,{children:"timestamp"}),". I have chosen to\nuse ",(0,i.jsx)(n.code,{children:"Vector3D"}),", since ",(0,i.jsx)(n.code,{children:"x"})," and ",(0,i.jsx)(n.code,{children:"y"})," attributes can be used for the position\nand, well, let's use ",(0,i.jsx)(n.code,{children:"z"})," for a timestamp, cause why not, right? ","\ud83d\ude09"]}),"\n",(0,i.jsx)(n.h4,{id:"evaluating-the-blizzards",children:"Evaluating the blizzards"}),"\n",(0,i.jsx)(n.admonition,{type:"caution",children:(0,i.jsx)(n.p,{children:"I think that this is the most perverted abuse of the traits in the whole 4 weeks\nof AoC in Rust\u2026"})}),"\n",(0,i.jsxs)(n.p,{children:["The blizzards move along their respective directions in time and loop around in\ntheir respective row/column. Each vertex holds position ",(0,i.jsx)(n.strong,{children:"and"})," time, so we can\n",(0,i.jsx)(n.em,{children:"just"})," index the basin with the vertex itself, right? Yes, we can ","\ud83d\ude08"]}),"\n",(0,i.jsx)(n.admonition,{title:"Fun fact",type:"tip",children:(0,i.jsx)(n.p,{children:"While writing this part, I've recognized unnecessary verbosity in the code and\ncleaned it up a bit. The changed version is shown here and the original was just\nmore verbose."})}),"\n",(0,i.jsxs)(n.p,{children:["I'll skip the boring parts of checking bounds and entry/exit of the basin ","\ud83d\ude09","\nWe can easily calculate positions of the blizzards using a modular arithmetics:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"impl Index for Basin {\n type Output = char;\n\n fn index(&self, index: Position) -> &Self::Output {\n // \u2039skipped boring parts\u203a\n\n // We need to account for the loops of the blizzards\n let width = self.cols - 2;\n let height = self.rows - 2;\n\n let blizzard_origin = |size, d, t, i| ((i - 1 + size + d * (t % size)) % size + 1) as usize;\n [\n (\n index.y() as usize,\n blizzard_origin(width, -1, index.z(), index.x()),\n '>',\n ),\n (\n index.y() as usize,\n blizzard_origin(width, 1, index.z(), index.x()),\n '<',\n ),\n (\n blizzard_origin(height, -1, index.z(), index.y()),\n index.x() as usize,\n 'v',\n ),\n (\n blizzard_origin(height, 1, index.z(), index.y()),\n index.x() as usize,\n '^',\n ),\n ]\n .iter()\n .find_map(|&(y, x, direction)| {\n if self.map[y][x] == direction {\n Some(&self.map[y][x])\n } else {\n None\n }\n })\n .unwrap_or(&'.')\n }\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["As you can see, there is an expression for calculating the original position and\nit's used multiple times, so why not take it out to a lambda, right? ","\ud83d\ude09"]}),"\n",(0,i.jsxs)(n.p,{children:["I couldn't get the ",(0,i.jsx)(n.code,{children:"rustfmt"})," to format the ",(0,i.jsx)(n.code,{children:"for"}),"-loop nicely, so I've just\ndecided to go with iterating over an elements of a slice. I have used, once\nagain, a combination of two functions (",(0,i.jsx)(n.code,{children:"find_map"})," in this case) to do 2 things\nat once and at the end, if we haven't found any blizzard, we just return the\nempty space."]}),"\n",(0,i.jsxs)(n.p,{children:["I think it's a very ",(0,i.jsx)(n.em,{children:"nice"})," (and naughty) way how to use the ",(0,i.jsx)(n.code,{children:"Index"})," trait, don't\nyou think?"]}),"\n",(0,i.jsx)(n.h4,{id:"shortest-path-algorithm",children:"Shortest-path algorithm"}),"\n",(0,i.jsxs)(n.p,{children:["For the shortest path you can choose and adjust any of the common shortest-path\nalgorithms, in my case, I have decided to use ",(0,i.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/A*_search_algorithm",children:(0,i.jsx)(n.em,{children:"A*"})})," instead of Dijkstra's\nalgorithm, since it better reflects the ",(0,i.jsx)(n.em,{children:"cost"})," function."]}),"\n",(0,i.jsxs)(n.admonition,{title:"Comparison of costs",type:"info",children:[(0,i.jsxs)(n.p,{children:["With the Dijkstra's algorithm I would proceed with the ",(0,i.jsx)(n.code,{children:"time"})," attribute used as\na priority for the queue."]}),(0,i.jsxs)(n.p,{children:["Whereas with the ",(0,i.jsx)(n.em,{children:"A*"}),", I have chosen to use both time and Manhattan distance\nthat promotes vertices closer to the exit ",(0,i.jsx)(n.strong,{children:"and"})," with a minimum time taken."]})]}),"\n",(0,i.jsxs)(n.p,{children:["Cost function is, of course, a closure ","\ud83d\ude09"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"let cost = |p: Position| p.z() as usize + exit.y().abs_diff(p.y()) + exit.x().abs_diff(p.x());\n"})}),"\n",(0,i.jsx)(n.p,{children:"And also for checking the possible moves from the current vertex, I have\nimplemented, yet another, closure that yields an iterator with the next moves:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"let next_positions = |p| {\n [(0, 0, 1), (0, -1, 1), (0, 1, 1), (-1, 0, 1), (1, 0, 1)]\n .iter()\n .filter_map(move |&(x, y, t)| {\n let next_p = p + Vector3D::new(x, y, t);\n\n if basin[next_p] == '.' {\n Some(next_p)\n } else {\n None\n }\n })\n};\n"})}),"\n",(0,i.jsx)(n.h4,{id:"min-heap",children:"Min-heap"}),"\n",(0,i.jsxs)(n.p,{children:["In this case I had a need to use the priority queue taking the elements with the\nlowest cost as the prioritized ones. Rust only offers you the ",(0,i.jsx)(n.a,{href:"https://doc.rust-lang.org/std/collections/struct.BinaryHeap.html",children:(0,i.jsx)(n.code,{children:"BinaryHeap"})})," and\nthat is a max-heap. One of the ways how to achieve a min-heap is to put the\nelements in wrapped in a ",(0,i.jsx)(n.a,{href:"https://doc.rust-lang.org/std/cmp/struct.Reverse.html",children:(0,i.jsx)(n.code,{children:"Reverse"})})," (as is even showed in the linked ",(0,i.jsxs)(n.a,{href:"https://doc.rust-lang.org/std/collections/struct.BinaryHeap.html#min-heap",children:["docs of\nthe ",(0,i.jsx)(n.code,{children:"BinaryHeap"})]}),"). However the wrapping affects the type of the heap and also\npopping the most prioritized elements yields values wrapped in the ",(0,i.jsx)(n.code,{children:"Reverse"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"For this purpose I have just taken the max-heap and wrapped it as a whole in a\nseparate structure providing just the desired methods:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"use std::cmp::{Ord, Reverse};\nuse std::collections::BinaryHeap;\n\npub struct MinHeap {\n heap: BinaryHeap>,\n}\n\nimpl MinHeap {\n pub fn new() -> MinHeap {\n MinHeap {\n heap: BinaryHeap::new(),\n }\n }\n\n pub fn push(&mut self, item: T) {\n self.heap.push(Reverse(item))\n }\n\n pub fn pop(&mut self) -> Option {\n self.heap.pop().map(|Reverse(x)| x)\n }\n}\n\nimpl Default for MinHeap {\n fn default() -> Self {\n Self::new()\n }\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"Rest is just the algorithm implementation which is not that interesting."}),"\n",(0,i.jsx)(n.h2,{id:"day-25-full-of-hot-air",children:(0,i.jsx)(n.a,{href:"https://adventofcode.com/2022/day/25",children:"Day 25: Full of Hot Air"})}),"\n",(0,i.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,i.jsxs)(n.p,{children:["Playing around with a numbers in a ",(0,i.jsx)(n.em,{children:"special"})," base."]})}),"\n",(0,i.jsxs)(n.p,{children:["Getting flashbacks to the ",(0,i.jsx)(n.em,{children:"IB111 Foundations of Programming"}),"\u2026 Very nice \u201cproblem\u201d\nwith a rather easy solution, as the last day always seems to be."]}),"\n",(0,i.jsx)(n.h3,{id:"solution-3",children:"Solution"}),"\n",(0,i.jsxs)(n.p,{children:["Implementing 2 functions, converting from the ",(0,i.jsx)(n.em,{children:"SNAFU base"})," and back to the ",(0,i.jsx)(n.em,{children:"SNAFU"}),"\n",(0,i.jsx)(n.em,{children:"base"})," representation. Let's do a bit more though! I have implemented two functions:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"from_snafu"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"to_snafu"})}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Now it is apparent that all I do is number to string and string to number. Hmm\u2026\nthat sounds familiar, doesn't it? Let's introduce a structure for the SNAFU numbers\nand implement the traits that we need."}),"\n",(0,i.jsx)(n.p,{children:"Let's start with a structure:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]\nstruct SNAFU {\n value: i64,\n}\n"})}),"\n",(0,i.jsxs)(n.h4,{id:"converting-from-str",children:["Converting from ",(0,i.jsx)(n.code,{children:"&str"})]}),"\n",(0,i.jsxs)(n.p,{children:["We will start by implementing the ",(0,i.jsx)(n.code,{children:"FromStr"})," trait that will help us parse our input.\nThis is rather simple, I can just take the ",(0,i.jsx)(n.code,{children:"from_snafu"})," function, copy-paste it\ninto the ",(0,i.jsx)(n.code,{children:"from_str"})," method and the number I get will be wrapped in ",(0,i.jsx)(n.code,{children:"Result"})," and\n",(0,i.jsx)(n.code,{children:"SNAFU"})," structure."]}),"\n",(0,i.jsxs)(n.h4,{id:"converting-to-string",children:["Converting to ",(0,i.jsx)(n.code,{children:"String"})]}),"\n",(0,i.jsxs)(n.p,{children:["This is more fun. In some cases you need to implement only one trait and others\nare automatically implemented using that one trait. In our case, if you look in\nthe documentation, you can see that ",(0,i.jsx)(n.code,{children:"ToString"})," trait is automatically implemented\nfor any type that implements ",(0,i.jsx)(n.code,{children:"Display"})," trait."]}),"\n",(0,i.jsxs)(n.p,{children:["Let's implement the ",(0,i.jsx)(n.code,{children:"Display"})," trait then. We should be able to use the ",(0,i.jsx)(n.code,{children:"to_snafu"}),"\nfunction and just take the ",(0,i.jsx)(n.code,{children:"self.value"})," from the ",(0,i.jsx)(n.code,{children:"SNAFU"})," structure."]}),"\n",(0,i.jsxs)(n.p,{children:["And for the convenience of tests, we can also implement a rather simple ",(0,i.jsx)(n.code,{children:"From"}),"\ntrait for the ",(0,i.jsx)(n.code,{children:"SNAFU"}),"."]}),"\n",(0,i.jsx)(n.h4,{id:"adjusting-the-code",children:"Adjusting the code"}),"\n",(0,i.jsx)(n.p,{children:"After those changes we need to adjust the code and tests."}),"\n",(0,i.jsx)(n.p,{children:"Parsing of the input is very easy, before we have used the lines, now we parse\neverything:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-diff",children:" fn parse_input>(pathname: P) -> Input {\n- file_to_lines(pathname)\n+ file_to_structs(pathname)\n }\n"})}),"\n",(0,i.jsx)(n.p,{children:"Part 1 needs to be adjusted a bit too:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-diff",children:" fn part_1(input: &Input) -> Output {\n- to_snafu(input.iter().map(|s| from_snafu(s)).sum())\n+ SNAFU::from(input.iter().map(|s| s.value).sum::()).to_string()\n }\n"})}),"\n",(0,i.jsx)(n.p,{children:"You can also see that it simplifies the meaning a bit and it is more explicit than\nthe previous versions."}),"\n",(0,i.jsx)(n.p,{children:"And for the tests:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-diff",children:" #[test]\n fn test_from() {\n- for (n, s) in EXAMPLES.iter() {\n- assert_eq!(from_snafu(s), *n);\n+ for (&n, s) in EXAMPLES.iter() {\n+ assert_eq!(s.parse::().unwrap().value, n);\n }\n }\n\n #[test]\n fn test_to() {\n- for (n, s) in EXAMPLES.iter() {\n- assert_eq!(to_snafu(*n), s.to_string());\n+ for (&n, s) in EXAMPLES.iter() {\n+ assert_eq!(SNAFU::from(n).to_string(), s.to_string());\n }\n"})}),"\n",(0,i.jsx)(n.h2,{id:"summary",children:"Summary"}),"\n",(0,i.jsx)(n.p,{children:"Let's wrap the whole thing up! Keeping in mind both AoC and the Rust\u2026"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Finished advent calendar :smile:",src:t(63321).Z+"",width:"2417",height:"1984"})}),"\n",(0,i.jsx)(n.h3,{id:"advent-of-code",children:"Advent of Code"}),"\n",(0,i.jsxs)(n.p,{children:["This year was quite fun, even though most of the solutions and posts came in\nlater on (",(0,i.jsx)(n.em,{children:"cough"})," in '23 ",(0,i.jsx)(n.em,{children:"cough"}),"). Day 22 was the most obnoxious one\u2026 And also\nit feels like I used priority queues and tree data structures ",(0,i.jsx)(n.strong,{children:"a lot"})," ","\ud83d\udc40"]}),"\n",(0,i.jsx)(n.h3,{id:"with-rust",children:"with Rust"}),"\n",(0,i.jsx)(n.p,{children:"I must admit that a lot of compiler warnings and errors were very useful. Even\nthough I still found some instances where they didn't help at all or cause even\nworse issues than I had. Compilation times have been addressed with the caching."}),"\n",(0,i.jsx)(n.p,{children:"Building my first tree data structure in Rust has been a very \u201cinteresting\u201d\njourney. Being able to write a more generic BFS algorithm that allows you to not\nduplicate code while still mantaining the desired functionality contributes to\na very readable code."}),"\n",(0,i.jsx)(n.p,{children:"I am definitely much more aware of the basic things that bloated Python is\nmissing, yet Rust has them\u2026"}),"\n",(0,i.jsxs)(n.p,{children:["Using explicit types and writing down placeholder functions with ",(0,i.jsx)(n.code,{children:"todo!()"}),"\nmacros is very pleasant, since it allows you to easily navigate the type system\nduring the development when you don't even need to be sure how are you going to\nput the smaller pieces together."]}),"\n",(0,i.jsx)(n.p,{children:"I have used a plethora of traits and also implemented some of them to either be\nidiomatic, or exploit the syntactic sugar they offer. Deriving the default trait\nimplementation is also very helpful in a lot of cases, e.g. debugging output,\ncopying, equality comparison, etc."}),"\n",(0,i.jsx)(n.p,{children:"I confess to touching more \u201ccursed\u201d parts of the Rust, such as macros to\ndeclutter the copy-paste for tests or writing my own structures that need to\ncarry a lifetime for their own fields."}),"\n",(0,i.jsxs)(n.p,{children:["tl;dr Relatively pleasant language until you hit brick wall ","\ud83d\ude09"]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsxs)(n.p,{children:["See you next year! Maybe in Rust, maybe not ","\ud83d\ude43"]})]})}function c(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},63321:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/calendar-f891b624f3e0efb34bba582100a7d8df.png"},11151:(e,n,t)=>{t.d(n,{Z:()=>r,a:()=>a});var i=t(67294);const s={},o=i.createContext(s);function a(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4200b1a9.d764baec.js b/assets/js/4200b1a9.d764baec.js new file mode 100644 index 0000000..e320695 --- /dev/null +++ b/assets/js/4200b1a9.d764baec.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[866],{24612:e=>{e.exports=JSON.parse('{"blogPosts":[{"id":"/2023/08/02/copr","metadata":{"permalink":"/blog/2023/08/02/copr","editUrl":"https://github.com/mfocko/blog/tree/main/blog/2023-08-02-copr.md","source":"@site/blog/2023-08-02-copr.md","title":"How can Copr help with broken dependencies","description":"Copr comes to save you when maintainer doesn\'t care.","date":"2023-08-02T00:00:00.000Z","formattedDate":"August 2, 2023","tags":[{"label":"\ud83c\udfed","permalink":"/blog/tags/\ud83c\udfed"},{"label":"red-hat","permalink":"/blog/tags/red-hat"},{"label":"copr","permalink":"/blog/tags/copr"},{"label":"admin","permalink":"/blog/tags/admin"},{"label":"vps","permalink":"/blog/tags/vps"}],"readingTime":3.44,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. your opinionated admin","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"How can Copr help with broken dependencies","description":"Copr comes to save you when maintainer doesn\'t care.","date":"2023-08-02T00:00:00.000Z","authors":[{"key":"mf","title":"a.k.a. your opinionated admin"}],"tags":["\ud83c\udfed","red-hat","copr","admin","vps"]},"unlisted":false,"nextItem":{"title":"4th week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/4th-week"}},"content":"When you decide to run Fedora on your VPS, you might get screwed over by using\\nrandom repositories\u2026\\n\\n\x3c!--truncate--\x3e\\n\\nWhen I \u201creserved\u201d my VPS[^1] back in June \'20, I slapped Fedora on it without\\nthinking. I bet 99% of people would say that I\'m crazy for doing such thing[^2],\\n**BUT** I\'ve been using Fedora on my PCs for some time already and it felt very\\nstable and natural to just use, even for VPS.\\n\\nOne of the first things I\'ve done was setting up a mail server. You may guess\\nwhat\'s the fun part about having a mail server\u2026 Yes, it\'s all the spam you\\nreceive and only then you realize how much \u201ccrap\u201d gets filtered on free mail\\nservices. To battle this problem I chose to use\\n[rspamd](https://github.com/rspamd/rspamd) that had CentOS support, but someone\\nhad a [Copr](https://copr.fedorainfracloud.org/) repository that I used to\\ninstall it.\\n\\n## How does Copr repositories work?\\n\\nIf you have ever used Ubuntu, you might be familiar with the concept since it is\\nvery close to [PPAs](https://help.ubuntu.com/community/PPA).\\n\\ntl;dr of the whole process consists of\\n\\n1. enabling the Copr repository, and\\n2. installing the desired package.\\n\\nSo in shell you would do\\n\\n```\\n# dnf copr enable \u2039copr-repository\u203a\\n# dnf install \u2039package-from-the-repository\u203a\\n```\\n\\nAnd\u2026 that\'s it! Nothing else needed! Simple, right? And literally same process\\nas you would do for the PPA.\\n\\n:::tip AUR\\n\\nOn the other hand, if you are familiar with the archLinux, you definitely know\\nAUR and what it can do for you. Copr repository is pretty similar, but the\\npackages are prebuilt in Copr and Copr repositories can carry the required\\ndependencies for said packages, which simplifies the distribution, and can even\\nhelp with installing singular packages (when you just need the dependency, not\\neverything).\\n\\n:::\\n\\n## My issue\\n\\nNow you might wonder how would I use it on my VPS. It\'s rather simple, once in\\n6 months a new Fedora release comes out. And you need to upgrade to newer\\nrelease\u2026 You don\'t need to do it right away and for such setup it probably isn\'t\\neven recommended.\\n\\n:::tip\\n\\nFedora releases are supported for a year, i.e. they live 6 months till the next\\nrelease and then another 6 months till another release.\\n\\nSome people prefer to run one version \u201cbehind\u201d. If you ever decide to run it on\\nyour home server or in a similar setup, it might be a pretty good idea to\\nfollow. I\'m using the \u201clatest greatest\u201d, cause why not :smile:\\n\\nOne way or another, you still need to bump the release every six months, unless\\nyou\'d bump 2 releases at once every year, which would be a decision, since, at\\nleast I, cannot see any benefits in it\u2026 You don\'t go for \u201cstability\u201d, cause once\\na year you switch to the latest release and then, before you bump, you use one\\nyear old software, so you\'re not even using the latest.\\n\\n:::\\n\\nFast-forward 2 years in the future, new Fedora release came out (October \'22)\\nand I was doing an upgrade. Dependencies of the rspamd have been updated and\\nrspamd builds in Copr have failed and no one fixed it. Cool, so now I can\\nupgrade, but can either ignore the dependencies or uninstall the rspamd\u2026\\n\\n## How can Copr help?\\n\\nI have managed to find\\n[specfile](https://github.com/rspamd/rspamd/blob/master/rpm/rspamd.spec) for the\\nrspamd package that they use for CentOS. There were some files apart from the\\nspecfile, so I had to make an SRPM locally and then\u2026 I just uploaded the SRPM\\nto the Copr to\\n[build](https://copr.fedorainfracloud.org/coprs/mfocko/rspamd/build/5046567/)\\nan RPM.\\n\\nI have switched the previous Copr repository for rspamd with my own and happily\\nproceeded with the upgrade.\\n\\n## Conclusion\\n\\nCopr is heavily used for testing builds on the upstream with\\n[Packit](https://packit.dev). However, as you can see, it is possible to use it\\n**very well** for packaging your own stuff and avoiding issues (such as the one\\nI have described above), if need be.\\n\\n[^1]: [vpsFree.cz](https://vpsfree.cz)\\n[^2]:\\n Even though I\'ve been running archLinux on some Raspberry Pi\'s and also\\n on one of my \u201chome servers\u201d, before getting the VPS. You could say I like\\n to live on the edge\u2026"},{"id":"aoc-2022/4th-week","metadata":{"permalink":"/blog/aoc-2022/4th-week","editUrl":"https://github.com/mfocko/blog/tree/main/blog/aoc-2022/04-week-4.md","source":"@site/blog/aoc-2022/04-week-4.md","title":"4th week of Advent of Code \'22 in Rust","description":"Surviving fourth week in Rust.","date":"2023-07-07T15:14:00.000Z","formattedDate":"July 7, 2023","tags":[{"label":"advent-of-code","permalink":"/blog/tags/advent-of-code"},{"label":"advent-of-code-2022","permalink":"/blog/tags/advent-of-code-2022"},{"label":"rust","permalink":"/blog/tags/rust"}],"readingTime":15.175,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. @mf","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"4th week of Advent of Code \'22 in Rust","description":"Surviving fourth week in Rust.","date":"2023-07-07T15:14","slug":"aoc-2022/4th-week","authors":"mf","tags":["advent-of-code","advent-of-code-2022","rust"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"How can Copr help with broken dependencies","permalink":"/blog/2023/08/02/copr"},"nextItem":{"title":"3rd week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/3rd-week"}},"content":"Let\'s go through the fourth week of [_Advent of Code_] in Rust.\\n\\n\x3c!--truncate--\x3e\\n\\n## [Day 22: Monkey Map](https://adventofcode.com/2022/day/22)\\n\\n:::info tl;dr\\n\\nSimulating a movement on a 2D map with given instructions. Map becomes a cube in\\nthe 2nd part\u2026\\n\\n:::\\n\\n:::caution Rant\\n\\nThis was the most obnoxious problem of this year\u2026 and a lot of Rust issues have\\nbeen hit.\\n\\n:::\\n\\n### Solution\\n\\nIt seems like a very simple problem to solve, but with very obnoxious changes in\\nthe 2nd part and also it\'s relatively hard to decompose \xbbproperly\xab.\\n\\n#### Column iterator\\n\\nIn the first part of the problem it was needed to know the boundaries of each\\nrow and column, since I stored them in `Vec>` and padded with spaces\\nto ensure I have a rectangular 2D \u201carray\u201d. However when you wanted to go through\\neach row and column to determine the boundaries, it was very easy to do for the\\nrows (cause each row is a `Vec` element), but not for the columns, since they\\nspan multiple rows.\\n\\nFor this use case I have implemented my own _column iterator_:\\n\\n```rust\\npub struct ColumnIterator<\'a, T> {\\n map: &\'a [Vec],\\n column: usize,\\n\\n i: usize,\\n}\\n\\nimpl<\'a, T> ColumnIterator<\'a, T> {\\n pub fn new(map: &\'a [Vec], column: usize) -> ColumnIterator<\'a, T> {\\n Self { map, column, i: 0 }\\n }\\n}\\n\\nimpl<\'a, T> Iterator for ColumnIterator<\'a, T> {\\n type Item = &\'a T;\\n\\n fn next(&mut self) -> Option {\\n if self.i >= self.map.len() {\\n return None;\\n }\\n\\n self.i += 1;\\n Some(&self.map[self.i - 1][self.column])\\n }\\n}\\n```\\n\\nGiven this piece of an iterator, it is very easy to factor out the common\\nfunctionality between the rows and columns into:\\n\\n```rust\\nlet mut find_boundaries = |constructor: fn(usize) -> Orientation,\\n iterator: &mut dyn Iterator,\\n upper_bound,\\n i| {\\n let mut first_non_empty = iterator.enumerate().skip_while(|&(_, &c)| c == \' \');\\n let start = first_non_empty.next().unwrap().0 as isize;\\n\\n let mut last_non_empty = first_non_empty.skip_while(|&(_, &c)| c != \' \');\\n let end = last_non_empty.next().unwrap_or((upper_bound, &\'_\')).0 as isize;\\n\\n boundaries.insert(constructor(i), start..end);\\n};\\n```\\n\\nAnd then use it as such:\\n\\n```rust\\n// construct all horizontal boundaries\\n(0..map.len()).for_each(|row| {\\n find_boundaries(\\n Orientation::horizontal,\\n &mut map[row].iter(),\\n map[row].len(),\\n row,\\n );\\n});\\n\\n// construct all vertical boundaries\\n(0..map[0].len()).for_each(|col| {\\n find_boundaries(\\n Orientation::vertical,\\n &mut ColumnIterator::new(&map, col),\\n map.len(),\\n col,\\n );\\n});\\n```\\n\\n#### Walking around the map\\n\\nOnce the 2nd part got introduced, you start to think about a way how not to\\ncopy-paste a lot of stuff (I haven\'t avoided it anyways\u2026). In this problem, I\'ve\\nchosen to introduce a trait (i.e. _interface_) for 2D and 3D walker.\\n\\n```rust\\ntrait Wrap: Clone {\\n type State;\\n\\n // simulation\\n fn is_blocked(&self) -> bool;\\n fn step(&mut self, steps: isize);\\n fn turn_left(&mut self);\\n fn turn_right(&mut self);\\n\\n // movement\\n fn next(&self) -> (Self::State, Direction);\\n\\n // final answer\\n fn answer(&self) -> Output;\\n}\\n```\\n\\nEach walker maintains its own state and also provides the functions that are\\nused during the simulation. The \u201cpromised\u201d methods are separated into:\\n\\n- _simulation_-related: that are used during the simulation from the `.fold()`\\n- _movement_-related: just a one method that holds most of the logic differences\\n between 2D and 3D\\n- _final answer_: which extracts the _proof of solution_ from the\\n implementation-specific walker\\n\\nBoth 2D and 3D versions borrow the original input and therefore you must\\nannotate the lifetime of it:\\n\\n```rust\\nstruct Wrap2D<\'a> {\\n input: &\'a Input,\\n position: Position,\\n direction: Direction,\\n}\\nimpl<\'a> Wrap2D<\'a> {\\n fn new(input: &\'a Input) -> Wrap2D<\'a> {\\n// \u2026\\n```\\n\\n#### Problems\\n\\nI have used a lot of closures for this problem and once I introduced a parameter\\nthat was of unknown type (apart from the fact it implements a specific trait), I\\ngot suggested a \u201cfix\u201d for the compilation error that resulted in something that\\nwas not possible to parse, cause it, more than likely, violated the grammar.\\n\\nIn a similar fashion, I have been suggested changes that led to a code that\\ndidn\'t make sense by just looking at it (there was no need to try the changes),\\nfor example one suggested change in the closure parameter caused disapperance of\\nthe parameter name. :smile:\\n\\n#### Clippy\\n\\nI have to admit that Clippy was rather helpful here, I\'ll include two examples\\nof rather smart suggestions.\\n\\nWhen writing the parsing for this problem, the first thing I have spotted on the\\n`char` was the `.is_digit()` function that takes a radix as a parameter. Clippy\\nnoticed that I use `radix = 10` and suggested switching to `.is_ascii_digit()`\\nthat does exactly the same thing:\\n\\n```diff\\n- .take_while(|c| c.is_digit(10))\\n+ .take_while(|c| c.is_ascii_digit())\\n```\\n\\nAnother useful suggestion appeared when working with the iterators and I wanted\\nto get the $n$-th element from it. You know the `.skip()`, you know the\\n`.next()`, just \u201cslap\u201d them together and we\'re done for :grin: Well, I got\\nsuggested to use `.nth()` that does exactly the combination of the two mentioned\\nmethods on iterators:\\n\\n```diff\\n- match it.clone().skip(skip).next().unwrap() {\\n+ match it.clone().nth(skip).unwrap() {\\n```\\n\\n## [Day 23: Unstable Diffusion](https://adventofcode.com/2022/day/23)\\n\\n:::info tl;dr\\n\\nSimulating movement of elves around with a set of specific rules.\\n\\n:::\\n\\n### Solution\\n\\nThere\'s not much to mention since it\'s just a cellular automaton simulation\\n(even though the AoC rules for cellular automatons usually get out of hand\\n:wink:).\\n\\nAlthough I had a need to determine boundaries of the elves\' positions and ended\\nup with a nasty DRY violation. Knowing that you you\'re looking for maximum and\\nminimum that are, of course, exactly the same except for initial values and\\ncomparators, it looks like a rather simple fix, but typing in Rust is something\\nelse, right? In the end I settled for a function that computes both boundaries\\nwithout any duplication while using a closure:\\n\\n```rust\\nfn get_bounds(positions: &Input) -> (Vector2D, Vector2D) {\\n let f = |init, cmp: &dyn Fn(isize, isize) -> isize| {\\n positions\\n .iter()\\n .fold(Vector2D::new(init, init), |acc, elf| {\\n Vector2D::new(cmp(acc.x(), elf.x()), cmp(acc.y(), elf.y()))\\n })\\n };\\n\\n (f(isize::MAX, &min::), f(isize::MIN, &max::))\\n}\\n```\\n\\nThis function returns a pair of 2D vectors that represent opposite points of the\\nbounding rectangle of all elves.\\n\\nYou might ask why would we need a closure and the answer is that `positions`\\ncannot be captured from within the nested function, only via closure. One more\\nfun fact on top of that is the type of the comparator\\n\\n```rust\\n&dyn Fn(isize, isize) -> isize\\n```\\n\\nOnce we remove the `dyn` keyword, compiler yells at us and also includes a way\\nhow to get a more thorough explanation of the error by running\\n\\n $ rustc --explain E0782\\n\\nwhich shows us\\n\\n Trait objects must include the `dyn` keyword.\\n\\n Erroneous code example:\\n\\n ```\\n trait Foo {}\\n fn test(arg: Box) {} // error!\\n ```\\n\\n Trait objects are a way to call methods on types that are not known until\\n runtime but conform to some trait.\\n\\n Trait objects should be formed with `Box`, but in the code above\\n `dyn` is left off.\\n\\n This makes it harder to see that `arg` is a trait object and not a\\n simply a heap allocated type called `Foo`.\\n\\n To fix this issue, add `dyn` before the trait name.\\n\\n ```\\n trait Foo {}\\n fn test(arg: Box) {} // ok!\\n ```\\n\\n This used to be allowed before edition 2021, but is now an error.\\n\\n:::danger Rant\\n\\nNot all of the explanations are helpful though, in some cases they might be even\\nmore confusing than helpful, since they address _very simple_ use cases.\\n\\nAs you can see, even in this case there are two sides to the explanations:\\n\\n- it explains why you need to use `dyn`, but\\n- it still mentions that trait objects need to be heap-allocated via `Box`\\n that, as you can see in my snippet, **does not** apply here :smile: IMO it\'s\\n caused by the fact that we are borrowing it and therefore we don\'t need to\\n care about the size or whereabouts of it.\\n\\n:::\\n\\n:::info C++ parallel\\n\\nIf you dive into the explanation above, you can notice that the `Box`\\npattern is very helpful for using types that are not known during compile-time.\\nYou would use a very similar approach in C++ when parsing some data structure\\nfrom input (let\'s say JSON for example).\\n\\nOn the other hand, in this case, it doesn\'t really make much sense, cause you\\ncan clearly see that the types **are known** during the compile-time, which in\\nC++ could be easily resolved by templating the helper function.\\n\\n:::\\n\\n## [Day 24: Blizzard Basin](https://adventofcode.com/2022/day/24)\\n\\n:::info tl;dr\\n\\nNavigating your way through a basin with series of blizzards that move around\\nyou as you move.\\n\\n:::\\n\\n:::caution\\n\\nIt\'s second to last day and I went \u201c_bonkers_\u201d on the Rust :smile: Proceed to\\nread _Solution_ part on your own risk.\\n\\n:::\\n\\n### Solution\\n\\nYou are given a map with blizzards all over the place and you\'re supposed to\\nfind the minimum time it requires you to walk through the basin without getting\\nin any of the blizzards.\\n\\n#### Breakdown\\n\\nRelatively simple, yet a bit annoying, approach can be taken. It\'s technically\\na shortest-path algorithm implementation with some relaxation restrictions and\\nbeing able to stay on one position for some time, so each _vertex_ of the graph\\nis determined by the position on the map and the _timestamp_. I have chosen to\\nuse `Vector3D`, since `x` and `y` attributes can be used for the position\\nand, well, let\'s use `z` for a timestamp, cause why not, right? :wink:\\n\\n#### Evaluating the blizzards\\n\\n:::caution\\n\\nI think that this is the most perverted abuse of the traits in the whole 4 weeks\\nof AoC in Rust\u2026\\n\\n:::\\n\\nThe blizzards move along their respective directions in time and loop around in\\ntheir respective row/column. Each vertex holds position **and** time, so we can\\n_just_ index the basin with the vertex itself, right? Yes, we can :smiling_imp:\\n\\n:::tip Fun fact\\n\\nWhile writing this part, I\'ve recognized unnecessary verbosity in the code and\\ncleaned it up a bit. The changed version is shown here and the original was just\\nmore verbose.\\n\\n:::\\n\\nI\'ll skip the boring parts of checking bounds and entry/exit of the basin :wink:\\nWe can easily calculate positions of the blizzards using a modular arithmetics:\\n\\n```rust\\nimpl Index for Basin {\\n type Output = char;\\n\\n fn index(&self, index: Position) -> &Self::Output {\\n // \u2039skipped boring parts\u203a\\n\\n // We need to account for the loops of the blizzards\\n let width = self.cols - 2;\\n let height = self.rows - 2;\\n\\n let blizzard_origin = |size, d, t, i| ((i - 1 + size + d * (t % size)) % size + 1) as usize;\\n [\\n (\\n index.y() as usize,\\n blizzard_origin(width, -1, index.z(), index.x()),\\n \'>\',\\n ),\\n (\\n index.y() as usize,\\n blizzard_origin(width, 1, index.z(), index.x()),\\n \'<\',\\n ),\\n (\\n blizzard_origin(height, -1, index.z(), index.y()),\\n index.x() as usize,\\n \'v\',\\n ),\\n (\\n blizzard_origin(height, 1, index.z(), index.y()),\\n index.x() as usize,\\n \'^\',\\n ),\\n ]\\n .iter()\\n .find_map(|&(y, x, direction)| {\\n if self.map[y][x] == direction {\\n Some(&self.map[y][x])\\n } else {\\n None\\n }\\n })\\n .unwrap_or(&\'.\')\\n }\\n}\\n```\\n\\nAs you can see, there is an expression for calculating the original position and\\nit\'s used multiple times, so why not take it out to a lambda, right? :wink:\\n\\nI couldn\'t get the `rustfmt` to format the `for`-loop nicely, so I\'ve just\\ndecided to go with iterating over an elements of a slice. I have used, once\\nagain, a combination of two functions (`find_map` in this case) to do 2 things\\nat once and at the end, if we haven\'t found any blizzard, we just return the\\nempty space.\\n\\nI think it\'s a very _nice_ (and naughty) way how to use the `Index` trait, don\'t\\nyou think?\\n\\n#### Shortest-path algorithm\\n\\nFor the shortest path you can choose and adjust any of the common shortest-path\\nalgorithms, in my case, I have decided to use [_A\\\\*_] instead of Dijkstra\'s\\nalgorithm, since it better reflects the _cost_ function.\\n\\n:::info Comparison of costs\\n\\nWith the Dijkstra\'s algorithm I would proceed with the `time` attribute used as\\na priority for the queue.\\n\\nWhereas with the _A\\\\*_, I have chosen to use both time and Manhattan distance\\nthat promotes vertices closer to the exit **and** with a minimum time taken.\\n\\n:::\\n\\nCost function is, of course, a closure :wink:\\n\\n```rust\\nlet cost = |p: Position| p.z() as usize + exit.y().abs_diff(p.y()) + exit.x().abs_diff(p.x());\\n```\\n\\nAnd also for checking the possible moves from the current vertex, I have\\nimplemented, yet another, closure that yields an iterator with the next moves:\\n\\n```rust\\nlet next_positions = |p| {\\n [(0, 0, 1), (0, -1, 1), (0, 1, 1), (-1, 0, 1), (1, 0, 1)]\\n .iter()\\n .filter_map(move |&(x, y, t)| {\\n let next_p = p + Vector3D::new(x, y, t);\\n\\n if basin[next_p] == \'.\' {\\n Some(next_p)\\n } else {\\n None\\n }\\n })\\n};\\n```\\n\\n#### Min-heap\\n\\nIn this case I had a need to use the priority queue taking the elements with the\\nlowest cost as the prioritized ones. Rust only offers you the [`BinaryHeap`] and\\nthat is a max-heap. One of the ways how to achieve a min-heap is to put the\\nelements in wrapped in a [`Reverse`] (as is even showed in the linked [docs of\\nthe `BinaryHeap`]). However the wrapping affects the type of the heap and also\\npopping the most prioritized elements yields values wrapped in the `Reverse`.\\n\\nFor this purpose I have just taken the max-heap and wrapped it as a whole in a\\nseparate structure providing just the desired methods:\\n\\n```rust\\nuse std::cmp::{Ord, Reverse};\\nuse std::collections::BinaryHeap;\\n\\npub struct MinHeap {\\n heap: BinaryHeap>,\\n}\\n\\nimpl MinHeap {\\n pub fn new() -> MinHeap {\\n MinHeap {\\n heap: BinaryHeap::new(),\\n }\\n }\\n\\n pub fn push(&mut self, item: T) {\\n self.heap.push(Reverse(item))\\n }\\n\\n pub fn pop(&mut self) -> Option {\\n self.heap.pop().map(|Reverse(x)| x)\\n }\\n}\\n\\nimpl Default for MinHeap {\\n fn default() -> Self {\\n Self::new()\\n }\\n}\\n```\\n\\nRest is just the algorithm implementation which is not that interesting.\\n\\n## [Day 25: Full of Hot Air](https://adventofcode.com/2022/day/25)\\n\\n:::info tl;dr\\n\\nPlaying around with a numbers in a _special_ base.\\n\\n:::\\n\\nGetting flashbacks to the _IB111 Foundations of Programming_\u2026 Very nice \u201cproblem\u201d\\nwith a rather easy solution, as the last day always seems to be.\\n\\n### Solution\\n\\nImplementing 2 functions, converting from the _SNAFU base_ and back to the _SNAFU_\\n_base_ representation. Let\'s do a bit more though! I have implemented two functions:\\n\\n- `from_snafu`\\n- `to_snafu`\\n\\nNow it is apparent that all I do is number to string and string to number. Hmm\u2026\\nthat sounds familiar, doesn\'t it? Let\'s introduce a structure for the SNAFU numbers\\nand implement the traits that we need.\\n\\nLet\'s start with a structure:\\n\\n```rust\\n#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]\\nstruct SNAFU {\\n value: i64,\\n}\\n```\\n\\n#### Converting from `&str`\\n\\nWe will start by implementing the `FromStr` trait that will help us parse our input.\\nThis is rather simple, I can just take the `from_snafu` function, copy-paste it\\ninto the `from_str` method and the number I get will be wrapped in `Result` and\\n`SNAFU` structure.\\n\\n#### Converting to `String`\\n\\nThis is more fun. In some cases you need to implement only one trait and others\\nare automatically implemented using that one trait. In our case, if you look in\\nthe documentation, you can see that `ToString` trait is automatically implemented\\nfor any type that implements `Display` trait.\\n\\nLet\'s implement the `Display` trait then. We should be able to use the `to_snafu`\\nfunction and just take the `self.value` from the `SNAFU` structure.\\n\\nAnd for the convenience of tests, we can also implement a rather simple `From`\\ntrait for the `SNAFU`.\\n\\n#### Adjusting the code\\n\\nAfter those changes we need to adjust the code and tests.\\n\\nParsing of the input is very easy, before we have used the lines, now we parse\\neverything:\\n\\n```diff\\n fn parse_input>(pathname: P) -> Input {\\n- file_to_lines(pathname)\\n+ file_to_structs(pathname)\\n }\\n```\\n\\nPart 1 needs to be adjusted a bit too:\\n\\n```diff\\n fn part_1(input: &Input) -> Output {\\n- to_snafu(input.iter().map(|s| from_snafu(s)).sum())\\n+ SNAFU::from(input.iter().map(|s| s.value).sum::()).to_string()\\n }\\n```\\n\\nYou can also see that it simplifies the meaning a bit and it is more explicit than\\nthe previous versions.\\n\\nAnd for the tests:\\n\\n```diff\\n #[test]\\n fn test_from() {\\n- for (n, s) in EXAMPLES.iter() {\\n- assert_eq!(from_snafu(s), *n);\\n+ for (&n, s) in EXAMPLES.iter() {\\n+ assert_eq!(s.parse::().unwrap().value, n);\\n }\\n }\\n\\n #[test]\\n fn test_to() {\\n- for (n, s) in EXAMPLES.iter() {\\n- assert_eq!(to_snafu(*n), s.to_string());\\n+ for (&n, s) in EXAMPLES.iter() {\\n+ assert_eq!(SNAFU::from(n).to_string(), s.to_string());\\n }\\n```\\n\\n## Summary\\n\\nLet\'s wrap the whole thing up! Keeping in mind both AoC and the Rust\u2026\\n\\n![Finished advent calendar :smile:](/img/blog/aoc-2022/04-week-4/calendar.png)\\n\\n### Advent of Code\\n\\nThis year was quite fun, even though most of the solutions and posts came in\\nlater on (_cough_ in \'23 _cough_). Day 22 was the most obnoxious one\u2026 And also\\nit feels like I used priority queues and tree data structures **a lot** :eyes:\\n\\n### with Rust\\n\\nI must admit that a lot of compiler warnings and errors were very useful. Even\\nthough I still found some instances where they didn\'t help at all or cause even\\nworse issues than I had. Compilation times have been addressed with the caching.\\n\\nBuilding my first tree data structure in Rust has been a very \u201cinteresting\u201d\\njourney. Being able to write a more generic BFS algorithm that allows you to not\\nduplicate code while still mantaining the desired functionality contributes to\\na very readable code.\\n\\nI am definitely much more aware of the basic things that bloated Python is\\nmissing, yet Rust has them\u2026\\n\\nUsing explicit types and writing down placeholder functions with `todo!()`\\nmacros is very pleasant, since it allows you to easily navigate the type system\\nduring the development when you don\'t even need to be sure how are you going to\\nput the smaller pieces together.\\n\\nI have used a plethora of traits and also implemented some of them to either be\\nidiomatic, or exploit the syntactic sugar they offer. Deriving the default trait\\nimplementation is also very helpful in a lot of cases, e.g. debugging output,\\ncopying, equality comparison, etc.\\n\\nI confess to touching more \u201ccursed\u201d parts of the Rust, such as macros to\\ndeclutter the copy-paste for tests or writing my own structures that need to\\ncarry a lifetime for their own fields.\\n\\ntl;dr Relatively pleasant language until you hit brick wall :wink:\\n\\n---\\n\\nSee you next year! Maybe in Rust, maybe not :upside_down_face:\\n\\n[_advent of code_]: https://adventofcode.com\\n[_a\\\\*_]: https://en.wikipedia.org/wiki/A*_search_algorithm\\n[`binaryheap`]: https://doc.rust-lang.org/std/collections/struct.BinaryHeap.html\\n[`reverse`]: https://doc.rust-lang.org/std/cmp/struct.Reverse.html\\n[docs of the `binaryheap`]: https://doc.rust-lang.org/std/collections/struct.BinaryHeap.html#min-heap"},{"id":"aoc-2022/3rd-week","metadata":{"permalink":"/blog/aoc-2022/3rd-week","editUrl":"https://github.com/mfocko/blog/tree/main/blog/aoc-2022/03-week-3.md","source":"@site/blog/aoc-2022/03-week-3.md","title":"3rd week of Advent of Code \'22 in Rust","description":"Surviving third week in Rust.","date":"2023-07-06T21:00:00.000Z","formattedDate":"July 6, 2023","tags":[{"label":"advent-of-code","permalink":"/blog/tags/advent-of-code"},{"label":"advent-of-code-2022","permalink":"/blog/tags/advent-of-code-2022"},{"label":"rust","permalink":"/blog/tags/rust"}],"readingTime":11.57,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. @mf","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"3rd week of Advent of Code \'22 in Rust","description":"Surviving third week in Rust.","date":"2023-07-06T21:00","slug":"aoc-2022/3rd-week","authors":"mf","tags":["advent-of-code","advent-of-code-2022","rust"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"4th week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/4th-week"},"nextItem":{"title":"Sort the matrix diagonally","permalink":"/blog/leetcode/sort-diagonally"}},"content":"Let\'s go through the third week of [_Advent of Code_] in Rust.\\n\\n\x3c!--truncate--\x3e\\n\\n## [Day 15: Beacon Exclusion Zone](https://adventofcode.com/2022/day/15)\\n\\n:::info tl;dr\\n\\nTriangulating a distress beacon based on the information from the sensors.\\n\\n:::\\n\\n### Solution\\n\\nRelatively easy thing to implement, no major Rust issues hit.\\n\\n## [Day 16: Proboscidea Volcanium](https://adventofcode.com/2022/day/16)\\n\\n:::info tl;dr\\n\\nFinding a max flow in a graph given some time constraints.\\n\\n:::\\n\\n### Solution\\n\\nI have used some interesting things to implement this and make it easier for me.\\n\\n#### Indexing in graph\\n\\nI have come across a situation where I needed to keep more information regarding\\nthe graph\u2026 In that case you can, of course, create a structure and keep it in,\\nbut once you have multiple members in the structure it gets harder to work with\\nsince you need to address the fields in the structure. When you work with graph,\\nyou frequently need to access the vertices and in this case it felt a lot easier\\nto implement the indexing in a graph, rather than explicitly access the\\nunderlying data structure.\\n\\nHere you can see a rather short snippet from the solution that allows you to\\n\u201cindex\u201d the graph:\\n\\n```rust\\nimpl Index<&str> for Graph {\\n type Output = Vertex;\\n\\n fn index(&self, index: &str) -> &Self::Output {\\n &self.g[index]\\n }\\n}\\n```\\n\\n#### Cartesian product\\n\\nDuring the implementation I had to utilize Floyd-Warshall algorithm for finding\\nthe shortest path between pairs of vertices and utilized the `iproduct!` macro\\nfrom the [`itertools`]. It is a very useful higher-order function that allows\\nyou to keep the nesting of the loops at a minimum level while still maintaining\\nthe same functionality.\\n\\n#### \u201cImplementing\u201d an iterator\\n\\nFor the second part, you get to split the work between 2 actors. That way you\\ncan achieve higher efficiency of the whole process that you\'re planning, but it\\nalso makes it harder to evaluate algorithmically, since you need to check the\\ndifferent ways the work can be split.\\n\\nBeing affected by _functional programming brain damage_:tm:, I have chosen to\\ndo this part by function that returns an iterator over the possible ways:\\n\\n```rust\\nfn pairings(\\n valves: &BTreeSet,\\n) -> impl Iterator, BTreeSet)> + \'_ {\\n let mapping = valves.iter().collect_vec();\\n\\n let max_mask = 1 << (valves.len() - 1);\\n\\n (0..max_mask).map(move |mask| {\\n let mut elephant = BTreeSet::new();\\n let mut human = BTreeSet::new();\\n\\n for (i, &v) in mapping.iter().enumerate() {\\n if (mask & (1 << i)) == 0 {\\n human.insert(v.clone());\\n } else {\\n elephant.insert(v.clone());\\n }\\n }\\n\\n (human, elephant)\\n })\\n}\\n```\\n\\n## [Day 17: Pyroclastic Flow](https://adventofcode.com/2022/day/17)\\n\\n:::info tl;dr\\n\\nSimulating an autonomous Tetris where pieces get affected by a series of jets of\\nhot gas.\\n\\n:::\\n\\n### Solution\\n\\nSimilarly to the previous day I have created some iterators :smile:\\n\\n#### Collision detection\\n\\nOnce you need to check for collisions it is very helpful to be able to just\\niterate through the positions that can actually collide with the wall or other\\npiece.\\n\\nTo get the desired behaviour, you can just compose few smaller functions:\\n\\n```rust\\nfn occupied(shape: &[Vec]) -> impl Iterator + \'_ {\\n shape.iter().enumerate().flat_map(|(y, row)| {\\n row.iter().enumerate().filter_map(move |(x, c)| {\\n if c == &\'#\' {\\n Some(Vector2D::new(x as isize, y as isize))\\n } else {\\n None\\n }\\n })\\n })\\n}\\n```\\n\\nIn the end, we get relative positions which we can adjust later when given the\\nspecific positions from iterator. You can see some interesting parts in this:\\n\\n- `.enumerate()` allows us to get both the indices (coordinates) and the line\\n or, later on, the character itself,\\n- `.flat_map()` flattens the iterator, i.e. when we return another iterator,\\n they just get chained instead of iterating over iterators (which sounds pretty\\n disturbing, doesn\'t it?),\\n- and finally `.filter_map()` which is pretty similar to the \u201cbasic\u201d `.map()`\\n with a one, key, difference that it expects the items of an iterator to be\\n mapped to an `Option` from which it ignores nothing (as in `None` :wink:)\\n and also unwraps the values from `Some(\u2026)`.\\n\\n#### Infinite iterator\\n\\nIn the solution we cycle through both Tetris-like shapes that fall down and the\\njets that move our pieces around. Initially I have implemented my own infinite\\niterator that just yields the indices. It is a very simple, yet powerful, piece\\nof code:\\n\\n```rust\\nstruct InfiniteIndex {\\n size: usize,\\n i: usize,\\n}\\n\\nimpl InfiniteIndex {\\n fn new(size: usize) -> InfiniteIndex {\\n InfiniteIndex { size, i: size - 1 }\\n }\\n}\\n\\nimpl Iterator for InfiniteIndex {\\n type Item = usize;\\n\\n fn next(&mut self) -> Option {\\n self.i = (self.i + 1) % self.size;\\n Some(self.i)\\n }\\n}\\n```\\n\\nHowever when I\'m looking at the code now, it doesn\'t really make much sense\u2026\\nGuess what, we can use a built-in function that is implemented on iterators for\\nthat! The function is called `.cycle()`\\n\\nOn the other hand, I am not going to switch to that function, since it would\\nintroduce an another myriad of issues caused by the fact that I create iterators\\nright away in the constructor of my structure and the iterators would borrow\\nboth the jets and shapes which would introduce a lifetime dependency into the\\nstructure.\\n\\n## [Day 18: Boiling Boulders](https://adventofcode.com/2022/day/18)\\n\\n:::info tl;dr\\n\\nLet\'s compute a surface area of some obsidian approximated via coordinates of\\ncubes.\\n\\n:::\\n\\n### Solution\\n\\nThis day is kinda interesting, because it shows how easily you can complicate the\\nproblem and also how much can you screw yourself over with the optimization and\\n\u201csmart\u201d approach.\\n\\nFor the first part you need to find the surface area of an obsidian that is\\napproximated by cubes. Now, that is a very easy thing to do, just keep the track\\nof already added cubes, and check if the newly added cube touches any face of any\\nother cube. Simple, and with a `BTreeSet` relatively efficient way to do it.\\n\\nHowever the second part lets you on a secret that there may be some surface area\\nfrom the \u201cinside\u201d too and you want to know only the one from the outside of the\\nobsidian. I have seen some solutions later, but if you check your data, you might\\nnotice that the bounding box of all the cubes isn\'t that big at all. Therefore I\\nchose to pre-construct the box beforehand, fill in the cubes and then just run a\\nBFS turning all the lava on the outside into the air. Now you just need to check\\ncubes and count how many of their faces touch the air.\\n\\n## [Day 19: Not Enough Minerals](https://adventofcode.com/2022/day/19)\\n\\n:::info tl;dr\\n\\nFinding out the best strategy for building robots to collect geodes.\\n\\n:::\\n\\n### Solution\\n\\nNot much interesting stuff to mention apart from the suggestion to never believe\\nthat the default implementation given by `derive` macro is what you want, it\\ndoesn\'t have to be. :smile:\\n\\n## [Day 20: Grove Positioning System](https://adventofcode.com/2022/day/20)\\n\\n:::info tl;dr\\n\\nShuffling around the _circular linked list_ to find the coordinates.\\n\\n:::\\n\\nNow, small rant for this day is in place. They\'ve never mentioned that coordinates\\ncan repeat and therefore the values are non-unique. This is something that did\\nnot happen in the given sample, but was present in the user input. It took \xbba lot\xab\\nto realize that this is the issue.\\n\\n### Solution\\n\\nI have tried implementing a circular linked list for this\u2026 and I have failed\\nmiserably. To be fair, I still have no clue why. It was \u201cfun\u201d to play around with\\nthe `Rc>`. In the end I failed on _wrong answer_. I have also encountered\\na rather interesting issue with `.borrow_mut()` method being used on `Rc>`.\\n\\n#### `.borrow_mut()`\\n\\nConsider the following snippet of the code (taken from the documentation):\\n\\n```rust\\nuse std::cell::{RefCell, RefMut};\\nuse std::collections::HashMap;\\nuse std::rc::Rc;\\n// use std::borrow::BorrowMut;\\n\\nfn main() {\\n let shared_map: Rc> = Rc::new(RefCell::new(HashMap::new()));\\n // Create a new block to limit the scope of the dynamic borrow\\n {\\n let mut map: RefMut<_> = shared_map.borrow_mut();\\n map.insert(\\"africa\\", 92388);\\n map.insert(\\"kyoto\\", 11837);\\n map.insert(\\"piccadilly\\", 11826);\\n map.insert(\\"marbles\\", 38);\\n }\\n\\n // Note that if we had not let the previous borrow of the cache fall out\\n // of scope then the subsequent borrow would cause a dynamic thread panic.\\n // This is the major hazard of using `RefCell`.\\n let total: i32 = shared_map.borrow().values().sum();\\n println!(\\"{total}\\");\\n}\\n```\\n\\nWe allocate a hash map on the heap and then in the inner block, we borrow it as\\na mutable reference, so that we can use it.\\n\\n:::note\\n\\nIt is a very primitive example for `Rc>` and mutable borrow.\\n\\n:::\\n\\nIf you uncomment the 4th line with `use std::borrow::BorrowMut;`, you cannot\\ncompile the code anymore, because of\\n\\n```\\n Compiling playground v0.0.1 (/playground)\\nerror[E0308]: mismatched types\\n --\x3e src/main.rs:10:34\\n |\\n10 | let mut map: RefMut<_> = shared_map.borrow_mut();\\n | --------- ^^^^^^^^^^^^^^^^^^^^^^^ expected struct `RefMut`, found mutable reference\\n | |\\n | expected due to this\\n |\\n = note: expected struct `RefMut<\'_, _>`\\n found mutable reference `&mut Rc>>`\\n\\nerror[E0599]: no method named `insert` found for struct `RefMut<\'_, _>` in the current scope\\n --\x3e src/main.rs:11:13\\n |\\n11 | map.insert(\\"africa\\", 92388);\\n | ^^^^^^ method not found in `RefMut<\'_, _>`\\n\\nerror[E0599]: no method named `insert` found for struct `RefMut<\'_, _>` in the current scope\\n --\x3e src/main.rs:12:13\\n |\\n12 | map.insert(\\"kyoto\\", 11837);\\n | ^^^^^^ method not found in `RefMut<\'_, _>`\\n\\nerror[E0599]: no method named `insert` found for struct `RefMut<\'_, _>` in the current scope\\n --\x3e src/main.rs:13:13\\n |\\n13 | map.insert(\\"piccadilly\\", 11826);\\n | ^^^^^^ method not found in `RefMut<\'_, _>`\\n\\nerror[E0599]: no method named `insert` found for struct `RefMut<\'_, _>` in the current scope\\n --\x3e src/main.rs:14:13\\n |\\n14 | map.insert(\\"marbles\\", 38);\\n | ^^^^^^ method not found in `RefMut<\'_, _>`\\n\\nSome errors have detailed explanations: E0308, E0599.\\nFor more information about an error, try `rustc --explain E0308`.\\nerror: could not compile `playground` due to 5 previous errors\\n```\\n\\nIt might seem **a bit** ridiculous. However, I got to a point where the compiler\\nsuggested `use std::borrow::BorrowMut;` and it resulted in breaking parts of the\\ncode that worked previously. I think it may be a good idea to go over what is\\nhappening here.\\n\\n##### `.borrow_mut()` on `Rc>`\\n\\nLet\'s consider a variable `x` of type `Rc>`. What happens when you\\ncall `.borrow_mut()` on it? We can look at the `Rc` type, and\u2026 hang on! There is\\nneither `.borrow_mut()` method or `BorrowMut` trait implemented. How can we do it\\nthen?\\n\\nLet\'s go further and we can see that `RefCell` implements a `.borrow_mut()`\\nmethod. OK, but how can we call it on the `Rc`? Easily! `Rc` implements\\n`Deref` and therefore you can call methods on `Rc` objects as if they were\\n`T` objects. If we read on _`Deref` coercion_, we can see the following:\\n\\n> If `T` implements `Deref`, \u2026:\\n>\\n> - \u2026\\n> - `T` implicitly implements all the (immutable) methods of the type `U`.\\n\\nWhat is the requirement for the `.borrow_mut()` on `RefCell`? Well, it needs\\n`&self`, so the `Deref` implements the `.borrow_mut()` for the `Rc>`.\\n\\n##### `BorrowMut` trait\\n\\nI have not been able to find a lot on this trait. My guess is that it provides a\\nmethod instead of a syntactic sugar (`&mut x`) for the mutable borrow. And also\\nit provides default implementations for the types:\\n\\n```rust\\nimpl BorrowMut for String\\n\\nimpl BorrowMut for &mut T\\nwhere\\n T: ?Sized,\\n\\nimpl BorrowMut for T\\nwhere\\n T: ?Sized,\\n\\nimpl BorrowMut<[T]> for Vec\\nwhere\\n A: Allocator,\\n\\nimpl BorrowMut for Box\\nwhere\\n A: Allocator,\\n T: ?Sized,\\n\\nimpl BorrowMut<[T]> for [T; N]\\n```\\n\\n##### Conflict\\n\\nNow the question is why did it break the code\u2026 My first take was that the type\\n`Rc>` has some _specialized_ implementation of the `.borrow_mut()` and\\nthe `use` overrides it with the default, which is true **in a sense**. However\\nthere is no _specialized_ implementation. Let\'s have a look at the trait and the\\ntype signature on the `RefCell`:\\n\\n```rust\\n// trait\\npub trait BorrowMut: Borrow\\nwhere\\n Borrowed: ?Sized,\\n{\\n fn borrow_mut(&mut self) -> &mut Borrowed;\\n}\\n\\n// \u2039RefCell.borrow_mut()\u203a type signature\\npub fn borrow_mut(&self) -> RefMut<\'_, T>\\n```\\n\\nI think that we can definitely agree on the fact that `RefMut<\'_, T>` is not the\\n`RefCell`.\\n\\n**In my opinion**, `RefCell` implements a **separate** `.borrow_mut()` rather\\nthan implementing the interface, because it **cannot** satisfy the type requirements\\nof the trait.\\n\\n:::caution\\n\\nI wonder how are we expected to deal with this conflict, if and when, we need\\nboth the `.borrow_mut()` of the trait and `.borrow_mut()` of the `RefCell`.\\n\\n:::\\n\\n:::tip Fun fact\\n\\nI was suggested by the compiler to do `use std::borrow::BorrowMut;` and break the\\ncode.\\n\\nSo much for the _almighty_ and _helpful_ compiler\u2026\\n\\n:::\\n\\n## [Day 21: Monkey Math](https://adventofcode.com/2022/day/21)\\n\\n:::info tl;dr\\n\\nComputing an expression tree and then also finding ideal value for a node.\\n\\n:::\\n\\n### Solution\\n\\nRelatively simple, until you get to the 2nd part where you start to practice\\na lot of the copy-paste. I have managed to sneak some perverted stuff in there\\nthough :) Let\'s go through the details.\\n\\n#### `Default` trait\\n\\nFor the first time and twice I had a need to have a default value for my types,\\nenumerations in this case. Rust offers a very nice trait[^1] that is described\\nas:\\n\\n> A trait for giving a type a useful default value.\\n\\nI guess it sums it up nicely. The more interesting part about this is the fact\\nthat you can use the _macro machinery_ to save yourself some typing. If you have\\nenumeration of which the default value doesn\'t bear any parameter, you can just\\ndo[^2]:\\n\\n```rust\\n#[derive(Default)]\\nenum Color {\\n #[default]\\n White,\\n Gray,\\n Black,\\n}\\n```\\n\\n#### Abusing negation\\n\\nIf you want to use a _unary minus_ operator on your own type, you can implement\\na `Neg` trait[^3]. I was dealing with a binary tree and needed a way how to look\\nat the other side, so I have just implemented the negation for flipping between\\nleft and right :smile:\\n\\n[^1]: [`Default`](https://doc.rust-lang.org/std/default/trait.Default.html) docs\\n[^2]: Pardon my example from the graph algorithms ;)\\n[^3]: [`Neg`](https://doc.rust-lang.org/std/ops/trait.Neg.html) docs\\n\\n[_advent of code_]: https://adventofcode.com\\n[`itertools`]: https://crates.io/crates/itertools\\n[this reddit post and the comment]: https://www.reddit.com/r/adventofcode/comments/zb98pn/comment/iyq0ono"},{"id":"leetcode/sort-diagonally","metadata":{"permalink":"/blog/leetcode/sort-diagonally","editUrl":"https://github.com/mfocko/blog/tree/main/blog/leetcode/sort-matrix-diagonally.md","source":"@site/blog/leetcode/sort-matrix-diagonally.md","title":"Sort the matrix diagonally","description":"Compiler assisted development.","date":"2023-03-04T23:15:00.000Z","formattedDate":"March 4, 2023","tags":[{"label":"cpp","permalink":"/blog/tags/cpp"},{"label":"leetcode","permalink":"/blog/tags/leetcode"},{"label":"iterators","permalink":"/blog/tags/iterators"}],"readingTime":16.99,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. @mf","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"Sort the matrix diagonally","description":"Compiler assisted development.","date":"2023-03-04T23:15","slug":"leetcode/sort-diagonally","authors":"mf","tags":["cpp","leetcode","iterators"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"3rd week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/3rd-week"},"nextItem":{"title":"2nd week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/2nd-week"}},"content":"Let\'s try to solve one of the LeetCode challenges in easy and hard mode at the\\nsame time.\\n\\n\x3c!--truncate--\x3e\\n\\n- Link to the problem: https://leetcode.com/problems/sort-the-matrix-diagonally/\\n\\n## Problem description\\n\\nA **matrix diagonal** is a diagonal line of cells starting from some cell in\\neither the topmost row or leftmost column and going in the bottom-right direction\\nuntil reaching the matrix\'s end. For example, the **matrix diagonal** starting\\nfrom `mat[2][0]`, where `mat` is a `6 x 3` matrix, includes cells `mat[2][0]`,\\n`mat[3][1]`, and `mat[4][2]`.\\n\\nGiven an `m x n` matrix `mat` of integers, sort each matrix diagonal in ascending\\norder and return the resulting matrix.\\n\\n### Example\\n\\n![Image describing the problem](https://assets.leetcode.com/uploads/2020/01/21/1482_example_1_2.png)\\n\\n## Skeleton and initial adjustments\\n\\nWe are given the following skeleton for the C++ and the given challenge:\\n\\n```cpp\\nclass Solution {\\npublic:\\n vector> diagonalSort(vector>& mat) {\\n\\n }\\n};\\n```\\n\\nThe task is to sort the passed matrix diagonally and then return it. First of all,\\nI don\'t like to solve this in a web browser, so we\'ll need to adjust it accordingly\\nfor running it locally. We\'ll start by including the `vector` header and using\\nfully-qualified namespaces[^1] and also adding few tests:\\n\\n```cpp\\n#include \\n#include \\n\\nusing matrix = std::vector>;\\n\\nclass Solution {\\npublic:\\n matrix diagonalSort(matrix& mat)\\n {\\n }\\n};\\n\\nstatic void test_case_1()\\n{\\n // Input: mat = [[3,3,1,1],[2,2,1,2],[1,1,1,2]]\\n // Output: [[1,1,1,1],[1,2,2,2],[1,2,3,3]]\\n\\n Solution s;\\n assert((s.diagonalSort(std::vector { std::vector { 3, 3, 1, 1 },\\n std::vector { 2, 2, 1, 2 },\\n std::vector { 1, 1, 1, 2 } })\\n == std::vector { std::vector { 1, 1, 1, 1 },\\n std::vector { 1, 2, 2, 2 },\\n std::vector { 1, 2, 3, 3 } }));\\n}\\n\\nstatic void test_case_2()\\n{\\n // Input: mat =\\n // [[11,25,66,1,69,7],[23,55,17,45,15,52],[75,31,36,44,58,8],[22,27,33,25,68,4],[84,28,14,11,5,50]]\\n // Output:\\n // [[5,17,4,1,52,7],[11,11,25,45,8,69],[14,23,25,44,58,15],[22,27,31,36,50,66],[84,28,75,33,55,68]]\\n\\n Solution s;\\n assert((s.diagonalSort(std::vector { std::vector { 11, 25, 66, 1, 69, 7 },\\n std::vector { 23, 55, 17, 45, 15, 52 },\\n std::vector { 75, 31, 36, 44, 58, 8 },\\n std::vector { 22, 27, 33, 25, 68, 4 },\\n std::vector { 84, 28, 14, 11, 5, 50 } })\\n == std::vector { std::vector { 5, 17, 4, 1, 52, 7 },\\n std::vector { 11, 11, 25, 45, 8, 69 },\\n std::vector { 14, 23, 25, 44, 58, 15 },\\n std::vector { 22, 27, 31, 36, 50, 66 },\\n std::vector { 84, 28, 75, 33, 55, 68 } }));\\n}\\n\\nint main()\\n{\\n test_case_1();\\n test_case_2();\\n\\n return 0;\\n}\\n```\\n\\nWe need to return the matrix, but we\'re given a reference to the input matrix. We\\ncan easily abuse the C++ here and just switch the reference to value, this way\\nthe matrix will be copied when passed to the function, we can sort the copy and\\njust return it back. And we also get yelled by the compiler for the fact that the\\nmethod doesn\'t return anything yet, so to make it \u201cshut up\u201d we will just return\\nthe input for now:\\n\\n```diff\\n- matrix diagonalSort(matrix& mat)\\n+ matrix diagonalSort(matrix mat)\\n {\\n+ return mat;\\n }\\n```\\n\\nNow, we get the copy and we\'re good to go.\\n\\n## Na\xefve solution\\n\\nAs you may know, C++ offers a plethora of functions that can be used to your\\nadvantage, given that you know how to \u201cbend\u201d the data structures accordingly.\\n\\nWhat does that mean for us? Well, we have an `std::sort`, we can use it, right?\\nLet\'s have a look at it:\\n\\n```cpp\\ntemplate< class RandomIt >\\nvoid sort( RandomIt first, RandomIt last );\\n```\\n\\nThis overload is more than we need. What does it do? It just sorts the elements\\nin the range `[first, last)` using `operator<` on them. We can\'t sort the whole\\nmatrix using this, but\u2026 we can sort just \xbbone\xab diagonal without doing much work\\non our end.\\n\\nWhat is the `RandomIt` type though? If we look more into the documentation, we\\ncan easily find the requirements for it and also learn that it\'s a _random access_\\n_iterator_ and allows swapping its values at the same time.\\n\\n:::tip Random access iterator\\n\\nWhat is the _random access iterator_ though? We can find it in a documentation\\nand see the following description:\\n\\n> A **LegacyRandomAccessIterator** is a [LegacyBidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator)\\n> that can be moved to point to any element in constant time.\\n\\nAfter that we can see all the requirements for it being listed. I don\'t feel like\\nreading them right now, so we will just use it and see where the compilation blows\\nup, i.e. \u201c_compiler-assisted development_\u201d[^2] if you will ;)\\n\\n:::\\n\\nNow we know that we can use `std::sort` to sort the diagonal itself, but we also\\nneed to get the diagonals somehow. I\'m rather lazy, so I\'ll just delegate it to\\nsomeone else[^3]. And that way we get\\n\\n```cpp\\nmatrix diagonalSort(matrix mat)\\n{\\n // we iterate over the diagonals\\n for (auto d : diagonals(mat)) {\\n // and we sort each diagonal\\n std::sort(d.begin(), d.end());\\n }\\n\\n // we take the matrix by copy, so we can sort in-situ and return the copy\\n // that we sorted\\n return mat;\\n}\\n```\\n\\nThis solution looks very simple, doesn\'t it? Well, cause it is.\\nLet\'s try compiling it:\\n\\n```\\nmatrix-sort.cpp:11:23: error: use of undeclared identifier \'diagonals\' [clang-diagnostic-error]\\n for (auto d : diagonals(mat)) {\\n ^\\nFound compiler error(s).\\nmake: *** [makefile:14: tidy] Error 1\\n```\\n\\nOK, seems about right. We haven\'t implemented the `diagonals` yet. And based on\\nwhat we\'ve written so far, we need a function or a class `diagonals` that will\\ngive us the diagonals we need.\\n\\n## Implementing the `diagonals`\\n\\nCool, so we need the function that will let us go through each and every diagonal\\nin our matrix. We use the _for-range_ loop, so whatever we get back from the\\n`diagonals` must support `.begin()` and `.end()`. Since I am a masochist, we will\\ndo such functionality for a matrix of any type, not just the `int` from the challenge.\\n\\nAs I said, we need to be able to\\n\\n- construct the object\\n- get the beginning\\n- get the end (the \u201csentinel\u201d)\\n\\n```cpp\\ntemplate \\nclass diagonals {\\n using matrix_t = std::vector>;\\n\\n matrix_t& _matrix;\\n\\npublic:\\n diagonals(matrix_t& m)\\n : _matrix(m)\\n {\\n }\\n diagonals_iter begin()\\n {\\n /* TODO */\\n }\\n diagonals_iter end()\\n {\\n /* TODO */\\n }\\n};\\n```\\n\\nNow we have a `diagonals` that we can use to go through the diagonals. We haven\'t\\nimplemented the core of it yet. Let\'s go through what we have for now.\\n\\nWe have a templated class with templated `T` that is used as a placeholder for any\\ntype we would store in the matrix. Because I\'m lazy, I have defined the `matrix_t`\\ntype that is a \u201cshortcut\u201d for `std::vector>`, so I don\'t have to\\ntype it out all the time. Of course, we need to store the matrix, we are given,\\nas a private attribute. And then just have the constructor and the 2 methods we\\nneed for the _for-range_.\\n\\n### Iterating over diagonals\\n\\nNow that we have an object that will allow us to iterate through the diagonals,\\nwe need to implement the iterating itself. We need to go through all of them, so\\nwe have multiple options how to do so. I have decided to start from the \u201cmain\u201d\\ndiagonal that starts at `(0, 0)` index and then proceed with the diagonals starting\\nin the first row, followed by the rest of the diagonals in the first column.\\n\\nWe need to be able to tell that we\'ve iterated through all of them, and also we\\nneed to know which diagonal is next. For that purpose we will pass the indices\\nof the first cell on the diagonal. That way we can always tell how to move forward.\\n\\nWe will start by updating the `begin` and `end` to reflect our choice accordingly.\\n\\n```cpp\\ndiagonals_iter begin() { return diagonals_iter { _matrix, 0, 0 }; }\\ndiagonals_iter end() { return diagonals_iter { _matrix, 0, _matrix.size() }; }\\n```\\n\\nFor the `begin` we return the first diagonal that starts at `(0, 0)`. And because\\nwe have decided to do the diagonals in the first column at the end, the first\\ndiagonal that is not a valid one is the one at `(0, height)`. Apart from the\\nindices, we also need to pass reference to the matrix itself.\\n\\n:::note\\n\\nYou may have noticed that we also include the diagonals that have length 1,\\nspecifically the ones at `(0, height - 1)` and `(width - 1, 0)`. We are implementing\\nan iterator that **should not** care about the way it\'s being used. Therefore, we\\ndon\'t care about the fact they don\'t need to be sorted.\\n\\n:::\\n\\nCool, let\'s leave the iterator itself to someone else, right?[^4]\\n\\n### Implementing the iterator over diagonals\\n\\nWe can start with a simple skeleton based on the information that we pass from\\nthe `diagonals`. Also to utilize the `matrix_t` and also contain implementation\\ndetails hidden away, we will put this code into the `diagonals` class.\\n\\n```cpp\\nclass diagonals_iter {\\n matrix_t& m;\\n std::size_t x;\\n std::size_t y;\\n\\npublic:\\n diagonals_iter(matrix_t& matrix, std::size_t x, std::size_t y)\\n : m(matrix)\\n , x(x)\\n , y(y)\\n {\\n }\\n};\\n```\\n\\nIn this case we will be implementing a \u201csimple\u201d forward iterator, so we don\'t\\nneed to implement a lot. Notably it will be:\\n\\n- inequality operator (we need to know when we reach the end and have nothing to\\n iterate over)\\n- preincrementation operator (we need to be able to move around the iterable)\\n- dereference operator (we need to be able to retrieve the objects we iterate\\n over)\\n\\n```cpp\\nclass diagonals_iter {\\n matrix_t& m;\\n std::size_t x;\\n std::size_t y;\\n\\npublic:\\n diagonals_iter(matrix_t& matrix, std::size_t x, std::size_t y)\\n : m(matrix)\\n , x(x)\\n , y(y)\\n {\\n }\\n\\n bool operator!=(const diagonals_iter& rhs) const\\n {\\n // iterators are not equal if they reference different matrices, or\\n // their positions differ\\n return m != rhs.m || x != rhs.x || y != rhs.y;\\n }\\n\\n diagonals_iter& operator++()\\n {\\n if (y != 0) {\\n // iterating through diagonals down the first column\\n y++;\\n return *this;\\n }\\n\\n // iterating the diagonals along the first row\\n x++;\\n if (x == m.front().size()) {\\n // switching to diagonals in the first column\\n x = 0;\\n y++;\\n }\\n\\n return *this;\\n }\\n\\n diagonal operator*() const { return diagonal { m, x, y }; }\\n};\\n```\\n\\nLet\'s go one-by-one. Inequality operator is rather simple, just compare iterator\'s\\nattributes field-by-field. If you think about it, checking inequality of two 2D\\nvectors may be a bit inefficient, therefore, we can swap around and check it as\\na last thing.\\n\\n```diff\\n- return m != rhs.m || x != rhs.x || y != rhs.y;\\n+ return x != rhs.x || y != rhs.y || m != rhs.m;\\n```\\n\\nPreincrementation is where the magic happens. If you have a better look, you can\\nsee two branches of this operation:\\n\\n1. When `y != 0` (we\'re iterating over the diagonals in the first column)\\n In this case, we just bump the row and we\'re done.\\n2. When `y == 0` (we\'re iterating over the diagonals in the first row)\\n In this case, we bump the column and check if we haven\'t gotten out of bounds,\\n i.e. the end of the first row. If we get out of the bounds, we\'re continuing\\n with the second diagonal in the first column.\\n\\nDereferencing the iterator must \u201cyield\u201d something. In our case it will be the\\ndiagonal that we want to sort. For sorting we need just the iterators that can\\nmove around said diagonal. The simplest thing, we can do, is to delegate it to\\nsomething else. In our case it will be a class called `diagonal`.\\n\\n## Implementing the `diagonal` itself\\n\\nAfter implementing the iterator over diagonals, we know that all we need to describe\\na diagonal is the matrix itself and the \u201cstart\u201d of the diagonal (row and column).\\nAnd we also know that the diagonal must provide some iterators for the `std::sort`\\nfunction. We can start with the following skeleton:\\n\\n```cpp\\ntemplate \\nclass diagonal {\\n using matrix_t = std::vector>;\\n\\n matrix_t& matrix;\\n std::size_t x;\\n std::size_t y;\\n\\npublic:\\n diagonal(matrix_t& matrix, std::size_t x, std::size_t y)\\n : matrix(matrix)\\n , x(x)\\n , y(y)\\n {\\n }\\n\\n diagonal_iter begin() const { return diagonal_iter { matrix, x, y }; }\\n\\n diagonal_iter end() const\\n {\\n auto max_x = matrix[y].size();\\n auto max_y = matrix.size();\\n\\n // we need to find the distance in which we get out of bounds (either in\\n // column or row)\\n auto steps = std::min(max_x - x, max_y - y);\\n\\n return diagonal_iter { matrix, x + steps, y + steps };\\n }\\n};\\n```\\n\\nInitialization is rather simple, we just \u201ckeep\u201d the stuff we get, `begin` is the\\nsimplest, we just delegate.\\n\\nIn case of the `end`, it gets more complicated. We need to know where is the \u201cend\u201d\\nof the diagonal. Since `end` should point to the first element \u201cafter\u201d the iterable,\\nwe know that it\'s the first position of the iterator where either `y` becomes\\n`matrix.size()` or `x` becomes `matrix[y].size()`. Also we are moving along diagonal,\\nduh, therefore we can deduce the first \u201cposition\u201d afterwards by minimal amount of\\nsteps to get out of the any column or row, hence `std::min(max_x - x, max_y - y)`.\\nFinal position is then computed simply by adding the steps to the beginning of\\nthe diagonal.\\n\\nNow we just need to finish the iterator for the diagonal itself and we\'re done.\\n\\n### Implementing `diagonal_iter`\\n\\nThis part is the hardest from all we need to do. It\'s because of the requirements\\nof the `std::sort` that requires us to implement a _random access iterator_. I have\\nbriefly described it above, and \u201cin a nutshell\u201d it means that we need to implement\\nan iterator that can move in constant time along the diagonal in any amount of\\nsteps.\\n\\nLet\'s go through all of the functionality that our iterator needs to support to\\nbe used in `std::sort`. We need the usual operations like:\\n\\n- equality/inequality\\n- incrementation\\n- dereferencing\\n\\nWe will also add all the types that our iterator uses with the category of the\\niterator, i.e. what interface it supports:\\n\\n```cpp\\nclass diagonal_iter {\\n // we need to keep reference to the matrix itself\\n matrix_t& m;\\n\\n // we need to be able to tell our current position\\n std::size_t x;\\n std::size_t y;\\n\\npublic:\\n using difference_type = std::ptrdiff_t;\\n using value_type = T;\\n using pointer = T*;\\n using reference = T&;\\n using iterator_category = std::random_access_iterator_tag;\\n\\n diagonal_iter(matrix_t& matrix,\\n std::size_t x,\\n std::size_t y)\\n : m(matrix)\\n , x(x)\\n , y(y)\\n {\\n }\\n\\n bool operator==(const diagonal_iter& rhs) const\\n {\\n return x == rhs.x && y == rhs.y && m == rhs.m;\\n }\\n\\n diagonal_iter& operator++()\\n {\\n // we are moving along the diagonal, so we increment both \u2039x\u203a and \u2039y\u203a at\\n // the same time\\n x++;\\n y++;\\n return *this;\\n }\\n\\n reference operator*() const { return m[y][x]; }\\n};\\n```\\n\\nThis is pretty similar to the previous iterator, but now we need to implement the\\nremaining requirements of the _random access iterator_. Let\'s see what those are:\\n\\n- decrementation - cause we need to be able to move backwards too, since _random _\\n _access iterator_ extends the interface of _bidirectional iterator_\\n- moving the iterator in either direction by steps given as an integer\\n- being able to tell the distance between two iterators\\n- define an ordering on the iterators\\n\\nLet\'s fill them in:\\n\\n```cpp\\nclass diagonal_iter {\\n // we need to keep reference to the matrix itself\\n matrix_t& m;\\n\\n // we need to be able to tell our current position\\n std::size_t x;\\n std::size_t y;\\n\\npublic:\\n using difference_type = std::ptrdiff_t;\\n using value_type = T;\\n using pointer = T*;\\n using reference = T&;\\n using iterator_category = std::random_access_iterator_tag;\\n\\n diagonal_iter(matrix_t& matrix,\\n std::size_t x,\\n std::size_t y)\\n : m(matrix)\\n , x(x)\\n , y(y)\\n {\\n }\\n\\n bool operator==(const diagonal_iter& rhs) const\\n {\\n return x == rhs.x && y == rhs.y && m == rhs.m;\\n }\\n\\n diagonal_iter& operator++()\\n {\\n // we are moving along the diagonal, so we increment both \u2039x\u203a and \u2039y\u203a at\\n // the same time\\n x++;\\n y++;\\n return *this;\\n }\\n\\n reference operator*() const { return m[y][x]; }\\n\\n // exactly opposite to the incrementation\\n diagonal_iter operator--()\\n {\\n x--;\\n y--;\\n return *this;\\n }\\n\\n // moving \u2039n\u203a steps back is same as calling decrementation \u2039n\u203a-times, so we\\n // can just return a new iterator and subtract \u2039n\u203a from both coordinates in\\n // the matrix\\n diagonal_iter operator-(difference_type n) const\\n {\\n return diagonal_iter { m, x - n, y - n };\\n }\\n\\n // here we assume that we are given two iterators on the same diagonal\\n difference_type operator-(const diagonal_iter& rhs) const\\n {\\n assert(m == rhs.m);\\n return x - rhs.x;\\n }\\n\\n // counterpart of moving \u2039n\u203a steps backwards\\n diagonal_iter operator+(difference_type n) const\\n {\\n return diagonal_iter { m, x + n, y + n };\\n }\\n\\n // we compare the coordinates, and also assume that those 2 iterators are\\n // lying on the same diagonal\\n bool operator<(const diagonal_iter& rhs) const\\n {\\n assert(m == rhs.m);\\n return x < rhs.x && y < rhs.y;\\n }\\n};\\n```\\n\\nAt this point we could probably try and compile it, right? If we do so, we will\\nget yelled at by a compiler for the following reasons:\\n\\n```\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1792:11: error: object of type \'diagonal::diagonal_iter\' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]\\n __last = __next;\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1817:11: note: in instantiation of function template specialization \'std::__unguarded_linear_insert::diagonal_iter, __gnu_cxx::__ops::_Val_less_iter>\' requested here\\n std::__unguarded_linear_insert(__i,\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1849:9: note: in instantiation of function template specialization \'std::__insertion_sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__insertion_sort(__first, __first + int(_S_threshold), __comp);\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1940:9: note: in instantiation of function template specialization \'std::__final_insertion_sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__final_insertion_sort(__first, __last, __comp);\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization \'std::__sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());\\n ^\\nmatrix-sort.cpp:161:18: note: in instantiation of function template specialization \'std::sort::diagonal_iter>\' requested here\\n std::sort(d.begin(), d.end());\\n ^\\nmatrix-sort.cpp:17:19: note: copy assignment operator of \'diagonal_iter\' is implicitly deleted because field \'m\' is of reference type \'diagonal::matrix_t &\' (aka \'vector> &\')\\n matrix_t& m;\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1830:2: error: no matching function for call to \'__unguarded_linear_insert\' [clang-diagnostic-error]\\n std::__unguarded_linear_insert(__i,\\n ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1850:9: note: in instantiation of function template specialization \'std::__unguarded_insertion_sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__unguarded_insertion_sort(__first + int(_S_threshold), __last,\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1940:9: note: in instantiation of function template specialization \'std::__final_insertion_sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__final_insertion_sort(__first, __last, __comp);\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization \'std::__sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());\\n ^\\nmatrix-sort.cpp:161:18: note: in instantiation of function template specialization \'std::sort::diagonal_iter>\' requested here\\n std::sort(d.begin(), d.end());\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1782:5: note: candidate template ignored: substitution failure [with _RandomAccessIterator = diagonal::diagonal_iter, _Compare = __gnu_cxx::__ops::_Val_less_iter]\\n __unguarded_linear_insert(_RandomAccessIterator __last,\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1923:11: error: object of type \'diagonal::diagonal_iter\' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]\\n __last = __cut;\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1937:9: note: in instantiation of function template specialization \'std::__introsort_loop::diagonal_iter, long, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__introsort_loop(__first, __last,\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization \'std::__sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());\\n ^\\nmatrix-sort.cpp:161:18: note: in instantiation of function template specialization \'std::sort::diagonal_iter>\' requested here\\n std::sort(d.begin(), d.end());\\n ^\\nmatrix-sort.cpp:17:19: note: copy assignment operator of \'diagonal_iter\' is implicitly deleted because field \'m\' is of reference type \'diagonal::matrix_t &\' (aka \'vector> &\')\\n matrix_t& m;\\n ^\\n```\\n\\nThat\'s a lot of noise, isn\'t it? Let\'s focus on the important parts:\\n\\n```\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1792:11: error: object of type \'diagonal::diagonal_iter\' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]\\n\u2026\\nmatrix-sort.cpp:17:19: note: copy assignment operator of \'diagonal_iter\' is implicitly deleted because field \'m\' is of reference type \'diagonal::matrix_t &\' (aka \'vector> &\')\\n matrix_t& m;\\n ^\\n```\\n\\nAh! We have a reference in our iterator, and this prevents us from having a copy\\nassignment operator (that is used \u201csomewhere\u201d in the sorting algorithm). Well\u2026\\nLet\'s just wrap it!\\n\\n```diff\\n# we need to keep a different type than reference\\n- matrix_t& m;\\n+ std::reference_wrapper m;\\n\\n# in comparison we need to get the reference out of the wrapper first\\n- return x == rhs.x && y == rhs.y && m == rhs.m;\\n+ return x == rhs.x && y == rhs.y && m.get() == rhs.m.get();\\n\\n# same when we return a reference to the \u201ccell\u201d in the matrix\\n- reference operator*() const { return m[y][x]; }\\n+ reference operator*() const { return m.get()[y][x]; }\\n\\n# and finally in the assertions that we set for the \u201cdistance\u201d and \u201cless than\u201d\\n- assert(m == rhs.m);\\n+ assert(m.get() == rhs.m.get());\\n```\\n\\nWe\'re done now! We have written an iterator over diagonals for a 2D `vector`. You can have a look at the final result [here](pathname:///files/blog/leetcode/sort-matrix-diagonally/matrix-sort.cpp).\\n\\n[^1]: just because I\'m used to it and don\'t care about your opinion ;)\\n[^2]: exercise at your own risk\\n[^3]: me in 5 minutes in fact, but don\'t make me scared\\n[^4]: me in the next section\u2026"},{"id":"aoc-2022/2nd-week","metadata":{"permalink":"/blog/aoc-2022/2nd-week","editUrl":"https://github.com/mfocko/blog/tree/main/blog/aoc-2022/02-week-2.md","source":"@site/blog/aoc-2022/02-week-2.md","title":"2nd week of Advent of Code \'22 in Rust","description":"Surviving second week in Rust.","date":"2022-12-25T23:15:00.000Z","formattedDate":"December 25, 2022","tags":[{"label":"advent-of-code","permalink":"/blog/tags/advent-of-code"},{"label":"advent-of-code-2022","permalink":"/blog/tags/advent-of-code-2022"},{"label":"rust","permalink":"/blog/tags/rust"}],"readingTime":20.875,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. @mf","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"2nd week of Advent of Code \'22 in Rust","description":"Surviving second week in Rust.","date":"2022-12-25T23:15","slug":"aoc-2022/2nd-week","authors":"mf","tags":["advent-of-code","advent-of-code-2022","rust"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Sort the matrix diagonally","permalink":"/blog/leetcode/sort-diagonally"},"nextItem":{"title":"1st week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/1st-week"}},"content":"Let\'s go through the second week of [_Advent of Code_] in Rust.\\n\\n\x3c!--truncate--\x3e\\n\\n## [Day 8: Treetop Tree House](https://adventofcode.com/2022/day/8)\\n\\n:::info tl;dr\\n\\nWe get a forest and we want to know how many trees are visible from the outside.\\nApart from that we want to find the best view.\\n\\n:::\\n\\nNothing interesting. We are moving around 2D map though. And indexing can get a\\nbit painful when doing so, let\'s refactor it a bit ;) During the preparation for\\nthe AoC, I have written `Vector2D` and now it\'s time to extend it with indexing\\nof `Vec` of `Vec`s. In my solution I was manipulating with indices in the following\\nway:\\n\\n- swapping them\\n- checking whether they are correct indices for the `Vec>`\\n- indexing `Vec>` with them\\n\\n:::caution\\n\\nI\'m getting familiar with Rust and starting to \u201cabuse\u201d it\u2026 While doing so, I\'m\\nalso uncovering some \u201cfeatures\u201d that I don\'t really like. Therefore I will mark\\nall of my rants with _thicc_ **\xab\u21af\xbb** mark and will try to \u201clock\u201d them into their\\nown \u201cbox of hell\u201d.\\n\\n:::\\n\\n#### Swapping indices\\n\\nRelatively simple implementation, just take the values, swap them and return new\\nvector.\\n\\n```rust\\nimpl Vector2D {\\n pub fn swap(&self) -> Self {\\n Self {\\n x: self.y,\\n y: self.x,\\n }\\n }\\n}\\n```\\n\\nPretty straight-forward implementation, but let\'s talk about the `T: Copy`. We\\nneed to use it, since we are returning a **new** vector, with swapped **values**.\\nIf we had values that cannot be copied, the only thing we could do, would be a\\nvector of references (and it would also introduce a lifetime, to which we\'ll get\\nlater on). This is pretty similar with the operations on sets from the first week.\\n\\n#### Indexing `Vec`\\n\\nI will start with the indexing, cause bound-checking is a bit more\u2026 complicated\\nthan I would like to.\\n\\n```rust\\npub fn index<\'a, T, U>(v: &\'a [Vec], idx: &Vector2D) -> &\'a U\\nwhere\\n usize: TryFrom,\\n >::Error: Debug,\\n T: Copy,\\n{\\n let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());\\n &v[y][x]\\n}\\n```\\n\\nLet\'s talk about this mess\u2026 Body of the function is probably the most easy part\\nand should not be hard to understand, we just take the `x` and `y` and convert\\nthem both to `usize` type that can be used later on for indexing.\\n\\nThe type signature of the function is where the fun is at :wink: We are trying\\nto convert unknown type to `usize`, so we must bound the `T` as a type that can\\nbe converted to `usize`, that\'s how we got `usize: TryFrom` which basically\\nsays that `usize` must implement `TryFrom` trait and therefore allows us to\\nconvert the indices to actual `usize` indices. Using `.unwrap()` also forces us\\nto bound the error that can occur when converting `T` into `usize`, that\'s how\\nwe get `>::Error: Debug` which loosely means\\n\\n> error during conversion of `T` into `usize` must implement `Debug`,\\n> i.e. can be printed in some way or other\\n\\n`T: Copy` is required by `.try_into()` which takes `T` by-value.\\n\\nAnd now we are left only with the first line of the definition.\\n\\n:::note\\n\\nSkilled Rustaceans might notice that this implementation is rather flaky and can\\nbreak in multiple places at once. I\'ll get back to it\u2026\\n\\n:::\\n\\nLet\'s split it in multiple parts:\\n\\n- `v: &\'a [Vec]` represents the 2D `Vec`, we are indexing, `Vec` implements\\n `Slice` trait and _clippy_ recommends using `&[T]` to `&Vec`, exact details\\n are unknown to me\\n- `idx: &Vector2D` represents the _indices_ which we use, we take them by\\n reference to avoid an unnecessary copy\\n- `-> &\'a U` means that we are returning a _reference_ to some value of type `U`.\\n Now the question is what does the `\'a` mean, we can also see it as a generic\\n type declared along `T` and `U`. And the answer is _relatively_ simple, `\'a`\\n represents a _lifetime_. We take the `v` by a reference and return a reference,\\n borrow checker validates all of the _borrows_ (or references), so we need to\\n specify that our returned value has _the same lifetime_ as the vector we have\\n taken by a reference, i.e. returned reference must live at least as long as the\\n `v`. This way we can \u201cbe sure\u201d that the returned reference is valid.\\n\\n##### Issues\\n\\nFirst issue that our implementation has is the fact that we cannot get a mutable\\nreference out of that function. This could be easily resolved by introducing new\\nfunction, e.g. `index_mut`. Which I have actually done while writing this part:\\n\\n```rust\\npub fn index_mut<\'a, T, U>(v: &\'a mut [Vec], idx: &Vector2D) -> &\'a mut U\\nwhere\\n usize: TryFrom,\\n >::Error: Debug,\\n T: Copy,\\n{\\n let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());\\n &mut v[y][x]\\n}\\n```\\n\\n:::caution **\xab\u21af\xbb** Why can\'t we use one function?\\n\\nWhen we consider a `Vec`, we don\'t need to consider containers as `T`, Rust\\nimplements indexing as traits `Index` and `IndexMut` that do the dirty work\\nbehind syntactic sugar of `container[idx]`.\\n\\nHowever, implementing of traits is not allowed for _external_ types, i.e. types\\nthat you haven\'t defined yourself. This means that you can implement indexing\\nover containers that you have implemented yourself, but you cannot use your own\\ntypes for indexing \u201cbuilt-in\u201d types.\\n\\nAnother part of this rabbit hole is trait `SliceIndex` that is of a relevance\\nbecause of\\n\\n```rust\\nimpl Index for [T]\\nwhere\\n I: SliceIndex<[T]>\\n\\nimpl Index for Vec\\nwhere\\n I: SliceIndex<[T]>,\\n A: Allocator\\n\\nimpl Index for [T; N]\\nwhere\\n [T]: Index\\n```\\n\\nIn other words, if your type implements `SliceIndex` trait, it can be used\\nfor indexing. As of now, this trait has all of its required methods experimental\\nand is marked as `unsafe`.\\n\\n:::\\n\\nAnother problem is a requirement for indexing either `[Vec]` or `Vec>`.\\nThis requirement could be countered by removing inner type `Vec` and constraining\\nit by a trait `Index` (or `IndexMut` respectively) in a following way\\n\\n```rust\\npub fn index<\'a, C, T>(v: &\'a [C], idx: &Vector2D) -> &\'a C::Output\\nwhere\\n usize: TryFrom,\\n >::Error: Debug,\\n T: Copy,\\n C: Index\\n{\\n let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());\\n &v[y][x]\\n}\\n```\\n\\nGiven this, we can also give a more meaningful typename for indexing type, such\\nas `I`.\\n\\n#### Checking bounds\\n\\nNow we can get to the boundary checks, it is very similar, but a more\u2026 dirty.\\nFirst approach that came up was to convert the indices in `Vector2D` to `usize`,\\nbut when you add the indices up, e.g. when checking the neighbors, you can end\\nup with negative values which, unlike in C++, causes an error (instead of underflow\\nthat you can use to your advantage; you can easily guess how).\\n\\nSo how can we approach this then? Well\u2026 we will convert the bounds instead of\\nthe indices and that lead us to:\\n\\n```rust\\npub fn in_range(v: &[Vec], idx: &Vector2D) -> bool\\nwhere\\n usize: TryInto,\\n >::Error: Debug,\\n T: PartialOrd + Copy,\\n{\\n idx.y >= 0.try_into().unwrap()\\n && idx.y < v.len().try_into().unwrap()\\n && idx.x >= 0.try_into().unwrap()\\n && idx.x\\n < v[TryInto::::try_into(idx.y).unwrap()]\\n .len()\\n .try_into()\\n .unwrap()\\n}\\n```\\n\\nYou can tell that it\'s definitely a shitty code. Let\'s improve it now! We will\\nget back to the original idea, but do it better. We know that we cannot convert\\nnegative values into `usize`, **but** we also know that conversion like that\\nreturns a `Result` which we can use to our advantage.\\n\\n```rust\\npub fn in_range(v: &[Vec], idx: &Vector2D) -> bool\\nwhere\\n T: Copy,\\n usize: TryFrom,\\n{\\n usize::try_from(idx.y)\\n .and_then(|y| usize::try_from(idx.x).map(|x| y < v.len() && x < v[y].len()))\\n .unwrap_or(false)\\n}\\n```\\n\\n`Result` is a type similar to `Either` in Haskell and it allows us to chain\\nmultiple operations on correct results or propagate the original error without\\ndoing anything. Let\'s dissect it one-by-one.\\n\\n`try_from` is a method implemented in `TryFrom` trait, that allows you to convert\\ntypes and either successfully convert them or fail (with a reasonable error). This\\nmethod returns `Result`.\\n\\nWe call `and_then` on that _result_, let\'s have a look at the type signature of\\n`and_then`, IMO it explains more than enough:\\n\\n```rust\\npub fn and_then(self, op: F) -> Result\\nwhere\\n F: FnOnce(T) -> Result\\n```\\n\\nOK\u2026 So it takes the result and a function and returns another result with\\ndifferent value and different error. However we can see that the function, which\\nrepresents an operation on a result, takes just the value, i.e. it doesn\'t care\\nabout any previous error. To make it short:\\n\\n> `and_then` allows us to run an operation, which can fail, on the correct result\\n\\nWe parsed a `y` index and now we try to convert the `x` index with `try_from`\\nagain, but on that result we use `map` rather than `and_then`, why would that be?\\n\\n```rust\\npub fn map(self, op: F) -> Result\\nwhere\\n F: FnOnce(T) -> U\\n```\\n\\nHuh\u2026 `map` performs an operation that **cannot** fail. And finally we use\\n`unwrap_or` which takes the value from result, or in case of an error returns the\\ndefault that we define.\\n\\nHow does this work then? If `y` is negative, the conversion fails and the error\\npropagates all the way to `unwrap_or`, if `y` can be a correct `usize` value, then\\nwe do the same with `x`. If `x` is negative, we propagate the error as with `y`,\\nand if it\'s not, then we check whether it exceeds the higher bounds or not.\\n\\n### Solution\\n\\nRelatively simple, you just need follow the rules and not get too smart, otherwise\\nit will get back at you.\\n\\n## [Day 9: Rope Bridge](https://adventofcode.com/2022/day/9)\\n\\n:::info tl;dr\\n\\nWe get a rope with knots and we want to track how many different positions are\\nvisited with the rope\'s tail.\\n\\n:::\\n\\nBy this day, I have come to a conclusion that current skeleton for each day\\ngenerates a lot of boilerplate. And even though it can be easily copied, it\'s\\njust a waste of space and unnecessary code. Let\'s \u201csimplify\u201d this (on one end\\nwhile creating monster on the other end). I\'ve gone through what we need in the\\npreparations for the AoC. Let\'s sum up our requirements:\\n\\n- parsing\\n- part 1 & 2\\n- running on sample / input\\n- tests\\n\\nParsing and implementation of both parts is code that changes each day and we\\ncannot do anything about it. However running and testing can be simplified!\\n\\nLet\'s introduce and export a new module `solution` that will take care of all of\\nthis. We will start by introducing a trait for each day.\\n\\n```rust\\npub trait Solution {\\n fn parse_input>(pathname: P) -> Input;\\n\\n fn part_1(input: &Input) -> Output;\\n fn part_2(input: &Input) -> Output;\\n}\\n```\\n\\nThis does a lot of work for us already, we have defined a trait and for each day\\nwe will create a structure representing a specific day. That structure will also\\nimplement the `Solution` trait.\\n\\nNow we need to get rid of the boilerplate, we can\'t get rid of the `main` function,\\nbut we can at least move out the functionality.\\n\\n```rust\\nfn run(type_of_input: &str) -> Result<()>\\nwhere\\n Self: Sized,\\n{\\n tracing_subscriber::fmt()\\n .with_env_filter(EnvFilter::from_default_env())\\n .with_target(false)\\n .with_file(true)\\n .with_line_number(true)\\n .without_time()\\n .compact()\\n .init();\\n color_eyre::install()?;\\n\\n let input = Self::parse_input(format!(\\"{}s/{}.txt\\", type_of_input, Self::day()));\\n\\n info!(\\"Part 1: {}\\", Self::part_1(&input));\\n info!(\\"Part 2: {}\\", Self::part_2(&input));\\n\\n Ok(())\\n}\\n\\nfn main() -> Result<()>\\nwhere\\n Self: Sized,\\n{\\n Self::run(\\"input\\")\\n}\\n```\\n\\nThis is all part of the `Solution` trait, which can implement methods while being\\ndependent on what is provided by the implementing types. In this case, we just\\nneed to bound the `Output` type to implement `Display` that is necessary for the\\n`info!` and format string there.\\n\\nNow we can get to first of the nasty things we are going to do\u2026 And it is the\\n`day()` method that you can see being used when constructing path to the input\\nfile. That method will generate a name of the file, e.g. `day01` and we know that\\nwe can _somehow_ deduce it from the structure name, given we name it reasonably.\\n\\n```rust\\nfn day() -> String {\\n let mut day = String::from(type_name::().split(\\"::\\").next().unwrap());\\n day.make_ascii_lowercase();\\n\\n day.to_string()\\n}\\n```\\n\\n:::caution `type_name`\\n\\nThis feature is still experimental and considered to be internal, it is not\\nadvised to use it any production code.\\n\\n:::\\n\\nAnd now we can get to the nastiest stuff :weary: We will **generate** the tests!\\n\\nWe want to be able to generate tests for sample input in a following way:\\n\\n```rust\\ntest_sample!(day_01, Day01, 42, 69);\\n```\\n\\nThere\'s not much we can do, so we will write a macro to generate the tests for us.\\n\\n```rust\\n#[macro_export]\\nmacro_rules! test_sample {\\n ($mod_name:ident, $day_struct:tt, $part_1:expr, $part_2:expr) => {\\n #[cfg(test)]\\n mod $mod_name {\\n use super::*;\\n\\n #[test]\\n fn test_part_1() {\\n let sample =\\n $day_struct::parse_input(&format!(\\"samples/{}.txt\\", $day_struct::day()));\\n assert_eq!($day_struct::part_1(&sample), $part_1);\\n }\\n\\n #[test]\\n fn test_part_2() {\\n let sample =\\n $day_struct::parse_input(&format!(\\"samples/{}.txt\\", $day_struct::day()));\\n assert_eq!($day_struct::part_2(&sample), $part_2);\\n }\\n }\\n };\\n}\\n```\\n\\nWe have used it in a similar way as macros in C/C++, one of the things that we\\ncan use to our advantage is defining \u201ctype\u201d of the parameters for the macro. All\\nparameters have their name prefixed with `$` sign and you can define various \u201cforms\u201d\\nof your macro. Let\'s go through it!\\n\\nWe have following parameters:\\n\\n- `$mod_name` which represents the name for the module with tests, it is typed\\n with `ident` which means that we want a valid identifier to be passed in.\\n- `$day_struct` represents the structure that will be used for tests, it is typed\\n with `tt` which represents a _token tree_, in our case it is a type.\\n- `$part_X` represents the expected output for the `X`th part and is of type `expr`\\n which literally means an _expression_.\\n\\nApart from that we need to use `#[macro_export]` to mark the macro as exported\\nfor usage outside of the module. Now our skeleton looks like:\\n\\n```rust\\nuse aoc_2022::*;\\n\\ntype Input = String;\\ntype Output = String;\\n\\nstruct DayXX;\\nimpl Solution for DayXX {\\n fn parse_input>(pathname: P) -> Input {\\n file_to_string(pathname)\\n }\\n\\n fn part_1(input: &Input) -> Output {\\n todo!()\\n }\\n\\n fn part_2(input: &Input) -> Output {\\n todo!()\\n }\\n}\\n\\nfn main() -> Result<()> {\\n // DayXX::run(\\"sample\\")\\n DayXX::main()\\n}\\n\\n// test_sample!(day_XX, DayXX, , );\\n```\\n\\n### Solution\\n\\nNot much to talk about, it is relatively easy to simulate.\\n\\n## [Day 10: Cathode-Ray Tube](https://adventofcode.com/2022/day/10)\\n\\n:::info tl;dr\\n\\nEmulating basic arithmetic operations on a CPU and drawing on CRT based on the\\nCPU\'s accumulator.\\n\\n:::\\n\\nIn this day I have discovered an issue with my design of the `Solution` trait.\\nAnd the issue is caused by different types of `Output` for the part 1 and part 2.\\n\\nProblem is relatively simple and consists of simulating a CPU, I have approached\\nit in a following way:\\n\\n```rust\\nfn evaluate_instructions(instructions: &[Instruction], mut out: Output) -> Output {\\n instructions\\n .iter()\\n .fold(State::new(), |state, instruction| {\\n state.execute(instruction, &mut out)\\n });\\n\\n out\\n}\\n```\\n\\nWe just take the instructions, we have some state of the CPU and we execute the\\ninstructions one-by-one. Perfect usage of the `fold` (or `reduce` as you may know\\nit from other languages).\\n\\nYou can also see that we have an `Output` type, so the question is how can we fix\\nthat problem. And the answer is very simple and _functional_. Rust allows you to\\nhave an `enumeration` that can _bear_ some other values apart from the type itself.\\n\\n:::tip\\n\\nWe could\'ve seen something like this with the `Result` type that can be\\ndefined as\\n\\n```rust\\nenum Result {\\n Ok(T),\\n Err(E)\\n}\\n```\\n\\n###### What does that mean though?\\n\\nWhen we have an `Ok` value, it has the result itself, and when we get an `Err`\\nvalue, it has the error. This also allows us to handle _results_ in a rather\\npretty way:\\n\\n```rust\\nmatch do_something(x) {\\n Ok(y) => {\\n println!(\\"SUCCESS: {}\\", y);\\n },\\n Err(y) => {\\n eprintln!(\\"ERROR: {}\\", y);\\n }\\n}\\n```\\n\\n:::\\n\\nMy solution has a following outline:\\n\\n```rust\\nfn execute(&self, i: &Instruction, output: &mut Output) -> State {\\n // execute the instruction\\n\\n // collect results if necessary\\n match output {\\n Output::Part1(x) => self.execute_part_1(y, x),\\n Output::Part2(x) => self.execute_part_2(y, x),\\n }\\n\\n // return the obtained state\\n new_state\\n}\\n```\\n\\nYou might think that it\'s a perfectly reasonable thing to do. Yes, **but** notice\\nthat the `match` statement doesn\'t _collect_ the changes in any way and also we\\npass `output` by `&mut`, so it is shared across each _iteration_ of the `fold`.\\n\\nThe dirty and ingenious thing is that `x`s are passed by `&mut` too and therefore\\nthey are directly modified by the helper functions. To sum it up and let it sit\\n\\n> We are **collecting** the result **into** an **enumeration** that is **shared**\\n> across **all** iterations of `fold`.\\n\\n### Solution\\n\\nSimilar to _Day 9_, but there are some technical details that can get you.\\n\\n## [Day 11: Monkey in the Middle](https://adventofcode.com/2022/day/11)\\n\\n:::info tl;dr\\n\\nSimulation of monkeys throwing stuff around and measuring your stress levels\\nwhile your stuff is being passed around.\\n\\n:::\\n\\nI think I decided to use regular expressions here for the first time, cause\\nparsing the input was a pain.\\n\\nAlso I didn\'t expect to implement Euclidean algorithm in Rust\u2026\\n\\n### Solution\\n\\nAgain, we\'re just running a simulation. Though I must admit it was very easy to\\nmake a small technical mistakes that could affect the final results very late.\\n\\n## [Day 12: Hill Climbing Algorithm](https://adventofcode.com/2022/day/12)\\n\\n:::info tl;dr\\n\\nFinding shortest path up the hill and also shortest path down to the ground while\\nalso rolling down the hill\u2026\\n\\n:::\\n\\nAs I have said in the _tl;dr_, we are looking for the shortest path, but the start\\nand goal differ for the part 1 and 2. So I have decided to refactor my solution\\nto a BFS algorithm that takes necessary parameters via functions:\\n\\n```rust\\nfn bfs(\\n graph: &[Vec], start: &Position, has_edge: F, is_target: G\\n) -> Option\\nwhere\\n F: Fn(&[Vec], &Position, &Position) -> bool,\\n G: Fn(&[Vec], &Position) -> bool\\n```\\n\\nWe pass the initial vertex from the caller and everything else is left to the BFS\\nalgorithm, based on the `has_edge` and `is_target` functions.\\n\\nThis was easy! And that is not very usual in Rust once you want to pass around\\nfunctions. :eyes:\\n\\n### Solution\\n\\nLooking for the shortest path\u2026 Must be Dijkstra, right? **Nope!** Half of the\\nReddit got jebaited though. In all fairness, nothing stops you from implementing\\nthe Dijkstra\'s algorithm for finding the shortest path, **but** if you know that\\nall connected vertices are in a unit (actually $d = 1$) distance from each other,\\nthen you know that running Dijkstra is equivalent to running BFS, only with worse\\ntime complexity, because of the priority heap instead of the queue.\\n\\n## [Day 13: Distress Signal](https://adventofcode.com/2022/day/13)\\n\\n:::info tl;dr\\n\\nProcessing packets with structured data from the distress signal.\\n\\n:::\\n\\nYou can implement a lot of traits if you want to. It is _imperative_ to implement\\nordering on the packets. I had a typo, so I also proceeded to implement a `Display`\\ntrait for debugging purposes:\\n\\n```rust\\nimpl Display for Packet {\\n fn fmt(&self, f: &mut std::fmt::Formatter<\'_>) -> std::fmt::Result {\\n match self {\\n Packet::Integer(x) => write!(f, \\"{x}\\"),\\n Packet::List(lst) => write!(f, \\"[{}]\\", lst.iter().map(|p| format!(\\"{p}\\")).join(\\",\\")),\\n }\\n }\\n}\\n```\\n\\n### Solution\\n\\nA lot of technical details\u2026 Parsing is nasty too\u2026\\n\\n## [Day 14: Regolith Reservoir](https://adventofcode.com/2022/day/14)\\n\\n:::info tl;dr\\n\\nLet\'s simulate falling sand grain-by-grain.\\n\\n:::\\n\\nAgain, both parts are relatively similar with minimal changes, so it is a good\\nidea to refactor it a bit. Similar approach to the [BFS above]. Also this is the\\nfirst day where I ran into efficiency issues and had to redo my solution to speed\\nit up just a bit.\\n\\n### Solution\\n\\nTedious.\\n\\n## Post Mortem\\n\\n### Indexing\\n\\nI was asked about the indexing after publishing the blog. And truly it is rather\\ncomplicated topic, especially after releasing `SliceIndex` trait. I couldn\'t\\nleave it be, so I tried to implement the `Index` and `IndexMut` trait.\\n\\n:::note\\n\\nI have also mentioned that the `SliceIndex` trait is `unsafe`, but truth be told,\\nonly _unsafe_ part are the 2 methods that are named `*unchecked*`. Anyways, I will\\nbe implementing the `Index*` traits for now, rather than the `SliceIndex`.\\n\\n:::\\n\\nIt\'s relatively straightforward\u2026\\n\\n```rust\\nimpl Index> for [C]\\nwhere\\n I: Copy + TryInto,\\n >::Error: Debug,\\n C: Index,\\n{\\n type Output = C::Output;\\n\\n fn index(&self, index: Vector2D) -> &Self::Output {\\n let (x, y): (usize, usize) =\\n (index.x.try_into().unwrap(), index.y.try_into().unwrap());\\n &self[y][x]\\n }\\n}\\n\\nimpl IndexMut> for [C]\\nwhere\\n I: Copy + TryInto,\\n >::Error: Debug,\\n C: IndexMut,\\n{\\n fn index_mut(&mut self, index: Vector2D) -> &mut Self::Output {\\n let (x, y): (usize, usize) =\\n (index.x.try_into().unwrap(), index.y.try_into().unwrap());\\n &mut self[y][x]\\n }\\n}\\n```\\n\\nWe can see a lot of similarities to the implementation of `index` and `index_mut`\\nfunctions. In the end, they are 1:1, just wrapped in the trait that provides a\\nsyntax sugar for `container[idx]`.\\n\\n:::note\\n\\nI have also switched from using the `TryFrom` to `TryInto` trait, since it better\\nmatches what we are using, the `.try_into` rather than `usize::try_from`.\\n\\nAlso implementing `TryFrom` automatically provides you with a `TryInto` trait,\\nsince it is relatively easy to implement. Just compare the following:\\n\\n```rust\\npub trait TryFrom: Sized {\\n type Error;\\n\\n fn try_from(value: T) -> Result;\\n}\\n\\npub trait TryInto: Sized {\\n type Error;\\n\\n fn try_into(self) -> Result;\\n}\\n```\\n\\n:::\\n\\nOK, so we have our trait implemented, we should be able to use `container[index]`,\\nright? Yes\u2026 but actually no :frowning:\\n\\n```\\nerror[E0277]: the type `[std::vec::Vec]` cannot be indexed by `aoc_2022::Vector2D`\\n --\x3e src/bin/day08.rs:26:18\\n |\\n26 | if trees[pos] > tallest {\\n | ^^^ slice indices are of type `usize` or ranges of `usize`\\n |\\n = help: the trait `std::slice::SliceIndex<[std::vec::Vec]>` is not implemented for `aoc_2022::Vector2D`\\n = note: required for `std::vec::Vec>` to implement `std::ops::Index>`\\n\\nerror[E0277]: the type `[std::vec::Vec]` cannot be indexed by `aoc_2022::Vector2D`\\n --\x3e src/bin/day08.rs:30:28\\n |\\n30 | max(tallest, trees[pos])\\n | ^^^ slice indices are of type `usize` or ranges of `usize`\\n |\\n = help: the trait `std::slice::SliceIndex<[std::vec::Vec]>` is not implemented for `aoc_2022::Vector2D`\\n = note: required for `std::vec::Vec>` to implement `std::ops::Index>`\\n\\nerror[E0277]: the type `[std::vec::Vec]` cannot be indexed by `aoc_2022::Vector2D`\\n --\x3e src/bin/day08.rs:52:28\\n |\\n52 | let max_height = trees[position];\\n | ^^^^^^^^ slice indices are of type `usize` or ranges of `usize`\\n |\\n = help: the trait `std::slice::SliceIndex<[std::vec::Vec]>` is not implemented for `aoc_2022::Vector2D`\\n = note: required for `std::vec::Vec>` to implement `std::ops::Index>`\\n```\\n\\nWhy? We have it implemented for the slices (`[C]`), why doesn\'t it work? Well,\\nthe fun part consists of the fact that in other place, where we were using it,\\nwe were passing the `&[Vec]`, but this is coming from a helper functions that\\ntake `&Vec>` instead. And\u2026 we don\'t implement `Index` and `IndexMut` for\\nthose. Just for the slices. \ud83e\udd2f _What are we going to do about it?_\\n\\nWe can either start copy-pasting or be smarter about it\u2026 I choose to be smarter,\\nso let\'s implement a macro! The only difference across the implementations are\\nthe types of the outer containers. Implementation doesn\'t differ **at all**!\\n\\nImplementing the macro can be done in a following way:\\n\\n```rust\\nmacro_rules! generate_indices {\\n ($container:ty) => {\\n impl Index> for $container\\n where\\n I: Copy + TryInto,\\n >::Error: Debug,\\n C: Index,\\n {\\n type Output = C::Output;\\n\\n fn index(&self, index: Vector2D) -> &Self::Output {\\n let (x, y): (usize, usize) =\\n (index.x.try_into().unwrap(), index.y.try_into().unwrap());\\n &self[y][x]\\n }\\n }\\n\\n impl IndexMut> for $container\\n where\\n I: Copy + TryInto,\\n >::Error: Debug,\\n C: IndexMut,\\n {\\n fn index_mut(&mut self, index: Vector2D) -> &mut Self::Output {\\n let (x, y): (usize, usize) =\\n (index.x.try_into().unwrap(), index.y.try_into().unwrap());\\n &mut self[y][x]\\n }\\n }\\n };\\n}\\n```\\n\\nAnd now we can simply do\\n\\n```rust\\ngenerate_indices!(VecDeque);\\ngenerate_indices!([C]);\\ngenerate_indices!(Vec);\\n// generate_indices!([C; N], const N: usize);\\n```\\n\\nThe last type (I took the inspiration from the implementations of the `Index` and\\n`IndexMut` traits) is a bit problematic, because of the `const N: usize` part,\\nwhich I haven\'t managed to be able to parse. And that\'s how I got rid of the error.\\n\\n:::note\\n\\nIf I were to use 2D-indexing over `[C; N]` slices, I\'d probably just go with the\\ncopy-paste, cause the cost of this \u201cmonstrosity\u201d outweighs the benefits of no DRY.\\n\\n:::\\n\\n#### Cause of the problem\\n\\nThis issue is relatively funny. If you don\'t use any type aliases, just the raw\\ntypes, you\'ll get suggested certain changes by the _clippy_. For example if you\\nconsider the following piece of code\\n\\n```rust\\nfn get_sum(nums: &Vec) -> i32 {\\n nums.iter().sum()\\n}\\n\\nfn main() {\\n let nums = vec![1, 2, 3];\\n println!(\\"Sum: {}\\", get_sum(&nums));\\n}\\n```\\n\\nand you run _clippy_ on it, you will get\\n\\n```\\nChecking playground v0.0.1 (/playground)\\nwarning: writing `&Vec` instead of `&[_]` involves a new object where a slice will do\\n --\x3e src/main.rs:1:18\\n |\\n1 | fn get_sum(nums: &Vec) -> i32 {\\n | ^^^^^^^^^ help: change this to: `&[i32]`\\n |\\n = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg\\n = note: `#[warn(clippy::ptr_arg)]` on by default\\n\\nwarning: `playground` (bin \\"playground\\") generated 1 warning\\n Finished dev [unoptimized + debuginfo] target(s) in 0.61s\\n```\\n\\nHowever, if you introduce a type alias, such as\\n\\n```rust\\ntype Numbers = Vec;\\n```\\n\\nThen _clippy_ won\'t say anything, cause there is literally nothing to suggest.\\nHowever the outcome is not the same\u2026\\n\\n[_advent of code_]: https://adventofcode.com\\n[bfs above]: #day-12-hill-climbing-algorithm"},{"id":"aoc-2022/1st-week","metadata":{"permalink":"/blog/aoc-2022/1st-week","editUrl":"https://github.com/mfocko/blog/tree/main/blog/aoc-2022/01-week-1.md","source":"@site/blog/aoc-2022/01-week-1.md","title":"1st week of Advent of Code \'22 in Rust","description":"Surviving first week in Rust.","date":"2022-12-15T01:15:00.000Z","formattedDate":"December 15, 2022","tags":[{"label":"advent-of-code","permalink":"/blog/tags/advent-of-code"},{"label":"advent-of-code-2022","permalink":"/blog/tags/advent-of-code-2022"},{"label":"rust","permalink":"/blog/tags/rust"}],"readingTime":12.4,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. @mf","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"1st week of Advent of Code \'22 in Rust","description":"Surviving first week in Rust.","date":"2022-12-15T01:15","slug":"aoc-2022/1st-week","authors":"mf","tags":["advent-of-code","advent-of-code-2022","rust"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"2nd week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/2nd-week"},"nextItem":{"title":"Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/intro"}},"content":"Let\'s go through the first week of [_Advent of Code_] in Rust.\\n\\n\x3c!--truncate--\x3e\\n\\n:::note\\n\\nIf you wish to have a look at the solutions, you can follow them on my [GitLab].\\nMore specifically in the [`/src/bin/`].\\n\\n:::\\n\\nI will try to summarize my experience with using Rust for the AoC. Trying it out\\nages ago, I believe it will be _pain and suffering_, but we will see. For each\\nday I will also try to give a tl;dr of the problem, so that you can better imagine\\nthe relation to my woes or :+1: moments.\\n\\n## [Day 1: Calorie Counting](https://adventofcode.com/2022/day/1)\\n\\n:::info tl;dr\\n\\nAs the name suggests, we get the calories of the food contained in the elves\\nbackpacks and we want to choose the elf that has the most food ;)\\n\\n:::\\n\\n> Wakey wakey!\\n\\nProgramming in Rust at 6am definitely hits. I\'ve also forgotten to mention how I\\nhandle samples. With each puzzle you usually get a sample input and expected\\noutput. You can use them to verify that your solution works, or usually doesn\'t.\\n\\nAt first I\'ve decided to put asserts into my `main`, something like\\n\\n```rust\\nassert_eq!(part_1(&sample), 24000);\\ninfo!(\\"Part 1: {}\\", part_1(&input));\\n\\nassert_eq!(part_2(&sample), 45000);\\ninfo!(\\"Part 2: {}\\", part_2(&input));\\n```\\n\\nHowever, once you get further, the sample input may take some time to run itself.\\nSo in the end, I have decided to turn them into unit tests:\\n\\n```rust\\n#[cfg(test)]\\nmod tests {\\n use super::*;\\n\\n #[test]\\n fn test_part_1() {\\n let sample = parse_input(\\"samples/day01.txt\\");\\n assert_eq!(part_1(&sample), 24000);\\n }\\n\\n #[test]\\n fn test_part_2() {\\n let sample = parse_input(\\"samples/day01.txt\\");\\n assert_eq!(part_2(&sample), 45000);\\n }\\n}\\n```\\n\\nAnd later on I have noticed, it\'s hard to tell the difference between the days,\\nso I further renamed the `mod` from generic `tests` to reflect the days.\\n\\nAlso after finishing the first day puzzle, I have installed an [`sccache`] to\\ncache the builds, so that the build time is lower, cause it was kinda unbearable.\\n\\n### Solution\\n\\nWell, it\'s a pretty simple problem. You just take the input, sum the calories and\\nfind the biggest one. However, if we try to generalize to more than the biggest\\none, the fun appears. We have few options:\\n\\n- keep all the calories, sort them, take what we need\\n- keep all the calories and use max heap\\n- use min heap and maintain at most N calories that we need\\n\\n## [Day 2: Rock Paper Scissors](https://adventofcode.com/2022/day/2)\\n\\n:::info tl;dr\\n\\nYou want to know what score did you achieve while playing _Rock Paper Scissors_.\\nAnd then you want to be strategic about it.\\n\\n:::\\n\\nApart from the technical details of the puzzle, it went relatively smooth.\\n\\n### Solution\\n\\nI took relatively na\xefve approach and then tried to simplify it.\\n\\n## [Day 3: Rucksack Reorganization](https://adventofcode.com/2022/day/3)\\n\\n:::info tl;dr\\n\\nLet\'s go reorganize elves\' backpacks! Each backpacks has 2 compartments and you\\nwant to find the common item among those compartments. Each of them has priority,\\nyou care only about the sum.\\n\\n:::\\n\\nThis is the day where I started to fight the compiler and neither of us decided\\nto give up. Let\'s dive into it \\\\o/\\n\\n:::tip Fun fact\\n\\nFighting the compiler took me 30 minutes.\\n\\n:::\\n\\nWe need to find a common item among 2 collections, that\'s an easy task, right?\\nWe can construct 2 sets and find an intersection:\\n\\n```rust\\nlet top: HashSet = [1, 2, 3].iter().collect();\\nlet bottom: HashSet = [3, 4, 5].iter().collect();\\n```\\n\\nNow, the first issue that we encounter is caused by the fact that we are using\\na slice (the `[\u2026]`), iterator of that returns **references** to the numbers.\\nAnd we get immediately yelled at by the compiler, because the numbers are discarded\\nafter running the `.collect`. To fix this, we can use `.into_iter`:\\n\\n```rust\\nlet top: HashSet = [1, 2, 3].into_iter().collect();\\nlet bottom: HashSet = [3, 4, 5].into_iter().collect();\\n```\\n\\nThis way the numbers will get copied instead of referenced. OK, let\'s find the\\nintersection of those 2 collections:\\n\\n```rust\\nprintln!(\\"Common elements: {:?}\\", top.intersection(&bottom));\\n```\\n\\n```\\nCommon elements: [3]\\n```\\n\\n:::caution\\n\\nNotice that we need to do `&bottom`. It explicitly specifies that `.intersection`\\n**borrows** the `bottom`, i.e. takes an immutable reference to it.\\n\\n:::\\n\\nThat\'s what we want, right? Looks like it! \\\\o/\\n\\nNext part wants us to find the common element among all of the backpacks. OK, so\\nthat should be fairly easy, we have an intersection and we want to find intersection\\nover all of them.\\n\\nLet\'s have a look at the type of the `.intersection`\\n\\n```rust\\npub fn intersection<\'a>(\\n\xa0\xa0\xa0\xa0&\'a self,\\n\xa0\xa0\xa0\xa0other: &\'a HashSet\\n) -> Intersection<\'a, T, S>\\n```\\n\\nOK\u2026 Huh\u2026 But we have an example there!\\n\\n```rust\\nlet intersection: HashSet<_> = a.intersection(&b).collect();\\n```\\n\\nCool, that\'s all we need.\\n\\n```rust\\nlet top: HashSet = [1, 2, 3, 4].into_iter().collect();\\nlet bottom: HashSet = [3, 4, 5, 6].into_iter().collect();\\nlet top_2: HashSet = [2, 3, 4, 5, 6].into_iter().collect();\\nlet bottom_2: HashSet = [4, 5, 6].into_iter().collect();\\n\\nlet intersection: HashSet<_> = top.intersection(&bottom).collect();\\nprintln!(\\"Intersection: {:?}\\", intersection);\\n```\\n\\n```\\nIntersection: {3, 4}\\n```\\n\\nCool, so let\'s do the intersection with the `top_2`:\\n\\n```rust\\nlet top: HashSet = [1, 2, 3, 4].into_iter().collect();\\nlet bottom: HashSet = [3, 4, 5, 6].into_iter().collect();\\nlet top_2: HashSet = [2, 3, 4, 5, 6].into_iter().collect();\\nlet bottom_2: HashSet = [4, 5, 6].into_iter().collect();\\n\\nlet intersection: HashSet<_> = top.intersection(&bottom).collect();\\nlet intersection: HashSet<_> = intersection.intersection(&top_2).collect();\\nprintln!(\\"Intersection: {:?}\\", intersection);\\n```\\n\\nAnd we get yelled at by the compiler:\\n\\n```\\nerror[E0308]: mismatched types\\n --\x3e src/main.rs:10:58\\n |\\n10 | let intersection: HashSet<_> = intersection.intersection(&top_2).collect();\\n | ------------ ^^^^^^ expected `&i32`, found `i32`\\n | |\\n | arguments to this function are incorrect\\n |\\n = note: expected reference `&HashSet<&i32>`\\n found reference `&HashSet`\\n```\\n\\n/o\\\\ What the hell is going on here? Well, the funny thing is, that this operation\\ndoesn\'t return the elements themselves, but the references to them and when we pass\\nthe third set, it has just the values themselves, without any references.\\n\\n:::tip\\n\\nIt may seem as a very weird decision, but in fact it makes some sense\u2026 It allows\\nyou to do intersection of items that may not be possible to copy. Overall this is\\na \u201ctax\u201d for having a borrow checker ~~drilling your ass~~ having your back and\\nmaking sure you\'re not doing something naughty that may cause an **undefined**\\n**behavior**.\\n\\n:::\\n\\nTo resolve this we need to get an iterator that **clones** the elements:\\n\\n```rust\\nlet top: HashSet = [1, 2, 3, 4].into_iter().collect();\\nlet bottom: HashSet = [3, 4, 5, 6].into_iter().collect();\\nlet top_2: HashSet = [2, 3, 4, 5, 6].into_iter().collect();\\nlet bottom_2: HashSet = [4, 5, 6].into_iter().collect();\\n\\nlet intersection: HashSet<_> = top.intersection(&bottom).cloned().collect();\\nlet intersection: HashSet<_> = intersection.intersection(&top_2).cloned().collect();\\nlet intersection: HashSet<_> = intersection.intersection(&bottom_2).cloned().collect();\\nprintln!(\\"Intersection: {:?}\\", intersection);\\n```\\n\\n```\\nIntersection: {4}\\n```\\n\\n### Solution\\n\\nThe approach is pretty simple, if you omit the _1on1 with the compiler_. You just\\nhave some fun with the set operations :)\\n\\n## [Day 4: Camp Cleanup](https://adventofcode.com/2022/day/4)\\n\\n:::info tl;dr\\n\\nElves are cleaning up the camp and they got overlapping sections to clean up.\\nFind how many overlap and can take the day off.\\n\\n:::\\n\\n[`RangeInclusive`] is your friend not an enemy :)\\n\\n### Solution\\n\\nRelatively easy, you just need to parse the input and know what you want. Rust\'s\\n`RangeInclusive` type helped a lot, cause it took care of all abstractions.\\n\\n## [Day 5: Supply Stacks](https://adventofcode.com/2022/day/5)\\n\\n:::info tl;dr\\n\\nLet\'s play with stacks of crates.\\n\\n:::\\n\\nVery easy problem with very annoying input. You can judge yourself:\\n\\n```\\n [D]\\n[N] [C]\\n[Z] [M] [P]\\n 1 2 3\\n\\nmove 1 from 2 to 1\\nmove 3 from 1 to 3\\nmove 2 from 2 to 1\\nmove 1 from 1 to 2\\n```\\n\\nGood luck transforming that into something reasonable :)\\n\\n:::tip Fun fact\\n\\nTook me 40 minutes to parse this reasonably, including fighting the compiler.\\n\\n:::\\n\\n### Solution\\n\\nFor the initial solution I went with a manual solution (as in _I have done all_\\n_the work_. Later on I have decided to explore the `std` and interface of the\\n`std::vec::Vec` and found [`split_off`] which takes an index and splits (duh)\\nthe vector:\\n\\n```rust\\nlet mut vec = vec![1, 2, 3];\\nlet vec2 = vec.split_off(1);\\nassert_eq!(vec, [1]);\\nassert_eq!(vec2, [2, 3]);\\n```\\n\\nThis helped me simplify my solution a lot and also get rid of some _edge cases_.\\n\\n## [Day 6: Tuning Trouble](https://adventofcode.com/2022/day/6)\\n\\n:::info tl;dr\\n\\nFinding start of the message in a very weird protocol. Start of the message is\\ndenoted by $N$ unique consecutive characters.\\n\\n:::\\n\\n### Solution\\n\\nA lot of different approaches, knowing that we are dealing with input consisting\\nsolely of ASCII letters, I bit the bullet and went with sliding window and\\nconstructing sets from that window, checking if the set is as big as the window.\\n\\nOne possible optimization could consist of keeping a bit-vector (i.e. `usize`\\nvariable) of encountered characters and updating it as we go. However this has\\na different issue and that is removal of the characters from the left side of the\\nwindow. We don\'t know if the same character is not included later on.\\n\\nOther option is to do similar thing, but keeping the frequencies of the letters,\\nand again knowing we have only ASCII letters we can optimize by having a vector\\nof 26 elements that keeps count for each lowercase letter.\\n\\n## [Day 7: No Space Left On Device](https://adventofcode.com/2022/day/7)\\n\\n:::info tl;dr\\n\\nLet\'s simulate [`du`] to get some stats about our file system and then pinpoint\\ndirectories that take a lot of space and should be deleted.\\n\\n:::\\n\\n> I was waiting for this moment, and yet it got me!\\n> _imagine me swearing for hours_\\n\\n### Solution\\n\\nWe need to \u201c_build_\u201d a file system from the input that is given in a following form:\\n\\n```\\n$ cd /\\n$ ls\\ndir a\\n14848514 b.txt\\n8504156 c.dat\\ndir d\\n$ cd a\\n$ ls\\ndir e\\n29116 f\\n2557 g\\n62596 h.lst\\n$ cd e\\n$ ls\\n584 i\\n$ cd ..\\n$ cd ..\\n$ cd d\\n$ ls\\n4060174 j\\n8033020 d.log\\n5626152 d.ext\\n7214296 k\\n```\\n\\nThere are few ways in which you can achieve this and also you can assume some\\npreconditions, but why would we do that, right? :)\\n\\nYou can \u201cslap\u201d this in either [`HashMap`] or [`BTreeMap`] and call it a day.\\nAnd that would be boring\u2026\\n\\n:::tip\\n\\n`BTreeMap` is quite fitting for this, don\'t you think?\\n\\n:::\\n\\nI always wanted to try allocation on heap in Rust, so I chose to implement a tree.\\nI fought with the `Box` for some time and was losing\u2026\\n\\nThen I looked up some implementations of trees or linked lists and decided to try\\n`Rc>`. And I got my _ass whopped_ by the compiler once again. /o\\\\\\n\\n:::tip\\n\\n`Box` represents a dynamically allocated memory on heap. It is a single pointer,\\nyou can imagine this as `std::unique_ptr` in C++.\\n\\n`Rc` represents a dynamically allocated memory on heap. On top of that it is\\n_reference counted_ (that\'s what the `Rc` stands for). You can imagine this as\\n`std::shared_ptr` in C++.\\n\\nNow the fun stuff. Neither of them lets you **mutate** the contents of the memory.\\n\\n`Cell` allows you to mutate the memory. Can be used reasonably with types that\\ncan be copied, because the memory safety is guaranteed by copying the contents\\nwhen there is more than one **mutable** reference to the memory.\\n\\n`RefCell` is similar to the `Cell`, but the borrowing rules (how many mutable\\nreferences are present) are checked dynamically.\\n\\nSo in the end, if you want something like `std::shared_ptr` in Rust, you want\\nto have `Rc>`.\\n\\n:::\\n\\nSo, how are we going to represent the file system then? We will use an enumeration,\\nhehe, which is an algebraic data type that can store some stuff in itself :weary:\\n\\n```rust\\ntype FileHandle = Rc>;\\n\\n#[derive(Debug)]\\nenum AocFile {\\n File(usize),\\n Directory(BTreeMap),\\n}\\n```\\n\\nLet\'s go over it! `FileHandle` represents dynamically allocated `AocFile`, not\\nmuch to discuss. What does the `#[derive(Debug)]` do though? It lets us to print\\nout the value of that enumeration, it\'s derived, so it\'s not as good as if we had\\nimplemented it ourselves, but it\'s good enough for debugging, hence the name.\\n\\nNow to the fun part! `AocFile` value can be represented in two ways:\\n\\n- `File(usize)`, e.g. `AocFile::File(123)` and we can pattern match it, if we\\n need to\\n- `Directory(BTreeMap)` will represent the directory and will\\n contain map matching the name of the files (or directories) within to their\\n respective file handles\\n\\nI will omit the details about constructing this file system, cause there are a lot\\nof technicalities introduced by the nature of the input. However if you are\\ninterested, you can have a look at my solution.\\n\\nWe need to find small enough directories and also find the smallest directory that\\nwill free enough space. Now the question is, how could we do that. And there are\\nmultiple ways I will describe.\\n\\nI have chosen to implement [_tree catamorphism_] :weary:. It is basically a fold\\nover a tree data structure. We descent down into the leaves and propagate computed\\nresults all the way to the root. You can also notice that this approach is very\\nsimilar to _dynamic programming_, we find overlapping sections of the computation\\nand try to minimize the additional work (in this case: we need to know sizes of\\nour descendants, but we have already been there).\\n\\nAnother approach that has been suggested to me few days later is running DFS on\\nthe graph. And, funnily enough, we would still need to combine what we found in\\nthe branches where we descent. So in the end, it would work very similarly to my\\nsolution.\\n\\nOne of the more exotic options would be precomputing the required information at\\nthe same time as parsing. That could be done by adding additional fields to the\\nnodes which would allow storing such information and updating it as we construct\\nthe file system.\\n\\n## Post Mortem\\n\\nThings that have been brought up in the discussion later on.\\n\\n### `Rc` vs `Rc>`\\n\\nIt has been brought up that I have a contradicting statement regarding the\\ndynamically allocated memory. Specifically:\\n\\n- You can imagine `Rc` as an `std::shared_ptr` (in C++)\\n- When you want an equivalent of `std::shared_ptr`, you want to use\\n `Rc>`\\n\\nNow, in Rust it is a bit more complicated, because the type that represents the\\n\u201cshared pointer\u201d is `Rc`. What `RefCell` does is making sure that there is\\nonly one \u201cowner\u201d of a mutable reference at a time (and dynamically, as opposed\\nto the `Cell`).\\n\\nTherefore to be precise and correct about the equivalents of `std::shared_ptr`\\nin Rust, we can say that\\n\\n- `Rc` is an equivalent of a `const std::shared_ptr`,\\n- and `Rc>` is an equivalent of a `std::shared_ptr`.\\n\\nYou can easily see that they only differ in the mutability. (And even that is not\\nas simple as it seems, because there is also `Cell`)\\n\\n[_advent of code_]: https://adventofcode.com\\n[gitlab]: https://gitlab.com/mfocko/advent-of-code-2022\\n[`/src/bin/`]: https://gitlab.com/mfocko/advent-of-code-2022/-/tree/main/src/bin\\n[`sccache`]: https://github.com/mozilla/sccache\\n[`rangeinclusive`]: https://doc.rust-lang.org/std/ops/struct.RangeInclusive.html\\n[`split_off`]: https://doc.rust-lang.org/std/vec/struct.Vec.html#method.split_off\\n[`du`]: https://www.man7.org/linux/man-pages/man1/du.1.html\\n[`hashmap`]: https://doc.rust-lang.org/std/collections/struct.HashMap.html\\n[`btreemap`]: https://doc.rust-lang.org/std/collections/struct.BTreeMap.html\\n[_tree catamorphism_]: https://en.wikipedia.org/wiki/Catamorphism#Tree_fold"},{"id":"aoc-2022/intro","metadata":{"permalink":"/blog/aoc-2022/intro","editUrl":"https://github.com/mfocko/blog/tree/main/blog/aoc-2022/00-intro.md","source":"@site/blog/aoc-2022/00-intro.md","title":"Advent of Code \'22 in Rust","description":"Preparing for Advent of Code \'22.","date":"2022-12-14T21:45:00.000Z","formattedDate":"December 14, 2022","tags":[{"label":"advent-of-code","permalink":"/blog/tags/advent-of-code"},{"label":"advent-of-code-2022","permalink":"/blog/tags/advent-of-code-2022"},{"label":"rust","permalink":"/blog/tags/rust"}],"readingTime":8.665,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. @mf","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"Advent of Code \'22 in Rust","description":"Preparing for Advent of Code \'22.","date":"2022-12-14T21:45","slug":"aoc-2022/intro","authors":"mf","tags":["advent-of-code","advent-of-code-2022","rust"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"1st week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/1st-week"}},"content":"Let\'s talk about the preparations for this year\'s [_Advent of Code_].\\n\\n\x3c!--truncate--\x3e\\n\\n## Choosing a language\\n\\nWhen choosing a language for AoC, you usually want a language that gives you a\\nquick feedback which allows you to iterate quickly to the solution of the puzzle.\\nOne of the most common choices is Python, many people also use JavaScript or Ruby.\\n\\nGiven the competitive nature of the AoC and popularity among competitive programming,\\nC++ might be also a very good choice. Only if you are familiar with it, I guess\u2026\\n\\nIf you want a challenge, you might also choose to rotate the languages each day.\\nThough I prefer to use only one language.\\n\\nFor this year I have been deciding between _Rust_, _C++_ and _Pascal_ or _Ada_.\\n\\nI have tried Rust last year and have survived with it for 3 days and then gave\\nup and switched to _Kotlin_, which was pretty good given it is \u201cJava undercover\u201d.\\nI pretty much like the ideas behind Rust, I am not sure about the whole cult and\\nimplementation of those ideas though. After some years with C/C++, I would say\\nthat Rust feels _too safe_ for my taste and tries to \u201c_punish me_\u201d even for the\\nmost trivial things.\\n\\nC++ is a very robust, but also comes with a wide variety of options providing you\\nthe ability to shoot yourself in the leg. I have tried to solve few days of previous\\nAdvent of Code events, it was _relatively easy_ to solve the problems in C++, given\\nthat I do not admit writing my own iterator for `enumerate`\u2026\\n\\nPascal or Ada were meme choices :) Ada is heavily inspired by Pascal and has a\\npretty nice standard library that offers enough to be able to quickly solve some\\nproblems in it. However the toolkit is questionable :/\\n\\n## Choosing libraries\\n\\n## Preparations for Rust\\n\\nAll of the sources, later on including solutions, can be found at my\\n[GitLab].\\n\\n### Toolkit\\n\\nSince we are using Rust, we are going to use a [Cargo] and more than likely VSCode\\nwith [`rust-analyzer`]. Because of my choice of libraries, we will also introduce\\na `.envrc` file that can be used by [`direnv`], which allows you to set specific\\nenvironment variables when you enter a directory. In our case, we will use\\n\\n```bash\\n# to show nice backtrace when using the color-eyre\\nexport RUST_BACKTRACE=1\\n\\n# to catch logs generated by tracing\\nexport RUST_LOG=trace\\n```\\n\\nAnd for the one of the most obnoxious things ever, we will use a script to download\\nthe inputs instead of \u201c_clicking, opening and copying to a file_\u201d[^1]. There is\\nno need to be _fancy_, so we will adjust Python script by Martin[^2].\\n\\n```py\\n#!/usr/bin/env python3\\n\\nimport datetime\\nimport yaml\\nimport requests\\nimport sys\\n\\n\\ndef load_config():\\n with open(\\"env.yaml\\", \\"r\\") as f:\\n js = yaml.load(f, Loader=yaml.Loader)\\n return js[\\"session\\"], js[\\"year\\"]\\n\\n\\ndef get_input(session, year, day):\\n return requests.get(\\n f\\"https://adventofcode.com/{year}/day/{day}/input\\",\\n cookies={\\"session\\": session},\\n headers={\\n \\"User-Agent\\": \\"{repo} by {mail}\\".format(\\n repo=\\"gitlab.com/mfocko/advent-of-code-2022\\",\\n mail=\\"me@mfocko.xyz\\",\\n )\\n },\\n ).content.decode(\\"utf-8\\")\\n\\n\\ndef main():\\n day = datetime.datetime.now().day\\n if len(sys.argv) == 2:\\n day = sys.argv[1]\\n\\n session, year = load_config()\\n problem_input = get_input(session, year, day)\\n\\n with open(f\\"./inputs/day{day:>02}.txt\\", \\"w\\") as f:\\n f.write(problem_input)\\n\\n\\nif __name__ == \\"__main__\\":\\n main()\\n```\\n\\nIf the script is called without any arguments, it will deduce the day from the\\nsystem, so we do not need to change the day every morning. It also requires a\\nconfiguration file:\\n\\n```yaml\\n# env.yaml\\nsession: \u2039your session cookie\u203a\\nyear: 2022\\n```\\n\\n### Libraries\\n\\nLooking at the list of the libraries, I have chosen \u201ca lot\u201d of them. Let\'s walk\\nthrough each of them.\\n\\n[`tracing`] and [`tracing-subscriber`] are the crates that can be used for tracing\\nand logging of your Rust programs, there are also other crates that can help you\\nwith providing backtrace to the Sentry in case you have deployed your application\\nsomewhere and you want to watch over it. In our use case we will just utilize the\\nmacros for debugging in the terminal.\\n\\n[`thiserror`], [`anyhow`] and [`color-eyre`] are used for error reporting.\\n`thiserror` is a very good choice for libraries, cause it extends the `Error`\\nfrom the `std` and allows you to create more convenient error types. Next is\\n`anyhow` which kinda builds on top of the `thiserror` and provides you with simpler\\nerror handling in binaries[^3]. And finally we have `color-eyre` which, as I found\\nout later, is a colorful (_wink wink_) extension of `eyre` which is fork of `anyhow`\\nwhile supporting customized reports.\\n\\nIn the end I have decided to remove `thiserror` and `anyhow`, since first one is\\nsuitable for libraries and the latter was basically fully replaced by `{color-,}eyre`.\\n\\n[`regex`] and [`lazy_static`] are a very good and also, I hope, self-explanatory\\ncombination. `lazy_static` allows you to have static variables that must be initialized\\nduring runtime.\\n\\n[`itertools`] provides some nice extensions to the iterators from the `std`.\\n\\n### My own \u201clibrary\u201d\\n\\nWhen creating the crate for this year\'s Advent of Code, I have chosen a library\\ntype. Even though standard library is huge, some things might not be included and\\nalso we can follow _KISS_. I have 2 modules that my \u201clibrary\u201d exports, one for\\nparsing and one for 2D vector (that gets used quite often during Advent of Code).\\n\\nKey part is, of course, processing the input and my library exports following\\nfunctions that get used a lot:\\n\\n```rust\\n/// Reads file to the string.\\npub fn file_to_string>(pathname: P) -> String;\\n\\n/// Reads file and returns it as a vector of characters.\\npub fn file_to_chars>(pathname: P) -> Vec;\\n\\n/// Reads file and returns a vector of parsed structures. Expects each structure\\n/// on its own line in the file. And `T` needs to implement `FromStr` trait.\\npub fn file_to_structs, T: FromStr>(pathname: P) -> Vec\\nwhere\\n ::Err: Debug;\\n\\n/// Converts iterator over strings to a vector of parsed structures. `T` needs\\n/// to implement `FromStr` trait and its error must derive `Debug` trait.\\npub fn strings_to_structs(\\n iter: impl Iterator\\n) -> Vec\\nwhere\\n ::Err: std::fmt::Debug,\\n U: Deref;\\n\\n/// Reads file and returns it as a vector of its lines.\\npub fn file_to_lines>(pathname: P) -> Vec;\\n```\\n\\nAs for the vector, I went with a rather simple implementation that allows only\\naddition of the vectors for now and accessing the elements via functions `x()`\\nand `y()`. Also the vector is generic, so we can use it with any numeric type we\\nneed.\\n\\n### Skeleton\\n\\nWe can also prepare a template to quickly bootstrap each of the days. We know\\nthat each puzzle has 2 parts, which means that we can start with 2 functions that\\nwill solve them.\\n\\n```rust\\nfn part1(input: &Input) -> Output {\\n todo!()\\n}\\n\\nfn part2(input: &Input) -> Output {\\n todo!()\\n}\\n```\\n\\nBoth functions take reference to the input and return some output (in majority\\nof puzzles, it is the same type). `todo!()` can be used as a nice placeholder,\\nit also causes a panic when reached and we could also provide some string with\\nan explanation, e.g. `todo!(\\"part 1\\")`. We have not given functions a specific\\ntype and to avoid as much copy-paste as possible, we will introduce type aliases.\\n\\n```rust\\ntype Input = String;\\ntype Output = i32;\\n```\\n\\n:::tip\\n\\nThis allows us to quickly adjust the types only in one place without the need to\\ndo _regex-replace_ or replace them manually.\\n\\n:::\\n\\nFor each day we get a personalized input that is provided as a text file. Almost\\nall the time, we would like to get some structured type out of that input, and\\ntherefore it makes sense to introduce a new function that will provide the parsing\\nof the input.\\n\\n```rust\\nfn parse_input(path: &str) -> Input {\\n todo!()\\n}\\n```\\n\\nThis \u201cparser\u201d will take a path to the file, just in case we would like to run the\\nsample instead of input.\\n\\nOK, so now we can write a `main` function that will take all of the pieces and\\nrun them.\\n\\n```rust\\nfn main() {\\n let input = parse_input(\\"inputs/dayXX.txt\\");\\n\\n println!(\\"Part 1: {}\\", part_1(&input));\\n println!(\\"Part 2: {}\\", part_2(&input));\\n}\\n```\\n\\nThis would definitely do :) But we have installed a few libraries and we want to\\nuse them. In this part we are going to utilize _[`tracing`]_ (for tracing, duh\u2026)\\nand _[`color-eyre`]_ (for better error reporting, e.g. from parsing).\\n\\n```rust\\nfn main() -> Result<()> {\\n tracing_subscriber::fmt()\\n .with_env_filter(EnvFilter::from_default_env())\\n .with_target(false)\\n .with_file(true)\\n .with_line_number(true)\\n .without_time()\\n .compact()\\n .init();\\n color_eyre::install()?;\\n\\n let input = parse_input(\\"inputs/dayXX.txt\\");\\n\\n info!(\\"Part 1: {}\\", part_1(&input));\\n info!(\\"Part 2: {}\\", part_2(&input));\\n\\n Ok(())\\n}\\n```\\n\\nThe first statement will set up tracing and configure it to print out the logs to\\nterminal, based on the environment variable. We also change the formatting a bit,\\nsince we do not need all the _fancy_ features of the logger. Pure initialization\\nwould get us logs like this:\\n\\n```\\n2022-12-11T19:53:19.975343Z INFO day01: Part 1: 0\\n```\\n\\nHowever after running that command, we will get the following:\\n\\n```\\n INFO src/bin/day01.rs:35: Part 1: 0\\n```\\n\\nAnd the `color_eyre::install()?` is quite straightforward. We just initialize the\\nerror reporting by _color eyre_.\\n\\n:::caution\\n\\nNotice that we had to add `Ok(())` to the end of the function and adjust the\\nreturn type of the `main` to `Result<()>`. It is caused by the _color eyre_ that\\ncan be installed only once and therefore it can fail, that is how we got the `?`\\nat the end of the `::install` which _unwraps_ the **\xbbresult\xab** of the installation.\\n\\n:::\\n\\nOverall we will get to a template like this:\\n\\n```rust\\nuse aoc_2022::*;\\n\\nuse color_eyre::eyre::Result;\\nuse tracing::info;\\nuse tracing_subscriber::EnvFilter;\\n\\ntype Input = String;\\ntype Output = i32;\\n\\nfn parse_input(path: &str) -> Input {\\n todo!()\\n}\\n\\nfn part1(input: &Input) -> Output {\\n todo!()\\n}\\n\\nfn part2(input: &Input) -> Output {\\n todo!()\\n}\\n\\nfn main() -> Result<()> {\\n tracing_subscriber::fmt()\\n .with_env_filter(EnvFilter::from_default_env())\\n .with_target(false)\\n .with_file(true)\\n .with_line_number(true)\\n .without_time()\\n .compact()\\n .init();\\n color_eyre::install()?;\\n\\n let input = parse_input(\\"inputs/dayXX.txt\\");\\n\\n info!(\\"Part 1: {}\\", part_1(&input));\\n info!(\\"Part 2: {}\\", part_2(&input));\\n\\n Ok(())\\n}\\n```\\n\\n[^1]:\\n Copy-pasting might be a relaxing thing to do, but you can also discover\\n nasty stuff about your PC. See [this Reddit post and the comment].\\n\\n[^2]: [GitHub profile](https://github.com/martinjonas)\\n[^3]:\\n Even though you can use it even for libraries, but handling errors from\\n libraries using `anyhow` is nasty\u2026 You will be the stinky one ;)\\n\\n[_advent of code_]: https://adventofcode.com\\n[gitlab]: https://gitlab.com/mfocko/advent-of-code-2022\\n[cargo]: https://doc.rust-lang.org/cargo/\\n[`rust-analyzer`]: https://rust-analyzer.github.io/\\n[`direnv`]: https://direnv.net/\\n[`tracing`]: https://crates.io/crates/tracing\\n[`tracing-subscriber`]: https://crates.io/crates/tracing-subscriber\\n[`thiserror`]: https://crates.io/crates/thiserror\\n[`anyhow`]: https://crates.io/crates/anyhow\\n[`color-eyre`]: https://crates.io/crates/color-eyre\\n[`regex`]: https://crates.io/crates/regex\\n[`lazy_static`]: https://crates.io/crates/lazy_static\\n[`itertools`]: https://crates.io/crates/itertools\\n[this reddit post and the comment]: https://www.reddit.com/r/adventofcode/comments/zb98pn/comment/iyq0ono"}]}')}}]); \ No newline at end of file diff --git a/assets/js/4200b1a9.faadd2c9.js b/assets/js/4200b1a9.faadd2c9.js deleted file mode 100644 index 10dc5bd..0000000 --- a/assets/js/4200b1a9.faadd2c9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[866],{24612:e=>{e.exports=JSON.parse('{"blogPosts":[{"id":"/2023/08/02/copr","metadata":{"permalink":"/blog/2023/08/02/copr","editUrl":"https://github.com/mfocko/blog/tree/main/blog/2023-08-02-copr.md","source":"@site/blog/2023-08-02-copr.md","title":"How can Copr help with broken dependencies","description":"Copr comes to save you when maintainer doesn\'t care.","date":"2023-08-02T00:00:00.000Z","formattedDate":"August 2, 2023","tags":[{"label":"\ud83c\udfed","permalink":"/blog/tags/\ud83c\udfed"},{"label":"red-hat","permalink":"/blog/tags/red-hat"},{"label":"copr","permalink":"/blog/tags/copr"},{"label":"admin","permalink":"/blog/tags/admin"},{"label":"vps","permalink":"/blog/tags/vps"}],"readingTime":3.44,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. your opinionated admin","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"How can Copr help with broken dependencies","description":"Copr comes to save you when maintainer doesn\'t care.","date":"2023-08-02T00:00:00.000Z","authors":[{"key":"mf","title":"a.k.a. your opinionated admin"}],"tags":["\ud83c\udfed","red-hat","copr","admin","vps"]},"unlisted":false,"nextItem":{"title":"4th week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/4th-week"}},"content":"When you decide to run Fedora on your VPS, you might get screwed over by using\\nrandom repositories\u2026\\n\\n\x3c!--truncate--\x3e\\n\\nWhen I \u201creserved\u201d my VPS[^1] back in June \'20, I slapped Fedora on it without\\nthinking. I bet 99% of people would say that I\'m crazy for doing such thing[^2],\\n**BUT** I\'ve been using Fedora on my PCs for some time already and it felt very\\nstable and natural to just use, even for VPS.\\n\\nOne of the first things I\'ve done was setting up a mail server. You may guess\\nwhat\'s the fun part about having a mail server\u2026 Yes, it\'s all the spam you\\nreceive and only then you realize how much \u201ccrap\u201d gets filtered on free mail\\nservices. To battle this problem I chose to use\\n[rspamd](https://github.com/rspamd/rspamd) that had CentOS support, but someone\\nhad a [Copr](https://copr.fedorainfracloud.org/) repository that I used to\\ninstall it.\\n\\n## How does Copr repositories work?\\n\\nIf you have ever used Ubuntu, you might be familiar with the concept since it is\\nvery close to [PPAs](https://help.ubuntu.com/community/PPA).\\n\\ntl;dr of the whole process consists of\\n1. enabling the Copr repository, and\\n2. installing the desired package.\\n\\nSo in shell you would do\\n```\\n# dnf copr enable \u2039copr-repository\u203a\\n# dnf install \u2039package-from-the-repository\u203a\\n```\\n\\nAnd\u2026 that\'s it! Nothing else needed! Simple, right? And literally same process\\nas you would do for the PPA.\\n\\n:::tip AUR\\n\\nOn the other hand, if you are familiar with the archLinux, you definitely know\\nAUR and what it can do for you. Copr repository is pretty similar, but the\\npackages are prebuilt in Copr and Copr repositories can carry the required\\ndependencies for said packages, which simplifies the distribution, and can even\\nhelp with installing singular packages (when you just need the dependency, not\\neverything).\\n\\n:::\\n\\n## My issue\\n\\nNow you might wonder how would I use it on my VPS. It\'s rather simple, once in\\n6 months a new Fedora release comes out. And you need to upgrade to newer\\nrelease\u2026 You don\'t need to do it right away and for such setup it probably isn\'t\\neven recommended.\\n\\n:::tip\\n\\nFedora releases are supported for a year, i.e. they live 6 months till the next\\nrelease and then another 6 months till another release.\\n\\nSome people prefer to run one version \u201cbehind\u201d. If you ever decide to run it on\\nyour home server or in a similar setup, it might be a pretty good idea to\\nfollow. I\'m using the \u201clatest greatest\u201d, cause why not :smile:\\n\\nOne way or another, you still need to bump the release every six months, unless\\nyou\'d bump 2 releases at once every year, which would be a decision, since, at\\nleast I, cannot see any benefits in it\u2026 You don\'t go for \u201cstability\u201d, cause once\\na year you switch to the latest release and then, before you bump, you use one\\nyear old software, so you\'re not even using the latest.\\n\\n:::\\n\\nFast-forward 2 years in the future, new Fedora release came out (October \'22)\\nand I was doing an upgrade. Dependencies of the rspamd have been updated and\\nrspamd builds in Copr have failed and no one fixed it. Cool, so now I can\\nupgrade, but can either ignore the dependencies or uninstall the rspamd\u2026\\n\\n## How can Copr help?\\n\\nI have managed to find\\n[specfile](https://github.com/rspamd/rspamd/blob/master/rpm/rspamd.spec) for the\\nrspamd package that they use for CentOS. There were some files apart from the\\nspecfile, so I had to make an SRPM locally and then\u2026 I just uploaded the SRPM\\nto the Copr to\\n[build](https://copr.fedorainfracloud.org/coprs/mfocko/rspamd/build/5046567/)\\nan RPM.\\n\\nI have switched the previous Copr repository for rspamd with my own and happily\\nproceeded with the upgrade.\\n\\n## Conclusion\\n\\nCopr is heavily used for testing builds on the upstream with\\n[Packit](https://packit.dev). However, as you can see, it is possible to use it\\n**very well** for packaging your own stuff and avoiding issues (such as the one\\nI have described above), if need be.\\n\\n[^1]: [vpsFree.cz](https://vpsfree.cz)\\n[^2]: Even though I\'ve been running archLinux on some Raspberry Pi\'s and also\\n on one of my \u201chome servers\u201d, before getting the VPS. You could say I like\\n to live on the edge\u2026"},{"id":"aoc-2022/4th-week","metadata":{"permalink":"/blog/aoc-2022/4th-week","editUrl":"https://github.com/mfocko/blog/tree/main/blog/aoc-2022/04-week-4.md","source":"@site/blog/aoc-2022/04-week-4.md","title":"4th week of Advent of Code \'22 in Rust","description":"Surviving fourth week in Rust.","date":"2023-07-07T15:14:00.000Z","formattedDate":"July 7, 2023","tags":[{"label":"advent-of-code","permalink":"/blog/tags/advent-of-code"},{"label":"advent-of-code-2022","permalink":"/blog/tags/advent-of-code-2022"},{"label":"rust","permalink":"/blog/tags/rust"}],"readingTime":15.175,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. @mf","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"4th week of Advent of Code \'22 in Rust","description":"Surviving fourth week in Rust.","date":"2023-07-07T15:14","slug":"aoc-2022/4th-week","authors":"mf","tags":["advent-of-code","advent-of-code-2022","rust"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"How can Copr help with broken dependencies","permalink":"/blog/2023/08/02/copr"},"nextItem":{"title":"3rd week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/3rd-week"}},"content":"Let\'s go through the fourth week of [_Advent of Code_] in Rust.\\n\\n\x3c!--truncate--\x3e\\n\\n## [Day 22: Monkey Map](https://adventofcode.com/2022/day/22)\\n\\n:::info tl;dr\\n\\nSimulating a movement on a 2D map with given instructions. Map becomes a cube in\\nthe 2nd part\u2026\\n\\n:::\\n\\n:::caution Rant\\n\\nThis was the most obnoxious problem of this year\u2026 and a lot of Rust issues have\\nbeen hit.\\n\\n:::\\n\\n### Solution\\n\\nIt seems like a very simple problem to solve, but with very obnoxious changes in\\nthe 2nd part and also it\'s relatively hard to decompose \xbbproperly\xab.\\n\\n#### Column iterator\\n\\nIn the first part of the problem it was needed to know the boundaries of each\\nrow and column, since I stored them in `Vec>` and padded with spaces\\nto ensure I have a rectangular 2D \u201carray\u201d. However when you wanted to go through\\neach row and column to determine the boundaries, it was very easy to do for the\\nrows (cause each row is a `Vec` element), but not for the columns, since they\\nspan multiple rows.\\n\\nFor this use case I have implemented my own _column iterator_:\\n```rust\\npub struct ColumnIterator<\'a, T> {\\n map: &\'a [Vec],\\n column: usize,\\n\\n i: usize,\\n}\\n\\nimpl<\'a, T> ColumnIterator<\'a, T> {\\n pub fn new(map: &\'a [Vec], column: usize) -> ColumnIterator<\'a, T> {\\n Self { map, column, i: 0 }\\n }\\n}\\n\\nimpl<\'a, T> Iterator for ColumnIterator<\'a, T> {\\n type Item = &\'a T;\\n\\n fn next(&mut self) -> Option {\\n if self.i >= self.map.len() {\\n return None;\\n }\\n\\n self.i += 1;\\n Some(&self.map[self.i - 1][self.column])\\n }\\n}\\n```\\n\\nGiven this piece of an iterator, it is very easy to factor out the common\\nfunctionality between the rows and columns into:\\n```rust\\nlet mut find_boundaries = |constructor: fn(usize) -> Orientation,\\n iterator: &mut dyn Iterator,\\n upper_bound,\\n i| {\\n let mut first_non_empty = iterator.enumerate().skip_while(|&(_, &c)| c == \' \');\\n let start = first_non_empty.next().unwrap().0 as isize;\\n\\n let mut last_non_empty = first_non_empty.skip_while(|&(_, &c)| c != \' \');\\n let end = last_non_empty.next().unwrap_or((upper_bound, &\'_\')).0 as isize;\\n\\n boundaries.insert(constructor(i), start..end);\\n};\\n```\\n\\nAnd then use it as such:\\n```rust\\n// construct all horizontal boundaries\\n(0..map.len()).for_each(|row| {\\n find_boundaries(\\n Orientation::horizontal,\\n &mut map[row].iter(),\\n map[row].len(),\\n row,\\n );\\n});\\n\\n// construct all vertical boundaries\\n(0..map[0].len()).for_each(|col| {\\n find_boundaries(\\n Orientation::vertical,\\n &mut ColumnIterator::new(&map, col),\\n map.len(),\\n col,\\n );\\n});\\n```\\n\\n#### Walking around the map\\n\\nOnce the 2nd part got introduced, you start to think about a way how not to\\ncopy-paste a lot of stuff (I haven\'t avoided it anyways\u2026). In this problem, I\'ve\\nchosen to introduce a trait (i.e. _interface_) for 2D and 3D walker.\\n```rust\\ntrait Wrap: Clone {\\n type State;\\n\\n // simulation\\n fn is_blocked(&self) -> bool;\\n fn step(&mut self, steps: isize);\\n fn turn_left(&mut self);\\n fn turn_right(&mut self);\\n\\n // movement\\n fn next(&self) -> (Self::State, Direction);\\n\\n // final answer\\n fn answer(&self) -> Output;\\n}\\n```\\n\\nEach walker maintains its own state and also provides the functions that are\\nused during the simulation. The \u201cpromised\u201d methods are separated into:\\n* _simulation_-related: that are used during the simulation from the `.fold()`\\n* _movement_-related: just a one method that holds most of the logic differences\\n between 2D and 3D\\n* _final answer_: which extracts the _proof of solution_ from the\\n implementation-specific walker\\n\\nBoth 2D and 3D versions borrow the original input and therefore you must\\nannotate the lifetime of it:\\n```rust\\nstruct Wrap2D<\'a> {\\n input: &\'a Input,\\n position: Position,\\n direction: Direction,\\n}\\nimpl<\'a> Wrap2D<\'a> {\\n fn new(input: &\'a Input) -> Wrap2D<\'a> {\\n// \u2026\\n```\\n\\n#### Problems\\n\\nI have used a lot of closures for this problem and once I introduced a parameter\\nthat was of unknown type (apart from the fact it implements a specific trait), I\\ngot suggested a \u201cfix\u201d for the compilation error that resulted in something that\\nwas not possible to parse, cause it, more than likely, violated the grammar.\\n\\nIn a similar fashion, I have been suggested changes that led to a code that\\ndidn\'t make sense by just looking at it (there was no need to try the changes),\\nfor example one suggested change in the closure parameter caused disapperance of\\nthe parameter name. :smile:\\n\\n#### Clippy\\n\\nI have to admit that Clippy was rather helpful here, I\'ll include two examples\\nof rather smart suggestions.\\n\\nWhen writing the parsing for this problem, the first thing I have spotted on the\\n`char` was the `.is_digit()` function that takes a radix as a parameter. Clippy\\nnoticed that I use `radix = 10` and suggested switching to `.is_ascii_digit()`\\nthat does exactly the same thing:\\n```diff\\n- .take_while(|c| c.is_digit(10))\\n+ .take_while(|c| c.is_ascii_digit())\\n```\\n\\nAnother useful suggestion appeared when working with the iterators and I wanted\\nto get the $n$-th element from it. You know the `.skip()`, you know the\\n`.next()`, just \u201cslap\u201d them together and we\'re done for :grin: Well, I got\\nsuggested to use `.nth()` that does exactly the combination of the two mentioned\\nmethods on iterators:\\n```diff\\n- match it.clone().skip(skip).next().unwrap() {\\n+ match it.clone().nth(skip).unwrap() {\\n```\\n\\n## [Day 23: Unstable Diffusion](https://adventofcode.com/2022/day/23)\\n\\n:::info tl;dr\\n\\nSimulating movement of elves around with a set of specific rules.\\n\\n:::\\n\\n### Solution\\n\\nThere\'s not much to mention since it\'s just a cellular automaton simulation\\n(even though the AoC rules for cellular automatons usually get out of hand\\n:wink:).\\n\\nAlthough I had a need to determine boundaries of the elves\' positions and ended\\nup with a nasty DRY violation. Knowing that you you\'re looking for maximum and\\nminimum that are, of course, exactly the same except for initial values and\\ncomparators, it looks like a rather simple fix, but typing in Rust is something\\nelse, right? In the end I settled for a function that computes both boundaries\\nwithout any duplication while using a closure:\\n```rust\\nfn get_bounds(positions: &Input) -> (Vector2D, Vector2D) {\\n let f = |init, cmp: &dyn Fn(isize, isize) -> isize| {\\n positions\\n .iter()\\n .fold(Vector2D::new(init, init), |acc, elf| {\\n Vector2D::new(cmp(acc.x(), elf.x()), cmp(acc.y(), elf.y()))\\n })\\n };\\n\\n (f(isize::MAX, &min::), f(isize::MIN, &max::))\\n}\\n```\\n\\nThis function returns a pair of 2D vectors that represent opposite points of the\\nbounding rectangle of all elves.\\n\\nYou might ask why would we need a closure and the answer is that `positions`\\ncannot be captured from within the nested function, only via closure. One more\\nfun fact on top of that is the type of the comparator\\n```rust\\n&dyn Fn(isize, isize) -> isize\\n```\\nOnce we remove the `dyn` keyword, compiler yells at us and also includes a way\\nhow to get a more thorough explanation of the error by running\\n\\n $ rustc --explain E0782\\n\\nwhich shows us\\n\\n Trait objects must include the `dyn` keyword.\\n \\n Erroneous code example:\\n \\n ```\\n trait Foo {}\\n fn test(arg: Box) {} // error!\\n ```\\n \\n Trait objects are a way to call methods on types that are not known until\\n runtime but conform to some trait.\\n \\n Trait objects should be formed with `Box`, but in the code above\\n `dyn` is left off.\\n \\n This makes it harder to see that `arg` is a trait object and not a\\n simply a heap allocated type called `Foo`.\\n \\n To fix this issue, add `dyn` before the trait name.\\n \\n ```\\n trait Foo {}\\n fn test(arg: Box) {} // ok!\\n ```\\n \\n This used to be allowed before edition 2021, but is now an error.\\n\\n:::danger Rant\\n\\nNot all of the explanations are helpful though, in some cases they might be even\\nmore confusing than helpful, since they address _very simple_ use cases.\\n\\nAs you can see, even in this case there are two sides to the explanations:\\n* it explains why you need to use `dyn`, but\\n* it still mentions that trait objects need to be heap-allocated via `Box`\\n that, as you can see in my snippet, **does not** apply here :smile: IMO it\'s\\n caused by the fact that we are borrowing it and therefore we don\'t need to\\n care about the size or whereabouts of it.\\n\\n:::\\n\\n:::info C++ parallel\\n\\nIf you dive into the explanation above, you can notice that the `Box`\\npattern is very helpful for using types that are not known during compile-time.\\nYou would use a very similar approach in C++ when parsing some data structure\\nfrom input (let\'s say JSON for example).\\n\\nOn the other hand, in this case, it doesn\'t really make much sense, cause you\\ncan clearly see that the types **are known** during the compile-time, which in\\nC++ could be easily resolved by templating the helper function.\\n\\n:::\\n\\n## [Day 24: Blizzard Basin](https://adventofcode.com/2022/day/24)\\n\\n:::info tl;dr\\n\\nNavigating your way through a basin with series of blizzards that move around\\nyou as you move.\\n\\n:::\\n\\n:::caution\\n\\nIt\'s second to last day and I went \u201c_bonkers_\u201d on the Rust :smile: Proceed to\\nread _Solution_ part on your own risk.\\n\\n:::\\n\\n### Solution\\n\\nYou are given a map with blizzards all over the place and you\'re supposed to\\nfind the minimum time it requires you to walk through the basin without getting\\nin any of the blizzards.\\n\\n#### Breakdown\\n\\nRelatively simple, yet a bit annoying, approach can be taken. It\'s technically\\na shortest-path algorithm implementation with some relaxation restrictions and\\nbeing able to stay on one position for some time, so each _vertex_ of the graph\\nis determined by the position on the map and the _timestamp_. I have chosen to\\nuse `Vector3D`, since `x` and `y` attributes can be used for the position\\nand, well, let\'s use `z` for a timestamp, cause why not, right? :wink:\\n\\n#### Evaluating the blizzards\\n\\n:::caution\\n\\nI think that this is the most perverted abuse of the traits in the whole 4 weeks\\nof AoC in Rust\u2026\\n\\n:::\\n\\nThe blizzards move along their respective directions in time and loop around in\\ntheir respective row/column. Each vertex holds position **and** time, so we can\\n_just_ index the basin with the vertex itself, right? Yes, we can :smiling_imp:\\n\\n:::tip Fun fact\\n\\nWhile writing this part, I\'ve recognized unnecessary verbosity in the code and\\ncleaned it up a bit. The changed version is shown here and the original was just\\nmore verbose.\\n\\n:::\\n\\nI\'ll skip the boring parts of checking bounds and entry/exit of the basin :wink:\\nWe can easily calculate positions of the blizzards using a modular arithmetics:\\n```rust\\nimpl Index for Basin {\\n type Output = char;\\n\\n fn index(&self, index: Position) -> &Self::Output {\\n // \u2039skipped boring parts\u203a\\n\\n // We need to account for the loops of the blizzards\\n let width = self.cols - 2;\\n let height = self.rows - 2;\\n\\n let blizzard_origin = |size, d, t, i| ((i - 1 + size + d * (t % size)) % size + 1) as usize;\\n [\\n (\\n index.y() as usize,\\n blizzard_origin(width, -1, index.z(), index.x()),\\n \'>\',\\n ),\\n (\\n index.y() as usize,\\n blizzard_origin(width, 1, index.z(), index.x()),\\n \'<\',\\n ),\\n (\\n blizzard_origin(height, -1, index.z(), index.y()),\\n index.x() as usize,\\n \'v\',\\n ),\\n (\\n blizzard_origin(height, 1, index.z(), index.y()),\\n index.x() as usize,\\n \'^\',\\n ),\\n ]\\n .iter()\\n .find_map(|&(y, x, direction)| {\\n if self.map[y][x] == direction {\\n Some(&self.map[y][x])\\n } else {\\n None\\n }\\n })\\n .unwrap_or(&\'.\')\\n }\\n}\\n```\\n\\nAs you can see, there is an expression for calculating the original position and\\nit\'s used multiple times, so why not take it out to a lambda, right? :wink:\\n\\nI couldn\'t get the `rustfmt` to format the `for`-loop nicely, so I\'ve just\\ndecided to go with iterating over an elements of a slice. I have used, once\\nagain, a combination of two functions (`find_map` in this case) to do 2 things\\nat once and at the end, if we haven\'t found any blizzard, we just return the\\nempty space.\\n\\nI think it\'s a very _nice_ (and naughty) way how to use the `Index` trait, don\'t\\nyou think?\\n\\n#### Shortest-path algorithm\\n\\nFor the shortest path you can choose and adjust any of the common shortest-path\\nalgorithms, in my case, I have decided to use [_A\\\\*_] instead of Dijkstra\'s\\nalgorithm, since it better reflects the _cost_ function.\\n\\n:::info Comparison of costs\\n\\nWith the Dijkstra\'s algorithm I would proceed with the `time` attribute used as\\na priority for the queue.\\n\\nWhereas with the _A\\\\*_, I have chosen to use both time and Manhattan distance\\nthat promotes vertices closer to the exit **and** with a minimum time taken.\\n\\n:::\\n\\nCost function is, of course, a closure :wink:\\n```rust\\nlet cost = |p: Position| p.z() as usize + exit.y().abs_diff(p.y()) + exit.x().abs_diff(p.x());\\n```\\n\\nAnd also for checking the possible moves from the current vertex, I have\\nimplemented, yet another, closure that yields an iterator with the next moves:\\n```rust\\nlet next_positions = |p| {\\n [(0, 0, 1), (0, -1, 1), (0, 1, 1), (-1, 0, 1), (1, 0, 1)]\\n .iter()\\n .filter_map(move |&(x, y, t)| {\\n let next_p = p + Vector3D::new(x, y, t);\\n\\n if basin[next_p] == \'.\' {\\n Some(next_p)\\n } else {\\n None\\n }\\n })\\n};\\n```\\n\\n#### Min-heap\\n\\nIn this case I had a need to use the priority queue taking the elements with the\\nlowest cost as the prioritized ones. Rust only offers you the [`BinaryHeap`] and\\nthat is a max-heap. One of the ways how to achieve a min-heap is to put the\\nelements in wrapped in a [`Reverse`] (as is even showed in the linked [docs of\\nthe `BinaryHeap`]). However the wrapping affects the type of the heap and also\\npopping the most prioritized elements yields values wrapped in the `Reverse`.\\n\\nFor this purpose I have just taken the max-heap and wrapped it as a whole in a\\nseparate structure providing just the desired methods:\\n```rust\\nuse std::cmp::{Ord, Reverse};\\nuse std::collections::BinaryHeap;\\n\\npub struct MinHeap {\\n heap: BinaryHeap>,\\n}\\n\\nimpl MinHeap {\\n pub fn new() -> MinHeap {\\n MinHeap {\\n heap: BinaryHeap::new(),\\n }\\n }\\n\\n pub fn push(&mut self, item: T) {\\n self.heap.push(Reverse(item))\\n }\\n\\n pub fn pop(&mut self) -> Option {\\n self.heap.pop().map(|Reverse(x)| x)\\n }\\n}\\n\\nimpl Default for MinHeap {\\n fn default() -> Self {\\n Self::new()\\n }\\n}\\n```\\n\\nRest is just the algorithm implementation which is not that interesting.\\n\\n## [Day 25: Full of Hot Air](https://adventofcode.com/2022/day/25)\\n\\n:::info tl;dr\\n\\nPlaying around with a numbers in a _special_ base.\\n\\n:::\\n\\nGetting flashbacks to the _IB111 Foundations of Programming_\u2026 Very nice \u201cproblem\u201d\\nwith a rather easy solution, as the last day always seems to be.\\n\\n### Solution\\n\\nImplementing 2 functions, converting from the _SNAFU base_ and back to the _SNAFU_\\n_base_ representation. Let\'s do a bit more though! I have implemented two functions:\\n* `from_snafu`\\n* `to_snafu`\\n\\nNow it is apparent that all I do is number to string and string to number. Hmm\u2026\\nthat sounds familiar, doesn\'t it? Let\'s introduce a structure for the SNAFU numbers\\nand implement the traits that we need.\\n\\nLet\'s start with a structure:\\n```rust\\n#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]\\nstruct SNAFU {\\n value: i64,\\n}\\n```\\n\\n#### Converting from `&str`\\n\\nWe will start by implementing the `FromStr` trait that will help us parse our input.\\nThis is rather simple, I can just take the `from_snafu` function, copy-paste it\\ninto the `from_str` method and the number I get will be wrapped in `Result` and\\n`SNAFU` structure.\\n\\n#### Converting to `String`\\n\\nThis is more fun. In some cases you need to implement only one trait and others\\nare automatically implemented using that one trait. In our case, if you look in\\nthe documentation, you can see that `ToString` trait is automatically implemented\\nfor any type that implements `Display` trait.\\n\\nLet\'s implement the `Display` trait then. We should be able to use the `to_snafu`\\nfunction and just take the `self.value` from the `SNAFU` structure.\\n\\nAnd for the convenience of tests, we can also implement a rather simple `From`\\ntrait for the `SNAFU`.\\n\\n#### Adjusting the code\\n\\nAfter those changes we need to adjust the code and tests.\\n\\nParsing of the input is very easy, before we have used the lines, now we parse\\neverything:\\n```diff\\n fn parse_input>(pathname: P) -> Input {\\n- file_to_lines(pathname)\\n+ file_to_structs(pathname)\\n }\\n```\\n\\nPart 1 needs to be adjusted a bit too:\\n```diff\\n fn part_1(input: &Input) -> Output {\\n- to_snafu(input.iter().map(|s| from_snafu(s)).sum())\\n+ SNAFU::from(input.iter().map(|s| s.value).sum::()).to_string()\\n }\\n```\\n\\nYou can also see that it simplifies the meaning a bit and it is more explicit than\\nthe previous versions.\\n\\nAnd for the tests:\\n```diff\\n #[test]\\n fn test_from() {\\n- for (n, s) in EXAMPLES.iter() {\\n- assert_eq!(from_snafu(s), *n);\\n+ for (&n, s) in EXAMPLES.iter() {\\n+ assert_eq!(s.parse::().unwrap().value, n);\\n }\\n }\\n \\n #[test]\\n fn test_to() {\\n- for (n, s) in EXAMPLES.iter() {\\n- assert_eq!(to_snafu(*n), s.to_string());\\n+ for (&n, s) in EXAMPLES.iter() {\\n+ assert_eq!(SNAFU::from(n).to_string(), s.to_string());\\n }\\n```\\n\\n## Summary\\n\\nLet\'s wrap the whole thing up! Keeping in mind both AoC and the Rust\u2026\\n\\n![Finished advent calendar :smile:](/img/blog/aoc-2022/04-week-4/calendar.png)\\n\\n### Advent of Code\\n\\nThis year was quite fun, even though most of the solutions and posts came in\\nlater on (*cough* in \'23 *cough*). Day 22 was the most obnoxious one\u2026 And also\\nit feels like I used priority queues and tree data structures **a lot** :eyes:\\n\\n### with Rust\\n\\nI must admit that a lot of compiler warnings and errors were very useful. Even\\nthough I still found some instances where they didn\'t help at all or cause even\\nworse issues than I had. Compilation times have been addressed with the caching.\\n\\nBuilding my first tree data structure in Rust has been a very \u201cinteresting\u201d\\njourney. Being able to write a more generic BFS algorithm that allows you to not\\nduplicate code while still mantaining the desired functionality contributes to\\na very readable code.\\n\\nI am definitely much more aware of the basic things that bloated Python is\\nmissing, yet Rust has them\u2026\\n\\nUsing explicit types and writing down placeholder functions with `todo!()`\\nmacros is very pleasant, since it allows you to easily navigate the type system\\nduring the development when you don\'t even need to be sure how are you going to\\nput the smaller pieces together.\\n\\nI have used a plethora of traits and also implemented some of them to either be\\nidiomatic, or exploit the syntactic sugar they offer. Deriving the default trait\\nimplementation is also very helpful in a lot of cases, e.g. debugging output,\\ncopying, equality comparison, etc.\\n\\nI confess to touching more \u201ccursed\u201d parts of the Rust, such as macros to\\ndeclutter the copy-paste for tests or writing my own structures that need to\\ncarry a lifetime for their own fields.\\n\\ntl;dr Relatively pleasant language until you hit brick wall :wink:\\n\\n---\\n\\nSee you next year! Maybe in Rust, maybe not :upside_down_face:\\n\\n[_Advent of Code_]: https://adventofcode.com\\n[_A\\\\*_]: https://en.wikipedia.org/wiki/A*_search_algorithm\\n[`BinaryHeap`]: https://doc.rust-lang.org/std/collections/struct.BinaryHeap.html\\n[`Reverse`]: https://doc.rust-lang.org/std/cmp/struct.Reverse.html\\n[docs of the `BinaryHeap`]: https://doc.rust-lang.org/std/collections/struct.BinaryHeap.html#min-heap"},{"id":"aoc-2022/3rd-week","metadata":{"permalink":"/blog/aoc-2022/3rd-week","editUrl":"https://github.com/mfocko/blog/tree/main/blog/aoc-2022/03-week-3.md","source":"@site/blog/aoc-2022/03-week-3.md","title":"3rd week of Advent of Code \'22 in Rust","description":"Surviving third week in Rust.","date":"2023-07-06T21:00:00.000Z","formattedDate":"July 6, 2023","tags":[{"label":"advent-of-code","permalink":"/blog/tags/advent-of-code"},{"label":"advent-of-code-2022","permalink":"/blog/tags/advent-of-code-2022"},{"label":"rust","permalink":"/blog/tags/rust"}],"readingTime":11.565,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. @mf","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"3rd week of Advent of Code \'22 in Rust","description":"Surviving third week in Rust.","date":"2023-07-06T21:00","slug":"aoc-2022/3rd-week","authors":"mf","tags":["advent-of-code","advent-of-code-2022","rust"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"4th week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/4th-week"},"nextItem":{"title":"Sort the matrix diagonally","permalink":"/blog/leetcode/sort-diagonally"}},"content":"Let\'s go through the third week of [_Advent of Code_] in Rust.\\n\\n\x3c!--truncate--\x3e\\n\\n## [Day 15: Beacon Exclusion Zone](https://adventofcode.com/2022/day/15)\\n\\n:::info tl;dr\\n\\nTriangulating a distress beacon based on the information from the sensors.\\n\\n:::\\n\\n### Solution\\n\\nRelatively easy thing to implement, no major Rust issues hit.\\n\\n## [Day 16: Proboscidea Volcanium](https://adventofcode.com/2022/day/16)\\n\\n:::info tl;dr\\n\\nFinding a max flow in a graph given some time constraints.\\n\\n:::\\n\\n### Solution\\n\\nI have used some interesting things to implement this and make it easier for me.\\n\\n#### Indexing in graph\\n\\nI have come across a situation where I needed to keep more information regarding\\nthe graph\u2026 In that case you can, of course, create a structure and keep it in,\\nbut once you have multiple members in the structure it gets harder to work with\\nsince you need to address the fields in the structure. When you work with graph,\\nyou frequently need to access the vertices and in this case it felt a lot easier\\nto implement the indexing in a graph, rather than explicitly access the\\nunderlying data structure.\\n\\nHere you can see a rather short snippet from the solution that allows you to\\n\u201cindex\u201d the graph:\\n```rust\\nimpl Index<&str> for Graph {\\n type Output = Vertex;\\n\\n fn index(&self, index: &str) -> &Self::Output {\\n &self.g[index]\\n }\\n}\\n```\\n\\n#### Cartesian product\\n\\nDuring the implementation I had to utilize Floyd-Warshall algorithm for finding\\nthe shortest path between pairs of vertices and utilized the `iproduct!` macro\\nfrom the [`itertools`]. It is a very useful higher-order function that allows\\nyou to keep the nesting of the loops at a minimum level while still maintaining\\nthe same functionality.\\n\\n#### \u201cImplementing\u201d an iterator\\n\\nFor the second part, you get to split the work between 2 actors. That way you\\ncan achieve higher efficiency of the whole process that you\'re planning, but it\\nalso makes it harder to evaluate algorithmically, since you need to check the\\ndifferent ways the work can be split.\\n\\nBeing affected by _functional programming brain damage_:tm:, I have chosen to\\ndo this part by function that returns an iterator over the possible ways:\\n```rust\\nfn pairings(\\n valves: &BTreeSet,\\n) -> impl Iterator, BTreeSet)> + \'_ {\\n let mapping = valves.iter().collect_vec();\\n\\n let max_mask = 1 << (valves.len() - 1);\\n\\n (0..max_mask).map(move |mask| {\\n let mut elephant = BTreeSet::new();\\n let mut human = BTreeSet::new();\\n\\n for (i, &v) in mapping.iter().enumerate() {\\n if (mask & (1 << i)) == 0 {\\n human.insert(v.clone());\\n } else {\\n elephant.insert(v.clone());\\n }\\n }\\n\\n (human, elephant)\\n })\\n}\\n```\\n\\n## [Day 17: Pyroclastic Flow](https://adventofcode.com/2022/day/17)\\n\\n:::info tl;dr\\n\\nSimulating an autonomous Tetris where pieces get affected by a series of jets of\\nhot gas.\\n\\n:::\\n\\n### Solution\\n\\nSimilarly to the previous day I have created some iterators :smile:\\n\\n#### Collision detection\\n\\nOnce you need to check for collisions it is very helpful to be able to just\\niterate through the positions that can actually collide with the wall or other\\npiece.\\n\\nTo get the desired behaviour, you can just compose few smaller functions:\\n```rust\\nfn occupied(shape: &[Vec]) -> impl Iterator + \'_ {\\n shape.iter().enumerate().flat_map(|(y, row)| {\\n row.iter().enumerate().filter_map(move |(x, c)| {\\n if c == &\'#\' {\\n Some(Vector2D::new(x as isize, y as isize))\\n } else {\\n None\\n }\\n })\\n })\\n}\\n```\\n\\nIn the end, we get relative positions which we can adjust later when given the\\nspecific positions from iterator. You can see some interesting parts in this:\\n\\n* `.enumerate()` allows us to get both the indices (coordinates) and the line\\n or, later on, the character itself,\\n* `.flat_map()` flattens the iterator, i.e. when we return another iterator,\\n they just get chained instead of iterating over iterators (which sounds pretty\\n disturbing, doesn\'t it?),\\n* and finally `.filter_map()` which is pretty similar to the \u201cbasic\u201d `.map()`\\n with a one, key, difference that it expects the items of an iterator to be\\n mapped to an `Option` from which it ignores nothing (as in `None` :wink:)\\n and also unwraps the values from `Some(\u2026)`.\\n\\n#### Infinite iterator\\n\\nIn the solution we cycle through both Tetris-like shapes that fall down and the\\njets that move our pieces around. Initially I have implemented my own infinite\\niterator that just yields the indices. It is a very simple, yet powerful, piece\\nof code:\\n```rust\\nstruct InfiniteIndex {\\n size: usize,\\n i: usize,\\n}\\n\\nimpl InfiniteIndex {\\n fn new(size: usize) -> InfiniteIndex {\\n InfiniteIndex { size, i: size - 1 }\\n }\\n}\\n\\nimpl Iterator for InfiniteIndex {\\n type Item = usize;\\n\\n fn next(&mut self) -> Option {\\n self.i = (self.i + 1) % self.size;\\n Some(self.i)\\n }\\n}\\n```\\n\\nHowever when I\'m looking at the code now, it doesn\'t really make much sense\u2026\\nGuess what, we can use a built-in function that is implemented on iterators for\\nthat! The function is called `.cycle()`\\n\\nOn the other hand, I am not going to switch to that function, since it would\\nintroduce an another myriad of issues caused by the fact that I create iterators\\nright away in the constructor of my structure and the iterators would borrow\\nboth the jets and shapes which would introduce a lifetime dependency into the\\nstructure.\\n\\n## [Day 18: Boiling Boulders](https://adventofcode.com/2022/day/18) \\n\\n:::info tl;dr\\n\\nLet\'s compute a surface area of some obsidian approximated via coordinates of\\ncubes.\\n\\n:::\\n\\n### Solution\\n\\nThis day is kinda interesting, because it shows how easily you can complicate the\\nproblem and also how much can you screw yourself over with the optimization and\\n\u201csmart\u201d approach.\\n\\nFor the first part you need to find the surface area of an obsidian that is\\napproximated by cubes. Now, that is a very easy thing to do, just keep the track\\nof already added cubes, and check if the newly added cube touches any face of any\\nother cube. Simple, and with a `BTreeSet` relatively efficient way to do it.\\n\\nHowever the second part lets you on a secret that there may be some surface area\\nfrom the \u201cinside\u201d too and you want to know only the one from the outside of the\\nobsidian. I have seen some solutions later, but if you check your data, you might\\nnotice that the bounding box of all the cubes isn\'t that big at all. Therefore I\\nchose to pre-construct the box beforehand, fill in the cubes and then just run a\\nBFS turning all the lava on the outside into the air. Now you just need to check\\ncubes and count how many of their faces touch the air.\\n\\n## [Day 19: Not Enough Minerals](https://adventofcode.com/2022/day/19)\\n\\n:::info tl;dr\\n\\nFinding out the best strategy for building robots to collect geodes.\\n\\n:::\\n\\n### Solution\\n\\nNot much interesting stuff to mention apart from the suggestion to never believe\\nthat the default implementation given by `derive` macro is what you want, it\\ndoesn\'t have to be. :smile:\\n\\n## [Day 20: Grove Positioning System](https://adventofcode.com/2022/day/20)\\n\\n:::info tl;dr\\n\\nShuffling around the _circular linked list_ to find the coordinates.\\n\\n:::\\n\\nNow, small rant for this day is in place. They\'ve never mentioned that coordinates\\ncan repeat and therefore the values are non-unique. This is something that did\\nnot happen in the given sample, but was present in the user input. It took \xbba lot\xab\\nto realize that this is the issue.\\n\\n### Solution\\n\\nI have tried implementing a circular linked list for this\u2026 and I have failed\\nmiserably. To be fair, I still have no clue why. It was \u201cfun\u201d to play around with\\nthe `Rc>`. In the end I failed on _wrong answer_. I have also encountered\\na rather interesting issue with `.borrow_mut()` method being used on `Rc>`.\\n\\n#### `.borrow_mut()`\\n\\nConsider the following snippet of the code (taken from the documentation):\\n```rust\\nuse std::cell::{RefCell, RefMut};\\nuse std::collections::HashMap;\\nuse std::rc::Rc;\\n// use std::borrow::BorrowMut;\\n\\nfn main() {\\n let shared_map: Rc> = Rc::new(RefCell::new(HashMap::new()));\\n // Create a new block to limit the scope of the dynamic borrow\\n {\\n let mut map: RefMut<_> = shared_map.borrow_mut();\\n map.insert(\\"africa\\", 92388);\\n map.insert(\\"kyoto\\", 11837);\\n map.insert(\\"piccadilly\\", 11826);\\n map.insert(\\"marbles\\", 38);\\n }\\n\\n // Note that if we had not let the previous borrow of the cache fall out\\n // of scope then the subsequent borrow would cause a dynamic thread panic.\\n // This is the major hazard of using `RefCell`.\\n let total: i32 = shared_map.borrow().values().sum();\\n println!(\\"{total}\\");\\n}\\n```\\n\\nWe allocate a hash map on the heap and then in the inner block, we borrow it as\\na mutable reference, so that we can use it.\\n\\n:::note\\n\\nIt is a very primitive example for `Rc>` and mutable borrow.\\n\\n:::\\n\\nIf you uncomment the 4th line with `use std::borrow::BorrowMut;`, you cannot\\ncompile the code anymore, because of\\n```\\n Compiling playground v0.0.1 (/playground)\\nerror[E0308]: mismatched types\\n --\x3e src/main.rs:10:34\\n |\\n10 | let mut map: RefMut<_> = shared_map.borrow_mut();\\n | --------- ^^^^^^^^^^^^^^^^^^^^^^^ expected struct `RefMut`, found mutable reference\\n | |\\n | expected due to this\\n |\\n = note: expected struct `RefMut<\'_, _>`\\n found mutable reference `&mut Rc>>`\\n\\nerror[E0599]: no method named `insert` found for struct `RefMut<\'_, _>` in the current scope\\n --\x3e src/main.rs:11:13\\n |\\n11 | map.insert(\\"africa\\", 92388);\\n | ^^^^^^ method not found in `RefMut<\'_, _>`\\n\\nerror[E0599]: no method named `insert` found for struct `RefMut<\'_, _>` in the current scope\\n --\x3e src/main.rs:12:13\\n |\\n12 | map.insert(\\"kyoto\\", 11837);\\n | ^^^^^^ method not found in `RefMut<\'_, _>`\\n\\nerror[E0599]: no method named `insert` found for struct `RefMut<\'_, _>` in the current scope\\n --\x3e src/main.rs:13:13\\n |\\n13 | map.insert(\\"piccadilly\\", 11826);\\n | ^^^^^^ method not found in `RefMut<\'_, _>`\\n\\nerror[E0599]: no method named `insert` found for struct `RefMut<\'_, _>` in the current scope\\n --\x3e src/main.rs:14:13\\n |\\n14 | map.insert(\\"marbles\\", 38);\\n | ^^^^^^ method not found in `RefMut<\'_, _>`\\n\\nSome errors have detailed explanations: E0308, E0599.\\nFor more information about an error, try `rustc --explain E0308`.\\nerror: could not compile `playground` due to 5 previous errors\\n```\\n\\nIt might seem **a bit** ridiculous. However, I got to a point where the compiler\\nsuggested `use std::borrow::BorrowMut;` and it resulted in breaking parts of the\\ncode that worked previously. I think it may be a good idea to go over what is\\nhappening here.\\n\\n##### `.borrow_mut()` on `Rc>`\\n\\nLet\'s consider a variable `x` of type `Rc>`. What happens when you\\ncall `.borrow_mut()` on it? We can look at the `Rc` type, and\u2026 hang on! There is\\nneither `.borrow_mut()` method or `BorrowMut` trait implemented. How can we do it\\nthen?\\n\\nLet\'s go further and we can see that `RefCell` implements a `.borrow_mut()`\\nmethod. OK, but how can we call it on the `Rc`? Easily! `Rc` implements\\n`Deref` and therefore you can call methods on `Rc` objects as if they were\\n`T` objects. If we read on _`Deref` coercion_, we can see the following:\\n\\n> If `T` implements `Deref`, \u2026:\\n> * \u2026\\n> * `T` implicitly implements all the (immutable) methods of the type `U`.\\n\\nWhat is the requirement for the `.borrow_mut()` on `RefCell`? Well, it needs\\n`&self`, so the `Deref` implements the `.borrow_mut()` for the `Rc>`.\\n\\n##### `BorrowMut` trait\\n\\nI have not been able to find a lot on this trait. My guess is that it provides a\\nmethod instead of a syntactic sugar (`&mut x`) for the mutable borrow. And also\\nit provides default implementations for the types:\\n```rust\\nimpl BorrowMut for String\\n\\nimpl BorrowMut for &mut T\\nwhere\\n T: ?Sized,\\n\\nimpl BorrowMut for T\\nwhere\\n T: ?Sized,\\n\\nimpl BorrowMut<[T]> for Vec\\nwhere\\n A: Allocator,\\n\\nimpl BorrowMut for Box\\nwhere\\n A: Allocator,\\n T: ?Sized,\\n\\nimpl BorrowMut<[T]> for [T; N]\\n```\\n\\n##### Conflict\\n\\nNow the question is why did it break the code\u2026 My first take was that the type\\n`Rc>` has some _specialized_ implementation of the `.borrow_mut()` and\\nthe `use` overrides it with the default, which is true **in a sense**. However\\nthere is no _specialized_ implementation. Let\'s have a look at the trait and the\\ntype signature on the `RefCell`:\\n```rust\\n// trait\\npub trait BorrowMut: Borrow\\nwhere\\n Borrowed: ?Sized,\\n{\\n fn borrow_mut(&mut self) -> &mut Borrowed;\\n}\\n\\n// \u2039RefCell.borrow_mut()\u203a type signature\\npub fn borrow_mut(&self) -> RefMut<\'_, T>\\n```\\n\\nI think that we can definitely agree on the fact that `RefMut<\'_, T>` is not the\\n`RefCell`.\\n\\n**In my opinion**, `RefCell` implements a **separate** `.borrow_mut()` rather\\nthan implementing the interface, because it **cannot** satisfy the type requirements\\nof the trait.\\n\\n:::caution\\n\\nI wonder how are we expected to deal with this conflict, if and when, we need\\nboth the `.borrow_mut()` of the trait and `.borrow_mut()` of the `RefCell`.\\n\\n:::\\n\\n:::tip Fun fact\\n\\nI was suggested by the compiler to do `use std::borrow::BorrowMut;` and break the\\ncode.\\n\\nSo much for the _almighty_ and _helpful_ compiler\u2026\\n\\n:::\\n\\n## [Day 21: Monkey Math](https://adventofcode.com/2022/day/21)\\n\\n:::info tl;dr\\n\\nComputing an expression tree and then also finding ideal value for a node.\\n\\n:::\\n\\n### Solution\\n\\nRelatively simple, until you get to the 2nd part where you start to practice\\na lot of the copy-paste. I have managed to sneak some perverted stuff in there\\nthough :) Let\'s go through the details.\\n\\n#### `Default` trait\\n\\nFor the first time and twice I had a need to have a default value for my types,\\nenumerations in this case. Rust offers a very nice trait[^1] that is described\\nas:\\n\\n> A trait for giving a type a useful default value.\\n\\nI guess it sums it up nicely. The more interesting part about this is the fact\\nthat you can use the _macro machinery_ to save yourself some typing. If you have\\nenumeration of which the default value doesn\'t bear any parameter, you can just\\ndo[^2]:\\n\\n```rust\\n#[derive(Default)]\\nenum Color {\\n #[default]\\n White,\\n Gray,\\n Black,\\n}\\n```\\n\\n#### Abusing negation\\n\\nIf you want to use a _unary minus_ operator on your own type, you can implement\\na `Neg` trait[^3]. I was dealing with a binary tree and needed a way how to look\\nat the other side, so I have just implemented the negation for flipping between\\nleft and right :smile:\\n\\n[^1]: [`Default`](https://doc.rust-lang.org/std/default/trait.Default.html) docs\\n[^2]: Pardon my example from the graph algorithms ;)\\n[^3]: [`Neg`](https://doc.rust-lang.org/std/ops/trait.Neg.html) docs\\n\\n[_Advent of Code_]: https://adventofcode.com\\n[`itertools`]: https://crates.io/crates/itertools\\n[this Reddit post and the comment]: https://www.reddit.com/r/adventofcode/comments/zb98pn/comment/iyq0ono"},{"id":"leetcode/sort-diagonally","metadata":{"permalink":"/blog/leetcode/sort-diagonally","editUrl":"https://github.com/mfocko/blog/tree/main/blog/leetcode/sort-matrix-diagonally.md","source":"@site/blog/leetcode/sort-matrix-diagonally.md","title":"Sort the matrix diagonally","description":"Compiler assisted development.","date":"2023-03-04T23:15:00.000Z","formattedDate":"March 4, 2023","tags":[{"label":"cpp","permalink":"/blog/tags/cpp"},{"label":"leetcode","permalink":"/blog/tags/leetcode"},{"label":"iterators","permalink":"/blog/tags/iterators"}],"readingTime":16.99,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. @mf","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"Sort the matrix diagonally","description":"Compiler assisted development.","date":"2023-03-04T23:15","slug":"leetcode/sort-diagonally","authors":"mf","tags":["cpp","leetcode","iterators"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"3rd week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/3rd-week"},"nextItem":{"title":"2nd week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/2nd-week"}},"content":"Let\'s try to solve one of the LeetCode challenges in easy and hard mode at the\\nsame time.\\n\\n\x3c!--truncate--\x3e\\n\\n* Link to the problem: https://leetcode.com/problems/sort-the-matrix-diagonally/\\n\\n## Problem description\\n\\nA **matrix diagonal** is a diagonal line of cells starting from some cell in\\neither the topmost row or leftmost column and going in the bottom-right direction\\nuntil reaching the matrix\'s end. For example, the **matrix diagonal** starting\\nfrom `mat[2][0]`, where `mat` is a `6 x 3` matrix, includes cells `mat[2][0]`,\\n`mat[3][1]`, and `mat[4][2]`.\\n\\nGiven an `m x n` matrix `mat` of integers, sort each matrix diagonal in ascending\\norder and return the resulting matrix.\\n\\n### Example\\n\\n![Image describing the problem](https://assets.leetcode.com/uploads/2020/01/21/1482_example_1_2.png)\\n\\n## Skeleton and initial adjustments\\n\\nWe are given the following skeleton for the C++ and the given challenge:\\n\\n```cpp\\nclass Solution {\\npublic:\\n vector> diagonalSort(vector>& mat) {\\n \\n }\\n};\\n```\\n\\nThe task is to sort the passed matrix diagonally and then return it. First of all,\\nI don\'t like to solve this in a web browser, so we\'ll need to adjust it accordingly\\nfor running it locally. We\'ll start by including the `vector` header and using\\nfully-qualified namespaces[^1] and also adding few tests:\\n\\n```cpp\\n#include \\n#include \\n\\nusing matrix = std::vector>;\\n\\nclass Solution {\\npublic:\\n matrix diagonalSort(matrix& mat)\\n {\\n }\\n};\\n\\nstatic void test_case_1()\\n{\\n // Input: mat = [[3,3,1,1],[2,2,1,2],[1,1,1,2]]\\n // Output: [[1,1,1,1],[1,2,2,2],[1,2,3,3]]\\n\\n Solution s;\\n assert((s.diagonalSort(std::vector { std::vector { 3, 3, 1, 1 },\\n std::vector { 2, 2, 1, 2 },\\n std::vector { 1, 1, 1, 2 } })\\n == std::vector { std::vector { 1, 1, 1, 1 },\\n std::vector { 1, 2, 2, 2 },\\n std::vector { 1, 2, 3, 3 } }));\\n}\\n\\nstatic void test_case_2()\\n{\\n // Input: mat =\\n // [[11,25,66,1,69,7],[23,55,17,45,15,52],[75,31,36,44,58,8],[22,27,33,25,68,4],[84,28,14,11,5,50]]\\n // Output:\\n // [[5,17,4,1,52,7],[11,11,25,45,8,69],[14,23,25,44,58,15],[22,27,31,36,50,66],[84,28,75,33,55,68]]\\n\\n Solution s;\\n assert((s.diagonalSort(std::vector { std::vector { 11, 25, 66, 1, 69, 7 },\\n std::vector { 23, 55, 17, 45, 15, 52 },\\n std::vector { 75, 31, 36, 44, 58, 8 },\\n std::vector { 22, 27, 33, 25, 68, 4 },\\n std::vector { 84, 28, 14, 11, 5, 50 } })\\n == std::vector { std::vector { 5, 17, 4, 1, 52, 7 },\\n std::vector { 11, 11, 25, 45, 8, 69 },\\n std::vector { 14, 23, 25, 44, 58, 15 },\\n std::vector { 22, 27, 31, 36, 50, 66 },\\n std::vector { 84, 28, 75, 33, 55, 68 } }));\\n}\\n\\nint main()\\n{\\n test_case_1();\\n test_case_2();\\n\\n return 0;\\n}\\n```\\n\\nWe need to return the matrix, but we\'re given a reference to the input matrix. We\\ncan easily abuse the C++ here and just switch the reference to value, this way\\nthe matrix will be copied when passed to the function, we can sort the copy and\\njust return it back. And we also get yelled by the compiler for the fact that the\\nmethod doesn\'t return anything yet, so to make it \u201cshut up\u201d we will just return\\nthe input for now:\\n\\n```diff\\n- matrix diagonalSort(matrix& mat)\\n+ matrix diagonalSort(matrix mat)\\n {\\n+ return mat;\\n }\\n```\\n\\nNow, we get the copy and we\'re good to go.\\n\\n## Na\xefve solution\\n\\nAs you may know, C++ offers a plethora of functions that can be used to your\\nadvantage, given that you know how to \u201cbend\u201d the data structures accordingly.\\n\\nWhat does that mean for us? Well, we have an `std::sort`, we can use it, right?\\nLet\'s have a look at it:\\n```cpp\\ntemplate< class RandomIt >\\nvoid sort( RandomIt first, RandomIt last );\\n```\\n\\nThis overload is more than we need. What does it do? It just sorts the elements\\nin the range `[first, last)` using `operator<` on them. We can\'t sort the whole\\nmatrix using this, but\u2026 we can sort just \xbbone\xab diagonal without doing much work\\non our end.\\n\\nWhat is the `RandomIt` type though? If we look more into the documentation, we\\ncan easily find the requirements for it and also learn that it\'s a _random access_\\n_iterator_ and allows swapping its values at the same time.\\n\\n:::tip Random access iterator\\n\\nWhat is the _random access iterator_ though? We can find it in a documentation\\nand see the following description:\\n\\n> A **LegacyRandomAccessIterator** is a [LegacyBidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator)\\n> that can be moved to point to any element in constant time.\\n\\nAfter that we can see all the requirements for it being listed. I don\'t feel like\\nreading them right now, so we will just use it and see where the compilation blows\\nup, i.e. \u201c_compiler-assisted development_\u201d[^2] if you will ;)\\n\\n:::\\n\\nNow we know that we can use `std::sort` to sort the diagonal itself, but we also\\nneed to get the diagonals somehow. I\'m rather lazy, so I\'ll just delegate it to\\nsomeone else[^3]. And that way we get\\n```cpp\\nmatrix diagonalSort(matrix mat)\\n{\\n // we iterate over the diagonals\\n for (auto d : diagonals(mat)) {\\n // and we sort each diagonal\\n std::sort(d.begin(), d.end());\\n }\\n\\n // we take the matrix by copy, so we can sort in-situ and return the copy\\n // that we sorted\\n return mat;\\n}\\n```\\n\\nThis solution looks very simple, doesn\'t it? Well, cause it is.\\nLet\'s try compiling it:\\n```\\nmatrix-sort.cpp:11:23: error: use of undeclared identifier \'diagonals\' [clang-diagnostic-error]\\n for (auto d : diagonals(mat)) {\\n ^\\nFound compiler error(s).\\nmake: *** [makefile:14: tidy] Error 1\\n```\\n\\nOK, seems about right. We haven\'t implemented the `diagonals` yet. And based on\\nwhat we\'ve written so far, we need a function or a class `diagonals` that will\\ngive us the diagonals we need.\\n\\n## Implementing the `diagonals`\\n\\nCool, so we need the function that will let us go through each and every diagonal\\nin our matrix. We use the _for-range_ loop, so whatever we get back from the\\n`diagonals` must support `.begin()` and `.end()`. Since I am a masochist, we will\\ndo such functionality for a matrix of any type, not just the `int` from the challenge.\\n\\nAs I said, we need to be able to\\n* construct the object\\n* get the beginning\\n* get the end (the \u201csentinel\u201d)\\n\\n```cpp\\ntemplate \\nclass diagonals {\\n using matrix_t = std::vector>;\\n\\n matrix_t& _matrix;\\n\\npublic:\\n diagonals(matrix_t& m)\\n : _matrix(m)\\n {\\n }\\n diagonals_iter begin()\\n {\\n /* TODO */\\n }\\n diagonals_iter end()\\n {\\n /* TODO */\\n }\\n};\\n```\\n\\nNow we have a `diagonals` that we can use to go through the diagonals. We haven\'t\\nimplemented the core of it yet. Let\'s go through what we have for now.\\n\\nWe have a templated class with templated `T` that is used as a placeholder for any\\ntype we would store in the matrix. Because I\'m lazy, I have defined the `matrix_t`\\ntype that is a \u201cshortcut\u201d for `std::vector>`, so I don\'t have to\\ntype it out all the time. Of course, we need to store the matrix, we are given,\\nas a private attribute. And then just have the constructor and the 2 methods we\\nneed for the _for-range_.\\n\\n### Iterating over diagonals\\n\\nNow that we have an object that will allow us to iterate through the diagonals,\\nwe need to implement the iterating itself. We need to go through all of them, so\\nwe have multiple options how to do so. I have decided to start from the \u201cmain\u201d\\ndiagonal that starts at `(0, 0)` index and then proceed with the diagonals starting\\nin the first row, followed by the rest of the diagonals in the first column.\\n\\nWe need to be able to tell that we\'ve iterated through all of them, and also we\\nneed to know which diagonal is next. For that purpose we will pass the indices\\nof the first cell on the diagonal. That way we can always tell how to move forward.\\n\\nWe will start by updating the `begin` and `end` to reflect our choice accordingly.\\n\\n```cpp\\ndiagonals_iter begin() { return diagonals_iter { _matrix, 0, 0 }; }\\ndiagonals_iter end() { return diagonals_iter { _matrix, 0, _matrix.size() }; }\\n```\\n\\nFor the `begin` we return the first diagonal that starts at `(0, 0)`. And because\\nwe have decided to do the diagonals in the first column at the end, the first\\ndiagonal that is not a valid one is the one at `(0, height)`. Apart from the\\nindices, we also need to pass reference to the matrix itself.\\n\\n:::note\\n\\nYou may have noticed that we also include the diagonals that have length 1,\\nspecifically the ones at `(0, height - 1)` and `(width - 1, 0)`. We are implementing\\nan iterator that **should not** care about the way it\'s being used. Therefore, we\\ndon\'t care about the fact they don\'t need to be sorted.\\n\\n:::\\n\\nCool, let\'s leave the iterator itself to someone else, right?[^4]\\n\\n### Implementing the iterator over diagonals\\n\\nWe can start with a simple skeleton based on the information that we pass from\\nthe `diagonals`. Also to utilize the `matrix_t` and also contain implementation\\ndetails hidden away, we will put this code into the `diagonals` class.\\n\\n```cpp\\nclass diagonals_iter {\\n matrix_t& m;\\n std::size_t x;\\n std::size_t y;\\n\\npublic:\\n diagonals_iter(matrix_t& matrix, std::size_t x, std::size_t y)\\n : m(matrix)\\n , x(x)\\n , y(y)\\n {\\n }\\n};\\n```\\n\\nIn this case we will be implementing a \u201csimple\u201d forward iterator, so we don\'t\\nneed to implement a lot. Notably it will be:\\n* inequality operator (we need to know when we reach the end and have nothing to\\n iterate over)\\n* preincrementation operator (we need to be able to move around the iterable)\\n* dereference operator (we need to be able to retrieve the objects we iterate\\n over)\\n\\n```cpp\\nclass diagonals_iter {\\n matrix_t& m;\\n std::size_t x;\\n std::size_t y;\\n\\npublic:\\n diagonals_iter(matrix_t& matrix, std::size_t x, std::size_t y)\\n : m(matrix)\\n , x(x)\\n , y(y)\\n {\\n }\\n\\n bool operator!=(const diagonals_iter& rhs) const\\n {\\n // iterators are not equal if they reference different matrices, or\\n // their positions differ\\n return m != rhs.m || x != rhs.x || y != rhs.y;\\n }\\n\\n diagonals_iter& operator++()\\n {\\n if (y != 0) {\\n // iterating through diagonals down the first column\\n y++;\\n return *this;\\n }\\n\\n // iterating the diagonals along the first row\\n x++;\\n if (x == m.front().size()) {\\n // switching to diagonals in the first column\\n x = 0;\\n y++;\\n }\\n\\n return *this;\\n }\\n\\n diagonal operator*() const { return diagonal { m, x, y }; }\\n};\\n```\\n\\nLet\'s go one-by-one. Inequality operator is rather simple, just compare iterator\'s\\nattributes field-by-field. If you think about it, checking inequality of two 2D\\nvectors may be a bit inefficient, therefore, we can swap around and check it as\\na last thing.\\n\\n```diff\\n- return m != rhs.m || x != rhs.x || y != rhs.y;\\n+ return x != rhs.x || y != rhs.y || m != rhs.m;\\n```\\n\\nPreincrementation is where the magic happens. If you have a better look, you can\\nsee two branches of this operation:\\n\\n1. When `y != 0` (we\'re iterating over the diagonals in the first column)\\n In this case, we just bump the row and we\'re done.\\n2. When `y == 0` (we\'re iterating over the diagonals in the first row)\\n In this case, we bump the column and check if we haven\'t gotten out of bounds,\\n i.e. the end of the first row. If we get out of the bounds, we\'re continuing\\n with the second diagonal in the first column.\\n\\nDereferencing the iterator must \u201cyield\u201d something. In our case it will be the\\ndiagonal that we want to sort. For sorting we need just the iterators that can\\nmove around said diagonal. The simplest thing, we can do, is to delegate it to\\nsomething else. In our case it will be a class called `diagonal`.\\n\\n## Implementing the `diagonal` itself\\n\\nAfter implementing the iterator over diagonals, we know that all we need to describe\\na diagonal is the matrix itself and the \u201cstart\u201d of the diagonal (row and column).\\nAnd we also know that the diagonal must provide some iterators for the `std::sort`\\nfunction. We can start with the following skeleton:\\n```cpp\\ntemplate \\nclass diagonal {\\n using matrix_t = std::vector>;\\n\\n matrix_t& matrix;\\n std::size_t x;\\n std::size_t y;\\n\\npublic:\\n diagonal(matrix_t& matrix, std::size_t x, std::size_t y)\\n : matrix(matrix)\\n , x(x)\\n , y(y)\\n {\\n }\\n\\n diagonal_iter begin() const { return diagonal_iter { matrix, x, y }; }\\n\\n diagonal_iter end() const\\n {\\n auto max_x = matrix[y].size();\\n auto max_y = matrix.size();\\n\\n // we need to find the distance in which we get out of bounds (either in\\n // column or row)\\n auto steps = std::min(max_x - x, max_y - y);\\n\\n return diagonal_iter { matrix, x + steps, y + steps };\\n }\\n};\\n```\\n\\nInitialization is rather simple, we just \u201ckeep\u201d the stuff we get, `begin` is the\\nsimplest, we just delegate.\\n\\nIn case of the `end`, it gets more complicated. We need to know where is the \u201cend\u201d\\nof the diagonal. Since `end` should point to the first element \u201cafter\u201d the iterable,\\nwe know that it\'s the first position of the iterator where either `y` becomes\\n`matrix.size()` or `x` becomes `matrix[y].size()`. Also we are moving along diagonal,\\nduh, therefore we can deduce the first \u201cposition\u201d afterwards by minimal amount of\\nsteps to get out of the any column or row, hence `std::min(max_x - x, max_y - y)`.\\nFinal position is then computed simply by adding the steps to the beginning of\\nthe diagonal.\\n\\nNow we just need to finish the iterator for the diagonal itself and we\'re done.\\n\\n### Implementing `diagonal_iter`\\n\\nThis part is the hardest from all we need to do. It\'s because of the requirements\\nof the `std::sort` that requires us to implement a _random access iterator_. I have\\nbriefly described it above, and \u201cin a nutshell\u201d it means that we need to implement\\nan iterator that can move in constant time along the diagonal in any amount of\\nsteps.\\n\\nLet\'s go through all of the functionality that our iterator needs to support to\\nbe used in `std::sort`. We need the usual operations like:\\n\\n* equality/inequality\\n* incrementation\\n* dereferencing\\n\\nWe will also add all the types that our iterator uses with the category of the\\niterator, i.e. what interface it supports:\\n```cpp\\nclass diagonal_iter {\\n // we need to keep reference to the matrix itself\\n matrix_t& m;\\n\\n // we need to be able to tell our current position\\n std::size_t x;\\n std::size_t y;\\n\\npublic:\\n using difference_type = std::ptrdiff_t;\\n using value_type = T;\\n using pointer = T*;\\n using reference = T&;\\n using iterator_category = std::random_access_iterator_tag;\\n\\n diagonal_iter(matrix_t& matrix,\\n std::size_t x,\\n std::size_t y)\\n : m(matrix)\\n , x(x)\\n , y(y)\\n {\\n }\\n\\n bool operator==(const diagonal_iter& rhs) const\\n {\\n return x == rhs.x && y == rhs.y && m == rhs.m;\\n }\\n\\n diagonal_iter& operator++()\\n {\\n // we are moving along the diagonal, so we increment both \u2039x\u203a and \u2039y\u203a at\\n // the same time\\n x++;\\n y++;\\n return *this;\\n }\\n\\n reference operator*() const { return m[y][x]; }\\n};\\n```\\n\\nThis is pretty similar to the previous iterator, but now we need to implement the\\nremaining requirements of the _random access iterator_. Let\'s see what those are:\\n\\n* decrementation - cause we need to be able to move backwards too, since _random _\\n _access iterator_ extends the interface of _bidirectional iterator_\\n* moving the iterator in either direction by steps given as an integer\\n* being able to tell the distance between two iterators\\n* define an ordering on the iterators\\n\\nLet\'s fill them in:\\n```cpp\\nclass diagonal_iter {\\n // we need to keep reference to the matrix itself\\n matrix_t& m;\\n\\n // we need to be able to tell our current position\\n std::size_t x;\\n std::size_t y;\\n\\npublic:\\n using difference_type = std::ptrdiff_t;\\n using value_type = T;\\n using pointer = T*;\\n using reference = T&;\\n using iterator_category = std::random_access_iterator_tag;\\n\\n diagonal_iter(matrix_t& matrix,\\n std::size_t x,\\n std::size_t y)\\n : m(matrix)\\n , x(x)\\n , y(y)\\n {\\n }\\n\\n bool operator==(const diagonal_iter& rhs) const\\n {\\n return x == rhs.x && y == rhs.y && m == rhs.m;\\n }\\n\\n diagonal_iter& operator++()\\n {\\n // we are moving along the diagonal, so we increment both \u2039x\u203a and \u2039y\u203a at\\n // the same time\\n x++;\\n y++;\\n return *this;\\n }\\n\\n reference operator*() const { return m[y][x]; }\\n\\n // exactly opposite to the incrementation\\n diagonal_iter operator--()\\n {\\n x--;\\n y--;\\n return *this;\\n }\\n\\n // moving \u2039n\u203a steps back is same as calling decrementation \u2039n\u203a-times, so we\\n // can just return a new iterator and subtract \u2039n\u203a from both coordinates in\\n // the matrix\\n diagonal_iter operator-(difference_type n) const\\n {\\n return diagonal_iter { m, x - n, y - n };\\n }\\n\\n // here we assume that we are given two iterators on the same diagonal\\n difference_type operator-(const diagonal_iter& rhs) const\\n {\\n assert(m == rhs.m);\\n return x - rhs.x;\\n }\\n\\n // counterpart of moving \u2039n\u203a steps backwards\\n diagonal_iter operator+(difference_type n) const\\n {\\n return diagonal_iter { m, x + n, y + n };\\n }\\n\\n // we compare the coordinates, and also assume that those 2 iterators are\\n // lying on the same diagonal\\n bool operator<(const diagonal_iter& rhs) const\\n {\\n assert(m == rhs.m);\\n return x < rhs.x && y < rhs.y;\\n }\\n};\\n```\\n\\nAt this point we could probably try and compile it, right? If we do so, we will\\nget yelled at by a compiler for the following reasons:\\n```\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1792:11: error: object of type \'diagonal::diagonal_iter\' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]\\n __last = __next;\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1817:11: note: in instantiation of function template specialization \'std::__unguarded_linear_insert::diagonal_iter, __gnu_cxx::__ops::_Val_less_iter>\' requested here\\n std::__unguarded_linear_insert(__i,\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1849:9: note: in instantiation of function template specialization \'std::__insertion_sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__insertion_sort(__first, __first + int(_S_threshold), __comp);\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1940:9: note: in instantiation of function template specialization \'std::__final_insertion_sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__final_insertion_sort(__first, __last, __comp);\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization \'std::__sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());\\n ^\\nmatrix-sort.cpp:161:18: note: in instantiation of function template specialization \'std::sort::diagonal_iter>\' requested here\\n std::sort(d.begin(), d.end());\\n ^\\nmatrix-sort.cpp:17:19: note: copy assignment operator of \'diagonal_iter\' is implicitly deleted because field \'m\' is of reference type \'diagonal::matrix_t &\' (aka \'vector> &\')\\n matrix_t& m;\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1830:2: error: no matching function for call to \'__unguarded_linear_insert\' [clang-diagnostic-error]\\n std::__unguarded_linear_insert(__i,\\n ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1850:9: note: in instantiation of function template specialization \'std::__unguarded_insertion_sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__unguarded_insertion_sort(__first + int(_S_threshold), __last,\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1940:9: note: in instantiation of function template specialization \'std::__final_insertion_sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__final_insertion_sort(__first, __last, __comp);\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization \'std::__sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());\\n ^\\nmatrix-sort.cpp:161:18: note: in instantiation of function template specialization \'std::sort::diagonal_iter>\' requested here\\n std::sort(d.begin(), d.end());\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1782:5: note: candidate template ignored: substitution failure [with _RandomAccessIterator = diagonal::diagonal_iter, _Compare = __gnu_cxx::__ops::_Val_less_iter]\\n __unguarded_linear_insert(_RandomAccessIterator __last,\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1923:11: error: object of type \'diagonal::diagonal_iter\' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]\\n __last = __cut;\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1937:9: note: in instantiation of function template specialization \'std::__introsort_loop::diagonal_iter, long, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__introsort_loop(__first, __last,\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization \'std::__sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());\\n ^\\nmatrix-sort.cpp:161:18: note: in instantiation of function template specialization \'std::sort::diagonal_iter>\' requested here\\n std::sort(d.begin(), d.end());\\n ^\\nmatrix-sort.cpp:17:19: note: copy assignment operator of \'diagonal_iter\' is implicitly deleted because field \'m\' is of reference type \'diagonal::matrix_t &\' (aka \'vector> &\')\\n matrix_t& m;\\n ^\\n```\\n\\nThat\'s a lot of noise, isn\'t it? Let\'s focus on the important parts:\\n```\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1792:11: error: object of type \'diagonal::diagonal_iter\' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]\\n\u2026\\nmatrix-sort.cpp:17:19: note: copy assignment operator of \'diagonal_iter\' is implicitly deleted because field \'m\' is of reference type \'diagonal::matrix_t &\' (aka \'vector> &\')\\n matrix_t& m;\\n ^\\n```\\n\\nAh! We have a reference in our iterator, and this prevents us from having a copy\\nassignment operator (that is used \u201csomewhere\u201d in the sorting algorithm). Well\u2026\\nLet\'s just wrap it!\\n```diff\\n# we need to keep a different type than reference\\n- matrix_t& m;\\n+ std::reference_wrapper m;\\n\\n# in comparison we need to get the reference out of the wrapper first\\n- return x == rhs.x && y == rhs.y && m == rhs.m;\\n+ return x == rhs.x && y == rhs.y && m.get() == rhs.m.get();\\n\\n# same when we return a reference to the \u201ccell\u201d in the matrix\\n- reference operator*() const { return m[y][x]; }\\n+ reference operator*() const { return m.get()[y][x]; }\\n\\n# and finally in the assertions that we set for the \u201cdistance\u201d and \u201cless than\u201d\\n- assert(m == rhs.m);\\n+ assert(m.get() == rhs.m.get());\\n```\\n\\nWe\'re done now! We have written an iterator over diagonals for a 2D `vector`. You can have a look at the final result [here](pathname:///files/blog/leetcode/sort-matrix-diagonally/matrix-sort.cpp).\\n\\n[^1]: just because I\'m used to it and don\'t care about your opinion ;)\\n[^2]: exercise at your own risk\\n[^3]: me in 5 minutes in fact, but don\'t make me scared\\n[^4]: me in the next section\u2026"},{"id":"aoc-2022/2nd-week","metadata":{"permalink":"/blog/aoc-2022/2nd-week","editUrl":"https://github.com/mfocko/blog/tree/main/blog/aoc-2022/02-week-2.md","source":"@site/blog/aoc-2022/02-week-2.md","title":"2nd week of Advent of Code \'22 in Rust","description":"Surviving second week in Rust.","date":"2022-12-25T23:15:00.000Z","formattedDate":"December 25, 2022","tags":[{"label":"advent-of-code","permalink":"/blog/tags/advent-of-code"},{"label":"advent-of-code-2022","permalink":"/blog/tags/advent-of-code-2022"},{"label":"rust","permalink":"/blog/tags/rust"}],"readingTime":20.875,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. @mf","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"2nd week of Advent of Code \'22 in Rust","description":"Surviving second week in Rust.","date":"2022-12-25T23:15","slug":"aoc-2022/2nd-week","authors":"mf","tags":["advent-of-code","advent-of-code-2022","rust"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Sort the matrix diagonally","permalink":"/blog/leetcode/sort-diagonally"},"nextItem":{"title":"1st week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/1st-week"}},"content":"Let\'s go through the second week of [_Advent of Code_] in Rust.\\n\\n\x3c!--truncate--\x3e\\n\\n## [Day 8: Treetop Tree House](https://adventofcode.com/2022/day/8)\\n\\n:::info tl;dr\\n\\nWe get a forest and we want to know how many trees are visible from the outside.\\nApart from that we want to find the best view.\\n\\n:::\\n\\nNothing interesting. We are moving around 2D map though. And indexing can get a\\nbit painful when doing so, let\'s refactor it a bit ;) During the preparation for\\nthe AoC, I have written `Vector2D` and now it\'s time to extend it with indexing\\nof `Vec` of `Vec`s. In my solution I was manipulating with indices in the following\\nway:\\n\\n- swapping them\\n- checking whether they are correct indices for the `Vec>`\\n- indexing `Vec>` with them\\n\\n:::caution\\n\\nI\'m getting familiar with Rust and starting to \u201cabuse\u201d it\u2026 While doing so, I\'m\\nalso uncovering some \u201cfeatures\u201d that I don\'t really like. Therefore I will mark\\nall of my rants with _thicc_ **\xab\u21af\xbb** mark and will try to \u201clock\u201d them into their\\nown \u201cbox of hell\u201d.\\n\\n:::\\n\\n#### Swapping indices\\n\\nRelatively simple implementation, just take the values, swap them and return new\\nvector.\\n\\n```rust\\nimpl Vector2D {\\n pub fn swap(&self) -> Self {\\n Self {\\n x: self.y,\\n y: self.x,\\n }\\n }\\n}\\n```\\n\\nPretty straight-forward implementation, but let\'s talk about the `T: Copy`. We\\nneed to use it, since we are returning a **new** vector, with swapped **values**.\\nIf we had values that cannot be copied, the only thing we could do, would be a\\nvector of references (and it would also introduce a lifetime, to which we\'ll get\\nlater on). This is pretty similar with the operations on sets from the first week.\\n\\n#### Indexing `Vec`\\n\\nI will start with the indexing, cause bound-checking is a bit more\u2026 complicated\\nthan I would like to.\\n\\n```rust\\npub fn index<\'a, T, U>(v: &\'a [Vec], idx: &Vector2D) -> &\'a U\\nwhere\\n usize: TryFrom,\\n >::Error: Debug,\\n T: Copy,\\n{\\n let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());\\n &v[y][x]\\n}\\n```\\n\\nLet\'s talk about this mess\u2026 Body of the function is probably the most easy part\\nand should not be hard to understand, we just take the `x` and `y` and convert\\nthem both to `usize` type that can be used later on for indexing.\\n\\nThe type signature of the function is where the fun is at :wink: We are trying\\nto convert unknown type to `usize`, so we must bound the `T` as a type that can\\nbe converted to `usize`, that\'s how we got `usize: TryFrom` which basically\\nsays that `usize` must implement `TryFrom` trait and therefore allows us to\\nconvert the indices to actual `usize` indices. Using `.unwrap()` also forces us\\nto bound the error that can occur when converting `T` into `usize`, that\'s how\\nwe get `>::Error: Debug` which loosely means\\n\\n> error during conversion of `T` into `usize` must implement `Debug`,\\n> i.e. can be printed in some way or other\\n\\n`T: Copy` is required by `.try_into()` which takes `T` by-value.\\n\\nAnd now we are left only with the first line of the definition.\\n\\n:::note\\n\\nSkilled Rustaceans might notice that this implementation is rather flaky and can\\nbreak in multiple places at once. I\'ll get back to it\u2026\\n\\n:::\\n\\nLet\'s split it in multiple parts:\\n- `v: &\'a [Vec]` represents the 2D `Vec`, we are indexing, `Vec` implements\\n `Slice` trait and _clippy_ recommends using `&[T]` to `&Vec`, exact details\\n are unknown to me\\n- `idx: &Vector2D` represents the _indices_ which we use, we take them by\\n reference to avoid an unnecessary copy\\n- `-> &\'a U` means that we are returning a _reference_ to some value of type `U`.\\n Now the question is what does the `\'a` mean, we can also see it as a generic\\n type declared along `T` and `U`. And the answer is _relatively_ simple, `\'a`\\n represents a _lifetime_. We take the `v` by a reference and return a reference,\\n borrow checker validates all of the _borrows_ (or references), so we need to\\n specify that our returned value has _the same lifetime_ as the vector we have\\n taken by a reference, i.e. returned reference must live at least as long as the\\n `v`. This way we can \u201cbe sure\u201d that the returned reference is valid.\\n\\n##### Issues\\n\\nFirst issue that our implementation has is the fact that we cannot get a mutable\\nreference out of that function. This could be easily resolved by introducing new\\nfunction, e.g. `index_mut`. Which I have actually done while writing this part:\\n```rust\\npub fn index_mut<\'a, T, U>(v: &\'a mut [Vec], idx: &Vector2D) -> &\'a mut U\\nwhere\\n usize: TryFrom,\\n >::Error: Debug,\\n T: Copy,\\n{\\n let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());\\n &mut v[y][x]\\n}\\n```\\n\\n:::caution **\xab\u21af\xbb** Why can\'t we use one function?\\n\\nWhen we consider a `Vec`, we don\'t need to consider containers as `T`, Rust\\nimplements indexing as traits `Index` and `IndexMut` that do the dirty work\\nbehind syntactic sugar of `container[idx]`.\\n\\nHowever, implementing of traits is not allowed for _external_ types, i.e. types\\nthat you haven\'t defined yourself. This means that you can implement indexing\\nover containers that you have implemented yourself, but you cannot use your own\\ntypes for indexing \u201cbuilt-in\u201d types.\\n\\nAnother part of this rabbit hole is trait `SliceIndex` that is of a relevance\\nbecause of\\n```rust\\nimpl Index for [T]\\nwhere\\n I: SliceIndex<[T]>\\n\\nimpl Index for Vec\\nwhere\\n I: SliceIndex<[T]>,\\n A: Allocator\\n\\nimpl Index for [T; N]\\nwhere\\n [T]: Index\\n```\\n\\nIn other words, if your type implements `SliceIndex` trait, it can be used\\nfor indexing. As of now, this trait has all of its required methods experimental\\nand is marked as `unsafe`.\\n\\n:::\\n\\nAnother problem is a requirement for indexing either `[Vec]` or `Vec>`.\\nThis requirement could be countered by removing inner type `Vec` and constraining\\nit by a trait `Index` (or `IndexMut` respectively) in a following way\\n```rust\\npub fn index<\'a, C, T>(v: &\'a [C], idx: &Vector2D) -> &\'a C::Output\\nwhere\\n usize: TryFrom,\\n >::Error: Debug,\\n T: Copy,\\n C: Index\\n{\\n let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());\\n &v[y][x]\\n}\\n```\\n\\nGiven this, we can also give a more meaningful typename for indexing type, such\\nas `I`.\\n\\n#### Checking bounds\\n\\nNow we can get to the boundary checks, it is very similar, but a more\u2026 dirty.\\nFirst approach that came up was to convert the indices in `Vector2D` to `usize`,\\nbut when you add the indices up, e.g. when checking the neighbors, you can end\\nup with negative values which, unlike in C++, causes an error (instead of underflow\\nthat you can use to your advantage; you can easily guess how).\\n\\nSo how can we approach this then? Well\u2026 we will convert the bounds instead of\\nthe indices and that lead us to:\\n```rust\\npub fn in_range(v: &[Vec], idx: &Vector2D) -> bool\\nwhere\\n usize: TryInto,\\n >::Error: Debug,\\n T: PartialOrd + Copy,\\n{\\n idx.y >= 0.try_into().unwrap()\\n && idx.y < v.len().try_into().unwrap()\\n && idx.x >= 0.try_into().unwrap()\\n && idx.x\\n < v[TryInto::::try_into(idx.y).unwrap()]\\n .len()\\n .try_into()\\n .unwrap()\\n}\\n```\\n\\nYou can tell that it\'s definitely a shitty code. Let\'s improve it now! We will\\nget back to the original idea, but do it better. We know that we cannot convert\\nnegative values into `usize`, **but** we also know that conversion like that\\nreturns a `Result` which we can use to our advantage.\\n```rust\\npub fn in_range(v: &[Vec], idx: &Vector2D) -> bool\\nwhere\\n T: Copy,\\n usize: TryFrom,\\n{\\n usize::try_from(idx.y)\\n .and_then(|y| usize::try_from(idx.x).map(|x| y < v.len() && x < v[y].len()))\\n .unwrap_or(false)\\n}\\n```\\n\\n`Result` is a type similar to `Either` in Haskell and it allows us to chain\\nmultiple operations on correct results or propagate the original error without\\ndoing anything. Let\'s dissect it one-by-one.\\n\\n`try_from` is a method implemented in `TryFrom` trait, that allows you to convert\\ntypes and either successfully convert them or fail (with a reasonable error). This\\nmethod returns `Result`.\\n\\nWe call `and_then` on that _result_, let\'s have a look at the type signature of\\n`and_then`, IMO it explains more than enough:\\n```rust\\npub fn and_then(self, op: F) -> Result\\nwhere\\n F: FnOnce(T) -> Result\\n```\\n\\nOK\u2026 So it takes the result and a function and returns another result with\\ndifferent value and different error. However we can see that the function, which\\nrepresents an operation on a result, takes just the value, i.e. it doesn\'t care\\nabout any previous error. To make it short:\\n\\n> `and_then` allows us to run an operation, which can fail, on the correct result\\n\\nWe parsed a `y` index and now we try to convert the `x` index with `try_from`\\nagain, but on that result we use `map` rather than `and_then`, why would that be?\\n\\n```rust\\npub fn map(self, op: F) -> Result\\nwhere\\n F: FnOnce(T) -> U\\n```\\n\\nHuh\u2026 `map` performs an operation that **cannot** fail. And finally we use\\n`unwrap_or` which takes the value from result, or in case of an error returns the\\ndefault that we define.\\n\\nHow does this work then? If `y` is negative, the conversion fails and the error\\npropagates all the way to `unwrap_or`, if `y` can be a correct `usize` value, then\\nwe do the same with `x`. If `x` is negative, we propagate the error as with `y`,\\nand if it\'s not, then we check whether it exceeds the higher bounds or not.\\n\\n### Solution\\n\\nRelatively simple, you just need follow the rules and not get too smart, otherwise\\nit will get back at you.\\n\\n## [Day 9: Rope Bridge](https://adventofcode.com/2022/day/9)\\n\\n:::info tl;dr\\n\\nWe get a rope with knots and we want to track how many different positions are\\nvisited with the rope\'s tail.\\n\\n:::\\n\\nBy this day, I have come to a conclusion that current skeleton for each day\\ngenerates a lot of boilerplate. And even though it can be easily copied, it\'s\\njust a waste of space and unnecessary code. Let\'s \u201csimplify\u201d this (on one end\\nwhile creating monster on the other end). I\'ve gone through what we need in the\\npreparations for the AoC. Let\'s sum up our requirements:\\n- parsing\\n- part 1 & 2\\n- running on sample / input\\n- tests\\n\\nParsing and implementation of both parts is code that changes each day and we\\ncannot do anything about it. However running and testing can be simplified!\\n\\nLet\'s introduce and export a new module `solution` that will take care of all of\\nthis. We will start by introducing a trait for each day.\\n```rust\\npub trait Solution {\\n fn parse_input>(pathname: P) -> Input;\\n\\n fn part_1(input: &Input) -> Output;\\n fn part_2(input: &Input) -> Output;\\n}\\n```\\n\\nThis does a lot of work for us already, we have defined a trait and for each day\\nwe will create a structure representing a specific day. That structure will also\\nimplement the `Solution` trait.\\n\\nNow we need to get rid of the boilerplate, we can\'t get rid of the `main` function,\\nbut we can at least move out the functionality.\\n```rust\\nfn run(type_of_input: &str) -> Result<()>\\nwhere\\n Self: Sized,\\n{\\n tracing_subscriber::fmt()\\n .with_env_filter(EnvFilter::from_default_env())\\n .with_target(false)\\n .with_file(true)\\n .with_line_number(true)\\n .without_time()\\n .compact()\\n .init();\\n color_eyre::install()?;\\n\\n let input = Self::parse_input(format!(\\"{}s/{}.txt\\", type_of_input, Self::day()));\\n\\n info!(\\"Part 1: {}\\", Self::part_1(&input));\\n info!(\\"Part 2: {}\\", Self::part_2(&input));\\n\\n Ok(())\\n}\\n\\nfn main() -> Result<()>\\nwhere\\n Self: Sized,\\n{\\n Self::run(\\"input\\")\\n}\\n```\\n\\nThis is all part of the `Solution` trait, which can implement methods while being\\ndependent on what is provided by the implementing types. In this case, we just\\nneed to bound the `Output` type to implement `Display` that is necessary for the\\n`info!` and format string there.\\n\\nNow we can get to first of the nasty things we are going to do\u2026 And it is the\\n`day()` method that you can see being used when constructing path to the input\\nfile. That method will generate a name of the file, e.g. `day01` and we know that\\nwe can _somehow_ deduce it from the structure name, given we name it reasonably.\\n\\n```rust\\nfn day() -> String {\\n let mut day = String::from(type_name::().split(\\"::\\").next().unwrap());\\n day.make_ascii_lowercase();\\n\\n day.to_string()\\n}\\n```\\n\\n:::caution `type_name`\\n\\nThis feature is still experimental and considered to be internal, it is not\\nadvised to use it any production code.\\n\\n:::\\n\\nAnd now we can get to the nastiest stuff :weary: We will **generate** the tests!\\n\\nWe want to be able to generate tests for sample input in a following way:\\n```rust\\ntest_sample!(day_01, Day01, 42, 69);\\n```\\n\\nThere\'s not much we can do, so we will write a macro to generate the tests for us.\\n\\n```rust\\n#[macro_export]\\nmacro_rules! test_sample {\\n ($mod_name:ident, $day_struct:tt, $part_1:expr, $part_2:expr) => {\\n #[cfg(test)]\\n mod $mod_name {\\n use super::*;\\n\\n #[test]\\n fn test_part_1() {\\n let sample =\\n $day_struct::parse_input(&format!(\\"samples/{}.txt\\", $day_struct::day()));\\n assert_eq!($day_struct::part_1(&sample), $part_1);\\n }\\n\\n #[test]\\n fn test_part_2() {\\n let sample =\\n $day_struct::parse_input(&format!(\\"samples/{}.txt\\", $day_struct::day()));\\n assert_eq!($day_struct::part_2(&sample), $part_2);\\n }\\n }\\n };\\n}\\n```\\n\\nWe have used it in a similar way as macros in C/C++, one of the things that we\\ncan use to our advantage is defining \u201ctype\u201d of the parameters for the macro. All\\nparameters have their name prefixed with `$` sign and you can define various \u201cforms\u201d\\nof your macro. Let\'s go through it!\\n\\nWe have following parameters:\\n- `$mod_name` which represents the name for the module with tests, it is typed\\n with `ident` which means that we want a valid identifier to be passed in.\\n- `$day_struct` represents the structure that will be used for tests, it is typed\\n with `tt` which represents a _token tree_, in our case it is a type.\\n- `$part_X` represents the expected output for the `X`th part and is of type `expr`\\n which literally means an _expression_.\\n\\nApart from that we need to use `#[macro_export]` to mark the macro as exported\\nfor usage outside of the module. Now our skeleton looks like:\\n```rust\\nuse aoc_2022::*;\\n\\ntype Input = String;\\ntype Output = String;\\n\\nstruct DayXX;\\nimpl Solution for DayXX {\\n fn parse_input>(pathname: P) -> Input {\\n file_to_string(pathname)\\n }\\n\\n fn part_1(input: &Input) -> Output {\\n todo!()\\n }\\n\\n fn part_2(input: &Input) -> Output {\\n todo!()\\n }\\n}\\n\\nfn main() -> Result<()> {\\n // DayXX::run(\\"sample\\")\\n DayXX::main()\\n}\\n\\n// test_sample!(day_XX, DayXX, , );\\n```\\n\\n### Solution\\n\\nNot much to talk about, it is relatively easy to simulate.\\n\\n## [Day 10: Cathode-Ray Tube](https://adventofcode.com/2022/day/10)\\n\\n:::info tl;dr\\n\\nEmulating basic arithmetic operations on a CPU and drawing on CRT based on the\\nCPU\'s accumulator.\\n\\n:::\\n\\nIn this day I have discovered an issue with my design of the `Solution` trait.\\nAnd the issue is caused by different types of `Output` for the part 1 and part 2.\\n\\nProblem is relatively simple and consists of simulating a CPU, I have approached\\nit in a following way:\\n```rust\\nfn evaluate_instructions(instructions: &[Instruction], mut out: Output) -> Output {\\n instructions\\n .iter()\\n .fold(State::new(), |state, instruction| {\\n state.execute(instruction, &mut out)\\n });\\n\\n out\\n}\\n```\\n\\nWe just take the instructions, we have some state of the CPU and we execute the\\ninstructions one-by-one. Perfect usage of the `fold` (or `reduce` as you may know\\nit from other languages).\\n\\nYou can also see that we have an `Output` type, so the question is how can we fix\\nthat problem. And the answer is very simple and _functional_. Rust allows you to\\nhave an `enumeration` that can _bear_ some other values apart from the type itself.\\n\\n:::tip\\n\\nWe could\'ve seen something like this with the `Result` type that can be\\ndefined as\\n```rust\\nenum Result {\\n Ok(T),\\n Err(E)\\n}\\n```\\n\\n###### What does that mean though?\\n\\nWhen we have an `Ok` value, it has the result itself, and when we get an `Err`\\nvalue, it has the error. This also allows us to handle _results_ in a rather\\npretty way:\\n```rust\\nmatch do_something(x) {\\n Ok(y) => {\\n println!(\\"SUCCESS: {}\\", y);\\n },\\n Err(y) => {\\n eprintln!(\\"ERROR: {}\\", y);\\n }\\n}\\n```\\n\\n:::\\n\\nMy solution has a following outline:\\n```rust\\nfn execute(&self, i: &Instruction, output: &mut Output) -> State {\\n // execute the instruction\\n\\n // collect results if necessary\\n match output {\\n Output::Part1(x) => self.execute_part_1(y, x),\\n Output::Part2(x) => self.execute_part_2(y, x),\\n }\\n\\n // return the obtained state\\n new_state\\n}\\n```\\n\\nYou might think that it\'s a perfectly reasonable thing to do. Yes, **but** notice\\nthat the `match` statement doesn\'t _collect_ the changes in any way and also we\\npass `output` by `&mut`, so it is shared across each _iteration_ of the `fold`.\\n\\nThe dirty and ingenious thing is that `x`s are passed by `&mut` too and therefore\\nthey are directly modified by the helper functions. To sum it up and let it sit\\n\\n> We are **collecting** the result **into** an **enumeration** that is **shared**\\n> across **all** iterations of `fold`.\\n\\n### Solution\\n\\nSimilar to _Day 9_, but there are some technical details that can get you.\\n\\n## [Day 11: Monkey in the Middle](https://adventofcode.com/2022/day/11)\\n\\n:::info tl;dr\\n\\nSimulation of monkeys throwing stuff around and measuring your stress levels\\nwhile your stuff is being passed around.\\n\\n:::\\n\\nI think I decided to use regular expressions here for the first time, cause\\nparsing the input was a pain.\\n\\nAlso I didn\'t expect to implement Euclidean algorithm in Rust\u2026\\n\\n### Solution\\n\\nAgain, we\'re just running a simulation. Though I must admit it was very easy to\\nmake a small technical mistakes that could affect the final results very late.\\n\\n## [Day 12: Hill Climbing Algorithm](https://adventofcode.com/2022/day/12)\\n\\n:::info tl;dr\\n\\nFinding shortest path up the hill and also shortest path down to the ground while\\nalso rolling down the hill\u2026\\n\\n:::\\n\\nAs I have said in the _tl;dr_, we are looking for the shortest path, but the start\\nand goal differ for the part 1 and 2. So I have decided to refactor my solution\\nto a BFS algorithm that takes necessary parameters via functions:\\n```rust\\nfn bfs(\\n graph: &[Vec], start: &Position, has_edge: F, is_target: G\\n) -> Option\\nwhere\\n F: Fn(&[Vec], &Position, &Position) -> bool,\\n G: Fn(&[Vec], &Position) -> bool\\n```\\n\\nWe pass the initial vertex from the caller and everything else is left to the BFS\\nalgorithm, based on the `has_edge` and `is_target` functions.\\n\\nThis was easy! And that is not very usual in Rust once you want to pass around\\nfunctions. :eyes:\\n\\n### Solution\\n\\nLooking for the shortest path\u2026 Must be Dijkstra, right? **Nope!** Half of the\\nReddit got jebaited though. In all fairness, nothing stops you from implementing\\nthe Dijkstra\'s algorithm for finding the shortest path, **but** if you know that\\nall connected vertices are in a unit (actually $d = 1$) distance from each other,\\nthen you know that running Dijkstra is equivalent to running BFS, only with worse\\ntime complexity, because of the priority heap instead of the queue.\\n\\n## [Day 13: Distress Signal](https://adventofcode.com/2022/day/13)\\n\\n:::info tl;dr\\n\\nProcessing packets with structured data from the distress signal.\\n\\n:::\\n\\nYou can implement a lot of traits if you want to. It is _imperative_ to implement\\nordering on the packets. I had a typo, so I also proceeded to implement a `Display`\\ntrait for debugging purposes:\\n```rust\\nimpl Display for Packet {\\n fn fmt(&self, f: &mut std::fmt::Formatter<\'_>) -> std::fmt::Result {\\n match self {\\n Packet::Integer(x) => write!(f, \\"{x}\\"),\\n Packet::List(lst) => write!(f, \\"[{}]\\", lst.iter().map(|p| format!(\\"{p}\\")).join(\\",\\")),\\n }\\n }\\n}\\n```\\n\\n### Solution\\n\\nA lot of technical details\u2026 Parsing is nasty too\u2026\\n\\n## [Day 14: Regolith Reservoir](https://adventofcode.com/2022/day/14)\\n\\n:::info tl;dr\\n\\nLet\'s simulate falling sand grain-by-grain.\\n\\n:::\\n\\nAgain, both parts are relatively similar with minimal changes, so it is a good\\nidea to refactor it a bit. Similar approach to the [BFS above]. Also this is the\\nfirst day where I ran into efficiency issues and had to redo my solution to speed\\nit up just a bit.\\n\\n### Solution\\n\\nTedious.\\n\\n## Post Mortem\\n\\n### Indexing\\n\\nI was asked about the indexing after publishing the blog. And truly it is rather\\ncomplicated topic, especially after releasing `SliceIndex` trait. I couldn\'t\\nleave it be, so I tried to implement the `Index` and `IndexMut` trait.\\n\\n:::note\\n\\nI have also mentioned that the `SliceIndex` trait is `unsafe`, but truth be told,\\nonly _unsafe_ part are the 2 methods that are named `*unchecked*`. Anyways, I will\\nbe implementing the `Index*` traits for now, rather than the `SliceIndex`.\\n\\n:::\\n\\nIt\'s relatively straightforward\u2026\\n\\n```rust\\nimpl Index> for [C]\\nwhere\\n I: Copy + TryInto,\\n >::Error: Debug,\\n C: Index,\\n{\\n type Output = C::Output;\\n\\n fn index(&self, index: Vector2D) -> &Self::Output {\\n let (x, y): (usize, usize) =\\n (index.x.try_into().unwrap(), index.y.try_into().unwrap());\\n &self[y][x]\\n }\\n}\\n\\nimpl IndexMut> for [C]\\nwhere\\n I: Copy + TryInto,\\n >::Error: Debug,\\n C: IndexMut,\\n{\\n fn index_mut(&mut self, index: Vector2D) -> &mut Self::Output {\\n let (x, y): (usize, usize) =\\n (index.x.try_into().unwrap(), index.y.try_into().unwrap());\\n &mut self[y][x]\\n }\\n}\\n```\\n\\nWe can see a lot of similarities to the implementation of `index` and `index_mut`\\nfunctions. In the end, they are 1:1, just wrapped in the trait that provides a\\nsyntax sugar for `container[idx]`.\\n\\n:::note\\n\\nI have also switched from using the `TryFrom` to `TryInto` trait, since it better\\nmatches what we are using, the `.try_into` rather than `usize::try_from`.\\n\\nAlso implementing `TryFrom` automatically provides you with a `TryInto` trait,\\nsince it is relatively easy to implement. Just compare the following:\\n\\n```rust\\npub trait TryFrom: Sized {\\n type Error;\\n\\n fn try_from(value: T) -> Result;\\n}\\n\\npub trait TryInto: Sized {\\n type Error;\\n\\n fn try_into(self) -> Result;\\n}\\n```\\n\\n:::\\n\\nOK, so we have our trait implemented, we should be able to use `container[index]`,\\nright? Yes\u2026 but actually no :frowning:\\n\\n```\\nerror[E0277]: the type `[std::vec::Vec]` cannot be indexed by `aoc_2022::Vector2D`\\n --\x3e src/bin/day08.rs:26:18\\n |\\n26 | if trees[pos] > tallest {\\n | ^^^ slice indices are of type `usize` or ranges of `usize`\\n |\\n = help: the trait `std::slice::SliceIndex<[std::vec::Vec]>` is not implemented for `aoc_2022::Vector2D`\\n = note: required for `std::vec::Vec>` to implement `std::ops::Index>`\\n\\nerror[E0277]: the type `[std::vec::Vec]` cannot be indexed by `aoc_2022::Vector2D`\\n --\x3e src/bin/day08.rs:30:28\\n |\\n30 | max(tallest, trees[pos])\\n | ^^^ slice indices are of type `usize` or ranges of `usize`\\n |\\n = help: the trait `std::slice::SliceIndex<[std::vec::Vec]>` is not implemented for `aoc_2022::Vector2D`\\n = note: required for `std::vec::Vec>` to implement `std::ops::Index>`\\n\\nerror[E0277]: the type `[std::vec::Vec]` cannot be indexed by `aoc_2022::Vector2D`\\n --\x3e src/bin/day08.rs:52:28\\n |\\n52 | let max_height = trees[position];\\n | ^^^^^^^^ slice indices are of type `usize` or ranges of `usize`\\n |\\n = help: the trait `std::slice::SliceIndex<[std::vec::Vec]>` is not implemented for `aoc_2022::Vector2D`\\n = note: required for `std::vec::Vec>` to implement `std::ops::Index>`\\n```\\n\\nWhy? We have it implemented for the slices (`[C]`), why doesn\'t it work? Well,\\nthe fun part consists of the fact that in other place, where we were using it,\\nwe were passing the `&[Vec]`, but this is coming from a helper functions that\\ntake `&Vec>` instead. And\u2026 we don\'t implement `Index` and `IndexMut` for\\nthose. Just for the slices. :exploding_head: *What are we going to do about it?*\\n\\nWe can either start copy-pasting or be smarter about it\u2026 I choose to be smarter,\\nso let\'s implement a macro! The only difference across the implementations are\\nthe types of the outer containers. Implementation doesn\'t differ **at all**!\\n\\nImplementing the macro can be done in a following way:\\n```rust\\nmacro_rules! generate_indices {\\n ($container:ty) => {\\n impl Index> for $container\\n where\\n I: Copy + TryInto,\\n >::Error: Debug,\\n C: Index,\\n {\\n type Output = C::Output;\\n\\n fn index(&self, index: Vector2D) -> &Self::Output {\\n let (x, y): (usize, usize) =\\n (index.x.try_into().unwrap(), index.y.try_into().unwrap());\\n &self[y][x]\\n }\\n }\\n\\n impl IndexMut> for $container\\n where\\n I: Copy + TryInto,\\n >::Error: Debug,\\n C: IndexMut,\\n {\\n fn index_mut(&mut self, index: Vector2D) -> &mut Self::Output {\\n let (x, y): (usize, usize) =\\n (index.x.try_into().unwrap(), index.y.try_into().unwrap());\\n &mut self[y][x]\\n }\\n }\\n };\\n}\\n```\\n\\nAnd now we can simply do\\n```rust\\ngenerate_indices!(VecDeque);\\ngenerate_indices!([C]);\\ngenerate_indices!(Vec);\\n// generate_indices!([C; N], const N: usize);\\n```\\n\\nThe last type (I took the inspiration from the implementations of the `Index` and\\n`IndexMut` traits) is a bit problematic, because of the `const N: usize` part,\\nwhich I haven\'t managed to be able to parse. And that\'s how I got rid of the error.\\n\\n:::note\\n\\nIf I were to use 2D-indexing over `[C; N]` slices, I\'d probably just go with the\\ncopy-paste, cause the cost of this \u201cmonstrosity\u201d outweighs the benefits of no DRY.\\n\\n:::\\n\\n#### Cause of the problem\\n\\nThis issue is relatively funny. If you don\'t use any type aliases, just the raw\\ntypes, you\'ll get suggested certain changes by the _clippy_. For example if you\\nconsider the following piece of code\\n```rust\\nfn get_sum(nums: &Vec) -> i32 {\\n nums.iter().sum()\\n}\\n\\nfn main() {\\n let nums = vec![1, 2, 3];\\n println!(\\"Sum: {}\\", get_sum(&nums));\\n}\\n```\\n\\nand you run _clippy_ on it, you will get\\n```\\nChecking playground v0.0.1 (/playground)\\nwarning: writing `&Vec` instead of `&[_]` involves a new object where a slice will do\\n --\x3e src/main.rs:1:18\\n |\\n1 | fn get_sum(nums: &Vec) -> i32 {\\n | ^^^^^^^^^ help: change this to: `&[i32]`\\n |\\n = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg\\n = note: `#[warn(clippy::ptr_arg)]` on by default\\n\\nwarning: `playground` (bin \\"playground\\") generated 1 warning\\n Finished dev [unoptimized + debuginfo] target(s) in 0.61s\\n```\\n\\nHowever, if you introduce a type alias, such as\\n```rust\\ntype Numbers = Vec;\\n```\\n\\nThen _clippy_ won\'t say anything, cause there is literally nothing to suggest.\\nHowever the outcome is not the same\u2026\\n\\n[_Advent of Code_]: https://adventofcode.com\\n[BFS above]: #day-12-hill-climbing-algorithm"},{"id":"aoc-2022/1st-week","metadata":{"permalink":"/blog/aoc-2022/1st-week","editUrl":"https://github.com/mfocko/blog/tree/main/blog/aoc-2022/01-week-1.md","source":"@site/blog/aoc-2022/01-week-1.md","title":"1st week of Advent of Code \'22 in Rust","description":"Surviving first week in Rust.","date":"2022-12-15T01:15:00.000Z","formattedDate":"December 15, 2022","tags":[{"label":"advent-of-code","permalink":"/blog/tags/advent-of-code"},{"label":"advent-of-code-2022","permalink":"/blog/tags/advent-of-code-2022"},{"label":"rust","permalink":"/blog/tags/rust"}],"readingTime":12.4,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. @mf","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"1st week of Advent of Code \'22 in Rust","description":"Surviving first week in Rust.","date":"2022-12-15T01:15","slug":"aoc-2022/1st-week","authors":"mf","tags":["advent-of-code","advent-of-code-2022","rust"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"2nd week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/2nd-week"},"nextItem":{"title":"Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/intro"}},"content":"Let\'s go through the first week of [_Advent of Code_] in Rust.\\n\\n\x3c!--truncate--\x3e\\n\\n:::note\\n\\nIf you wish to have a look at the solutions, you can follow them on my [GitLab].\\nMore specifically in the [`/src/bin/`].\\n\\n:::\\n\\nI will try to summarize my experience with using Rust for the AoC. Trying it out\\nages ago, I believe it will be _pain and suffering_, but we will see. For each\\nday I will also try to give a tl;dr of the problem, so that you can better imagine\\nthe relation to my woes or :+1: moments.\\n\\n## [Day 1: Calorie Counting](https://adventofcode.com/2022/day/1)\\n\\n:::info tl;dr\\n\\nAs the name suggests, we get the calories of the food contained in the elves\\nbackpacks and we want to choose the elf that has the most food ;)\\n\\n:::\\n\\n> Wakey wakey!\\n\\nProgramming in Rust at 6am definitely hits. I\'ve also forgotten to mention how I\\nhandle samples. With each puzzle you usually get a sample input and expected\\noutput. You can use them to verify that your solution works, or usually doesn\'t.\\n\\nAt first I\'ve decided to put asserts into my `main`, something like\\n```rust\\nassert_eq!(part_1(&sample), 24000);\\ninfo!(\\"Part 1: {}\\", part_1(&input));\\n\\nassert_eq!(part_2(&sample), 45000);\\ninfo!(\\"Part 2: {}\\", part_2(&input));\\n```\\n\\nHowever, once you get further, the sample input may take some time to run itself.\\nSo in the end, I have decided to turn them into unit tests:\\n```rust\\n#[cfg(test)]\\nmod tests {\\n use super::*;\\n\\n #[test]\\n fn test_part_1() {\\n let sample = parse_input(\\"samples/day01.txt\\");\\n assert_eq!(part_1(&sample), 24000);\\n }\\n\\n #[test]\\n fn test_part_2() {\\n let sample = parse_input(\\"samples/day01.txt\\");\\n assert_eq!(part_2(&sample), 45000);\\n }\\n}\\n```\\n\\nAnd later on I have noticed, it\'s hard to tell the difference between the days,\\nso I further renamed the `mod` from generic `tests` to reflect the days.\\n\\nAlso after finishing the first day puzzle, I have installed an [`sccache`] to\\ncache the builds, so that the build time is lower, cause it was kinda unbearable.\\n\\n### Solution\\n\\nWell, it\'s a pretty simple problem. You just take the input, sum the calories and\\nfind the biggest one. However, if we try to generalize to more than the biggest\\none, the fun appears. We have few options:\\n\\n- keep all the calories, sort them, take what we need\\n- keep all the calories and use max heap\\n- use min heap and maintain at most N calories that we need\\n\\n## [Day 2: Rock Paper Scissors](https://adventofcode.com/2022/day/2)\\n\\n:::info tl;dr\\n\\nYou want to know what score did you achieve while playing _Rock Paper Scissors_.\\nAnd then you want to be strategic about it.\\n\\n:::\\n\\nApart from the technical details of the puzzle, it went relatively smooth.\\n\\n### Solution\\n\\nI took relatively na\xefve approach and then tried to simplify it.\\n\\n## [Day 3: Rucksack Reorganization](https://adventofcode.com/2022/day/3)\\n\\n:::info tl;dr\\n\\nLet\'s go reorganize elves\' backpacks! Each backpacks has 2 compartments and you\\nwant to find the common item among those compartments. Each of them has priority,\\nyou care only about the sum.\\n\\n:::\\n\\nThis is the day where I started to fight the compiler and neither of us decided\\nto give up. Let\'s dive into it \\\\o/\\n\\n:::tip Fun fact\\n\\nFighting the compiler took me 30 minutes.\\n\\n:::\\n\\nWe need to find a common item among 2 collections, that\'s an easy task, right?\\nWe can construct 2 sets and find an intersection:\\n```rust\\nlet top: HashSet = [1, 2, 3].iter().collect();\\nlet bottom: HashSet = [3, 4, 5].iter().collect();\\n```\\n\\nNow, the first issue that we encounter is caused by the fact that we are using\\na slice (the `[\u2026]`), iterator of that returns **references** to the numbers.\\nAnd we get immediately yelled at by the compiler, because the numbers are discarded\\nafter running the `.collect`. To fix this, we can use `.into_iter`:\\n```rust\\nlet top: HashSet = [1, 2, 3].into_iter().collect();\\nlet bottom: HashSet = [3, 4, 5].into_iter().collect();\\n```\\n\\nThis way the numbers will get copied instead of referenced. OK, let\'s find the\\nintersection of those 2 collections:\\n```rust\\nprintln!(\\"Common elements: {:?}\\", top.intersection(&bottom));\\n```\\n```\\nCommon elements: [3]\\n```\\n\\n:::caution\\n\\nNotice that we need to do `&bottom`. It explicitly specifies that `.intersection`\\n**borrows** the `bottom`, i.e. takes an immutable reference to it.\\n\\n:::\\n\\nThat\'s what we want, right? Looks like it! \\\\o/\\n\\nNext part wants us to find the common element among all of the backpacks. OK, so\\nthat should be fairly easy, we have an intersection and we want to find intersection\\nover all of them.\\n\\nLet\'s have a look at the type of the `.intersection`\\n```rust\\npub fn intersection<\'a>(\\n\xa0\xa0\xa0\xa0&\'a self,\\n\xa0\xa0\xa0\xa0other: &\'a HashSet\\n) -> Intersection<\'a, T, S>\\n```\\n\\nOK\u2026 Huh\u2026 But we have an example there!\\n```rust\\nlet intersection: HashSet<_> = a.intersection(&b).collect();\\n```\\n\\nCool, that\'s all we need.\\n```rust\\nlet top: HashSet = [1, 2, 3, 4].into_iter().collect();\\nlet bottom: HashSet = [3, 4, 5, 6].into_iter().collect();\\nlet top_2: HashSet = [2, 3, 4, 5, 6].into_iter().collect();\\nlet bottom_2: HashSet = [4, 5, 6].into_iter().collect();\\n\\nlet intersection: HashSet<_> = top.intersection(&bottom).collect();\\nprintln!(\\"Intersection: {:?}\\", intersection);\\n```\\n```\\nIntersection: {3, 4}\\n```\\n\\nCool, so let\'s do the intersection with the `top_2`:\\n```rust\\nlet top: HashSet = [1, 2, 3, 4].into_iter().collect();\\nlet bottom: HashSet = [3, 4, 5, 6].into_iter().collect();\\nlet top_2: HashSet = [2, 3, 4, 5, 6].into_iter().collect();\\nlet bottom_2: HashSet = [4, 5, 6].into_iter().collect();\\n\\nlet intersection: HashSet<_> = top.intersection(&bottom).collect();\\nlet intersection: HashSet<_> = intersection.intersection(&top_2).collect();\\nprintln!(\\"Intersection: {:?}\\", intersection);\\n```\\n\\nAnd we get yelled at by the compiler:\\n```\\nerror[E0308]: mismatched types\\n --\x3e src/main.rs:10:58\\n |\\n10 | let intersection: HashSet<_> = intersection.intersection(&top_2).collect();\\n | ------------ ^^^^^^ expected `&i32`, found `i32`\\n | |\\n | arguments to this function are incorrect\\n |\\n = note: expected reference `&HashSet<&i32>`\\n found reference `&HashSet`\\n```\\n\\n/o\\\\ What the hell is going on here? Well, the funny thing is, that this operation\\ndoesn\'t return the elements themselves, but the references to them and when we pass\\nthe third set, it has just the values themselves, without any references.\\n\\n:::tip\\n\\nIt may seem as a very weird decision, but in fact it makes some sense\u2026 It allows\\nyou to do intersection of items that may not be possible to copy. Overall this is\\na \u201ctax\u201d for having a borrow checker ~~drilling your ass~~ having your back and\\nmaking sure you\'re not doing something naughty that may cause an **undefined**\\n**behavior**.\\n\\n:::\\n\\nTo resolve this we need to get an iterator that **clones** the elements:\\n```rust\\nlet top: HashSet = [1, 2, 3, 4].into_iter().collect();\\nlet bottom: HashSet = [3, 4, 5, 6].into_iter().collect();\\nlet top_2: HashSet = [2, 3, 4, 5, 6].into_iter().collect();\\nlet bottom_2: HashSet = [4, 5, 6].into_iter().collect();\\n\\nlet intersection: HashSet<_> = top.intersection(&bottom).cloned().collect();\\nlet intersection: HashSet<_> = intersection.intersection(&top_2).cloned().collect();\\nlet intersection: HashSet<_> = intersection.intersection(&bottom_2).cloned().collect();\\nprintln!(\\"Intersection: {:?}\\", intersection);\\n```\\n```\\nIntersection: {4}\\n```\\n\\n### Solution\\n\\nThe approach is pretty simple, if you omit the _1on1 with the compiler_. You just\\nhave some fun with the set operations :)\\n\\n## [Day 4: Camp Cleanup](https://adventofcode.com/2022/day/4)\\n\\n:::info tl;dr\\n\\nElves are cleaning up the camp and they got overlapping sections to clean up.\\nFind how many overlap and can take the day off.\\n\\n:::\\n\\n[`RangeInclusive`] is your friend not an enemy :)\\n\\n### Solution\\n\\nRelatively easy, you just need to parse the input and know what you want. Rust\'s\\n`RangeInclusive` type helped a lot, cause it took care of all abstractions.\\n\\n## [Day 5: Supply Stacks](https://adventofcode.com/2022/day/5)\\n\\n:::info tl;dr\\n\\nLet\'s play with stacks of crates.\\n\\n:::\\n\\nVery easy problem with very annoying input. You can judge yourself:\\n```\\n [D] \\n[N] [C] \\n[Z] [M] [P]\\n 1 2 3 \\n\\nmove 1 from 2 to 1\\nmove 3 from 1 to 3\\nmove 2 from 2 to 1\\nmove 1 from 1 to 2\\n```\\n\\nGood luck transforming that into something reasonable :)\\n\\n\\n:::tip Fun fact\\n\\nTook me 40 minutes to parse this reasonably, including fighting the compiler.\\n\\n:::\\n\\n### Solution\\n\\nFor the initial solution I went with a manual solution (as in _I have done all_\\n_the work_. Later on I have decided to explore the `std` and interface of the\\n`std::vec::Vec` and found [`split_off`] which takes an index and splits (duh)\\nthe vector:\\n```rust\\nlet mut vec = vec![1, 2, 3];\\nlet vec2 = vec.split_off(1);\\nassert_eq!(vec, [1]);\\nassert_eq!(vec2, [2, 3]);\\n```\\n\\nThis helped me simplify my solution a lot and also get rid of some _edge cases_.\\n\\n## [Day 6: Tuning Trouble](https://adventofcode.com/2022/day/6)\\n\\n:::info tl;dr\\n\\nFinding start of the message in a very weird protocol. Start of the message is\\ndenoted by $N$ unique consecutive characters.\\n\\n:::\\n\\n### Solution\\n\\nA lot of different approaches, knowing that we are dealing with input consisting\\nsolely of ASCII letters, I bit the bullet and went with sliding window and\\nconstructing sets from that window, checking if the set is as big as the window.\\n\\nOne possible optimization could consist of keeping a bit-vector (i.e. `usize`\\nvariable) of encountered characters and updating it as we go. However this has\\na different issue and that is removal of the characters from the left side of the\\nwindow. We don\'t know if the same character is not included later on.\\n\\nOther option is to do similar thing, but keeping the frequencies of the letters,\\nand again knowing we have only ASCII letters we can optimize by having a vector\\nof 26 elements that keeps count for each lowercase letter.\\n\\n## [Day 7: No Space Left On Device](https://adventofcode.com/2022/day/7)\\n\\n:::info tl;dr\\n\\nLet\'s simulate [`du`] to get some stats about our file system and then pinpoint\\ndirectories that take a lot of space and should be deleted.\\n\\n:::\\n\\n> I was waiting for this moment, and yet it got me!\\n> *imagine me swearing for hours*\\n\\n### Solution\\n\\nWe need to \u201c_build_\u201d a file system from the input that is given in a following form:\\n```\\n$ cd /\\n$ ls\\ndir a\\n14848514 b.txt\\n8504156 c.dat\\ndir d\\n$ cd a\\n$ ls\\ndir e\\n29116 f\\n2557 g\\n62596 h.lst\\n$ cd e\\n$ ls\\n584 i\\n$ cd ..\\n$ cd ..\\n$ cd d\\n$ ls\\n4060174 j\\n8033020 d.log\\n5626152 d.ext\\n7214296 k\\n```\\n\\nThere are few ways in which you can achieve this and also you can assume some\\npreconditions, but why would we do that, right? :)\\n\\nYou can \u201cslap\u201d this in either [`HashMap`] or [`BTreeMap`] and call it a day.\\nAnd that would be boring\u2026\\n\\n:::tip\\n\\n`BTreeMap` is quite fitting for this, don\'t you think?\\n\\n:::\\n\\nI always wanted to try allocation on heap in Rust, so I chose to implement a tree.\\nI fought with the `Box` for some time and was losing\u2026\\n\\nThen I looked up some implementations of trees or linked lists and decided to try\\n`Rc>`. And I got my _ass whopped_ by the compiler once again. /o\\\\\\n\\n:::tip\\n\\n`Box` represents a dynamically allocated memory on heap. It is a single pointer,\\nyou can imagine this as `std::unique_ptr` in C++.\\n\\n`Rc` represents a dynamically allocated memory on heap. On top of that it is\\n_reference counted_ (that\'s what the `Rc` stands for). You can imagine this as\\n`std::shared_ptr` in C++.\\n\\nNow the fun stuff. Neither of them lets you **mutate** the contents of the memory.\\n\\n`Cell` allows you to mutate the memory. Can be used reasonably with types that\\ncan be copied, because the memory safety is guaranteed by copying the contents\\nwhen there is more than one **mutable** reference to the memory.\\n\\n`RefCell` is similar to the `Cell`, but the borrowing rules (how many mutable\\nreferences are present) are checked dynamically.\\n\\nSo in the end, if you want something like `std::shared_ptr` in Rust, you want\\nto have `Rc>`.\\n\\n:::\\n\\nSo, how are we going to represent the file system then? We will use an enumeration,\\nhehe, which is an algebraic data type that can store some stuff in itself :weary:\\n```rust\\ntype FileHandle = Rc>;\\n\\n#[derive(Debug)]\\nenum AocFile {\\n File(usize),\\n Directory(BTreeMap),\\n}\\n```\\n\\nLet\'s go over it! `FileHandle` represents dynamically allocated `AocFile`, not\\nmuch to discuss. What does the `#[derive(Debug)]` do though? It lets us to print\\nout the value of that enumeration, it\'s derived, so it\'s not as good as if we had\\nimplemented it ourselves, but it\'s good enough for debugging, hence the name.\\n\\nNow to the fun part! `AocFile` value can be represented in two ways:\\n- `File(usize)`, e.g. `AocFile::File(123)` and we can pattern match it, if we\\n need to\\n- `Directory(BTreeMap)` will represent the directory and will\\n contain map matching the name of the files (or directories) within to their\\n respective file handles\\n\\nI will omit the details about constructing this file system, cause there are a lot\\nof technicalities introduced by the nature of the input. However if you are\\ninterested, you can have a look at my solution.\\n\\nWe need to find small enough directories and also find the smallest directory that\\nwill free enough space. Now the question is, how could we do that. And there are\\nmultiple ways I will describe.\\n\\nI have chosen to implement [_tree catamorphism_] :weary:. It is basically a fold\\nover a tree data structure. We descent down into the leaves and propagate computed\\nresults all the way to the root. You can also notice that this approach is very\\nsimilar to _dynamic programming_, we find overlapping sections of the computation\\nand try to minimize the additional work (in this case: we need to know sizes of\\nour descendants, but we have already been there).\\n\\nAnother approach that has been suggested to me few days later is running DFS on\\nthe graph. And, funnily enough, we would still need to combine what we found in\\nthe branches where we descent. So in the end, it would work very similarly to my\\nsolution.\\n\\nOne of the more exotic options would be precomputing the required information at\\nthe same time as parsing. That could be done by adding additional fields to the\\nnodes which would allow storing such information and updating it as we construct\\nthe file system.\\n\\n## Post Mortem\\n\\nThings that have been brought up in the discussion later on.\\n\\n### `Rc` vs `Rc>`\\n\\nIt has been brought up that I have a contradicting statement regarding the\\ndynamically allocated memory. Specifically:\\n\\n- You can imagine `Rc` as an `std::shared_ptr` (in C++)\\n- When you want an equivalent of `std::shared_ptr`, you want to use\\n `Rc>`\\n\\nNow, in Rust it is a bit more complicated, because the type that represents the\\n\u201cshared pointer\u201d is `Rc`. What `RefCell` does is making sure that there is\\nonly one \u201cowner\u201d of a mutable reference at a time (and dynamically, as opposed\\nto the `Cell`).\\n\\nTherefore to be precise and correct about the equivalents of `std::shared_ptr`\\nin Rust, we can say that\\n\\n- `Rc` is an equivalent of a `const std::shared_ptr`,\\n- and `Rc>` is an equivalent of a `std::shared_ptr`.\\n\\nYou can easily see that they only differ in the mutability. (And even that is not\\nas simple as it seems, because there is also `Cell`)\\n\\n[_Advent of Code_]: https://adventofcode.com\\n[GitLab]: https://gitlab.com/mfocko/advent-of-code-2022\\n[`/src/bin/`]: https://gitlab.com/mfocko/advent-of-code-2022/-/tree/main/src/bin\\n[`sccache`]: https://github.com/mozilla/sccache\\n[`RangeInclusive`]: https://doc.rust-lang.org/std/ops/struct.RangeInclusive.html\\n[`split_off`]: https://doc.rust-lang.org/std/vec/struct.Vec.html#method.split_off\\n[`du`]: https://www.man7.org/linux/man-pages/man1/du.1.html\\n[`HashMap`]: https://doc.rust-lang.org/std/collections/struct.HashMap.html\\n[`BTreeMap`]: https://doc.rust-lang.org/std/collections/struct.BTreeMap.html\\n[_tree catamorphism_]: https://en.wikipedia.org/wiki/Catamorphism#Tree_fold"},{"id":"aoc-2022/intro","metadata":{"permalink":"/blog/aoc-2022/intro","editUrl":"https://github.com/mfocko/blog/tree/main/blog/aoc-2022/00-intro.md","source":"@site/blog/aoc-2022/00-intro.md","title":"Advent of Code \'22 in Rust","description":"Preparing for Advent of Code \'22.","date":"2022-12-14T21:45:00.000Z","formattedDate":"December 14, 2022","tags":[{"label":"advent-of-code","permalink":"/blog/tags/advent-of-code"},{"label":"advent-of-code-2022","permalink":"/blog/tags/advent-of-code-2022"},{"label":"rust","permalink":"/blog/tags/rust"}],"readingTime":8.665,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. @mf","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"Advent of Code \'22 in Rust","description":"Preparing for Advent of Code \'22.","date":"2022-12-14T21:45","slug":"aoc-2022/intro","authors":"mf","tags":["advent-of-code","advent-of-code-2022","rust"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"1st week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/1st-week"}},"content":"Let\'s talk about the preparations for this year\'s [_Advent of Code_].\\n\\n\x3c!--truncate--\x3e\\n\\n## Choosing a language\\n\\nWhen choosing a language for AoC, you usually want a language that gives you a\\nquick feedback which allows you to iterate quickly to the solution of the puzzle.\\nOne of the most common choices is Python, many people also use JavaScript or Ruby.\\n\\nGiven the competitive nature of the AoC and popularity among competitive programming,\\nC++ might be also a very good choice. Only if you are familiar with it, I guess\u2026\\n\\nIf you want a challenge, you might also choose to rotate the languages each day.\\nThough I prefer to use only one language.\\n\\nFor this year I have been deciding between _Rust_, _C++_ and _Pascal_ or _Ada_.\\n\\nI have tried Rust last year and have survived with it for 3 days and then gave\\nup and switched to _Kotlin_, which was pretty good given it is \u201cJava undercover\u201d.\\nI pretty much like the ideas behind Rust, I am not sure about the whole cult and\\nimplementation of those ideas though. After some years with C/C++, I would say\\nthat Rust feels _too safe_ for my taste and tries to \u201c_punish me_\u201d even for the\\nmost trivial things.\\n\\nC++ is a very robust, but also comes with a wide variety of options providing you\\nthe ability to shoot yourself in the leg. I have tried to solve few days of previous\\nAdvent of Code events, it was _relatively easy_ to solve the problems in C++, given\\nthat I do not admit writing my own iterator for `enumerate`\u2026\\n\\nPascal or Ada were meme choices :) Ada is heavily inspired by Pascal and has a\\npretty nice standard library that offers enough to be able to quickly solve some\\nproblems in it. However the toolkit is questionable :/\\n\\n## Choosing libraries\\n\\n## Preparations for Rust\\n\\nAll of the sources, later on including solutions, can be found at my\\n[GitLab].\\n\\n### Toolkit\\n\\nSince we are using Rust, we are going to use a [Cargo] and more than likely VSCode\\nwith [`rust-analyzer`]. Because of my choice of libraries, we will also introduce\\na `.envrc` file that can be used by [`direnv`], which allows you to set specific\\nenvironment variables when you enter a directory. In our case, we will use\\n```bash\\n# to show nice backtrace when using the color-eyre\\nexport RUST_BACKTRACE=1\\n\\n# to catch logs generated by tracing\\nexport RUST_LOG=trace\\n```\\n\\nAnd for the one of the most obnoxious things ever, we will use a script to download\\nthe inputs instead of \u201c_clicking, opening and copying to a file_\u201d[^1]. There is\\nno need to be _fancy_, so we will adjust Python script by Martin[^2].\\n```py\\n#!/usr/bin/env python3\\n\\nimport datetime\\nimport yaml\\nimport requests\\nimport sys\\n\\n\\ndef load_config():\\n with open(\\"env.yaml\\", \\"r\\") as f:\\n js = yaml.load(f, Loader=yaml.Loader)\\n return js[\\"session\\"], js[\\"year\\"]\\n\\n\\ndef get_input(session, year, day):\\n return requests.get(\\n f\\"https://adventofcode.com/{year}/day/{day}/input\\",\\n cookies={\\"session\\": session},\\n headers={\\n \\"User-Agent\\": \\"{repo} by {mail}\\".format(\\n repo=\\"gitlab.com/mfocko/advent-of-code-2022\\",\\n mail=\\"me@mfocko.xyz\\",\\n )\\n },\\n ).content.decode(\\"utf-8\\")\\n\\n\\ndef main():\\n day = datetime.datetime.now().day\\n if len(sys.argv) == 2:\\n day = sys.argv[1]\\n\\n session, year = load_config()\\n problem_input = get_input(session, year, day)\\n\\n with open(f\\"./inputs/day{day:>02}.txt\\", \\"w\\") as f:\\n f.write(problem_input)\\n\\n\\nif __name__ == \\"__main__\\":\\n main()\\n```\\n\\nIf the script is called without any arguments, it will deduce the day from the\\nsystem, so we do not need to change the day every morning. It also requires a\\nconfiguration file:\\n```yaml\\n# env.yaml\\nsession: \u2039your session cookie\u203a\\nyear: 2022\\n```\\n\\n### Libraries\\n\\nLooking at the list of the libraries, I have chosen \u201ca lot\u201d of them. Let\'s walk\\nthrough each of them.\\n\\n[`tracing`] and [`tracing-subscriber`] are the crates that can be used for tracing\\nand logging of your Rust programs, there are also other crates that can help you\\nwith providing backtrace to the Sentry in case you have deployed your application\\nsomewhere and you want to watch over it. In our use case we will just utilize the\\nmacros for debugging in the terminal.\\n\\n[`thiserror`], [`anyhow`] and [`color-eyre`] are used for error reporting.\\n`thiserror` is a very good choice for libraries, cause it extends the `Error`\\nfrom the `std` and allows you to create more convenient error types. Next is\\n`anyhow` which kinda builds on top of the `thiserror` and provides you with simpler\\nerror handling in binaries[^3]. And finally we have `color-eyre` which, as I found\\nout later, is a colorful (_wink wink_) extension of `eyre` which is fork of `anyhow`\\nwhile supporting customized reports.\\n\\nIn the end I have decided to remove `thiserror` and `anyhow`, since first one is\\nsuitable for libraries and the latter was basically fully replaced by `{color-,}eyre`.\\n\\n[`regex`] and [`lazy_static`] are a very good and also, I hope, self-explanatory\\ncombination. `lazy_static` allows you to have static variables that must be initialized\\nduring runtime.\\n\\n[`itertools`] provides some nice extensions to the iterators from the `std`.\\n\\n### My own \u201clibrary\u201d\\n\\nWhen creating the crate for this year\'s Advent of Code, I have chosen a library\\ntype. Even though standard library is huge, some things might not be included and\\nalso we can follow _KISS_. I have 2 modules that my \u201clibrary\u201d exports, one for\\nparsing and one for 2D vector (that gets used quite often during Advent of Code).\\n\\nKey part is, of course, processing the input and my library exports following\\nfunctions that get used a lot:\\n```rust\\n/// Reads file to the string.\\npub fn file_to_string>(pathname: P) -> String;\\n\\n/// Reads file and returns it as a vector of characters.\\npub fn file_to_chars>(pathname: P) -> Vec;\\n\\n/// Reads file and returns a vector of parsed structures. Expects each structure\\n/// on its own line in the file. And `T` needs to implement `FromStr` trait.\\npub fn file_to_structs, T: FromStr>(pathname: P) -> Vec\\nwhere\\n ::Err: Debug;\\n\\n/// Converts iterator over strings to a vector of parsed structures. `T` needs\\n/// to implement `FromStr` trait and its error must derive `Debug` trait.\\npub fn strings_to_structs(\\n iter: impl Iterator\\n) -> Vec\\nwhere\\n ::Err: std::fmt::Debug,\\n U: Deref;\\n\\n/// Reads file and returns it as a vector of its lines.\\npub fn file_to_lines>(pathname: P) -> Vec;\\n```\\n\\nAs for the vector, I went with a rather simple implementation that allows only\\naddition of the vectors for now and accessing the elements via functions `x()`\\nand `y()`. Also the vector is generic, so we can use it with any numeric type we\\nneed.\\n\\n### Skeleton\\n\\nWe can also prepare a template to quickly bootstrap each of the days. We know\\nthat each puzzle has 2 parts, which means that we can start with 2 functions that\\nwill solve them.\\n```rust\\nfn part1(input: &Input) -> Output {\\n todo!()\\n}\\n\\nfn part2(input: &Input) -> Output {\\n todo!()\\n}\\n```\\n\\nBoth functions take reference to the input and return some output (in majority\\nof puzzles, it is the same type). `todo!()` can be used as a nice placeholder,\\nit also causes a panic when reached and we could also provide some string with\\nan explanation, e.g. `todo!(\\"part 1\\")`. We have not given functions a specific\\ntype and to avoid as much copy-paste as possible, we will introduce type aliases.\\n```rust\\ntype Input = String;\\ntype Output = i32;\\n```\\n\\n:::tip\\n\\nThis allows us to quickly adjust the types only in one place without the need to\\ndo _regex-replace_ or replace them manually.\\n\\n:::\\n\\nFor each day we get a personalized input that is provided as a text file. Almost\\nall the time, we would like to get some structured type out of that input, and\\ntherefore it makes sense to introduce a new function that will provide the parsing\\nof the input.\\n```rust\\nfn parse_input(path: &str) -> Input {\\n todo!()\\n}\\n```\\n\\nThis \u201cparser\u201d will take a path to the file, just in case we would like to run the\\nsample instead of input.\\n\\nOK, so now we can write a `main` function that will take all of the pieces and\\nrun them.\\n```rust\\nfn main() {\\n let input = parse_input(\\"inputs/dayXX.txt\\");\\n\\n println!(\\"Part 1: {}\\", part_1(&input));\\n println!(\\"Part 2: {}\\", part_2(&input));\\n}\\n```\\n\\nThis would definitely do :) But we have installed a few libraries and we want to\\nuse them. In this part we are going to utilize _[`tracing`]_ (for tracing, duh\u2026)\\nand _[`color-eyre`]_ (for better error reporting, e.g. from parsing).\\n```rust\\nfn main() -> Result<()> {\\n tracing_subscriber::fmt()\\n .with_env_filter(EnvFilter::from_default_env())\\n .with_target(false)\\n .with_file(true)\\n .with_line_number(true)\\n .without_time()\\n .compact()\\n .init();\\n color_eyre::install()?;\\n\\n let input = parse_input(\\"inputs/dayXX.txt\\");\\n\\n info!(\\"Part 1: {}\\", part_1(&input));\\n info!(\\"Part 2: {}\\", part_2(&input));\\n\\n Ok(())\\n}\\n```\\n\\nThe first statement will set up tracing and configure it to print out the logs to\\nterminal, based on the environment variable. We also change the formatting a bit,\\nsince we do not need all the _fancy_ features of the logger. Pure initialization\\nwould get us logs like this:\\n```\\n2022-12-11T19:53:19.975343Z INFO day01: Part 1: 0\\n```\\n\\nHowever after running that command, we will get the following:\\n```\\n INFO src/bin/day01.rs:35: Part 1: 0\\n```\\n\\nAnd the `color_eyre::install()?` is quite straightforward. We just initialize the\\nerror reporting by _color eyre_.\\n\\n:::caution\\n\\nNotice that we had to add `Ok(())` to the end of the function and adjust the\\nreturn type of the `main` to `Result<()>`. It is caused by the _color eyre_ that\\ncan be installed only once and therefore it can fail, that is how we got the `?`\\nat the end of the `::install` which _unwraps_ the **\xbbresult\xab** of the installation.\\n\\n:::\\n\\nOverall we will get to a template like this:\\n```rust\\nuse aoc_2022::*;\\n\\nuse color_eyre::eyre::Result;\\nuse tracing::info;\\nuse tracing_subscriber::EnvFilter;\\n\\ntype Input = String;\\ntype Output = i32;\\n\\nfn parse_input(path: &str) -> Input {\\n todo!()\\n}\\n\\nfn part1(input: &Input) -> Output {\\n todo!()\\n}\\n\\nfn part2(input: &Input) -> Output {\\n todo!()\\n}\\n\\nfn main() -> Result<()> {\\n tracing_subscriber::fmt()\\n .with_env_filter(EnvFilter::from_default_env())\\n .with_target(false)\\n .with_file(true)\\n .with_line_number(true)\\n .without_time()\\n .compact()\\n .init();\\n color_eyre::install()?;\\n\\n let input = parse_input(\\"inputs/dayXX.txt\\");\\n\\n info!(\\"Part 1: {}\\", part_1(&input));\\n info!(\\"Part 2: {}\\", part_2(&input));\\n\\n Ok(())\\n}\\n```\\n\\n[^1]: Copy-pasting might be a relaxing thing to do, but you can also discover\\nnasty stuff about your PC. See [this Reddit post and the comment].\\n[^2]: [GitHub profile](https://github.com/martinjonas)\\n[^3]: Even though you can use it even for libraries, but handling errors from\\nlibraries using `anyhow` is nasty\u2026 You will be the stinky one ;)\\n\\n[_Advent of Code_]: https://adventofcode.com\\n[GitLab]: https://gitlab.com/mfocko/advent-of-code-2022\\n[Cargo]: https://doc.rust-lang.org/cargo/\\n[`rust-analyzer`]: https://rust-analyzer.github.io/\\n[`direnv`]: https://direnv.net/\\n[`tracing`]: https://crates.io/crates/tracing\\n[`tracing-subscriber`]: https://crates.io/crates/tracing-subscriber\\n[`thiserror`]: https://crates.io/crates/thiserror\\n[`anyhow`]: https://crates.io/crates/anyhow\\n[`color-eyre`]: https://crates.io/crates/color-eyre\\n[`regex`]: https://crates.io/crates/regex\\n[`lazy_static`]: https://crates.io/crates/lazy_static\\n[`itertools`]: https://crates.io/crates/itertools\\n[this Reddit post and the comment]: https://www.reddit.com/r/adventofcode/comments/zb98pn/comment/iyq0ono"}]}')}}]); \ No newline at end of file diff --git a/assets/js/595c7293.6c273bef.js b/assets/js/595c7293.6ef41b13.js similarity index 98% rename from assets/js/595c7293.6c273bef.js rename to assets/js/595c7293.6ef41b13.js index 497ea2d..90ff738 100644 --- a/assets/js/595c7293.6c273bef.js +++ b/assets/js/595c7293.6ef41b13.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[5634],{58396:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>l});var i=t(85893),s=t(11151);const r={id:"seminar-08",title:"8th seminar",description:"Manipulating with files only char-by-char and a magic tree.\n"},o="8th seminar bonus assignment",c={id:"bonuses/seminar-08",title:"8th seminar",description:"Manipulating with files only char-by-char and a magic tree.\n",source:"@site/c/bonuses/08.md",sourceDirName:"bonuses",slug:"/bonuses/seminar-08",permalink:"/c/bonuses/seminar-08",draft:!1,unlisted:!1,editUrl:"https://github.com/mfocko/blog/tree/main/c/bonuses/08.md",tags:[],version:"current",lastUpdatedAt:1704291155,formattedLastUpdatedAt:"Jan 3, 2024",frontMatter:{id:"seminar-08",title:"8th seminar",description:"Manipulating with files only char-by-char and a magic tree.\n"},sidebar:"autogeneratedBar",previous:{title:"5th and 6th seminar",permalink:"/c/bonuses/seminar-05-06"},next:{title:"10th seminar",permalink:"/c/bonuses/seminar-10"}},a={},l=[{value:"Introduction",id:"introduction",level:2},{value:"Warning",id:"warning",level:2},{value:"Testing",id:"testing",level:2},{value:"Task no. 1: Counting (0.75 K\u20a1)",id:"task-no-1-counting-075-k",level:2},{value:"Requirements",id:"requirements",level:3},{value:"Bonus part (0.75 K\u20a1)",id:"bonus-part-075-k",level:3},{value:"Task no. 2: Weird trees (1 K\u20a1)",id:"task-no-2-weird-trees-1-k",level:2},{value:"Submitting",id:"submitting",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",hr:"hr",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"8th-seminar-bonus-assignment",children:"8th seminar bonus assignment"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"pathname:///files/c/bonuses/08.tar.gz",children:"Source"})}),"\n",(0,i.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,i.jsx)(n.p,{children:"In this bonus you can implement two tasks, one of them has a bonus part with generic\nsolution."}),"\n",(0,i.jsx)(n.p,{children:"One is focused on counting ananas or in case of generic version any substring in\nthe file, but with a restriction on the function you use."}),"\n",(0,i.jsx)(n.p,{children:"Other one has a more algorithmic spirit."}),"\n",(0,i.jsx)(n.p,{children:"For this bonus you can get at maximum 2.5 K\u20a1."}),"\n",(0,i.jsx)(n.h2,{id:"warning",children:"Warning"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"DO NOT COMMIT test data"})," to your own git repository, since the tests include\nfiles that exceed 10MB by themselves. Even if they are on separate branch, they\ntake up the space."]}),"\n",(0,i.jsx)(n.h2,{id:"testing",children:"Testing"}),"\n",(0,i.jsxs)(n.p,{children:["For testing you are provided with python script (requires ",(0,i.jsx)(n.code,{children:"click"})," to be installed:\n",(0,i.jsx)(n.code,{children:"pip3 install --user click"}),") and ",(0,i.jsx)(n.code,{children:"Makefile"})," that provides following targets:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"check-counting"})," - runs the ",(0,i.jsx)(n.code,{children:"counting"})," tests"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"check-counting-bonus"})," - runs the ",(0,i.jsx)(n.code,{children:"counting"})," tests with bonus implemented"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"check"})," - runs both ",(0,i.jsx)(n.code,{children:"counting"})," and ",(0,i.jsx)(n.code,{children:"counting-bonus"})," tests"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"clean"})," - removes output files from the test runs"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"task-no-1-counting-075-k",children:"Task no. 1: Counting (0.75 K\u20a1)"}),"\n",(0,i.jsx)(n.p,{children:"Your first task is to make smallish program that counts occurences of specific\n(or given) word from file and writes the number to other file."}),"\n",(0,i.jsx)(n.p,{children:"Usage of the program is:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"Usage: ./counting [string-to-be-counted]\n"})}),"\n",(0,i.jsx)(n.p,{children:"Arguments that are passed to the program represent:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:""})," - path to the file where we count the words"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:""})," - path to the file where we output the count"]}),"\n",(0,i.jsxs)(n.li,{children:["(optional argument) ",(0,i.jsx)(n.code,{children:"[string-to-be-counted]"})," - in case you implement bonus,\notherwise we default to word ",(0,i.jsx)(n.code,{children:"ananas"})," ;)"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"In skeleton you are given 3 empty, but documented, functions to implement."}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"count_anything"})," - function accepts input file and substring to be counted in\nthe file, returns the count."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"count_ananas"})," - same as ",(0,i.jsx)(n.code,{children:"count_anything"}),", but specialized for ananases, the\ndefault implementation from the skeleton expects you to implement ",(0,i.jsx)(n.code,{children:"count_anything"}),"\nand therefore it just calls the other function."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"write_number"})," - function that writes the number to the file, why would you\nneed the function is explained later :)"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"requirements",children:"Requirements"}),"\n",(0,i.jsxs)(n.p,{children:["For manipulation with the files you are only allowed to use ",(0,i.jsx)(n.code,{children:"fopen"}),", ",(0,i.jsx)(n.code,{children:"fclose"}),",\n",(0,i.jsx)(n.code,{children:"fgetc"})," and ",(0,i.jsx)(n.code,{children:"fputc"}),". Functions like ",(0,i.jsx)(n.code,{children:"fprintf"})," (except for ",(0,i.jsx)(n.code,{children:"stderr"})," or logging) and\n",(0,i.jsx)(n.code,{children:"fscanf"})," are ",(0,i.jsx)(n.strong,{children:"forbidden"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"In case you struggle and want to use one of those functions, the solution will be\npenalized by 50% of points."}),"\n",(0,i.jsx)(n.h3,{id:"bonus-part-075-k",children:"Bonus part (0.75 K\u20a1)"}),"\n",(0,i.jsxs)(n.p,{children:["Bonus part of this assignment is to implement ",(0,i.jsx)(n.code,{children:"count_anything"})," rather than ",(0,i.jsx)(n.code,{children:"count_ananas"}),"."]}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"Smaller hint: This task does not need dynamic allocation :) You just need one\ngood helper function and the right idea ;)"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"task-no-2-weird-trees-1-k",children:"Task no. 2: Weird trees (1 K\u20a1)"}),"\n",(0,i.jsxs)(n.p,{children:["In this task we are crossing our paths with ",(0,i.jsx)(n.em,{children:"algorithms and data structures"}),".\nYour task is to write a program that constructs tree from the file that is given\nas an argument and pretty-prints it."]}),"\n",(0,i.jsxs)(n.p,{children:["Input file consists of lines, that include ",(0,i.jsx)(n.code,{children:"key"})," and ",(0,i.jsx)(n.code,{children:"rank"})," in form ",(0,i.jsx)(n.code,{children:"key;rank"}),"\nor ",(0,i.jsx)(n.code,{children:"nil"}),". Why would we have ",(0,i.jsx)(n.code,{children:"nil"})," in a file? The file represents pre-order iteration\nthrough the tree. Leaves never have rank different than 0, so you can safely assume\n2 non-existing ",(0,i.jsx)(n.code,{children:"nil"}),"s in the input after you read such node ;)"]}),"\n",(0,i.jsxs)("table",{children:[(0,i.jsxs)("tr",{children:[(0,i.jsx)("th",{children:"Example input file"}),(0,i.jsx)("th",{children:"Tree it represents"})]}),(0,i.jsxs)("tr",{children:[(0,i.jsx)("td",{children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"8;4\n5;3\n3;2\n2;1\n1;0\nnil\n4;0\n7;1\n6;0\nnil\n11;2\n10;1\n9;0\nnil\n12;0\n"})})}),(0,i.jsx)("td",{children:(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"tree",src:t(30073).Z+"",width:"633",height:"684"})})})]})]}),"\n",(0,i.jsxs)(n.p,{children:["In this task you are only provided with different trees in the ",(0,i.jsx)(n.code,{children:"test-trees"})," directory.\nImplementation and format of the pretty-print is totally up to you. :)"]}),"\n",(0,i.jsx)(n.p,{children:"Example of mine for the tree above:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"8 (rank = 4)\n+-- 5 (rank = 3)\n| +-- 3 (rank = 2)\n| | +-- 2 (rank = 1)\n| | | +-- 1 (rank = 0)\n| | +-- 4 (rank = 0)\n| +-- 7 (rank = 1)\n| +-- 6 (rank = 0)\n+-- 11 (rank = 2)\n +-- 10 (rank = 1)\n | +-- 9 (rank = 0)\n +-- 12 (rank = 0)\n"})}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"Can you find out what are those trees? :)"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"submitting",children:"Submitting"}),"\n",(0,i.jsx)(n.p,{children:"In case you have any questions, feel free to reach out to me."}),"\n",(0,i.jsx)(n.hr,{})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},30073:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/tree-c9e37f87f9095c00fad33ea034485ce6.png"},11151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>o});var i=t(67294);const s={},r=i.createContext(s);function o(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[5634],{58396:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>l});var i=t(85893),s=t(11151);const r={id:"seminar-08",title:"8th seminar",description:"Manipulating with files only char-by-char and a magic tree.\n"},o="8th seminar bonus assignment",c={id:"bonuses/seminar-08",title:"8th seminar",description:"Manipulating with files only char-by-char and a magic tree.\n",source:"@site/c/bonuses/08.md",sourceDirName:"bonuses",slug:"/bonuses/seminar-08",permalink:"/c/bonuses/seminar-08",draft:!1,unlisted:!1,editUrl:"https://github.com/mfocko/blog/tree/main/c/bonuses/08.md",tags:[],version:"current",lastUpdatedAt:1704558496,formattedLastUpdatedAt:"Jan 6, 2024",frontMatter:{id:"seminar-08",title:"8th seminar",description:"Manipulating with files only char-by-char and a magic tree.\n"},sidebar:"autogeneratedBar",previous:{title:"5th and 6th seminar",permalink:"/c/bonuses/seminar-05-06"},next:{title:"10th seminar",permalink:"/c/bonuses/seminar-10"}},a={},l=[{value:"Introduction",id:"introduction",level:2},{value:"Warning",id:"warning",level:2},{value:"Testing",id:"testing",level:2},{value:"Task no. 1: Counting (0.75 K\u20a1)",id:"task-no-1-counting-075-k",level:2},{value:"Requirements",id:"requirements",level:3},{value:"Bonus part (0.75 K\u20a1)",id:"bonus-part-075-k",level:3},{value:"Task no. 2: Weird trees (1 K\u20a1)",id:"task-no-2-weird-trees-1-k",level:2},{value:"Submitting",id:"submitting",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",hr:"hr",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"8th-seminar-bonus-assignment",children:"8th seminar bonus assignment"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"pathname:///files/c/bonuses/08.tar.gz",children:"Source"})}),"\n",(0,i.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,i.jsx)(n.p,{children:"In this bonus you can implement two tasks, one of them has a bonus part with generic\nsolution."}),"\n",(0,i.jsx)(n.p,{children:"One is focused on counting ananas or in case of generic version any substring in\nthe file, but with a restriction on the function you use."}),"\n",(0,i.jsx)(n.p,{children:"Other one has a more algorithmic spirit."}),"\n",(0,i.jsx)(n.p,{children:"For this bonus you can get at maximum 2.5 K\u20a1."}),"\n",(0,i.jsx)(n.h2,{id:"warning",children:"Warning"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"DO NOT COMMIT test data"})," to your own git repository, since the tests include\nfiles that exceed 10MB by themselves. Even if they are on separate branch, they\ntake up the space."]}),"\n",(0,i.jsx)(n.h2,{id:"testing",children:"Testing"}),"\n",(0,i.jsxs)(n.p,{children:["For testing you are provided with python script (requires ",(0,i.jsx)(n.code,{children:"click"})," to be installed:\n",(0,i.jsx)(n.code,{children:"pip3 install --user click"}),") and ",(0,i.jsx)(n.code,{children:"Makefile"})," that provides following targets:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"check-counting"})," - runs the ",(0,i.jsx)(n.code,{children:"counting"})," tests"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"check-counting-bonus"})," - runs the ",(0,i.jsx)(n.code,{children:"counting"})," tests with bonus implemented"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"check"})," - runs both ",(0,i.jsx)(n.code,{children:"counting"})," and ",(0,i.jsx)(n.code,{children:"counting-bonus"})," tests"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"clean"})," - removes output files from the test runs"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"task-no-1-counting-075-k",children:"Task no. 1: Counting (0.75 K\u20a1)"}),"\n",(0,i.jsx)(n.p,{children:"Your first task is to make smallish program that counts occurences of specific\n(or given) word from file and writes the number to other file."}),"\n",(0,i.jsx)(n.p,{children:"Usage of the program is:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"Usage: ./counting [string-to-be-counted]\n"})}),"\n",(0,i.jsx)(n.p,{children:"Arguments that are passed to the program represent:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:""})," - path to the file where we count the words"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:""})," - path to the file where we output the count"]}),"\n",(0,i.jsxs)(n.li,{children:["(optional argument) ",(0,i.jsx)(n.code,{children:"[string-to-be-counted]"})," - in case you implement bonus,\notherwise we default to word ",(0,i.jsx)(n.code,{children:"ananas"})," ;)"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"In skeleton you are given 3 empty, but documented, functions to implement."}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"count_anything"})," - function accepts input file and substring to be counted in\nthe file, returns the count."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"count_ananas"})," - same as ",(0,i.jsx)(n.code,{children:"count_anything"}),", but specialized for ananases, the\ndefault implementation from the skeleton expects you to implement ",(0,i.jsx)(n.code,{children:"count_anything"}),"\nand therefore it just calls the other function."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"write_number"})," - function that writes the number to the file, why would you\nneed the function is explained later :)"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"requirements",children:"Requirements"}),"\n",(0,i.jsxs)(n.p,{children:["For manipulation with the files you are only allowed to use ",(0,i.jsx)(n.code,{children:"fopen"}),", ",(0,i.jsx)(n.code,{children:"fclose"}),",\n",(0,i.jsx)(n.code,{children:"fgetc"})," and ",(0,i.jsx)(n.code,{children:"fputc"}),". Functions like ",(0,i.jsx)(n.code,{children:"fprintf"})," (except for ",(0,i.jsx)(n.code,{children:"stderr"})," or logging) and\n",(0,i.jsx)(n.code,{children:"fscanf"})," are ",(0,i.jsx)(n.strong,{children:"forbidden"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"In case you struggle and want to use one of those functions, the solution will be\npenalized by 50% of points."}),"\n",(0,i.jsx)(n.h3,{id:"bonus-part-075-k",children:"Bonus part (0.75 K\u20a1)"}),"\n",(0,i.jsxs)(n.p,{children:["Bonus part of this assignment is to implement ",(0,i.jsx)(n.code,{children:"count_anything"})," rather than ",(0,i.jsx)(n.code,{children:"count_ananas"}),"."]}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"Smaller hint: This task does not need dynamic allocation :) You just need one\ngood helper function and the right idea ;)"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"task-no-2-weird-trees-1-k",children:"Task no. 2: Weird trees (1 K\u20a1)"}),"\n",(0,i.jsxs)(n.p,{children:["In this task we are crossing our paths with ",(0,i.jsx)(n.em,{children:"algorithms and data structures"}),".\nYour task is to write a program that constructs tree from the file that is given\nas an argument and pretty-prints it."]}),"\n",(0,i.jsxs)(n.p,{children:["Input file consists of lines, that include ",(0,i.jsx)(n.code,{children:"key"})," and ",(0,i.jsx)(n.code,{children:"rank"})," in form ",(0,i.jsx)(n.code,{children:"key;rank"}),"\nor ",(0,i.jsx)(n.code,{children:"nil"}),". Why would we have ",(0,i.jsx)(n.code,{children:"nil"})," in a file? The file represents pre-order iteration\nthrough the tree. Leaves never have rank different than 0, so you can safely assume\n2 non-existing ",(0,i.jsx)(n.code,{children:"nil"}),"s in the input after you read such node ;)"]}),"\n",(0,i.jsxs)("table",{children:[(0,i.jsxs)("tr",{children:[(0,i.jsx)("th",{children:"Example input file"}),(0,i.jsx)("th",{children:"Tree it represents"})]}),(0,i.jsxs)("tr",{children:[(0,i.jsx)("td",{children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"8;4\n5;3\n3;2\n2;1\n1;0\nnil\n4;0\n7;1\n6;0\nnil\n11;2\n10;1\n9;0\nnil\n12;0\n"})})}),(0,i.jsx)("td",{children:(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"tree",src:t(30073).Z+"",width:"633",height:"684"})})})]})]}),"\n",(0,i.jsxs)(n.p,{children:["In this task you are only provided with different trees in the ",(0,i.jsx)(n.code,{children:"test-trees"})," directory.\nImplementation and format of the pretty-print is totally up to you. :)"]}),"\n",(0,i.jsx)(n.p,{children:"Example of mine for the tree above:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"8 (rank = 4)\n+-- 5 (rank = 3)\n| +-- 3 (rank = 2)\n| | +-- 2 (rank = 1)\n| | | +-- 1 (rank = 0)\n| | +-- 4 (rank = 0)\n| +-- 7 (rank = 1)\n| +-- 6 (rank = 0)\n+-- 11 (rank = 2)\n +-- 10 (rank = 1)\n | +-- 9 (rank = 0)\n +-- 12 (rank = 0)\n"})}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"Can you find out what are those trees? :)"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"submitting",children:"Submitting"}),"\n",(0,i.jsx)(n.p,{children:"In case you have any questions, feel free to reach out to me."}),"\n",(0,i.jsx)(n.hr,{})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},30073:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/tree-c9e37f87f9095c00fad33ea034485ce6.png"},11151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>o});var i=t(67294);const s={},r=i.createContext(s);function o(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7052c0bc.54d577f1.js b/assets/js/7052c0bc.acb5879a.js similarity index 90% rename from assets/js/7052c0bc.54d577f1.js rename to assets/js/7052c0bc.acb5879a.js index f5608aa..7c46b85 100644 --- a/assets/js/7052c0bc.54d577f1.js +++ b/assets/js/7052c0bc.acb5879a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[9731],{42286:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>s,contentTitle:()=>c,default:()=>d,frontMatter:()=>i,metadata:()=>a,toc:()=>p});var o=n(85893),r=n(11151);const i={id:"cpp-intro",title:"Introduction",slug:"/"},c=void 0,a={id:"cpp-intro",title:"Introduction",description:"",source:"@site/cpp/00-intro.md",sourceDirName:".",slug:"/",permalink:"/cpp/",draft:!1,unlisted:!1,editUrl:"https://github.com/mfocko/blog/tree/main/cpp/00-intro.md",tags:[],version:"current",lastUpdatedAt:1704291155,formattedLastUpdatedAt:"Jan 3, 2024",sidebarPosition:0,frontMatter:{id:"cpp-intro",title:"Introduction",slug:"/"},sidebar:"autogeneratedBar",next:{title:"Exceptions and RAII",permalink:"/cpp/category/exceptions-and-raii"}},s={},p=[];function u(t){return(0,o.jsx)(o.Fragment,{})}function d(t={}){const{wrapper:e}={...(0,r.a)(),...t.components};return e?(0,o.jsx)(e,{...t,children:(0,o.jsx)(u,{...t})}):u()}},11151:(t,e,n)=>{n.d(e,{Z:()=>a,a:()=>c});var o=n(67294);const r={},i=o.createContext(r);function c(t){const e=o.useContext(i);return o.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function a(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(r):t.components||r:c(t.components),o.createElement(i.Provider,{value:e},t.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[9731],{42286:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>s,contentTitle:()=>c,default:()=>d,frontMatter:()=>i,metadata:()=>a,toc:()=>p});var o=n(85893),r=n(11151);const i={id:"cpp-intro",title:"Introduction",slug:"/"},c=void 0,a={id:"cpp-intro",title:"Introduction",description:"",source:"@site/cpp/00-intro.md",sourceDirName:".",slug:"/",permalink:"/cpp/",draft:!1,unlisted:!1,editUrl:"https://github.com/mfocko/blog/tree/main/cpp/00-intro.md",tags:[],version:"current",lastUpdatedAt:1704558496,formattedLastUpdatedAt:"Jan 6, 2024",sidebarPosition:0,frontMatter:{id:"cpp-intro",title:"Introduction",slug:"/"},sidebar:"autogeneratedBar",next:{title:"Exceptions and RAII",permalink:"/cpp/category/exceptions-and-raii"}},s={},p=[];function u(t){return(0,o.jsx)(o.Fragment,{})}function d(t={}){const{wrapper:e}={...(0,r.a)(),...t.components};return e?(0,o.jsx)(e,{...t,children:(0,o.jsx)(u,{...t})}):u()}},11151:(t,e,n)=>{n.d(e,{Z:()=>a,a:()=>c});var o=n(67294);const r={},i=o.createContext(r);function c(t){const e=o.useContext(i);return o.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function a(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(r):t.components||r:c(t.components),o.createElement(i.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/794ef108.5b256546.js b/assets/js/794ef108.b36337bc.js similarity index 95% rename from assets/js/794ef108.5b256546.js rename to assets/js/794ef108.b36337bc.js index c521a1a..44a7385 100644 --- a/assets/js/794ef108.5b256546.js +++ b/assets/js/794ef108.b36337bc.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[3803],{86427:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>a,contentTitle:()=>s,default:()=>l,frontMatter:()=>i,metadata:()=>c,toc:()=>u});var o=n(85893),r=n(11151);const i={id:"c-intro",title:"Introduction",slug:"/"},s=void 0,c={id:"c-intro",title:"Introduction",description:"",source:"@site/c/00-intro.md",sourceDirName:".",slug:"/",permalink:"/c/",draft:!1,unlisted:!1,editUrl:"https://github.com/mfocko/blog/tree/main/c/00-intro.md",tags:[],version:"current",lastUpdatedAt:1704291155,formattedLastUpdatedAt:"Jan 3, 2024",sidebarPosition:0,frontMatter:{id:"c-intro",title:"Introduction",slug:"/"},sidebar:"autogeneratedBar",next:{title:"Bonuses",permalink:"/c/category/bonuses"}},a={},u=[];function d(t){return(0,o.jsx)(o.Fragment,{})}function l(t={}){const{wrapper:e}={...(0,r.a)(),...t.components};return e?(0,o.jsx)(e,{...t,children:(0,o.jsx)(d,{...t})}):d()}},11151:(t,e,n)=>{n.d(e,{Z:()=>c,a:()=>s});var o=n(67294);const r={},i=o.createContext(r);function s(t){const e=o.useContext(i);return o.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function c(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(r):t.components||r:s(t.components),o.createElement(i.Provider,{value:e},t.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[3803],{86427:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>a,contentTitle:()=>s,default:()=>l,frontMatter:()=>i,metadata:()=>c,toc:()=>u});var o=n(85893),r=n(11151);const i={id:"c-intro",title:"Introduction",slug:"/"},s=void 0,c={id:"c-intro",title:"Introduction",description:"",source:"@site/c/00-intro.md",sourceDirName:".",slug:"/",permalink:"/c/",draft:!1,unlisted:!1,editUrl:"https://github.com/mfocko/blog/tree/main/c/00-intro.md",tags:[],version:"current",lastUpdatedAt:1704558496,formattedLastUpdatedAt:"Jan 6, 2024",sidebarPosition:0,frontMatter:{id:"c-intro",title:"Introduction",slug:"/"},sidebar:"autogeneratedBar",next:{title:"Bonuses",permalink:"/c/category/bonuses"}},a={},u=[];function d(t){return(0,o.jsx)(o.Fragment,{})}function l(t={}){const{wrapper:e}={...(0,r.a)(),...t.components};return e?(0,o.jsx)(e,{...t,children:(0,o.jsx)(d,{...t})}):d()}},11151:(t,e,n)=>{n.d(e,{Z:()=>c,a:()=>s});var o=n(67294);const r={},i=o.createContext(r);function s(t){const e=o.useContext(i);return o.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function c(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(r):t.components||r:s(t.components),o.createElement(i.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/84d1e0d8.e078634a.js b/assets/js/84d1e0d8.f2e0ffd7.js similarity index 94% rename from assets/js/84d1e0d8.e078634a.js rename to assets/js/84d1e0d8.f2e0ffd7.js index d86312a..11fb33d 100644 --- a/assets/js/84d1e0d8.e078634a.js +++ b/assets/js/84d1e0d8.f2e0ffd7.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[1885],{49713:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var o=n(85893),s=n(11151);const r={id:"algorithms-intro",title:"Introduction",slug:"/"},i=void 0,a={id:"algorithms-intro",title:"Introduction",description:"In this part you can find \u201crandom\u201d additional materials I have written over the",source:"@site/algorithms/00-intro.md",sourceDirName:".",slug:"/",permalink:"/algorithms/",draft:!1,unlisted:!1,editUrl:"https://github.com/mfocko/blog/tree/main/algorithms/00-intro.md",tags:[],version:"current",lastUpdatedAt:1704291155,formattedLastUpdatedAt:"Jan 3, 2024",sidebarPosition:0,frontMatter:{id:"algorithms-intro",title:"Introduction",slug:"/"},sidebar:"autogeneratedBar",next:{title:"Algorithms and Correctness",permalink:"/algorithms/category/algorithms-and-correctness"}},c={},d=[];function l(t){const e={a:"a",em:"em",p:"p",...(0,s.a)(),...t.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(e.p,{children:["In this part you can find \u201crandom\u201d additional materials I have written over the\ncourse of teaching ",(0,o.jsx)(e.em,{children:"Algorithms and data structures I"}),"."]}),"\n",(0,o.jsx)(e.p,{children:"It is a various mix of stuff that may have been produced as a follow-up on some\nquestion asked at the seminar or spontanously."}),"\n",(0,o.jsxs)(e.p,{children:["If you have some ideas for posts, please do not hesitate to submit them as issues\nin the linked ",(0,o.jsx)(e.a,{href:"https://gitlab.fi.muni.cz/xfocko/kb/issues",children:"GitLab"}),"."]})]})}function u(t={}){const{wrapper:e}={...(0,s.a)(),...t.components};return e?(0,o.jsx)(e,{...t,children:(0,o.jsx)(l,{...t})}):l(t)}},11151:(t,e,n)=>{n.d(e,{Z:()=>a,a:()=>i});var o=n(67294);const s={},r=o.createContext(s);function i(t){const e=o.useContext(r);return o.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function a(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(s):t.components||s:i(t.components),o.createElement(r.Provider,{value:e},t.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[1885],{49713:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var o=n(85893),s=n(11151);const r={id:"algorithms-intro",title:"Introduction",slug:"/"},i=void 0,a={id:"algorithms-intro",title:"Introduction",description:"In this part you can find \u201crandom\u201d additional materials I have written over the",source:"@site/algorithms/00-intro.md",sourceDirName:".",slug:"/",permalink:"/algorithms/",draft:!1,unlisted:!1,editUrl:"https://github.com/mfocko/blog/tree/main/algorithms/00-intro.md",tags:[],version:"current",lastUpdatedAt:1704558496,formattedLastUpdatedAt:"Jan 6, 2024",sidebarPosition:0,frontMatter:{id:"algorithms-intro",title:"Introduction",slug:"/"},sidebar:"autogeneratedBar",next:{title:"Algorithms and Correctness",permalink:"/algorithms/category/algorithms-and-correctness"}},c={},d=[];function l(t){const e={a:"a",em:"em",p:"p",...(0,s.a)(),...t.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(e.p,{children:["In this part you can find \u201crandom\u201d additional materials I have written over the\ncourse of teaching ",(0,o.jsx)(e.em,{children:"Algorithms and data structures I"}),"."]}),"\n",(0,o.jsx)(e.p,{children:"It is a various mix of stuff that may have been produced as a follow-up on some\nquestion asked at the seminar or spontanously."}),"\n",(0,o.jsxs)(e.p,{children:["If you have some ideas for posts, please do not hesitate to submit them as issues\nin the linked ",(0,o.jsx)(e.a,{href:"https://gitlab.fi.muni.cz/xfocko/kb/issues",children:"GitLab"}),"."]})]})}function u(t={}){const{wrapper:e}={...(0,s.a)(),...t.components};return e?(0,o.jsx)(e,{...t,children:(0,o.jsx)(l,{...t})}):l(t)}},11151:(t,e,n)=>{n.d(e,{Z:()=>a,a:()=>i});var o=n(67294);const s={},r=o.createContext(s);function i(t){const e=o.useContext(r);return o.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function a(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(s):t.components||s:i(t.components),o.createElement(r.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/b1288602.2a7bb9cd.js b/assets/js/b1288602.fa264713.js similarity index 98% rename from assets/js/b1288602.2a7bb9cd.js rename to assets/js/b1288602.fa264713.js index d565b63..249fede 100644 --- a/assets/js/b1288602.2a7bb9cd.js +++ b/assets/js/b1288602.fa264713.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[59],{51456:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>a,toc:()=>h});var r=t(85893),s=t(11151);const o={title:"Submitting merge requests"},i="Submitting merge requests for review",a={id:"mr",title:"Submitting merge requests",description:"This tutorial aims to show you how to follow basic git workflow and submit changes",source:"@site/c/mr.md",sourceDirName:".",slug:"/mr",permalink:"/c/mr",draft:!1,unlisted:!1,editUrl:"https://github.com/mfocko/blog/tree/main/c/mr.md",tags:[],version:"current",lastUpdatedAt:1704291155,formattedLastUpdatedAt:"Jan 3, 2024",frontMatter:{title:"Submitting merge requests"},sidebar:"autogeneratedBar",previous:{title:"Practice exam C",permalink:"/c/pexam/cams"}},c={},h=[{value:"Tutorial",id:"tutorial",level:2},{value:"Step #1 - Starting from the clean repository",id:"step-1---starting-from-the-clean-repository",level:3},{value:"Step #2 - Create new branch",id:"step-2---create-new-branch",level:3},{value:"Step #3 - Do the assignment",id:"step-3---do-the-assignment",level:3},{value:"Step #4 - Commit and upload the changes to GitLab",id:"step-4---commit-and-upload-the-changes-to-gitlab",level:3},{value:"Step #5 - Creating a merge request manually",id:"step-5---creating-a-merge-request-manually",level:3},{value:"Step #6 - Set assignees",id:"step-6---set-assignees",level:3},{value:"Step #7 - Return to default branch",id:"step-7---return-to-default-branch",level:3}];function l(e){const n={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",hr:"hr",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,s.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"submitting-merge-requests-for-review",children:"Submitting merge requests for review"}),"\n",(0,r.jsxs)(n.p,{children:["This tutorial aims to show you how to follow basic git workflow and submit changes\nthrough ",(0,r.jsx)(n.em,{children:"Merge Requests"})," for review."]}),"\n",(0,r.jsxs)(n.p,{children:["The rudimentary idea behind aims for changes to be present on a separate branch\nthat is supposedly ",(0,r.jsx)(n.em,{children:"merged"})," into the default branch. Till then changes can be reviewed\non ",(0,r.jsx)(n.em,{children:"Merge Request"})," and additional changes may be made based on the reviews. Once\nthe changes satisfy requirements, the merge request is merged."]}),"\n",(0,r.jsx)(n.h2,{id:"tutorial",children:"Tutorial"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["Use this tutorial only for bonus assignments ",(0,r.jsx)(n.strong,{children:"made by your tutors"})," or in case\nyou need to make up for the absence."]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"step-1---starting-from-the-clean-repository",children:"Step #1 - Starting from the clean repository"}),"\n",(0,r.jsxs)(n.p,{children:["In your repository (either locally or on aisa) type ",(0,r.jsx)(n.code,{children:"git status"})," and check if your\nrepository is clean and you are present on the main branch (",(0,r.jsx)(n.code,{children:"master"}),", ",(0,r.jsx)(n.code,{children:"main"})," or\n",(0,r.jsx)(n.code,{children:"trunk"}),"). If you do not know what your default branch is, it is probably ",(0,r.jsx)(n.code,{children:"master"}),"\nand you should not be on any other branch."]}),"\n",(0,r.jsx)(n.p,{children:"Output of the command should look like this:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"aisa$ git status\nOn branch master # Or main or trunk.\nYour branch is up to date with 'origin/master'.\n\nnothing to commit, working tree clean\n"})}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["In case you are on different branch or there are uncommitted changes,\n",(0,r.jsx)(n.strong,{children:"do not continue!!!"})," Clean your repository (commit the changes or discard\nthem), before you continue."]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"step-2---create-new-branch",children:"Step #2 - Create new branch"}),"\n",(0,r.jsx)(n.p,{children:"In your repository write command:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"aisa$ git checkout -b BRANCH\nSwitched to a new branch 'BRANCH'\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Instead of ",(0,r.jsx)(n.code,{children:"BRANCH"})," use some reasonable name for the branch. For example if you\nare working on the seminar from 3rd week, name the branch ",(0,r.jsx)(n.code,{children:"seminar-03"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"step-3---do-the-assignment",children:"Step #3 - Do the assignment"}),"\n",(0,r.jsx)(n.p,{children:"Download the skeleton for the seminar assignment, extract and program. For example\nif you are working on 3rd seminar, you can do so by:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"aisa$ wget https://www.fi.muni.cz/pb071/seminars/seminar-03/pb071-seminar-03.zip\naisa$ unzip pb071-seminar-03.zip\n# Now you should have directory 'seminar-03'.\naisa$ rm pb071-seminar-03.zip\naisa$ cd seminar-03\n# You can work on the assignment.\n"})}),"\n",(0,r.jsx)(n.h3,{id:"step-4---commit-and-upload-the-changes-to-gitlab",children:"Step #4 - Commit and upload the changes to GitLab"}),"\n",(0,r.jsxs)(n.p,{children:["The same way you ",(0,r.jsx)(n.em,{children:"add"})," and ",(0,r.jsx)(n.em,{children:"commit"})," files for the homework assignments, you do for\nthe seminar."]}),"\n",(0,r.jsxs)(n.p,{children:["Now you can upload the changes to GitLab. ",(0,r.jsx)(n.code,{children:"git push"})," is not enough, since repository\non GitLab does not know your new branch. You can solve this by adding arguments:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"aisa$ git push origin BRANCH\n...\nremote: To create a merge request for BRANCH, visit:\nremote: https://gitlab.fi.muni.cz/login/pb071/merge_requests/new?merge_request%5Bsource_branch%5D=BRANCH\n...\n"})}),"\n",(0,r.jsx)(n.p,{children:"In the output you should have a link for creating a merge request. If you see this\nlink, open it and skip next step."}),"\n",(0,r.jsx)(n.h3,{id:"step-5---creating-a-merge-request-manually",children:"Step #5 - Creating a merge request manually"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"Open your repository on GitLab."}),"\n",(0,r.jsxs)(n.li,{children:["On the left panel click on ",(0,r.jsx)(n.em,{children:"Merge Requests"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["Click on ",(0,r.jsx)(n.em,{children:"New Merge Request"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["In ",(0,r.jsx)(n.em,{children:"Source branch"})," select ",(0,r.jsx)(n.code,{children:"login/pb071"})," and ",(0,r.jsx)(n.code,{children:"BRANCH"}),", which you created."]}),"\n",(0,r.jsxs)(n.li,{children:["In ",(0,r.jsx)(n.em,{children:"Target branch"})," select ",(0,r.jsx)(n.code,{children:"login/pb071"})," and your default branch you have seen\nin the output of the first command. (most likely ",(0,r.jsx)(n.code,{children:"master"}),")"]}),"\n",(0,r.jsxs)(n.li,{children:["Click on ",(0,r.jsx)(n.em,{children:"Compare branches and continue"}),"."]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"step-6---set-assignees",children:"Step #6 - Set assignees"}),"\n",(0,r.jsxs)(n.p,{children:["On the page that is opened, please check at the top that you are creating merge\nrequest ",(0,r.jsx)(n.strong,{children:"from"})," your new branch ",(0,r.jsx)(n.strong,{children:"to"})," your default branch (one of ",(0,r.jsx)(n.code,{children:"master"}),", ",(0,r.jsx)(n.code,{children:"main"}),"\nor ",(0,r.jsx)(n.code,{children:"trunk"}),")."]}),"\n",(0,r.jsxs)(n.p,{children:["Then in the field ",(0,r.jsx)(n.em,{children:"Assignees"})," set your tutors based on the seminar group. You can\nuse login for a quick look up."]}),"\n",(0,r.jsxs)(n.p,{children:["In the end click on ",(0,r.jsx)(n.em,{children:"Submit merge request"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"step-7---return-to-default-branch",children:"Step #7 - Return to default branch"}),"\n",(0,r.jsx)(n.p,{children:"Homework assignments can be submitted only from branches specified in the rules\nfor the course. Because of that, before you do anything else, you should switch\nback to your default branch."}),"\n",(0,r.jsxs)(n.p,{children:["First of all, same as in step #1, check that your repository is clean with ",(0,r.jsx)(n.code,{children:"git status"}),".\nFor the sake of safety, do not continue without clean repository. Then with command\n",(0,r.jsx)(n.code,{children:"git checkout BRANCH"})," switch to your default branch ",(0,r.jsx)(n.code,{children:"BRANCH"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["If you do not know which branch is your default, try ",(0,r.jsx)(n.code,{children:"git branch"})," that outputs all branches in your repository. Default branch is typically ",(0,r.jsx)(n.code,{children:"master"}),", but can\nbe ",(0,r.jsx)(n.code,{children:"main"})," or ",(0,r.jsx)(n.code,{children:"trunk"}),"."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"aisa$ git status\n# Check if repository is clean\n\n# If you know, what is your default branch, you can skip next command.\naisa$ git branch\n# Find the default branch in the list; should be one of the `master`, `main` or\n# `trunk` and you should not have more than one of those.\n# In case the list clears the terminal and you cannot see shell prompt, you can\n# press `q` to quit the pager.\n\naisa$ git checkout master\n"})}),"\n",(0,r.jsx)(n.hr,{}),"\n",(0,r.jsxs)(n.p,{children:["Adapted from: ",(0,r.jsx)(n.a,{href:"https://www.fi.muni.cz/~xlacko1/pb071/mr.html",children:"https://www.fi.muni.cz/~xlacko1/pb071/mr.html"})]})]})}function d(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>i});var r=t(67294);const s={},o=r.createContext(s);function i(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[59],{51456:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>a,toc:()=>h});var r=t(85893),s=t(11151);const o={title:"Submitting merge requests"},i="Submitting merge requests for review",a={id:"mr",title:"Submitting merge requests",description:"This tutorial aims to show you how to follow basic git workflow and submit changes",source:"@site/c/mr.md",sourceDirName:".",slug:"/mr",permalink:"/c/mr",draft:!1,unlisted:!1,editUrl:"https://github.com/mfocko/blog/tree/main/c/mr.md",tags:[],version:"current",lastUpdatedAt:1704558496,formattedLastUpdatedAt:"Jan 6, 2024",frontMatter:{title:"Submitting merge requests"},sidebar:"autogeneratedBar",previous:{title:"Practice exam C",permalink:"/c/pexam/cams"}},c={},h=[{value:"Tutorial",id:"tutorial",level:2},{value:"Step #1 - Starting from the clean repository",id:"step-1---starting-from-the-clean-repository",level:3},{value:"Step #2 - Create new branch",id:"step-2---create-new-branch",level:3},{value:"Step #3 - Do the assignment",id:"step-3---do-the-assignment",level:3},{value:"Step #4 - Commit and upload the changes to GitLab",id:"step-4---commit-and-upload-the-changes-to-gitlab",level:3},{value:"Step #5 - Creating a merge request manually",id:"step-5---creating-a-merge-request-manually",level:3},{value:"Step #6 - Set assignees",id:"step-6---set-assignees",level:3},{value:"Step #7 - Return to default branch",id:"step-7---return-to-default-branch",level:3}];function l(e){const n={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",hr:"hr",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,s.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"submitting-merge-requests-for-review",children:"Submitting merge requests for review"}),"\n",(0,r.jsxs)(n.p,{children:["This tutorial aims to show you how to follow basic git workflow and submit changes\nthrough ",(0,r.jsx)(n.em,{children:"Merge Requests"})," for review."]}),"\n",(0,r.jsxs)(n.p,{children:["The rudimentary idea behind aims for changes to be present on a separate branch\nthat is supposedly ",(0,r.jsx)(n.em,{children:"merged"})," into the default branch. Till then changes can be reviewed\non ",(0,r.jsx)(n.em,{children:"Merge Request"})," and additional changes may be made based on the reviews. Once\nthe changes satisfy requirements, the merge request is merged."]}),"\n",(0,r.jsx)(n.h2,{id:"tutorial",children:"Tutorial"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["Use this tutorial only for bonus assignments ",(0,r.jsx)(n.strong,{children:"made by your tutors"})," or in case\nyou need to make up for the absence."]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"step-1---starting-from-the-clean-repository",children:"Step #1 - Starting from the clean repository"}),"\n",(0,r.jsxs)(n.p,{children:["In your repository (either locally or on aisa) type ",(0,r.jsx)(n.code,{children:"git status"})," and check if your\nrepository is clean and you are present on the main branch (",(0,r.jsx)(n.code,{children:"master"}),", ",(0,r.jsx)(n.code,{children:"main"})," or\n",(0,r.jsx)(n.code,{children:"trunk"}),"). If you do not know what your default branch is, it is probably ",(0,r.jsx)(n.code,{children:"master"}),"\nand you should not be on any other branch."]}),"\n",(0,r.jsx)(n.p,{children:"Output of the command should look like this:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"aisa$ git status\nOn branch master # Or main or trunk.\nYour branch is up to date with 'origin/master'.\n\nnothing to commit, working tree clean\n"})}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["In case you are on different branch or there are uncommitted changes,\n",(0,r.jsx)(n.strong,{children:"do not continue!!!"})," Clean your repository (commit the changes or discard\nthem), before you continue."]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"step-2---create-new-branch",children:"Step #2 - Create new branch"}),"\n",(0,r.jsx)(n.p,{children:"In your repository write command:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"aisa$ git checkout -b BRANCH\nSwitched to a new branch 'BRANCH'\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Instead of ",(0,r.jsx)(n.code,{children:"BRANCH"})," use some reasonable name for the branch. For example if you\nare working on the seminar from 3rd week, name the branch ",(0,r.jsx)(n.code,{children:"seminar-03"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"step-3---do-the-assignment",children:"Step #3 - Do the assignment"}),"\n",(0,r.jsx)(n.p,{children:"Download the skeleton for the seminar assignment, extract and program. For example\nif you are working on 3rd seminar, you can do so by:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"aisa$ wget https://www.fi.muni.cz/pb071/seminars/seminar-03/pb071-seminar-03.zip\naisa$ unzip pb071-seminar-03.zip\n# Now you should have directory 'seminar-03'.\naisa$ rm pb071-seminar-03.zip\naisa$ cd seminar-03\n# You can work on the assignment.\n"})}),"\n",(0,r.jsx)(n.h3,{id:"step-4---commit-and-upload-the-changes-to-gitlab",children:"Step #4 - Commit and upload the changes to GitLab"}),"\n",(0,r.jsxs)(n.p,{children:["The same way you ",(0,r.jsx)(n.em,{children:"add"})," and ",(0,r.jsx)(n.em,{children:"commit"})," files for the homework assignments, you do for\nthe seminar."]}),"\n",(0,r.jsxs)(n.p,{children:["Now you can upload the changes to GitLab. ",(0,r.jsx)(n.code,{children:"git push"})," is not enough, since repository\non GitLab does not know your new branch. You can solve this by adding arguments:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"aisa$ git push origin BRANCH\n...\nremote: To create a merge request for BRANCH, visit:\nremote: https://gitlab.fi.muni.cz/login/pb071/merge_requests/new?merge_request%5Bsource_branch%5D=BRANCH\n...\n"})}),"\n",(0,r.jsx)(n.p,{children:"In the output you should have a link for creating a merge request. If you see this\nlink, open it and skip next step."}),"\n",(0,r.jsx)(n.h3,{id:"step-5---creating-a-merge-request-manually",children:"Step #5 - Creating a merge request manually"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"Open your repository on GitLab."}),"\n",(0,r.jsxs)(n.li,{children:["On the left panel click on ",(0,r.jsx)(n.em,{children:"Merge Requests"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["Click on ",(0,r.jsx)(n.em,{children:"New Merge Request"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["In ",(0,r.jsx)(n.em,{children:"Source branch"})," select ",(0,r.jsx)(n.code,{children:"login/pb071"})," and ",(0,r.jsx)(n.code,{children:"BRANCH"}),", which you created."]}),"\n",(0,r.jsxs)(n.li,{children:["In ",(0,r.jsx)(n.em,{children:"Target branch"})," select ",(0,r.jsx)(n.code,{children:"login/pb071"})," and your default branch you have seen\nin the output of the first command. (most likely ",(0,r.jsx)(n.code,{children:"master"}),")"]}),"\n",(0,r.jsxs)(n.li,{children:["Click on ",(0,r.jsx)(n.em,{children:"Compare branches and continue"}),"."]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"step-6---set-assignees",children:"Step #6 - Set assignees"}),"\n",(0,r.jsxs)(n.p,{children:["On the page that is opened, please check at the top that you are creating merge\nrequest ",(0,r.jsx)(n.strong,{children:"from"})," your new branch ",(0,r.jsx)(n.strong,{children:"to"})," your default branch (one of ",(0,r.jsx)(n.code,{children:"master"}),", ",(0,r.jsx)(n.code,{children:"main"}),"\nor ",(0,r.jsx)(n.code,{children:"trunk"}),")."]}),"\n",(0,r.jsxs)(n.p,{children:["Then in the field ",(0,r.jsx)(n.em,{children:"Assignees"})," set your tutors based on the seminar group. You can\nuse login for a quick look up."]}),"\n",(0,r.jsxs)(n.p,{children:["In the end click on ",(0,r.jsx)(n.em,{children:"Submit merge request"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"step-7---return-to-default-branch",children:"Step #7 - Return to default branch"}),"\n",(0,r.jsx)(n.p,{children:"Homework assignments can be submitted only from branches specified in the rules\nfor the course. Because of that, before you do anything else, you should switch\nback to your default branch."}),"\n",(0,r.jsxs)(n.p,{children:["First of all, same as in step #1, check that your repository is clean with ",(0,r.jsx)(n.code,{children:"git status"}),".\nFor the sake of safety, do not continue without clean repository. Then with command\n",(0,r.jsx)(n.code,{children:"git checkout BRANCH"})," switch to your default branch ",(0,r.jsx)(n.code,{children:"BRANCH"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["If you do not know which branch is your default, try ",(0,r.jsx)(n.code,{children:"git branch"})," that outputs all branches in your repository. Default branch is typically ",(0,r.jsx)(n.code,{children:"master"}),", but can\nbe ",(0,r.jsx)(n.code,{children:"main"})," or ",(0,r.jsx)(n.code,{children:"trunk"}),"."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"aisa$ git status\n# Check if repository is clean\n\n# If you know, what is your default branch, you can skip next command.\naisa$ git branch\n# Find the default branch in the list; should be one of the `master`, `main` or\n# `trunk` and you should not have more than one of those.\n# In case the list clears the terminal and you cannot see shell prompt, you can\n# press `q` to quit the pager.\n\naisa$ git checkout master\n"})}),"\n",(0,r.jsx)(n.hr,{}),"\n",(0,r.jsxs)(n.p,{children:["Adapted from: ",(0,r.jsx)(n.a,{href:"https://www.fi.muni.cz/~xlacko1/pb071/mr.html",children:"https://www.fi.muni.cz/~xlacko1/pb071/mr.html"})]})]})}function d(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>i});var r=t(67294);const s={},o=r.createContext(s);function i(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bb882650.6eee4002.js b/assets/js/bb882650.6eee4002.js deleted file mode 100644 index 20c9c36..0000000 --- a/assets/js/bb882650.6eee4002.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[8091],{66765:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>u,frontMatter:()=>r,metadata:()=>s,toc:()=>c});var n=o(85893),a=o(11151);const r={title:"3rd week of Advent of Code '22 in Rust",description:"Surviving third week in Rust.",date:"2023-07-06T21:00",slug:"aoc-2022/3rd-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},i=void 0,s={permalink:"/blog/aoc-2022/3rd-week",editUrl:"https://github.com/mfocko/blog/tree/main/blog/aoc-2022/03-week-3.md",source:"@site/blog/aoc-2022/03-week-3.md",title:"3rd week of Advent of Code '22 in Rust",description:"Surviving third week in Rust.",date:"2023-07-06T21:00:00.000Z",formattedDate:"July 6, 2023",tags:[{label:"advent-of-code",permalink:"/blog/tags/advent-of-code"},{label:"advent-of-code-2022",permalink:"/blog/tags/advent-of-code-2022"},{label:"rust",permalink:"/blog/tags/rust"}],readingTime:11.565,hasTruncateMarker:!0,authors:[{name:"Matej Focko",email:"me+blog@mfocko.xyz",title:"a.k.a. @mf",url:"https://gitlab.com/mfocko",imageURL:"https://github.com/mfocko.png",key:"mf"}],frontMatter:{title:"3rd week of Advent of Code '22 in Rust",description:"Surviving third week in Rust.",date:"2023-07-06T21:00",slug:"aoc-2022/3rd-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"4th week of Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/4th-week"},nextItem:{title:"Sort the matrix diagonally",permalink:"/blog/leetcode/sort-diagonally"}},d={authorsImageUrls:[void 0]},c=[];function l(e){const t={em:"em",p:"p",...(0,a.a)(),...e.components};return(0,n.jsxs)(t.p,{children:["Let's go through the third week of [",(0,n.jsx)(t.em,{children:"Advent of Code"}),"] in Rust."]})}function u(e={}){const{wrapper:t}={...(0,a.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},11151:(e,t,o)=>{o.d(t,{Z:()=>s,a:()=>i});var n=o(67294);const a={},r=n.createContext(a);function i(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bb882650.925fdbba.js b/assets/js/bb882650.925fdbba.js new file mode 100644 index 0000000..c089233 --- /dev/null +++ b/assets/js/bb882650.925fdbba.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[8091],{66765:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>u,frontMatter:()=>r,metadata:()=>s,toc:()=>c});var n=o(85893),a=o(11151);const r={title:"3rd week of Advent of Code '22 in Rust",description:"Surviving third week in Rust.",date:"2023-07-06T21:00",slug:"aoc-2022/3rd-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},i=void 0,s={permalink:"/blog/aoc-2022/3rd-week",editUrl:"https://github.com/mfocko/blog/tree/main/blog/aoc-2022/03-week-3.md",source:"@site/blog/aoc-2022/03-week-3.md",title:"3rd week of Advent of Code '22 in Rust",description:"Surviving third week in Rust.",date:"2023-07-06T21:00:00.000Z",formattedDate:"July 6, 2023",tags:[{label:"advent-of-code",permalink:"/blog/tags/advent-of-code"},{label:"advent-of-code-2022",permalink:"/blog/tags/advent-of-code-2022"},{label:"rust",permalink:"/blog/tags/rust"}],readingTime:11.57,hasTruncateMarker:!0,authors:[{name:"Matej Focko",email:"me+blog@mfocko.xyz",title:"a.k.a. @mf",url:"https://gitlab.com/mfocko",imageURL:"https://github.com/mfocko.png",key:"mf"}],frontMatter:{title:"3rd week of Advent of Code '22 in Rust",description:"Surviving third week in Rust.",date:"2023-07-06T21:00",slug:"aoc-2022/3rd-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"4th week of Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/4th-week"},nextItem:{title:"Sort the matrix diagonally",permalink:"/blog/leetcode/sort-diagonally"}},d={authorsImageUrls:[void 0]},c=[];function l(e){const t={em:"em",p:"p",...(0,a.a)(),...e.components};return(0,n.jsxs)(t.p,{children:["Let's go through the third week of [",(0,n.jsx)(t.em,{children:"Advent of Code"}),"] in Rust."]})}function u(e={}){const{wrapper:t}={...(0,a.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},11151:(e,t,o)=>{o.d(t,{Z:()=>s,a:()=>i});var n=o(67294);const a={},r=n.createContext(a);function i(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c4c4056e.3de7285f.js b/assets/js/c4c4056e.a7e01235.js similarity index 98% rename from assets/js/c4c4056e.3de7285f.js rename to assets/js/c4c4056e.a7e01235.js index 3625485..81fd4ac 100644 --- a/assets/js/c4c4056e.3de7285f.js +++ b/assets/js/c4c4056e.a7e01235.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[635],{61381:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>h});var r=n(85893),s=n(11151);const o={id:"index",slug:"/paths/bf-to-astar",title:"From BF to A*",description:"Figuring out shortest-path problem from the BF to the A* algorithm.\n",tags:["cpp","brute force","bellman ford","dynamic programming","dijkstra","greedy","a star"],last_update:{date:new Date("2024-01-01T00:00:00.000Z")}},a=void 0,i={id:"paths/2024-01-01-bf-to-astar/index",title:"From BF to A*",description:"Figuring out shortest-path problem from the BF to the A* algorithm.\n",source:"@site/algorithms/11-paths/2024-01-01-bf-to-astar/index.md",sourceDirName:"11-paths/2024-01-01-bf-to-astar",slug:"/paths/bf-to-astar",permalink:"/algorithms/paths/bf-to-astar",draft:!1,unlisted:!1,editUrl:"https://github.com/mfocko/blog/tree/main/algorithms/11-paths/2024-01-01-bf-to-astar/index.md",tags:[{label:"cpp",permalink:"/algorithms/tags/cpp"},{label:"brute force",permalink:"/algorithms/tags/brute-force"},{label:"bellman ford",permalink:"/algorithms/tags/bellman-ford"},{label:"dynamic programming",permalink:"/algorithms/tags/dynamic-programming"},{label:"dijkstra",permalink:"/algorithms/tags/dijkstra"},{label:"greedy",permalink:"/algorithms/tags/greedy"},{label:"a star",permalink:"/algorithms/tags/a-star"}],version:"current",lastUpdatedAt:1704067200,formattedLastUpdatedAt:"Jan 1, 2024",frontMatter:{id:"index",slug:"/paths/bf-to-astar",title:"From BF to A*",description:"Figuring out shortest-path problem from the BF to the A* algorithm.\n",tags:["cpp","brute force","bellman ford","dynamic programming","dijkstra","greedy","a star"],last_update:{date:"2024-01-01T00:00:00.000Z"}},sidebar:"autogeneratedBar",previous:{title:"Paths in Graphs",permalink:"/algorithms/category/paths-in-graphs"},next:{title:"BF",permalink:"/algorithms/paths/bf-to-astar/bf"}},l={},h=[{value:"Intro",id:"intro",level:2},{value:"Boilerplate",id:"boilerplate",level:2}];function c(t){const e={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...t.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(e.h2,{id:"intro",children:"Intro"}),"\n",(0,r.jsx)(e.p,{children:"We will delve into the details and ideas of the most common path-finding\nalgorithms. For the purpose of demonstrating some \u201cfeatures\u201d of the improved\nalgorithms, we will use a 2D map with some rules that will allow us to show cons\nand pros of the shown algorithms."}),"\n",(0,r.jsx)(e.p,{children:"Let's have a look at the example map:"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"#############\n#..#..*.*.**#\n##***.....**#\n#..########.#\n#...###...#.#\n#..#...##.#.#\n#..#.*.#..#.#\n#....#....#.#\n########*.*.#\n#...........#\n#############\n"})}),"\n",(0,r.jsx)(e.p,{children:"We can see three different kinds of cells:"}),"\n",(0,r.jsxs)(e.ol,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.code,{children:"#"})," which represent walls, that cannot be entered at all"]}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.code,{children:"*"})," which represent vortices that can be entered at the cost of 5 coins"]}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.code,{children:"."})," which represent normal cells that can be entered for 1 coin (which is the\nbase price of moving around the map)"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:"Let's dissect a specific position on the map to get a better grasp of the rules:"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" .\n#S*\n .\n"})}),"\n",(0,r.jsxs)(e.p,{children:["We are standing in the cell marked with ",(0,r.jsx)(e.code,{children:"S"})," and we have the following options"]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["move to the north (",(0,r.jsx)(e.code,{children:"."}),") with the cost of 1 coin,"]}),"\n",(0,r.jsxs)(e.li,{children:["move to the west (",(0,r.jsx)(e.code,{children:"#"}),") ",(0,r.jsx)(e.strong,{children:"is not"})," allowed because of the wall,"]}),"\n",(0,r.jsxs)(e.li,{children:["move to the east (",(0,r.jsx)(e.code,{children:"*"}),") is allowed with the cost of 5 coins, and finally"]}),"\n",(0,r.jsxs)(e.li,{children:["move to the south (",(0,r.jsx)(e.code,{children:"."}),") with the cost of 1 coin."]}),"\n"]}),"\n",(0,r.jsx)(e.admonition,{type:"info",children:(0,r.jsxs)(e.p,{children:["Further on I will follow the same scheme for marking cells with an addition of\n",(0,r.jsx)(e.code,{children:"D"})," to denote the ",(0,r.jsx)(e.em,{children:"destination"})," to which we will be finding the shortest path."]})}),"\n",(0,r.jsx)(e.h2,{id:"boilerplate",children:"Boilerplate"}),"\n",(0,r.jsx)(e.p,{children:"For working with this map I have prepared a basic structure for the graph in C++\nthat will abstract some of the internal workings of our map, namely:"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:"remembers the costs of moving around"}),"\n",(0,r.jsxs)(e.li,{children:["provides a simple function that returns price for moving ",(0,r.jsx)(e.strong,{children:"directly"})," between\ntwo positions on the map"]}),"\n",(0,r.jsx)(e.li,{children:"allows us to print the map out, just in case we'd need some adjustments to be\nmade"}),"\n"]}),"\n",(0,r.jsxs)(e.p,{children:["We can see the ",(0,r.jsx)(e.code,{children:"graph"})," header here:"]}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-cpp",children:"#ifndef _GRAPH_HPP\n#define _GRAPH_HPP\n\n#include \n#include \n#include \n#include \n#include \n\nusing vertex_t = std::pair;\n\nstruct graph {\n graph(const std::vector>& map)\n : map(map),\n _height(static_cast(map.size())),\n _width(map.empty() ? 0 : static_cast(map[0].size())) {}\n\n static auto unreachable() -> int { return UNREACHABLE; }\n static auto normal_cost() -> int { return NORMAL_COST; }\n static auto vortex_cost() -> int { return VORTEX_COST; }\n\n auto cost(const vertex_t& u, const vertex_t& v) const -> int {\n auto [ux, uy] = u;\n auto [vx, vy] = v;\n\n auto hd = std::abs(ux - vx) + std::abs(uy - vy);\n switch (hd) {\n // \u2039u = v\u203a; staying on the same cell\n case 0:\n return 0;\n // \u2039u\u203a and \u2039v\u203a are neighbours\n case 1:\n break;\n // \u2039u\u203a and \u2039v\u203a are not neighbouring cells\n default:\n return UNREACHABLE;\n }\n\n // boundary check\n if (vy < 0 || vy >= _height || vx < 0 || vx >= _width) {\n return UNREACHABLE;\n }\n\n switch (map[vy][vx]) {\n case '#':\n return UNREACHABLE;\n case '*':\n return VORTEX_COST;\n default:\n return NORMAL_COST;\n }\n }\n\n auto width() const -> int { return _width; }\n auto height() const -> int { return _height; }\n auto has(const vertex_t& v) const -> bool {\n auto [x, y] = v;\n return (0 <= y && y < _height) && (0 <= x && x < _width);\n }\n\n friend std::ostream& operator<<(std::ostream& os, const graph& g);\n\n private:\n std::vector> map;\n int _height, _width;\n\n const static int UNREACHABLE = std::numeric_limits::max();\n // XXX: modify here to change the price of entering the vortex\n const static int VORTEX_COST = 5;\n const static int NORMAL_COST = 1;\n};\n\nstd::ostream& operator<<(std::ostream& os, const graph& g) {\n for (const auto& row : g.map) {\n for (const char cell : row) {\n os << cell;\n }\n os << \"\\n\";\n }\n\n return os;\n}\n\n#endif /* _GRAPH_HPP */\n"})}),"\n",(0,r.jsx)(e.admonition,{title:"Source code",type:"info",children:(0,r.jsxs)(e.p,{children:["You can find all the source code referenced in this series\n",(0,r.jsx)(e.a,{href:"pathname:///files/algorithms/paths/bf-to-astar.tar.gz",children:"here"}),"."]})}),"\n",(0,r.jsx)(e.p,{children:"Let's finally start with some algorithms!"})]})}function d(t={}){const{wrapper:e}={...(0,s.a)(),...t.components};return e?(0,r.jsx)(e,{...t,children:(0,r.jsx)(c,{...t})}):c(t)}},11151:(t,e,n)=>{n.d(e,{Z:()=>i,a:()=>a});var r=n(67294);const s={},o=r.createContext(s);function a(t){const e=r.useContext(o);return r.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function i(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(s):t.components||s:a(t.components),r.createElement(o.Provider,{value:e},t.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[635],{61381:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>h});var r=n(85893),s=n(11151);const o={id:"index",slug:"/paths/bf-to-astar",title:"From BF to A*",description:"Figuring out shortest-path problem from the BF to the A* algorithm.\n",tags:["cpp","brute force","bellman ford","dynamic programming","dijkstra","greedy","a star"],last_update:{date:new Date("2024-01-01T00:00:00.000Z")}},a=void 0,i={id:"paths/2024-01-01-bf-to-astar/index",title:"From BF to A*",description:"Figuring out shortest-path problem from the BF to the A* algorithm.\n",source:"@site/algorithms/11-paths/2024-01-01-bf-to-astar/index.md",sourceDirName:"11-paths/2024-01-01-bf-to-astar",slug:"/paths/bf-to-astar",permalink:"/algorithms/paths/bf-to-astar",draft:!1,unlisted:!1,editUrl:"https://github.com/mfocko/blog/tree/main/algorithms/11-paths/2024-01-01-bf-to-astar/index.md",tags:[{label:"cpp",permalink:"/algorithms/tags/cpp"},{label:"brute force",permalink:"/algorithms/tags/brute-force"},{label:"bellman ford",permalink:"/algorithms/tags/bellman-ford"},{label:"dynamic programming",permalink:"/algorithms/tags/dynamic-programming"},{label:"dijkstra",permalink:"/algorithms/tags/dijkstra"},{label:"greedy",permalink:"/algorithms/tags/greedy"},{label:"a star",permalink:"/algorithms/tags/a-star"}],version:"current",lastUpdatedAt:1704067200,formattedLastUpdatedAt:"Jan 1, 2024",frontMatter:{id:"index",slug:"/paths/bf-to-astar",title:"From BF to A*",description:"Figuring out shortest-path problem from the BF to the A* algorithm.\n",tags:["cpp","brute force","bellman ford","dynamic programming","dijkstra","greedy","a star"],last_update:{date:"2024-01-01T00:00:00.000Z"}},sidebar:"autogeneratedBar",previous:{title:"Paths in Graphs",permalink:"/algorithms/category/paths-in-graphs"},next:{title:"BF",permalink:"/algorithms/paths/bf-to-astar/bf"}},l={},h=[{value:"Intro",id:"intro",level:2},{value:"Boilerplate",id:"boilerplate",level:2}];function c(t){const e={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...t.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(e.h2,{id:"intro",children:"Intro"}),"\n",(0,r.jsx)(e.p,{children:"We will delve into the details and ideas of the most common path-finding\nalgorithms. For the purpose of demonstrating some \u201cfeatures\u201d of the improved\nalgorithms, we will use a 2D map with some rules that will allow us to show cons\nand pros of the shown algorithms."}),"\n",(0,r.jsx)(e.p,{children:"Let's have a look at the example map:"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"#############\n#..#..*.*.**#\n##***.....**#\n#..########.#\n#...###...#.#\n#..#...##.#.#\n#..#.*.#..#.#\n#....#....#.#\n########*.*.#\n#...........#\n#############\n"})}),"\n",(0,r.jsx)(e.p,{children:"We can see three different kinds of cells:"}),"\n",(0,r.jsxs)(e.ol,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.code,{children:"#"})," which represent walls, that cannot be entered at all"]}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.code,{children:"*"})," which represent vortices that can be entered at the cost of 5 coins"]}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.code,{children:"."})," which represent normal cells that can be entered for 1 coin (which is the\nbase price of moving around the map)"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:"Let's dissect a specific position on the map to get a better grasp of the rules:"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" .\n#S*\n .\n"})}),"\n",(0,r.jsxs)(e.p,{children:["We are standing in the cell marked with ",(0,r.jsx)(e.code,{children:"S"})," and we have the following options"]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["move to the north (",(0,r.jsx)(e.code,{children:"."}),") with the cost of 1 coin,"]}),"\n",(0,r.jsxs)(e.li,{children:["move to the west (",(0,r.jsx)(e.code,{children:"#"}),") ",(0,r.jsx)(e.strong,{children:"is not"})," allowed because of the wall,"]}),"\n",(0,r.jsxs)(e.li,{children:["move to the east (",(0,r.jsx)(e.code,{children:"*"}),") is allowed with the cost of 5 coins, and finally"]}),"\n",(0,r.jsxs)(e.li,{children:["move to the south (",(0,r.jsx)(e.code,{children:"."}),") with the cost of 1 coin."]}),"\n"]}),"\n",(0,r.jsx)(e.admonition,{type:"info",children:(0,r.jsxs)(e.p,{children:["Further on I will follow the same scheme for marking cells with an addition of\n",(0,r.jsx)(e.code,{children:"D"})," to denote the ",(0,r.jsx)(e.em,{children:"destination"})," to which we will be finding the shortest path."]})}),"\n",(0,r.jsx)(e.h2,{id:"boilerplate",children:"Boilerplate"}),"\n",(0,r.jsx)(e.p,{children:"For working with this map I have prepared a basic structure for the graph in C++\nthat will abstract some of the internal workings of our map, namely:"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:"remembers the costs of moving around"}),"\n",(0,r.jsxs)(e.li,{children:["provides a simple function that returns price for moving ",(0,r.jsx)(e.strong,{children:"directly"})," between\ntwo positions on the map"]}),"\n",(0,r.jsx)(e.li,{children:"allows us to print the map out, just in case we'd need some adjustments to be\nmade"}),"\n"]}),"\n",(0,r.jsxs)(e.p,{children:["We can see the ",(0,r.jsx)(e.code,{children:"graph"})," header here:"]}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-cpp",children:"#ifndef _GRAPH_HPP\n#define _GRAPH_HPP\n\n#include \n#include \n#include \n#include \n#include \n\nusing vertex_t = std::pair;\n\nstruct graph {\n graph(const std::vector>& map)\n : map(map),\n _height(static_cast(map.size())),\n _width(map.empty() ? 0 : static_cast(map[0].size())) {}\n\n static auto unreachable() -> int { return UNREACHABLE; }\n static auto normal_cost() -> int { return NORMAL_COST; }\n static auto vortex_cost() -> int { return VORTEX_COST; }\n\n auto cost(const vertex_t& u, const vertex_t& v) const -> int {\n auto [ux, uy] = u;\n auto [vx, vy] = v;\n\n auto md = std::abs(ux - vx) + std::abs(uy - vy);\n switch (md) {\n // \u2039u = v\u203a; staying on the same cell\n case 0:\n return 0;\n // \u2039u\u203a and \u2039v\u203a are neighbours\n case 1:\n break;\n // \u2039u\u203a and \u2039v\u203a are not neighbouring cells\n default:\n return UNREACHABLE;\n }\n\n // boundary check\n if (vy < 0 || vy >= _height || vx < 0 || vx >= _width) {\n return UNREACHABLE;\n }\n\n switch (map[vy][vx]) {\n case '#':\n return UNREACHABLE;\n case '*':\n return VORTEX_COST;\n default:\n return NORMAL_COST;\n }\n }\n\n auto width() const -> int { return _width; }\n auto height() const -> int { return _height; }\n auto has(const vertex_t& v) const -> bool {\n auto [x, y] = v;\n return (0 <= y && y < _height) && (0 <= x && x < _width);\n }\n\n friend std::ostream& operator<<(std::ostream& os, const graph& g);\n\n private:\n std::vector> map;\n int _height, _width;\n\n const static int UNREACHABLE = std::numeric_limits::max();\n // XXX: modify here to change the price of entering the vortex\n const static int VORTEX_COST = 5;\n const static int NORMAL_COST = 1;\n};\n\nstd::ostream& operator<<(std::ostream& os, const graph& g) {\n for (const auto& row : g.map) {\n for (const char cell : row) {\n os << cell;\n }\n os << \"\\n\";\n }\n\n return os;\n}\n\n#endif /* _GRAPH_HPP */\n"})}),"\n",(0,r.jsx)(e.admonition,{title:"Source code",type:"info",children:(0,r.jsxs)(e.p,{children:["You can find all the source code referenced in this series\n",(0,r.jsx)(e.a,{href:"pathname:///files/algorithms/paths/bf-to-astar.tar.gz",children:"here"}),"."]})}),"\n",(0,r.jsx)(e.p,{children:"Let's finally start with some algorithms!"})]})}function d(t={}){const{wrapper:e}={...(0,s.a)(),...t.components};return e?(0,r.jsx)(e,{...t,children:(0,r.jsx)(c,{...t})}):c(t)}},11151:(t,e,n)=>{n.d(e,{Z:()=>i,a:()=>a});var r=n(67294);const s={},o=r.createContext(s);function a(t){const e=r.useContext(o);return r.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function i(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(s):t.components||s:a(t.components),r.createElement(o.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/cfa2b263.ce80265a.js b/assets/js/cfa2b263.ce80265a.js new file mode 100644 index 0000000..0865ae2 --- /dev/null +++ b/assets/js/cfa2b263.ce80265a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[3086],{34437:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>d});var i=n(85893),a=n(11151);const o={title:"Sort the matrix diagonally",description:"Compiler assisted development.",date:"2023-03-04T23:15",slug:"leetcode/sort-diagonally",authors:"mf",tags:["cpp","leetcode","iterators"],hide_table_of_contents:!1},r=void 0,s={permalink:"/blog/leetcode/sort-diagonally",editUrl:"https://github.com/mfocko/blog/tree/main/blog/leetcode/sort-matrix-diagonally.md",source:"@site/blog/leetcode/sort-matrix-diagonally.md",title:"Sort the matrix diagonally",description:"Compiler assisted development.",date:"2023-03-04T23:15:00.000Z",formattedDate:"March 4, 2023",tags:[{label:"cpp",permalink:"/blog/tags/cpp"},{label:"leetcode",permalink:"/blog/tags/leetcode"},{label:"iterators",permalink:"/blog/tags/iterators"}],readingTime:16.99,hasTruncateMarker:!0,authors:[{name:"Matej Focko",email:"me+blog@mfocko.xyz",title:"a.k.a. @mf",url:"https://gitlab.com/mfocko",imageURL:"https://github.com/mfocko.png",key:"mf"}],frontMatter:{title:"Sort the matrix diagonally",description:"Compiler assisted development.",date:"2023-03-04T23:15",slug:"leetcode/sort-diagonally",authors:"mf",tags:["cpp","leetcode","iterators"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"3rd week of Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/3rd-week"},nextItem:{title:"2nd week of Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/2nd-week"}},l={authorsImageUrls:[void 0]},d=[{value:"Problem description",id:"problem-description",level:2},{value:"Example",id:"example",level:3},{value:"Skeleton and initial adjustments",id:"skeleton-and-initial-adjustments",level:2},{value:"Na\xefve solution",id:"na\xefve-solution",level:2},{value:"Implementing the diagonals",id:"implementing-the-diagonals",level:2},{value:"Iterating over diagonals",id:"iterating-over-diagonals",level:3},{value:"Implementing the iterator over diagonals",id:"implementing-the-iterator-over-diagonals",level:3},{value:"Implementing the diagonal itself",id:"implementing-the-diagonal-itself",level:2},{value:"Implementing diagonal_iter",id:"implementing-diagonal_iter",level:3}];function c(e){const t={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",section:"section",strong:"strong",sup:"sup",ul:"ul",...(0,a.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:"Let's try to solve one of the LeetCode challenges in easy and hard mode at the\nsame time."}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["Link to the problem: ",(0,i.jsx)(t.a,{href:"https://leetcode.com/problems/sort-the-matrix-diagonally/",children:"https://leetcode.com/problems/sort-the-matrix-diagonally/"})]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"problem-description",children:"Problem description"}),"\n",(0,i.jsxs)(t.p,{children:["A ",(0,i.jsx)(t.strong,{children:"matrix diagonal"})," is a diagonal line of cells starting from some cell in\neither the topmost row or leftmost column and going in the bottom-right direction\nuntil reaching the matrix's end. For example, the ",(0,i.jsx)(t.strong,{children:"matrix diagonal"})," starting\nfrom ",(0,i.jsx)(t.code,{children:"mat[2][0]"}),", where ",(0,i.jsx)(t.code,{children:"mat"})," is a ",(0,i.jsx)(t.code,{children:"6 x 3"})," matrix, includes cells ",(0,i.jsx)(t.code,{children:"mat[2][0]"}),",\n",(0,i.jsx)(t.code,{children:"mat[3][1]"}),", and ",(0,i.jsx)(t.code,{children:"mat[4][2]"}),"."]}),"\n",(0,i.jsxs)(t.p,{children:["Given an ",(0,i.jsx)(t.code,{children:"m x n"})," matrix ",(0,i.jsx)(t.code,{children:"mat"})," of integers, sort each matrix diagonal in ascending\norder and return the resulting matrix."]}),"\n",(0,i.jsx)(t.h3,{id:"example",children:"Example"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{src:"https://assets.leetcode.com/uploads/2020/01/21/1482_example_1_2.png",alt:"Image describing the problem"})}),"\n",(0,i.jsx)(t.h2,{id:"skeleton-and-initial-adjustments",children:"Skeleton and initial adjustments"}),"\n",(0,i.jsx)(t.p,{children:"We are given the following skeleton for the C++ and the given challenge:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-cpp",children:"class Solution {\npublic:\n vector> diagonalSort(vector>& mat) {\n\n }\n};\n"})}),"\n",(0,i.jsxs)(t.p,{children:["The task is to sort the passed matrix diagonally and then return it. First of all,\nI don't like to solve this in a web browser, so we'll need to adjust it accordingly\nfor running it locally. We'll start by including the ",(0,i.jsx)(t.code,{children:"vector"})," header and using\nfully-qualified namespaces",(0,i.jsx)(t.sup,{children:(0,i.jsx)(t.a,{href:"#user-content-fn-1-b611be",id:"user-content-fnref-1-b611be","data-footnote-ref":!0,"aria-describedby":"footnote-label",children:"1"})})," and also adding few tests:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-cpp",children:"#include \n#include \n\nusing matrix = std::vector>;\n\nclass Solution {\npublic:\n matrix diagonalSort(matrix& mat)\n {\n }\n};\n\nstatic void test_case_1()\n{\n // Input: mat = [[3,3,1,1],[2,2,1,2],[1,1,1,2]]\n // Output: [[1,1,1,1],[1,2,2,2],[1,2,3,3]]\n\n Solution s;\n assert((s.diagonalSort(std::vector { std::vector { 3, 3, 1, 1 },\n std::vector { 2, 2, 1, 2 },\n std::vector { 1, 1, 1, 2 } })\n == std::vector { std::vector { 1, 1, 1, 1 },\n std::vector { 1, 2, 2, 2 },\n std::vector { 1, 2, 3, 3 } }));\n}\n\nstatic void test_case_2()\n{\n // Input: mat =\n // [[11,25,66,1,69,7],[23,55,17,45,15,52],[75,31,36,44,58,8],[22,27,33,25,68,4],[84,28,14,11,5,50]]\n // Output:\n // [[5,17,4,1,52,7],[11,11,25,45,8,69],[14,23,25,44,58,15],[22,27,31,36,50,66],[84,28,75,33,55,68]]\n\n Solution s;\n assert((s.diagonalSort(std::vector { std::vector { 11, 25, 66, 1, 69, 7 },\n std::vector { 23, 55, 17, 45, 15, 52 },\n std::vector { 75, 31, 36, 44, 58, 8 },\n std::vector { 22, 27, 33, 25, 68, 4 },\n std::vector { 84, 28, 14, 11, 5, 50 } })\n == std::vector { std::vector { 5, 17, 4, 1, 52, 7 },\n std::vector { 11, 11, 25, 45, 8, 69 },\n std::vector { 14, 23, 25, 44, 58, 15 },\n std::vector { 22, 27, 31, 36, 50, 66 },\n std::vector { 84, 28, 75, 33, 55, 68 } }));\n}\n\nint main()\n{\n test_case_1();\n test_case_2();\n\n return 0;\n}\n"})}),"\n",(0,i.jsx)(t.p,{children:"We need to return the matrix, but we're given a reference to the input matrix. We\ncan easily abuse the C++ here and just switch the reference to value, this way\nthe matrix will be copied when passed to the function, we can sort the copy and\njust return it back. And we also get yelled by the compiler for the fact that the\nmethod doesn't return anything yet, so to make it \u201cshut up\u201d we will just return\nthe input for now:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-diff",children:"- matrix diagonalSort(matrix& mat)\n+ matrix diagonalSort(matrix mat)\n {\n+ return mat;\n }\n"})}),"\n",(0,i.jsx)(t.p,{children:"Now, we get the copy and we're good to go."}),"\n",(0,i.jsx)(t.h2,{id:"na\xefve-solution",children:"Na\xefve solution"}),"\n",(0,i.jsx)(t.p,{children:"As you may know, C++ offers a plethora of functions that can be used to your\nadvantage, given that you know how to \u201cbend\u201d the data structures accordingly."}),"\n",(0,i.jsxs)(t.p,{children:["What does that mean for us? Well, we have an ",(0,i.jsx)(t.code,{children:"std::sort"}),", we can use it, right?\nLet's have a look at it:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-cpp",children:"template< class RandomIt >\nvoid sort( RandomIt first, RandomIt last );\n"})}),"\n",(0,i.jsxs)(t.p,{children:["This overload is more than we need. What does it do? It just sorts the elements\nin the range ",(0,i.jsx)(t.code,{children:"[first, last)"})," using ",(0,i.jsx)(t.code,{children:"operator<"})," on them. We can't sort the whole\nmatrix using this, but\u2026 we can sort just \xbbone\xab diagonal without doing much work\non our end."]}),"\n",(0,i.jsxs)(t.p,{children:["What is the ",(0,i.jsx)(t.code,{children:"RandomIt"})," type though? If we look more into the documentation, we\ncan easily find the requirements for it and also learn that it's a ",(0,i.jsx)(t.em,{children:"random access"}),"\n",(0,i.jsx)(t.em,{children:"iterator"})," and allows swapping its values at the same time."]}),"\n",(0,i.jsxs)(t.admonition,{title:"Random access iterator",type:"tip",children:[(0,i.jsxs)(t.p,{children:["What is the ",(0,i.jsx)(t.em,{children:"random access iterator"})," though? We can find it in a documentation\nand see the following description:"]}),(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:["A ",(0,i.jsx)(t.strong,{children:"LegacyRandomAccessIterator"})," is a ",(0,i.jsx)(t.a,{href:"https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator",children:"LegacyBidirectionalIterator"}),"\nthat can be moved to point to any element in constant time."]}),"\n"]}),(0,i.jsxs)(t.p,{children:["After that we can see all the requirements for it being listed. I don't feel like\nreading them right now, so we will just use it and see where the compilation blows\nup, i.e. \u201c",(0,i.jsx)(t.em,{children:"compiler-assisted development"}),"\u201d",(0,i.jsx)(t.sup,{children:(0,i.jsx)(t.a,{href:"#user-content-fn-2-b611be",id:"user-content-fnref-2-b611be","data-footnote-ref":!0,"aria-describedby":"footnote-label",children:"2"})})," if you will ;)"]})]}),"\n",(0,i.jsxs)(t.p,{children:["Now we know that we can use ",(0,i.jsx)(t.code,{children:"std::sort"})," to sort the diagonal itself, but we also\nneed to get the diagonals somehow. I'm rather lazy, so I'll just delegate it to\nsomeone else",(0,i.jsx)(t.sup,{children:(0,i.jsx)(t.a,{href:"#user-content-fn-3-b611be",id:"user-content-fnref-3-b611be","data-footnote-ref":!0,"aria-describedby":"footnote-label",children:"3"})}),". And that way we get"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-cpp",children:"matrix diagonalSort(matrix mat)\n{\n // we iterate over the diagonals\n for (auto d : diagonals(mat)) {\n // and we sort each diagonal\n std::sort(d.begin(), d.end());\n }\n\n // we take the matrix by copy, so we can sort in-situ and return the copy\n // that we sorted\n return mat;\n}\n"})}),"\n",(0,i.jsx)(t.p,{children:"This solution looks very simple, doesn't it? Well, cause it is.\nLet's try compiling it:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:"matrix-sort.cpp:11:23: error: use of undeclared identifier 'diagonals' [clang-diagnostic-error]\n for (auto d : diagonals(mat)) {\n ^\nFound compiler error(s).\nmake: *** [makefile:14: tidy] Error 1\n"})}),"\n",(0,i.jsxs)(t.p,{children:["OK, seems about right. We haven't implemented the ",(0,i.jsx)(t.code,{children:"diagonals"})," yet. And based on\nwhat we've written so far, we need a function or a class ",(0,i.jsx)(t.code,{children:"diagonals"})," that will\ngive us the diagonals we need."]}),"\n",(0,i.jsxs)(t.h2,{id:"implementing-the-diagonals",children:["Implementing the ",(0,i.jsx)(t.code,{children:"diagonals"})]}),"\n",(0,i.jsxs)(t.p,{children:["Cool, so we need the function that will let us go through each and every diagonal\nin our matrix. We use the ",(0,i.jsx)(t.em,{children:"for-range"})," loop, so whatever we get back from the\n",(0,i.jsx)(t.code,{children:"diagonals"})," must support ",(0,i.jsx)(t.code,{children:".begin()"})," and ",(0,i.jsx)(t.code,{children:".end()"}),". Since I am a masochist, we will\ndo such functionality for a matrix of any type, not just the ",(0,i.jsx)(t.code,{children:"int"})," from the challenge."]}),"\n",(0,i.jsx)(t.p,{children:"As I said, we need to be able to"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"construct the object"}),"\n",(0,i.jsx)(t.li,{children:"get the beginning"}),"\n",(0,i.jsx)(t.li,{children:"get the end (the \u201csentinel\u201d)"}),"\n"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-cpp",children:"template \nclass diagonals {\n using matrix_t = std::vector>;\n\n matrix_t& _matrix;\n\npublic:\n diagonals(matrix_t& m)\n : _matrix(m)\n {\n }\n diagonals_iter begin()\n {\n /* TODO */\n }\n diagonals_iter end()\n {\n /* TODO */\n }\n};\n"})}),"\n",(0,i.jsxs)(t.p,{children:["Now we have a ",(0,i.jsx)(t.code,{children:"diagonals"})," that we can use to go through the diagonals. We haven't\nimplemented the core of it yet. Let's go through what we have for now."]}),"\n",(0,i.jsxs)(t.p,{children:["We have a templated class with templated ",(0,i.jsx)(t.code,{children:"T"})," that is used as a placeholder for any\ntype we would store in the matrix. Because I'm lazy, I have defined the ",(0,i.jsx)(t.code,{children:"matrix_t"}),"\ntype that is a \u201cshortcut\u201d for ",(0,i.jsx)(t.code,{children:"std::vector>"}),", so I don't have to\ntype it out all the time. Of course, we need to store the matrix, we are given,\nas a private attribute. And then just have the constructor and the 2 methods we\nneed for the ",(0,i.jsx)(t.em,{children:"for-range"}),"."]}),"\n",(0,i.jsx)(t.h3,{id:"iterating-over-diagonals",children:"Iterating over diagonals"}),"\n",(0,i.jsxs)(t.p,{children:["Now that we have an object that will allow us to iterate through the diagonals,\nwe need to implement the iterating itself. We need to go through all of them, so\nwe have multiple options how to do so. I have decided to start from the \u201cmain\u201d\ndiagonal that starts at ",(0,i.jsx)(t.code,{children:"(0, 0)"})," index and then proceed with the diagonals starting\nin the first row, followed by the rest of the diagonals in the first column."]}),"\n",(0,i.jsx)(t.p,{children:"We need to be able to tell that we've iterated through all of them, and also we\nneed to know which diagonal is next. For that purpose we will pass the indices\nof the first cell on the diagonal. That way we can always tell how to move forward."}),"\n",(0,i.jsxs)(t.p,{children:["We will start by updating the ",(0,i.jsx)(t.code,{children:"begin"})," and ",(0,i.jsx)(t.code,{children:"end"})," to reflect our choice accordingly."]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-cpp",children:"diagonals_iter begin() { return diagonals_iter { _matrix, 0, 0 }; }\ndiagonals_iter end() { return diagonals_iter { _matrix, 0, _matrix.size() }; }\n"})}),"\n",(0,i.jsxs)(t.p,{children:["For the ",(0,i.jsx)(t.code,{children:"begin"})," we return the first diagonal that starts at ",(0,i.jsx)(t.code,{children:"(0, 0)"}),". And because\nwe have decided to do the diagonals in the first column at the end, the first\ndiagonal that is not a valid one is the one at ",(0,i.jsx)(t.code,{children:"(0, height)"}),". Apart from the\nindices, we also need to pass reference to the matrix itself."]}),"\n",(0,i.jsx)(t.admonition,{type:"note",children:(0,i.jsxs)(t.p,{children:["You may have noticed that we also include the diagonals that have length 1,\nspecifically the ones at ",(0,i.jsx)(t.code,{children:"(0, height - 1)"})," and ",(0,i.jsx)(t.code,{children:"(width - 1, 0)"}),". We are implementing\nan iterator that ",(0,i.jsx)(t.strong,{children:"should not"})," care about the way it's being used. Therefore, we\ndon't care about the fact they don't need to be sorted."]})}),"\n",(0,i.jsxs)(t.p,{children:["Cool, let's leave the iterator itself to someone else, right?",(0,i.jsx)(t.sup,{children:(0,i.jsx)(t.a,{href:"#user-content-fn-4-b611be",id:"user-content-fnref-4-b611be","data-footnote-ref":!0,"aria-describedby":"footnote-label",children:"4"})})]}),"\n",(0,i.jsx)(t.h3,{id:"implementing-the-iterator-over-diagonals",children:"Implementing the iterator over diagonals"}),"\n",(0,i.jsxs)(t.p,{children:["We can start with a simple skeleton based on the information that we pass from\nthe ",(0,i.jsx)(t.code,{children:"diagonals"}),". Also to utilize the ",(0,i.jsx)(t.code,{children:"matrix_t"})," and also contain implementation\ndetails hidden away, we will put this code into the ",(0,i.jsx)(t.code,{children:"diagonals"})," class."]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-cpp",children:"class diagonals_iter {\n matrix_t& m;\n std::size_t x;\n std::size_t y;\n\npublic:\n diagonals_iter(matrix_t& matrix, std::size_t x, std::size_t y)\n : m(matrix)\n , x(x)\n , y(y)\n {\n }\n};\n"})}),"\n",(0,i.jsx)(t.p,{children:"In this case we will be implementing a \u201csimple\u201d forward iterator, so we don't\nneed to implement a lot. Notably it will be:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"inequality operator (we need to know when we reach the end and have nothing to\niterate over)"}),"\n",(0,i.jsx)(t.li,{children:"preincrementation operator (we need to be able to move around the iterable)"}),"\n",(0,i.jsx)(t.li,{children:"dereference operator (we need to be able to retrieve the objects we iterate\nover)"}),"\n"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-cpp",children:"class diagonals_iter {\n matrix_t& m;\n std::size_t x;\n std::size_t y;\n\npublic:\n diagonals_iter(matrix_t& matrix, std::size_t x, std::size_t y)\n : m(matrix)\n , x(x)\n , y(y)\n {\n }\n\n bool operator!=(const diagonals_iter& rhs) const\n {\n // iterators are not equal if they reference different matrices, or\n // their positions differ\n return m != rhs.m || x != rhs.x || y != rhs.y;\n }\n\n diagonals_iter& operator++()\n {\n if (y != 0) {\n // iterating through diagonals down the first column\n y++;\n return *this;\n }\n\n // iterating the diagonals along the first row\n x++;\n if (x == m.front().size()) {\n // switching to diagonals in the first column\n x = 0;\n y++;\n }\n\n return *this;\n }\n\n diagonal operator*() const { return diagonal { m, x, y }; }\n};\n"})}),"\n",(0,i.jsx)(t.p,{children:"Let's go one-by-one. Inequality operator is rather simple, just compare iterator's\nattributes field-by-field. If you think about it, checking inequality of two 2D\nvectors may be a bit inefficient, therefore, we can swap around and check it as\na last thing."}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-diff",children:"- return m != rhs.m || x != rhs.x || y != rhs.y;\n+ return x != rhs.x || y != rhs.y || m != rhs.m;\n"})}),"\n",(0,i.jsx)(t.p,{children:"Preincrementation is where the magic happens. If you have a better look, you can\nsee two branches of this operation:"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:["When ",(0,i.jsx)(t.code,{children:"y != 0"})," (we're iterating over the diagonals in the first column)\nIn this case, we just bump the row and we're done."]}),"\n",(0,i.jsxs)(t.li,{children:["When ",(0,i.jsx)(t.code,{children:"y == 0"})," (we're iterating over the diagonals in the first row)\nIn this case, we bump the column and check if we haven't gotten out of bounds,\ni.e. the end of the first row. If we get out of the bounds, we're continuing\nwith the second diagonal in the first column."]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["Dereferencing the iterator must \u201cyield\u201d something. In our case it will be the\ndiagonal that we want to sort. For sorting we need just the iterators that can\nmove around said diagonal. The simplest thing, we can do, is to delegate it to\nsomething else. In our case it will be a class called ",(0,i.jsx)(t.code,{children:"diagonal"}),"."]}),"\n",(0,i.jsxs)(t.h2,{id:"implementing-the-diagonal-itself",children:["Implementing the ",(0,i.jsx)(t.code,{children:"diagonal"})," itself"]}),"\n",(0,i.jsxs)(t.p,{children:["After implementing the iterator over diagonals, we know that all we need to describe\na diagonal is the matrix itself and the \u201cstart\u201d of the diagonal (row and column).\nAnd we also know that the diagonal must provide some iterators for the ",(0,i.jsx)(t.code,{children:"std::sort"}),"\nfunction. We can start with the following skeleton:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-cpp",children:"template \nclass diagonal {\n using matrix_t = std::vector>;\n\n matrix_t& matrix;\n std::size_t x;\n std::size_t y;\n\npublic:\n diagonal(matrix_t& matrix, std::size_t x, std::size_t y)\n : matrix(matrix)\n , x(x)\n , y(y)\n {\n }\n\n diagonal_iter begin() const { return diagonal_iter { matrix, x, y }; }\n\n diagonal_iter end() const\n {\n auto max_x = matrix[y].size();\n auto max_y = matrix.size();\n\n // we need to find the distance in which we get out of bounds (either in\n // column or row)\n auto steps = std::min(max_x - x, max_y - y);\n\n return diagonal_iter { matrix, x + steps, y + steps };\n }\n};\n"})}),"\n",(0,i.jsxs)(t.p,{children:["Initialization is rather simple, we just \u201ckeep\u201d the stuff we get, ",(0,i.jsx)(t.code,{children:"begin"})," is the\nsimplest, we just delegate."]}),"\n",(0,i.jsxs)(t.p,{children:["In case of the ",(0,i.jsx)(t.code,{children:"end"}),", it gets more complicated. We need to know where is the \u201cend\u201d\nof the diagonal. Since ",(0,i.jsx)(t.code,{children:"end"})," should point to the first element \u201cafter\u201d the iterable,\nwe know that it's the first position of the iterator where either ",(0,i.jsx)(t.code,{children:"y"})," becomes\n",(0,i.jsx)(t.code,{children:"matrix.size()"})," or ",(0,i.jsx)(t.code,{children:"x"})," becomes ",(0,i.jsx)(t.code,{children:"matrix[y].size()"}),". Also we are moving along diagonal,\nduh, therefore we can deduce the first \u201cposition\u201d afterwards by minimal amount of\nsteps to get out of the any column or row, hence ",(0,i.jsx)(t.code,{children:"std::min(max_x - x, max_y - y)"}),".\nFinal position is then computed simply by adding the steps to the beginning of\nthe diagonal."]}),"\n",(0,i.jsx)(t.p,{children:"Now we just need to finish the iterator for the diagonal itself and we're done."}),"\n",(0,i.jsxs)(t.h3,{id:"implementing-diagonal_iter",children:["Implementing ",(0,i.jsx)(t.code,{children:"diagonal_iter"})]}),"\n",(0,i.jsxs)(t.p,{children:["This part is the hardest from all we need to do. It's because of the requirements\nof the ",(0,i.jsx)(t.code,{children:"std::sort"})," that requires us to implement a ",(0,i.jsx)(t.em,{children:"random access iterator"}),". I have\nbriefly described it above, and \u201cin a nutshell\u201d it means that we need to implement\nan iterator that can move in constant time along the diagonal in any amount of\nsteps."]}),"\n",(0,i.jsxs)(t.p,{children:["Let's go through all of the functionality that our iterator needs to support to\nbe used in ",(0,i.jsx)(t.code,{children:"std::sort"}),". We need the usual operations like:"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"equality/inequality"}),"\n",(0,i.jsx)(t.li,{children:"incrementation"}),"\n",(0,i.jsx)(t.li,{children:"dereferencing"}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"We will also add all the types that our iterator uses with the category of the\niterator, i.e. what interface it supports:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-cpp",children:"class diagonal_iter {\n // we need to keep reference to the matrix itself\n matrix_t& m;\n\n // we need to be able to tell our current position\n std::size_t x;\n std::size_t y;\n\npublic:\n using difference_type = std::ptrdiff_t;\n using value_type = T;\n using pointer = T*;\n using reference = T&;\n using iterator_category = std::random_access_iterator_tag;\n\n diagonal_iter(matrix_t& matrix,\n std::size_t x,\n std::size_t y)\n : m(matrix)\n , x(x)\n , y(y)\n {\n }\n\n bool operator==(const diagonal_iter& rhs) const\n {\n return x == rhs.x && y == rhs.y && m == rhs.m;\n }\n\n diagonal_iter& operator++()\n {\n // we are moving along the diagonal, so we increment both \u2039x\u203a and \u2039y\u203a at\n // the same time\n x++;\n y++;\n return *this;\n }\n\n reference operator*() const { return m[y][x]; }\n};\n"})}),"\n",(0,i.jsxs)(t.p,{children:["This is pretty similar to the previous iterator, but now we need to implement the\nremaining requirements of the ",(0,i.jsx)(t.em,{children:"random access iterator"}),". Let's see what those are:"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["decrementation - cause we need to be able to move backwards too, since _random _\n",(0,i.jsx)(t.em,{children:"access iterator"})," extends the interface of ",(0,i.jsx)(t.em,{children:"bidirectional iterator"})]}),"\n",(0,i.jsx)(t.li,{children:"moving the iterator in either direction by steps given as an integer"}),"\n",(0,i.jsx)(t.li,{children:"being able to tell the distance between two iterators"}),"\n",(0,i.jsx)(t.li,{children:"define an ordering on the iterators"}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"Let's fill them in:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-cpp",children:"class diagonal_iter {\n // we need to keep reference to the matrix itself\n matrix_t& m;\n\n // we need to be able to tell our current position\n std::size_t x;\n std::size_t y;\n\npublic:\n using difference_type = std::ptrdiff_t;\n using value_type = T;\n using pointer = T*;\n using reference = T&;\n using iterator_category = std::random_access_iterator_tag;\n\n diagonal_iter(matrix_t& matrix,\n std::size_t x,\n std::size_t y)\n : m(matrix)\n , x(x)\n , y(y)\n {\n }\n\n bool operator==(const diagonal_iter& rhs) const\n {\n return x == rhs.x && y == rhs.y && m == rhs.m;\n }\n\n diagonal_iter& operator++()\n {\n // we are moving along the diagonal, so we increment both \u2039x\u203a and \u2039y\u203a at\n // the same time\n x++;\n y++;\n return *this;\n }\n\n reference operator*() const { return m[y][x]; }\n\n // exactly opposite to the incrementation\n diagonal_iter operator--()\n {\n x--;\n y--;\n return *this;\n }\n\n // moving \u2039n\u203a steps back is same as calling decrementation \u2039n\u203a-times, so we\n // can just return a new iterator and subtract \u2039n\u203a from both coordinates in\n // the matrix\n diagonal_iter operator-(difference_type n) const\n {\n return diagonal_iter { m, x - n, y - n };\n }\n\n // here we assume that we are given two iterators on the same diagonal\n difference_type operator-(const diagonal_iter& rhs) const\n {\n assert(m == rhs.m);\n return x - rhs.x;\n }\n\n // counterpart of moving \u2039n\u203a steps backwards\n diagonal_iter operator+(difference_type n) const\n {\n return diagonal_iter { m, x + n, y + n };\n }\n\n // we compare the coordinates, and also assume that those 2 iterators are\n // lying on the same diagonal\n bool operator<(const diagonal_iter& rhs) const\n {\n assert(m == rhs.m);\n return x < rhs.x && y < rhs.y;\n }\n};\n"})}),"\n",(0,i.jsx)(t.p,{children:"At this point we could probably try and compile it, right? If we do so, we will\nget yelled at by a compiler for the following reasons:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:"/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1792:11: error: object of type 'diagonal::diagonal_iter' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]\n __last = __next;\n ^\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1817:11: note: in instantiation of function template specialization 'std::__unguarded_linear_insert::diagonal_iter, __gnu_cxx::__ops::_Val_less_iter>' requested here\n std::__unguarded_linear_insert(__i,\n ^\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1849:9: note: in instantiation of function template specialization 'std::__insertion_sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here\n std::__insertion_sort(__first, __first + int(_S_threshold), __comp);\n ^\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1940:9: note: in instantiation of function template specialization 'std::__final_insertion_sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here\n std::__final_insertion_sort(__first, __last, __comp);\n ^\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization 'std::__sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here\n std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());\n ^\nmatrix-sort.cpp:161:18: note: in instantiation of function template specialization 'std::sort::diagonal_iter>' requested here\n std::sort(d.begin(), d.end());\n ^\nmatrix-sort.cpp:17:19: note: copy assignment operator of 'diagonal_iter' is implicitly deleted because field 'm' is of reference type 'diagonal::matrix_t &' (aka 'vector> &')\n matrix_t& m;\n ^\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1830:2: error: no matching function for call to '__unguarded_linear_insert' [clang-diagnostic-error]\n std::__unguarded_linear_insert(__i,\n ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1850:9: note: in instantiation of function template specialization 'std::__unguarded_insertion_sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here\n std::__unguarded_insertion_sort(__first + int(_S_threshold), __last,\n ^\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1940:9: note: in instantiation of function template specialization 'std::__final_insertion_sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here\n std::__final_insertion_sort(__first, __last, __comp);\n ^\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization 'std::__sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here\n std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());\n ^\nmatrix-sort.cpp:161:18: note: in instantiation of function template specialization 'std::sort::diagonal_iter>' requested here\n std::sort(d.begin(), d.end());\n ^\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1782:5: note: candidate template ignored: substitution failure [with _RandomAccessIterator = diagonal::diagonal_iter, _Compare = __gnu_cxx::__ops::_Val_less_iter]\n __unguarded_linear_insert(_RandomAccessIterator __last,\n ^\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1923:11: error: object of type 'diagonal::diagonal_iter' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]\n __last = __cut;\n ^\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1937:9: note: in instantiation of function template specialization 'std::__introsort_loop::diagonal_iter, long, __gnu_cxx::__ops::_Iter_less_iter>' requested here\n std::__introsort_loop(__first, __last,\n ^\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization 'std::__sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here\n std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());\n ^\nmatrix-sort.cpp:161:18: note: in instantiation of function template specialization 'std::sort::diagonal_iter>' requested here\n std::sort(d.begin(), d.end());\n ^\nmatrix-sort.cpp:17:19: note: copy assignment operator of 'diagonal_iter' is implicitly deleted because field 'm' is of reference type 'diagonal::matrix_t &' (aka 'vector> &')\n matrix_t& m;\n ^\n"})}),"\n",(0,i.jsx)(t.p,{children:"That's a lot of noise, isn't it? Let's focus on the important parts:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:"/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1792:11: error: object of type 'diagonal::diagonal_iter' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]\n\u2026\nmatrix-sort.cpp:17:19: note: copy assignment operator of 'diagonal_iter' is implicitly deleted because field 'm' is of reference type 'diagonal::matrix_t &' (aka 'vector> &')\n matrix_t& m;\n ^\n"})}),"\n",(0,i.jsx)(t.p,{children:"Ah! We have a reference in our iterator, and this prevents us from having a copy\nassignment operator (that is used \u201csomewhere\u201d in the sorting algorithm). Well\u2026\nLet's just wrap it!"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-diff",children:"# we need to keep a different type than reference\n- matrix_t& m;\n+ std::reference_wrapper m;\n\n# in comparison we need to get the reference out of the wrapper first\n- return x == rhs.x && y == rhs.y && m == rhs.m;\n+ return x == rhs.x && y == rhs.y && m.get() == rhs.m.get();\n\n# same when we return a reference to the \u201ccell\u201d in the matrix\n- reference operator*() const { return m[y][x]; }\n+ reference operator*() const { return m.get()[y][x]; }\n\n# and finally in the assertions that we set for the \u201cdistance\u201d and \u201cless than\u201d\n- assert(m == rhs.m);\n+ assert(m.get() == rhs.m.get());\n"})}),"\n",(0,i.jsxs)(t.p,{children:["We're done now! We have written an iterator over diagonals for a 2D ",(0,i.jsx)(t.code,{children:"vector"}),". You can have a look at the final result ",(0,i.jsx)(t.a,{href:"pathname:///files/blog/leetcode/sort-matrix-diagonally/matrix-sort.cpp",children:"here"}),"."]}),"\n",(0,i.jsxs)(t.section,{"data-footnotes":!0,className:"footnotes",children:[(0,i.jsx)(t.h2,{className:"sr-only",id:"footnote-label",children:"Footnotes"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{id:"user-content-fn-1-b611be",children:["\n",(0,i.jsxs)(t.p,{children:["just because I'm used to it and don't care about your opinion ;) ",(0,i.jsx)(t.a,{href:"#user-content-fnref-1-b611be","data-footnote-backref":"","aria-label":"Back to reference 1",className:"data-footnote-backref",children:"\u21a9"})]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{id:"user-content-fn-2-b611be",children:["\n",(0,i.jsxs)(t.p,{children:["exercise at your own risk ",(0,i.jsx)(t.a,{href:"#user-content-fnref-2-b611be","data-footnote-backref":"","aria-label":"Back to reference 2",className:"data-footnote-backref",children:"\u21a9"})]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{id:"user-content-fn-3-b611be",children:["\n",(0,i.jsxs)(t.p,{children:["me in 5 minutes in fact, but don't make me scared ",(0,i.jsx)(t.a,{href:"#user-content-fnref-3-b611be","data-footnote-backref":"","aria-label":"Back to reference 3",className:"data-footnote-backref",children:"\u21a9"})]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{id:"user-content-fn-4-b611be",children:["\n",(0,i.jsxs)(t.p,{children:["me in the next section\u2026 ",(0,i.jsx)(t.a,{href:"#user-content-fnref-4-b611be","data-footnote-backref":"","aria-label":"Back to reference 4",className:"data-footnote-backref",children:"\u21a9"})]}),"\n"]}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,a.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},11151:(e,t,n)=>{n.d(t,{Z:()=>s,a:()=>r});var i=n(67294);const a={},o=i.createContext(a);function r(e){const t=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),i.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/cfa2b263.efd5103c.js b/assets/js/cfa2b263.efd5103c.js deleted file mode 100644 index 3395734..0000000 --- a/assets/js/cfa2b263.efd5103c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[3086],{34437:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>d});var i=n(85893),a=n(11151);const o={title:"Sort the matrix diagonally",description:"Compiler assisted development.",date:"2023-03-04T23:15",slug:"leetcode/sort-diagonally",authors:"mf",tags:["cpp","leetcode","iterators"],hide_table_of_contents:!1},r=void 0,s={permalink:"/blog/leetcode/sort-diagonally",editUrl:"https://github.com/mfocko/blog/tree/main/blog/leetcode/sort-matrix-diagonally.md",source:"@site/blog/leetcode/sort-matrix-diagonally.md",title:"Sort the matrix diagonally",description:"Compiler assisted development.",date:"2023-03-04T23:15:00.000Z",formattedDate:"March 4, 2023",tags:[{label:"cpp",permalink:"/blog/tags/cpp"},{label:"leetcode",permalink:"/blog/tags/leetcode"},{label:"iterators",permalink:"/blog/tags/iterators"}],readingTime:16.99,hasTruncateMarker:!0,authors:[{name:"Matej Focko",email:"me+blog@mfocko.xyz",title:"a.k.a. @mf",url:"https://gitlab.com/mfocko",imageURL:"https://github.com/mfocko.png",key:"mf"}],frontMatter:{title:"Sort the matrix diagonally",description:"Compiler assisted development.",date:"2023-03-04T23:15",slug:"leetcode/sort-diagonally",authors:"mf",tags:["cpp","leetcode","iterators"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"3rd week of Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/3rd-week"},nextItem:{title:"2nd week of Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/2nd-week"}},l={authorsImageUrls:[void 0]},d=[{value:"Problem description",id:"problem-description",level:2},{value:"Example",id:"example",level:3},{value:"Skeleton and initial adjustments",id:"skeleton-and-initial-adjustments",level:2},{value:"Na\xefve solution",id:"na\xefve-solution",level:2},{value:"Implementing the diagonals",id:"implementing-the-diagonals",level:2},{value:"Iterating over diagonals",id:"iterating-over-diagonals",level:3},{value:"Implementing the iterator over diagonals",id:"implementing-the-iterator-over-diagonals",level:3},{value:"Implementing the diagonal itself",id:"implementing-the-diagonal-itself",level:2},{value:"Implementing diagonal_iter",id:"implementing-diagonal_iter",level:3}];function c(e){const t={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",section:"section",strong:"strong",sup:"sup",ul:"ul",...(0,a.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:"Let's try to solve one of the LeetCode challenges in easy and hard mode at the\nsame time."}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["Link to the problem: ",(0,i.jsx)(t.a,{href:"https://leetcode.com/problems/sort-the-matrix-diagonally/",children:"https://leetcode.com/problems/sort-the-matrix-diagonally/"})]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"problem-description",children:"Problem description"}),"\n",(0,i.jsxs)(t.p,{children:["A ",(0,i.jsx)(t.strong,{children:"matrix diagonal"})," is a diagonal line of cells starting from some cell in\neither the topmost row or leftmost column and going in the bottom-right direction\nuntil reaching the matrix's end. For example, the ",(0,i.jsx)(t.strong,{children:"matrix diagonal"})," starting\nfrom ",(0,i.jsx)(t.code,{children:"mat[2][0]"}),", where ",(0,i.jsx)(t.code,{children:"mat"})," is a ",(0,i.jsx)(t.code,{children:"6 x 3"})," matrix, includes cells ",(0,i.jsx)(t.code,{children:"mat[2][0]"}),",\n",(0,i.jsx)(t.code,{children:"mat[3][1]"}),", and ",(0,i.jsx)(t.code,{children:"mat[4][2]"}),"."]}),"\n",(0,i.jsxs)(t.p,{children:["Given an ",(0,i.jsx)(t.code,{children:"m x n"})," matrix ",(0,i.jsx)(t.code,{children:"mat"})," of integers, sort each matrix diagonal in ascending\norder and return the resulting matrix."]}),"\n",(0,i.jsx)(t.h3,{id:"example",children:"Example"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{src:"https://assets.leetcode.com/uploads/2020/01/21/1482_example_1_2.png",alt:"Image describing the problem"})}),"\n",(0,i.jsx)(t.h2,{id:"skeleton-and-initial-adjustments",children:"Skeleton and initial adjustments"}),"\n",(0,i.jsx)(t.p,{children:"We are given the following skeleton for the C++ and the given challenge:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-cpp",children:"class Solution {\npublic:\n vector> diagonalSort(vector>& mat) {\n \n }\n};\n"})}),"\n",(0,i.jsxs)(t.p,{children:["The task is to sort the passed matrix diagonally and then return it. First of all,\nI don't like to solve this in a web browser, so we'll need to adjust it accordingly\nfor running it locally. We'll start by including the ",(0,i.jsx)(t.code,{children:"vector"})," header and using\nfully-qualified namespaces",(0,i.jsx)(t.sup,{children:(0,i.jsx)(t.a,{href:"#user-content-fn-1-b611be",id:"user-content-fnref-1-b611be","data-footnote-ref":!0,"aria-describedby":"footnote-label",children:"1"})})," and also adding few tests:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-cpp",children:"#include \n#include \n\nusing matrix = std::vector>;\n\nclass Solution {\npublic:\n matrix diagonalSort(matrix& mat)\n {\n }\n};\n\nstatic void test_case_1()\n{\n // Input: mat = [[3,3,1,1],[2,2,1,2],[1,1,1,2]]\n // Output: [[1,1,1,1],[1,2,2,2],[1,2,3,3]]\n\n Solution s;\n assert((s.diagonalSort(std::vector { std::vector { 3, 3, 1, 1 },\n std::vector { 2, 2, 1, 2 },\n std::vector { 1, 1, 1, 2 } })\n == std::vector { std::vector { 1, 1, 1, 1 },\n std::vector { 1, 2, 2, 2 },\n std::vector { 1, 2, 3, 3 } }));\n}\n\nstatic void test_case_2()\n{\n // Input: mat =\n // [[11,25,66,1,69,7],[23,55,17,45,15,52],[75,31,36,44,58,8],[22,27,33,25,68,4],[84,28,14,11,5,50]]\n // Output:\n // [[5,17,4,1,52,7],[11,11,25,45,8,69],[14,23,25,44,58,15],[22,27,31,36,50,66],[84,28,75,33,55,68]]\n\n Solution s;\n assert((s.diagonalSort(std::vector { std::vector { 11, 25, 66, 1, 69, 7 },\n std::vector { 23, 55, 17, 45, 15, 52 },\n std::vector { 75, 31, 36, 44, 58, 8 },\n std::vector { 22, 27, 33, 25, 68, 4 },\n std::vector { 84, 28, 14, 11, 5, 50 } })\n == std::vector { std::vector { 5, 17, 4, 1, 52, 7 },\n std::vector { 11, 11, 25, 45, 8, 69 },\n std::vector { 14, 23, 25, 44, 58, 15 },\n std::vector { 22, 27, 31, 36, 50, 66 },\n std::vector { 84, 28, 75, 33, 55, 68 } }));\n}\n\nint main()\n{\n test_case_1();\n test_case_2();\n\n return 0;\n}\n"})}),"\n",(0,i.jsx)(t.p,{children:"We need to return the matrix, but we're given a reference to the input matrix. We\ncan easily abuse the C++ here and just switch the reference to value, this way\nthe matrix will be copied when passed to the function, we can sort the copy and\njust return it back. And we also get yelled by the compiler for the fact that the\nmethod doesn't return anything yet, so to make it \u201cshut up\u201d we will just return\nthe input for now:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-diff",children:"- matrix diagonalSort(matrix& mat)\n+ matrix diagonalSort(matrix mat)\n {\n+ return mat;\n }\n"})}),"\n",(0,i.jsx)(t.p,{children:"Now, we get the copy and we're good to go."}),"\n",(0,i.jsx)(t.h2,{id:"na\xefve-solution",children:"Na\xefve solution"}),"\n",(0,i.jsx)(t.p,{children:"As you may know, C++ offers a plethora of functions that can be used to your\nadvantage, given that you know how to \u201cbend\u201d the data structures accordingly."}),"\n",(0,i.jsxs)(t.p,{children:["What does that mean for us? Well, we have an ",(0,i.jsx)(t.code,{children:"std::sort"}),", we can use it, right?\nLet's have a look at it:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-cpp",children:"template< class RandomIt >\nvoid sort( RandomIt first, RandomIt last );\n"})}),"\n",(0,i.jsxs)(t.p,{children:["This overload is more than we need. What does it do? It just sorts the elements\nin the range ",(0,i.jsx)(t.code,{children:"[first, last)"})," using ",(0,i.jsx)(t.code,{children:"operator<"})," on them. We can't sort the whole\nmatrix using this, but\u2026 we can sort just \xbbone\xab diagonal without doing much work\non our end."]}),"\n",(0,i.jsxs)(t.p,{children:["What is the ",(0,i.jsx)(t.code,{children:"RandomIt"})," type though? If we look more into the documentation, we\ncan easily find the requirements for it and also learn that it's a ",(0,i.jsx)(t.em,{children:"random access"}),"\n",(0,i.jsx)(t.em,{children:"iterator"})," and allows swapping its values at the same time."]}),"\n",(0,i.jsxs)(t.admonition,{title:"Random access iterator",type:"tip",children:[(0,i.jsxs)(t.p,{children:["What is the ",(0,i.jsx)(t.em,{children:"random access iterator"})," though? We can find it in a documentation\nand see the following description:"]}),(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:["A ",(0,i.jsx)(t.strong,{children:"LegacyRandomAccessIterator"})," is a ",(0,i.jsx)(t.a,{href:"https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator",children:"LegacyBidirectionalIterator"}),"\nthat can be moved to point to any element in constant time."]}),"\n"]}),(0,i.jsxs)(t.p,{children:["After that we can see all the requirements for it being listed. I don't feel like\nreading them right now, so we will just use it and see where the compilation blows\nup, i.e. \u201c",(0,i.jsx)(t.em,{children:"compiler-assisted development"}),"\u201d",(0,i.jsx)(t.sup,{children:(0,i.jsx)(t.a,{href:"#user-content-fn-2-b611be",id:"user-content-fnref-2-b611be","data-footnote-ref":!0,"aria-describedby":"footnote-label",children:"2"})})," if you will ;)"]})]}),"\n",(0,i.jsxs)(t.p,{children:["Now we know that we can use ",(0,i.jsx)(t.code,{children:"std::sort"})," to sort the diagonal itself, but we also\nneed to get the diagonals somehow. I'm rather lazy, so I'll just delegate it to\nsomeone else",(0,i.jsx)(t.sup,{children:(0,i.jsx)(t.a,{href:"#user-content-fn-3-b611be",id:"user-content-fnref-3-b611be","data-footnote-ref":!0,"aria-describedby":"footnote-label",children:"3"})}),". And that way we get"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-cpp",children:"matrix diagonalSort(matrix mat)\n{\n // we iterate over the diagonals\n for (auto d : diagonals(mat)) {\n // and we sort each diagonal\n std::sort(d.begin(), d.end());\n }\n\n // we take the matrix by copy, so we can sort in-situ and return the copy\n // that we sorted\n return mat;\n}\n"})}),"\n",(0,i.jsx)(t.p,{children:"This solution looks very simple, doesn't it? Well, cause it is.\nLet's try compiling it:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:"matrix-sort.cpp:11:23: error: use of undeclared identifier 'diagonals' [clang-diagnostic-error]\n for (auto d : diagonals(mat)) {\n ^\nFound compiler error(s).\nmake: *** [makefile:14: tidy] Error 1\n"})}),"\n",(0,i.jsxs)(t.p,{children:["OK, seems about right. We haven't implemented the ",(0,i.jsx)(t.code,{children:"diagonals"})," yet. And based on\nwhat we've written so far, we need a function or a class ",(0,i.jsx)(t.code,{children:"diagonals"})," that will\ngive us the diagonals we need."]}),"\n",(0,i.jsxs)(t.h2,{id:"implementing-the-diagonals",children:["Implementing the ",(0,i.jsx)(t.code,{children:"diagonals"})]}),"\n",(0,i.jsxs)(t.p,{children:["Cool, so we need the function that will let us go through each and every diagonal\nin our matrix. We use the ",(0,i.jsx)(t.em,{children:"for-range"})," loop, so whatever we get back from the\n",(0,i.jsx)(t.code,{children:"diagonals"})," must support ",(0,i.jsx)(t.code,{children:".begin()"})," and ",(0,i.jsx)(t.code,{children:".end()"}),". Since I am a masochist, we will\ndo such functionality for a matrix of any type, not just the ",(0,i.jsx)(t.code,{children:"int"})," from the challenge."]}),"\n",(0,i.jsx)(t.p,{children:"As I said, we need to be able to"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"construct the object"}),"\n",(0,i.jsx)(t.li,{children:"get the beginning"}),"\n",(0,i.jsx)(t.li,{children:"get the end (the \u201csentinel\u201d)"}),"\n"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-cpp",children:"template \nclass diagonals {\n using matrix_t = std::vector>;\n\n matrix_t& _matrix;\n\npublic:\n diagonals(matrix_t& m)\n : _matrix(m)\n {\n }\n diagonals_iter begin()\n {\n /* TODO */\n }\n diagonals_iter end()\n {\n /* TODO */\n }\n};\n"})}),"\n",(0,i.jsxs)(t.p,{children:["Now we have a ",(0,i.jsx)(t.code,{children:"diagonals"})," that we can use to go through the diagonals. We haven't\nimplemented the core of it yet. Let's go through what we have for now."]}),"\n",(0,i.jsxs)(t.p,{children:["We have a templated class with templated ",(0,i.jsx)(t.code,{children:"T"})," that is used as a placeholder for any\ntype we would store in the matrix. Because I'm lazy, I have defined the ",(0,i.jsx)(t.code,{children:"matrix_t"}),"\ntype that is a \u201cshortcut\u201d for ",(0,i.jsx)(t.code,{children:"std::vector>"}),", so I don't have to\ntype it out all the time. Of course, we need to store the matrix, we are given,\nas a private attribute. And then just have the constructor and the 2 methods we\nneed for the ",(0,i.jsx)(t.em,{children:"for-range"}),"."]}),"\n",(0,i.jsx)(t.h3,{id:"iterating-over-diagonals",children:"Iterating over diagonals"}),"\n",(0,i.jsxs)(t.p,{children:["Now that we have an object that will allow us to iterate through the diagonals,\nwe need to implement the iterating itself. We need to go through all of them, so\nwe have multiple options how to do so. I have decided to start from the \u201cmain\u201d\ndiagonal that starts at ",(0,i.jsx)(t.code,{children:"(0, 0)"})," index and then proceed with the diagonals starting\nin the first row, followed by the rest of the diagonals in the first column."]}),"\n",(0,i.jsx)(t.p,{children:"We need to be able to tell that we've iterated through all of them, and also we\nneed to know which diagonal is next. For that purpose we will pass the indices\nof the first cell on the diagonal. That way we can always tell how to move forward."}),"\n",(0,i.jsxs)(t.p,{children:["We will start by updating the ",(0,i.jsx)(t.code,{children:"begin"})," and ",(0,i.jsx)(t.code,{children:"end"})," to reflect our choice accordingly."]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-cpp",children:"diagonals_iter begin() { return diagonals_iter { _matrix, 0, 0 }; }\ndiagonals_iter end() { return diagonals_iter { _matrix, 0, _matrix.size() }; }\n"})}),"\n",(0,i.jsxs)(t.p,{children:["For the ",(0,i.jsx)(t.code,{children:"begin"})," we return the first diagonal that starts at ",(0,i.jsx)(t.code,{children:"(0, 0)"}),". And because\nwe have decided to do the diagonals in the first column at the end, the first\ndiagonal that is not a valid one is the one at ",(0,i.jsx)(t.code,{children:"(0, height)"}),". Apart from the\nindices, we also need to pass reference to the matrix itself."]}),"\n",(0,i.jsx)(t.admonition,{type:"note",children:(0,i.jsxs)(t.p,{children:["You may have noticed that we also include the diagonals that have length 1,\nspecifically the ones at ",(0,i.jsx)(t.code,{children:"(0, height - 1)"})," and ",(0,i.jsx)(t.code,{children:"(width - 1, 0)"}),". We are implementing\nan iterator that ",(0,i.jsx)(t.strong,{children:"should not"})," care about the way it's being used. Therefore, we\ndon't care about the fact they don't need to be sorted."]})}),"\n",(0,i.jsxs)(t.p,{children:["Cool, let's leave the iterator itself to someone else, right?",(0,i.jsx)(t.sup,{children:(0,i.jsx)(t.a,{href:"#user-content-fn-4-b611be",id:"user-content-fnref-4-b611be","data-footnote-ref":!0,"aria-describedby":"footnote-label",children:"4"})})]}),"\n",(0,i.jsx)(t.h3,{id:"implementing-the-iterator-over-diagonals",children:"Implementing the iterator over diagonals"}),"\n",(0,i.jsxs)(t.p,{children:["We can start with a simple skeleton based on the information that we pass from\nthe ",(0,i.jsx)(t.code,{children:"diagonals"}),". Also to utilize the ",(0,i.jsx)(t.code,{children:"matrix_t"})," and also contain implementation\ndetails hidden away, we will put this code into the ",(0,i.jsx)(t.code,{children:"diagonals"})," class."]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-cpp",children:"class diagonals_iter {\n matrix_t& m;\n std::size_t x;\n std::size_t y;\n\npublic:\n diagonals_iter(matrix_t& matrix, std::size_t x, std::size_t y)\n : m(matrix)\n , x(x)\n , y(y)\n {\n }\n};\n"})}),"\n",(0,i.jsx)(t.p,{children:"In this case we will be implementing a \u201csimple\u201d forward iterator, so we don't\nneed to implement a lot. Notably it will be:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"inequality operator (we need to know when we reach the end and have nothing to\niterate over)"}),"\n",(0,i.jsx)(t.li,{children:"preincrementation operator (we need to be able to move around the iterable)"}),"\n",(0,i.jsx)(t.li,{children:"dereference operator (we need to be able to retrieve the objects we iterate\nover)"}),"\n"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-cpp",children:"class diagonals_iter {\n matrix_t& m;\n std::size_t x;\n std::size_t y;\n\npublic:\n diagonals_iter(matrix_t& matrix, std::size_t x, std::size_t y)\n : m(matrix)\n , x(x)\n , y(y)\n {\n }\n\n bool operator!=(const diagonals_iter& rhs) const\n {\n // iterators are not equal if they reference different matrices, or\n // their positions differ\n return m != rhs.m || x != rhs.x || y != rhs.y;\n }\n\n diagonals_iter& operator++()\n {\n if (y != 0) {\n // iterating through diagonals down the first column\n y++;\n return *this;\n }\n\n // iterating the diagonals along the first row\n x++;\n if (x == m.front().size()) {\n // switching to diagonals in the first column\n x = 0;\n y++;\n }\n\n return *this;\n }\n\n diagonal operator*() const { return diagonal { m, x, y }; }\n};\n"})}),"\n",(0,i.jsx)(t.p,{children:"Let's go one-by-one. Inequality operator is rather simple, just compare iterator's\nattributes field-by-field. If you think about it, checking inequality of two 2D\nvectors may be a bit inefficient, therefore, we can swap around and check it as\na last thing."}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-diff",children:"- return m != rhs.m || x != rhs.x || y != rhs.y;\n+ return x != rhs.x || y != rhs.y || m != rhs.m;\n"})}),"\n",(0,i.jsx)(t.p,{children:"Preincrementation is where the magic happens. If you have a better look, you can\nsee two branches of this operation:"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:["When ",(0,i.jsx)(t.code,{children:"y != 0"})," (we're iterating over the diagonals in the first column)\nIn this case, we just bump the row and we're done."]}),"\n",(0,i.jsxs)(t.li,{children:["When ",(0,i.jsx)(t.code,{children:"y == 0"})," (we're iterating over the diagonals in the first row)\nIn this case, we bump the column and check if we haven't gotten out of bounds,\ni.e. the end of the first row. If we get out of the bounds, we're continuing\nwith the second diagonal in the first column."]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["Dereferencing the iterator must \u201cyield\u201d something. In our case it will be the\ndiagonal that we want to sort. For sorting we need just the iterators that can\nmove around said diagonal. The simplest thing, we can do, is to delegate it to\nsomething else. In our case it will be a class called ",(0,i.jsx)(t.code,{children:"diagonal"}),"."]}),"\n",(0,i.jsxs)(t.h2,{id:"implementing-the-diagonal-itself",children:["Implementing the ",(0,i.jsx)(t.code,{children:"diagonal"})," itself"]}),"\n",(0,i.jsxs)(t.p,{children:["After implementing the iterator over diagonals, we know that all we need to describe\na diagonal is the matrix itself and the \u201cstart\u201d of the diagonal (row and column).\nAnd we also know that the diagonal must provide some iterators for the ",(0,i.jsx)(t.code,{children:"std::sort"}),"\nfunction. We can start with the following skeleton:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-cpp",children:"template \nclass diagonal {\n using matrix_t = std::vector>;\n\n matrix_t& matrix;\n std::size_t x;\n std::size_t y;\n\npublic:\n diagonal(matrix_t& matrix, std::size_t x, std::size_t y)\n : matrix(matrix)\n , x(x)\n , y(y)\n {\n }\n\n diagonal_iter begin() const { return diagonal_iter { matrix, x, y }; }\n\n diagonal_iter end() const\n {\n auto max_x = matrix[y].size();\n auto max_y = matrix.size();\n\n // we need to find the distance in which we get out of bounds (either in\n // column or row)\n auto steps = std::min(max_x - x, max_y - y);\n\n return diagonal_iter { matrix, x + steps, y + steps };\n }\n};\n"})}),"\n",(0,i.jsxs)(t.p,{children:["Initialization is rather simple, we just \u201ckeep\u201d the stuff we get, ",(0,i.jsx)(t.code,{children:"begin"})," is the\nsimplest, we just delegate."]}),"\n",(0,i.jsxs)(t.p,{children:["In case of the ",(0,i.jsx)(t.code,{children:"end"}),", it gets more complicated. We need to know where is the \u201cend\u201d\nof the diagonal. Since ",(0,i.jsx)(t.code,{children:"end"})," should point to the first element \u201cafter\u201d the iterable,\nwe know that it's the first position of the iterator where either ",(0,i.jsx)(t.code,{children:"y"})," becomes\n",(0,i.jsx)(t.code,{children:"matrix.size()"})," or ",(0,i.jsx)(t.code,{children:"x"})," becomes ",(0,i.jsx)(t.code,{children:"matrix[y].size()"}),". Also we are moving along diagonal,\nduh, therefore we can deduce the first \u201cposition\u201d afterwards by minimal amount of\nsteps to get out of the any column or row, hence ",(0,i.jsx)(t.code,{children:"std::min(max_x - x, max_y - y)"}),".\nFinal position is then computed simply by adding the steps to the beginning of\nthe diagonal."]}),"\n",(0,i.jsx)(t.p,{children:"Now we just need to finish the iterator for the diagonal itself and we're done."}),"\n",(0,i.jsxs)(t.h3,{id:"implementing-diagonal_iter",children:["Implementing ",(0,i.jsx)(t.code,{children:"diagonal_iter"})]}),"\n",(0,i.jsxs)(t.p,{children:["This part is the hardest from all we need to do. It's because of the requirements\nof the ",(0,i.jsx)(t.code,{children:"std::sort"})," that requires us to implement a ",(0,i.jsx)(t.em,{children:"random access iterator"}),". I have\nbriefly described it above, and \u201cin a nutshell\u201d it means that we need to implement\nan iterator that can move in constant time along the diagonal in any amount of\nsteps."]}),"\n",(0,i.jsxs)(t.p,{children:["Let's go through all of the functionality that our iterator needs to support to\nbe used in ",(0,i.jsx)(t.code,{children:"std::sort"}),". We need the usual operations like:"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"equality/inequality"}),"\n",(0,i.jsx)(t.li,{children:"incrementation"}),"\n",(0,i.jsx)(t.li,{children:"dereferencing"}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"We will also add all the types that our iterator uses with the category of the\niterator, i.e. what interface it supports:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-cpp",children:"class diagonal_iter {\n // we need to keep reference to the matrix itself\n matrix_t& m;\n\n // we need to be able to tell our current position\n std::size_t x;\n std::size_t y;\n\npublic:\n using difference_type = std::ptrdiff_t;\n using value_type = T;\n using pointer = T*;\n using reference = T&;\n using iterator_category = std::random_access_iterator_tag;\n\n diagonal_iter(matrix_t& matrix,\n std::size_t x,\n std::size_t y)\n : m(matrix)\n , x(x)\n , y(y)\n {\n }\n\n bool operator==(const diagonal_iter& rhs) const\n {\n return x == rhs.x && y == rhs.y && m == rhs.m;\n }\n\n diagonal_iter& operator++()\n {\n // we are moving along the diagonal, so we increment both \u2039x\u203a and \u2039y\u203a at\n // the same time\n x++;\n y++;\n return *this;\n }\n\n reference operator*() const { return m[y][x]; }\n};\n"})}),"\n",(0,i.jsxs)(t.p,{children:["This is pretty similar to the previous iterator, but now we need to implement the\nremaining requirements of the ",(0,i.jsx)(t.em,{children:"random access iterator"}),". Let's see what those are:"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["decrementation - cause we need to be able to move backwards too, since _random _\n",(0,i.jsx)(t.em,{children:"access iterator"})," extends the interface of ",(0,i.jsx)(t.em,{children:"bidirectional iterator"})]}),"\n",(0,i.jsx)(t.li,{children:"moving the iterator in either direction by steps given as an integer"}),"\n",(0,i.jsx)(t.li,{children:"being able to tell the distance between two iterators"}),"\n",(0,i.jsx)(t.li,{children:"define an ordering on the iterators"}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"Let's fill them in:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-cpp",children:"class diagonal_iter {\n // we need to keep reference to the matrix itself\n matrix_t& m;\n\n // we need to be able to tell our current position\n std::size_t x;\n std::size_t y;\n\npublic:\n using difference_type = std::ptrdiff_t;\n using value_type = T;\n using pointer = T*;\n using reference = T&;\n using iterator_category = std::random_access_iterator_tag;\n\n diagonal_iter(matrix_t& matrix,\n std::size_t x,\n std::size_t y)\n : m(matrix)\n , x(x)\n , y(y)\n {\n }\n\n bool operator==(const diagonal_iter& rhs) const\n {\n return x == rhs.x && y == rhs.y && m == rhs.m;\n }\n\n diagonal_iter& operator++()\n {\n // we are moving along the diagonal, so we increment both \u2039x\u203a and \u2039y\u203a at\n // the same time\n x++;\n y++;\n return *this;\n }\n\n reference operator*() const { return m[y][x]; }\n\n // exactly opposite to the incrementation\n diagonal_iter operator--()\n {\n x--;\n y--;\n return *this;\n }\n\n // moving \u2039n\u203a steps back is same as calling decrementation \u2039n\u203a-times, so we\n // can just return a new iterator and subtract \u2039n\u203a from both coordinates in\n // the matrix\n diagonal_iter operator-(difference_type n) const\n {\n return diagonal_iter { m, x - n, y - n };\n }\n\n // here we assume that we are given two iterators on the same diagonal\n difference_type operator-(const diagonal_iter& rhs) const\n {\n assert(m == rhs.m);\n return x - rhs.x;\n }\n\n // counterpart of moving \u2039n\u203a steps backwards\n diagonal_iter operator+(difference_type n) const\n {\n return diagonal_iter { m, x + n, y + n };\n }\n\n // we compare the coordinates, and also assume that those 2 iterators are\n // lying on the same diagonal\n bool operator<(const diagonal_iter& rhs) const\n {\n assert(m == rhs.m);\n return x < rhs.x && y < rhs.y;\n }\n};\n"})}),"\n",(0,i.jsx)(t.p,{children:"At this point we could probably try and compile it, right? If we do so, we will\nget yelled at by a compiler for the following reasons:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:"/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1792:11: error: object of type 'diagonal::diagonal_iter' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]\n __last = __next;\n ^\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1817:11: note: in instantiation of function template specialization 'std::__unguarded_linear_insert::diagonal_iter, __gnu_cxx::__ops::_Val_less_iter>' requested here\n std::__unguarded_linear_insert(__i,\n ^\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1849:9: note: in instantiation of function template specialization 'std::__insertion_sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here\n std::__insertion_sort(__first, __first + int(_S_threshold), __comp);\n ^\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1940:9: note: in instantiation of function template specialization 'std::__final_insertion_sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here\n std::__final_insertion_sort(__first, __last, __comp);\n ^\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization 'std::__sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here\n std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());\n ^\nmatrix-sort.cpp:161:18: note: in instantiation of function template specialization 'std::sort::diagonal_iter>' requested here\n std::sort(d.begin(), d.end());\n ^\nmatrix-sort.cpp:17:19: note: copy assignment operator of 'diagonal_iter' is implicitly deleted because field 'm' is of reference type 'diagonal::matrix_t &' (aka 'vector> &')\n matrix_t& m;\n ^\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1830:2: error: no matching function for call to '__unguarded_linear_insert' [clang-diagnostic-error]\n std::__unguarded_linear_insert(__i,\n ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1850:9: note: in instantiation of function template specialization 'std::__unguarded_insertion_sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here\n std::__unguarded_insertion_sort(__first + int(_S_threshold), __last,\n ^\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1940:9: note: in instantiation of function template specialization 'std::__final_insertion_sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here\n std::__final_insertion_sort(__first, __last, __comp);\n ^\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization 'std::__sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here\n std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());\n ^\nmatrix-sort.cpp:161:18: note: in instantiation of function template specialization 'std::sort::diagonal_iter>' requested here\n std::sort(d.begin(), d.end());\n ^\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1782:5: note: candidate template ignored: substitution failure [with _RandomAccessIterator = diagonal::diagonal_iter, _Compare = __gnu_cxx::__ops::_Val_less_iter]\n __unguarded_linear_insert(_RandomAccessIterator __last,\n ^\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1923:11: error: object of type 'diagonal::diagonal_iter' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]\n __last = __cut;\n ^\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1937:9: note: in instantiation of function template specialization 'std::__introsort_loop::diagonal_iter, long, __gnu_cxx::__ops::_Iter_less_iter>' requested here\n std::__introsort_loop(__first, __last,\n ^\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization 'std::__sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here\n std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());\n ^\nmatrix-sort.cpp:161:18: note: in instantiation of function template specialization 'std::sort::diagonal_iter>' requested here\n std::sort(d.begin(), d.end());\n ^\nmatrix-sort.cpp:17:19: note: copy assignment operator of 'diagonal_iter' is implicitly deleted because field 'm' is of reference type 'diagonal::matrix_t &' (aka 'vector> &')\n matrix_t& m;\n ^\n"})}),"\n",(0,i.jsx)(t.p,{children:"That's a lot of noise, isn't it? Let's focus on the important parts:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:"/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1792:11: error: object of type 'diagonal::diagonal_iter' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]\n\u2026\nmatrix-sort.cpp:17:19: note: copy assignment operator of 'diagonal_iter' is implicitly deleted because field 'm' is of reference type 'diagonal::matrix_t &' (aka 'vector> &')\n matrix_t& m;\n ^\n"})}),"\n",(0,i.jsx)(t.p,{children:"Ah! We have a reference in our iterator, and this prevents us from having a copy\nassignment operator (that is used \u201csomewhere\u201d in the sorting algorithm). Well\u2026\nLet's just wrap it!"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-diff",children:"# we need to keep a different type than reference\n- matrix_t& m;\n+ std::reference_wrapper m;\n\n# in comparison we need to get the reference out of the wrapper first\n- return x == rhs.x && y == rhs.y && m == rhs.m;\n+ return x == rhs.x && y == rhs.y && m.get() == rhs.m.get();\n\n# same when we return a reference to the \u201ccell\u201d in the matrix\n- reference operator*() const { return m[y][x]; }\n+ reference operator*() const { return m.get()[y][x]; }\n\n# and finally in the assertions that we set for the \u201cdistance\u201d and \u201cless than\u201d\n- assert(m == rhs.m);\n+ assert(m.get() == rhs.m.get());\n"})}),"\n",(0,i.jsxs)(t.p,{children:["We're done now! We have written an iterator over diagonals for a 2D ",(0,i.jsx)(t.code,{children:"vector"}),". You can have a look at the final result ",(0,i.jsx)(t.a,{href:"pathname:///files/blog/leetcode/sort-matrix-diagonally/matrix-sort.cpp",children:"here"}),"."]}),"\n",(0,i.jsxs)(t.section,{"data-footnotes":!0,className:"footnotes",children:[(0,i.jsx)(t.h2,{className:"sr-only",id:"footnote-label",children:"Footnotes"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{id:"user-content-fn-1-b611be",children:["\n",(0,i.jsxs)(t.p,{children:["just because I'm used to it and don't care about your opinion ;) ",(0,i.jsx)(t.a,{href:"#user-content-fnref-1-b611be","data-footnote-backref":"","aria-label":"Back to reference 1",className:"data-footnote-backref",children:"\u21a9"})]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{id:"user-content-fn-2-b611be",children:["\n",(0,i.jsxs)(t.p,{children:["exercise at your own risk ",(0,i.jsx)(t.a,{href:"#user-content-fnref-2-b611be","data-footnote-backref":"","aria-label":"Back to reference 2",className:"data-footnote-backref",children:"\u21a9"})]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{id:"user-content-fn-3-b611be",children:["\n",(0,i.jsxs)(t.p,{children:["me in 5 minutes in fact, but don't make me scared ",(0,i.jsx)(t.a,{href:"#user-content-fnref-3-b611be","data-footnote-backref":"","aria-label":"Back to reference 3",className:"data-footnote-backref",children:"\u21a9"})]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{id:"user-content-fn-4-b611be",children:["\n",(0,i.jsxs)(t.p,{children:["me in the next section\u2026 ",(0,i.jsx)(t.a,{href:"#user-content-fnref-4-b611be","data-footnote-backref":"","aria-label":"Back to reference 4",className:"data-footnote-backref",children:"\u21a9"})]}),"\n"]}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,a.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},11151:(e,t,n)=>{n.d(t,{Z:()=>s,a:()=>r});var i=n(67294);const a={},o=i.createContext(a);function r(e){const t=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),i.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d05e838c.3caaf7e6.js b/assets/js/d05e838c.c79b079a.js similarity index 98% rename from assets/js/d05e838c.3caaf7e6.js rename to assets/js/d05e838c.c79b079a.js index 0a36be3..c2e8fd8 100644 --- a/assets/js/d05e838c.3caaf7e6.js +++ b/assets/js/d05e838c.c79b079a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[6544],{63004:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>a,frontMatter:()=>i,metadata:()=>o,toc:()=>l});var s=r(85893),t=r(11151);const i={id:"seminar-05-06",title:"5th and 6th seminar",description:"200IQ encryption.\n"},c=void 0,o={id:"bonuses/seminar-05-06",title:"5th and 6th seminar",description:"200IQ encryption.\n",source:"@site/c/bonuses/05-06.md",sourceDirName:"bonuses",slug:"/bonuses/seminar-05-06",permalink:"/c/bonuses/seminar-05-06",draft:!1,unlisted:!1,editUrl:"https://github.com/mfocko/blog/tree/main/c/bonuses/05-06.md",tags:[],version:"current",lastUpdatedAt:1704291155,formattedLastUpdatedAt:"Jan 3, 2024",frontMatter:{id:"seminar-05-06",title:"5th and 6th seminar",description:"200IQ encryption.\n"},sidebar:"autogeneratedBar",previous:{title:"4th seminar",permalink:"/c/bonuses/seminar-04"},next:{title:"8th seminar",permalink:"/c/bonuses/seminar-08"}},d={},l=[{value:"Introduction",id:"introduction",level:2},{value:"Task no. 1: Reverse (0.5 K\u20a1)",id:"task-no-1-reverse-05-k",level:3},{value:"Task no. 2: Vigen\xe8re (0.5 K\u20a1)",id:"task-no-2-vigen\xe8re-05-k",level:3},{value:"Bonus part (0.5 K\u20a1)",id:"bonus-part-05-k",level:4},{value:"Task no. 3: Bit madness (0.5 K\u20a1)",id:"task-no-3-bit-madness-05-k",level:3},{value:"Task no. 4: All combined to BMP (0.5 K\u20a1)",id:"task-no-4-all-combined-to-bmp-05-k",level:3},{value:"Submitting",id:"submitting",level:2}];function h(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",hr:"hr",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"For this bonus you can get at maximum 2.5 K\u20a1."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"pathname:///files/c/bonuses/05-06.tar.gz",children:"Source"})}),"\n",(0,s.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,s.jsx)(n.p,{children:"In this bonus you will implement few functions that will be used together for\nimplementing a very special cipher."}),"\n",(0,s.jsx)(n.h3,{id:"task-no-1-reverse-05-k",children:"Task no. 1: Reverse (0.5 K\u20a1)"}),"\n",(0,s.jsxs)(n.p,{children:["Write a function ",(0,s.jsx)(n.code,{children:"char* reverse(const char* text)"})," that returns copy of the input\nstring in reversed order (also uppercase)."]}),"\n",(0,s.jsxs)(n.p,{children:["In case you are given ",(0,s.jsx)(n.code,{children:"NULL"}),", return ",(0,s.jsx)(n.code,{children:"NULL"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"Example (more in tests):"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-c",children:'char* reversed = reverse("Hello world!");\n\nprintf("%s\\n", reversed);\n// "!DLROW OLLEH"\n\nif (reversed != NULL) {\n free(reversed);\n}\n'})}),"\n",(0,s.jsx)(n.h3,{id:"task-no-2-vigen\xe8re-05-k",children:"Task no. 2: Vigen\xe8re (0.5 K\u20a1)"}),"\n",(0,s.jsx)(n.p,{children:"Vigen\xe8re cipher is similar to the Caesar cipher, but you also have a key that is\nused for encrypting (or decrypting)."}),"\n",(0,s.jsx)(n.p,{children:"Your task is to write two functions:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"char* vigenere_encrypt(const char* key, const char* text)"})," for encrypting"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"char* vigenere_decrypt(const char* key, const char* text)"})," for decrypting"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"In both of those you should return uppercase characters."}),"\n",(0,s.jsx)(n.p,{children:"Meaning of the parameters you are given:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"key"})," - String that represents key that is used for *crypting. It consists of\none word and can have only characters of the alphabet. Does not matter if they\nare uppercase or lowercase."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"text"})," - String that is to be *crypted."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Function returns address of the encrypted (or decrypted) string. Or ",(0,s.jsx)(n.code,{children:"NULL"})," in case\nerror occurs."]}),"\n",(0,s.jsx)(n.p,{children:"Example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-c",children:'char *encrypted = vigenere_encrypt("CoMPuTeR", "Hello world!");\n\nprintf("%s\\n", encrypted);\n// "JSXAI PSINR!"\n\nif (encrypted != NULL) {\n free(encrypted)\n}\n'})}),"\n",(0,s.jsx)(n.h4,{id:"bonus-part-05-k",children:"Bonus part (0.5 K\u20a1)"}),"\n",(0,s.jsx)(n.p,{children:"If you can utilize helper function that would do both encrypting and decrypting,\nyou can gain 0.5 K\u20a1."}),"\n",(0,s.jsxs)(n.p,{children:["Usage of ",(0,s.jsx)(n.code,{children:"true"}),"/",(0,s.jsx)(n.code,{children:"false"})," to decide path in code is prohibited. It leads to merging\nof both functions into one. Point of this part is to discover a way to do this\ngenerically in such way that there are no separate paths for one or the other. One\nfunction with no branching for both of them, parametrization is your friend :)"]}),"\n",(0,s.jsx)(n.h3,{id:"task-no-3-bit-madness-05-k",children:"Task no. 3: Bit madness (0.5 K\u20a1)"}),"\n",(0,s.jsx)(n.p,{children:"This is a state of the art crypto. Please do not share :)"}),"\n",(0,s.jsx)(n.p,{children:"For encrypting:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Split the character that is to be encrypted in halves (4 and 4 bits each)."}),"\n",(0,s.jsx)(n.li,{children:"Bits in 1st half are to be split into pairs. Swap bits in those pairs."}),"\n",(0,s.jsxs)(n.li,{children:["Then use the 4 bits that you created in the 2nd step for ",(0,s.jsx)(n.code,{children:"XOR"})," with the other\n4 bits."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["This simple and ingenious principle will be illustrated on the following example.\nString we want to encrypt is ",(0,s.jsx)(n.code,{children:"Hello world!"}),". We need to encrypt each letter separately,\nso we will demonstrate on letter ",(0,s.jsx)(n.code,{children:"H"}),":"]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Letter ",(0,s.jsx)(n.code,{children:"H"})," is represented in ASCII as ",(0,s.jsx)(n.code,{children:"72"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"72"})," represented in binary is: ",(0,s.jsx)(n.code,{children:"01001000"}),". So first 4 bits are: ",(0,s.jsx)(n.code,{children:"0100"})," and last\n4 bits are ",(0,s.jsx)(n.code,{children:"1000"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["First half of bits (",(0,s.jsx)(n.code,{children:"0100"}),") consists of 2 pairs (",(0,s.jsx)(n.code,{children:"01"})," and ",(0,s.jsx)(n.code,{children:"00"}),") which we swap\n(",(0,s.jsx)(n.code,{children:"01 ~> 10"})," and ",(0,s.jsx)(n.code,{children:"00 ~> 00"}),"). That way we get ",(0,s.jsx)(n.code,{children:"1000"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"That half is used for xor with the other 4 bits:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:" 1000 // second half\nXOR 1000 // first half after 2nd step\n--------\n 0000\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Now we combine both halves (first one is ",(0,s.jsx)(n.code,{children:"1000"}),", which we got from the 2nd step\nand second one is ",(0,s.jsx)(n.code,{children:"0000"}),", which we got from the 3rd step) and get ",(0,s.jsx)(n.code,{children:"10000000"}),",\nwhich is encrypted character ",(0,s.jsx)(n.code,{children:"H"})," using this method."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"In case of decryption, reverse those steps."}),"\n",(0,s.jsx)(n.p,{children:"Your task is to implement functions:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"unsigned char* bit_encrypt(const char* text)"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"char* bit_decrypt(const unsigned char* text)"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-c",children:'unsigned char* encrypted = bit_encrypt("Hello world!");\n\nfor (int i = 0; i < 12;i++) {\n printf("%x ", encrypted[i]);\n //80 9c 95 95 96 11 bc 96 b9 95 9d 10\n}\n\nif (encrypted != NULL) {\n free(encrypted);\n}\n'})}),"\n",(0,s.jsx)(n.h3,{id:"task-no-4-all-combined-to-bmp-05-k",children:"Task no. 4: All combined to BMP (0.5 K\u20a1)"}),"\n",(0,s.jsx)(n.p,{children:"Authors of the BMP cipher are non-disclosed :)"}),"\n",(0,s.jsx)(n.p,{children:"Create pair of functions:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"unsigned char* bmp_encrypt(const char* key, const char* text)"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"char* bmp_decrypt(const char* key, const unsigned char* text)"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"BMP cipher consists of following steps for encrypting:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Reverse the input string"}),"\n",(0,s.jsx)(n.li,{children:"Use Vigenere on the string you got from step #1"}),"\n",(0,s.jsx)(n.li,{children:"Use bit madness on the string you got from step #2"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"For decrypting, reverse the steps."}),"\n",(0,s.jsx)(n.h2,{id:"submitting",children:"Submitting"}),"\n",(0,s.jsx)(n.p,{children:"In case you have any questions, feel free to reach out to me."}),"\n",(0,s.jsx)(n.hr,{})]})}function a(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},11151:(e,n,r)=>{r.d(n,{Z:()=>o,a:()=>c});var s=r(67294);const t={},i=s.createContext(t);function c(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:c(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[6544],{63004:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>a,frontMatter:()=>i,metadata:()=>o,toc:()=>l});var s=r(85893),t=r(11151);const i={id:"seminar-05-06",title:"5th and 6th seminar",description:"200IQ encryption.\n"},c=void 0,o={id:"bonuses/seminar-05-06",title:"5th and 6th seminar",description:"200IQ encryption.\n",source:"@site/c/bonuses/05-06.md",sourceDirName:"bonuses",slug:"/bonuses/seminar-05-06",permalink:"/c/bonuses/seminar-05-06",draft:!1,unlisted:!1,editUrl:"https://github.com/mfocko/blog/tree/main/c/bonuses/05-06.md",tags:[],version:"current",lastUpdatedAt:1704558496,formattedLastUpdatedAt:"Jan 6, 2024",frontMatter:{id:"seminar-05-06",title:"5th and 6th seminar",description:"200IQ encryption.\n"},sidebar:"autogeneratedBar",previous:{title:"4th seminar",permalink:"/c/bonuses/seminar-04"},next:{title:"8th seminar",permalink:"/c/bonuses/seminar-08"}},d={},l=[{value:"Introduction",id:"introduction",level:2},{value:"Task no. 1: Reverse (0.5 K\u20a1)",id:"task-no-1-reverse-05-k",level:3},{value:"Task no. 2: Vigen\xe8re (0.5 K\u20a1)",id:"task-no-2-vigen\xe8re-05-k",level:3},{value:"Bonus part (0.5 K\u20a1)",id:"bonus-part-05-k",level:4},{value:"Task no. 3: Bit madness (0.5 K\u20a1)",id:"task-no-3-bit-madness-05-k",level:3},{value:"Task no. 4: All combined to BMP (0.5 K\u20a1)",id:"task-no-4-all-combined-to-bmp-05-k",level:3},{value:"Submitting",id:"submitting",level:2}];function h(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",hr:"hr",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"For this bonus you can get at maximum 2.5 K\u20a1."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"pathname:///files/c/bonuses/05-06.tar.gz",children:"Source"})}),"\n",(0,s.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,s.jsx)(n.p,{children:"In this bonus you will implement few functions that will be used together for\nimplementing a very special cipher."}),"\n",(0,s.jsx)(n.h3,{id:"task-no-1-reverse-05-k",children:"Task no. 1: Reverse (0.5 K\u20a1)"}),"\n",(0,s.jsxs)(n.p,{children:["Write a function ",(0,s.jsx)(n.code,{children:"char* reverse(const char* text)"})," that returns copy of the input\nstring in reversed order (also uppercase)."]}),"\n",(0,s.jsxs)(n.p,{children:["In case you are given ",(0,s.jsx)(n.code,{children:"NULL"}),", return ",(0,s.jsx)(n.code,{children:"NULL"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"Example (more in tests):"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-c",children:'char* reversed = reverse("Hello world!");\n\nprintf("%s\\n", reversed);\n// "!DLROW OLLEH"\n\nif (reversed != NULL) {\n free(reversed);\n}\n'})}),"\n",(0,s.jsx)(n.h3,{id:"task-no-2-vigen\xe8re-05-k",children:"Task no. 2: Vigen\xe8re (0.5 K\u20a1)"}),"\n",(0,s.jsx)(n.p,{children:"Vigen\xe8re cipher is similar to the Caesar cipher, but you also have a key that is\nused for encrypting (or decrypting)."}),"\n",(0,s.jsx)(n.p,{children:"Your task is to write two functions:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"char* vigenere_encrypt(const char* key, const char* text)"})," for encrypting"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"char* vigenere_decrypt(const char* key, const char* text)"})," for decrypting"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"In both of those you should return uppercase characters."}),"\n",(0,s.jsx)(n.p,{children:"Meaning of the parameters you are given:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"key"})," - String that represents key that is used for *crypting. It consists of\none word and can have only characters of the alphabet. Does not matter if they\nare uppercase or lowercase."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"text"})," - String that is to be *crypted."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Function returns address of the encrypted (or decrypted) string. Or ",(0,s.jsx)(n.code,{children:"NULL"})," in case\nerror occurs."]}),"\n",(0,s.jsx)(n.p,{children:"Example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-c",children:'char *encrypted = vigenere_encrypt("CoMPuTeR", "Hello world!");\n\nprintf("%s\\n", encrypted);\n// "JSXAI PSINR!"\n\nif (encrypted != NULL) {\n free(encrypted)\n}\n'})}),"\n",(0,s.jsx)(n.h4,{id:"bonus-part-05-k",children:"Bonus part (0.5 K\u20a1)"}),"\n",(0,s.jsx)(n.p,{children:"If you can utilize helper function that would do both encrypting and decrypting,\nyou can gain 0.5 K\u20a1."}),"\n",(0,s.jsxs)(n.p,{children:["Usage of ",(0,s.jsx)(n.code,{children:"true"}),"/",(0,s.jsx)(n.code,{children:"false"})," to decide path in code is prohibited. It leads to merging\nof both functions into one. Point of this part is to discover a way to do this\ngenerically in such way that there are no separate paths for one or the other. One\nfunction with no branching for both of them, parametrization is your friend :)"]}),"\n",(0,s.jsx)(n.h3,{id:"task-no-3-bit-madness-05-k",children:"Task no. 3: Bit madness (0.5 K\u20a1)"}),"\n",(0,s.jsx)(n.p,{children:"This is a state of the art crypto. Please do not share :)"}),"\n",(0,s.jsx)(n.p,{children:"For encrypting:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Split the character that is to be encrypted in halves (4 and 4 bits each)."}),"\n",(0,s.jsx)(n.li,{children:"Bits in 1st half are to be split into pairs. Swap bits in those pairs."}),"\n",(0,s.jsxs)(n.li,{children:["Then use the 4 bits that you created in the 2nd step for ",(0,s.jsx)(n.code,{children:"XOR"})," with the other\n4 bits."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["This simple and ingenious principle will be illustrated on the following example.\nString we want to encrypt is ",(0,s.jsx)(n.code,{children:"Hello world!"}),". We need to encrypt each letter separately,\nso we will demonstrate on letter ",(0,s.jsx)(n.code,{children:"H"}),":"]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Letter ",(0,s.jsx)(n.code,{children:"H"})," is represented in ASCII as ",(0,s.jsx)(n.code,{children:"72"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"72"})," represented in binary is: ",(0,s.jsx)(n.code,{children:"01001000"}),". So first 4 bits are: ",(0,s.jsx)(n.code,{children:"0100"})," and last\n4 bits are ",(0,s.jsx)(n.code,{children:"1000"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["First half of bits (",(0,s.jsx)(n.code,{children:"0100"}),") consists of 2 pairs (",(0,s.jsx)(n.code,{children:"01"})," and ",(0,s.jsx)(n.code,{children:"00"}),") which we swap\n(",(0,s.jsx)(n.code,{children:"01 ~> 10"})," and ",(0,s.jsx)(n.code,{children:"00 ~> 00"}),"). That way we get ",(0,s.jsx)(n.code,{children:"1000"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"That half is used for xor with the other 4 bits:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:" 1000 // second half\nXOR 1000 // first half after 2nd step\n--------\n 0000\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Now we combine both halves (first one is ",(0,s.jsx)(n.code,{children:"1000"}),", which we got from the 2nd step\nand second one is ",(0,s.jsx)(n.code,{children:"0000"}),", which we got from the 3rd step) and get ",(0,s.jsx)(n.code,{children:"10000000"}),",\nwhich is encrypted character ",(0,s.jsx)(n.code,{children:"H"})," using this method."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"In case of decryption, reverse those steps."}),"\n",(0,s.jsx)(n.p,{children:"Your task is to implement functions:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"unsigned char* bit_encrypt(const char* text)"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"char* bit_decrypt(const unsigned char* text)"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-c",children:'unsigned char* encrypted = bit_encrypt("Hello world!");\n\nfor (int i = 0; i < 12;i++) {\n printf("%x ", encrypted[i]);\n //80 9c 95 95 96 11 bc 96 b9 95 9d 10\n}\n\nif (encrypted != NULL) {\n free(encrypted);\n}\n'})}),"\n",(0,s.jsx)(n.h3,{id:"task-no-4-all-combined-to-bmp-05-k",children:"Task no. 4: All combined to BMP (0.5 K\u20a1)"}),"\n",(0,s.jsx)(n.p,{children:"Authors of the BMP cipher are non-disclosed :)"}),"\n",(0,s.jsx)(n.p,{children:"Create pair of functions:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"unsigned char* bmp_encrypt(const char* key, const char* text)"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"char* bmp_decrypt(const char* key, const unsigned char* text)"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"BMP cipher consists of following steps for encrypting:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Reverse the input string"}),"\n",(0,s.jsx)(n.li,{children:"Use Vigenere on the string you got from step #1"}),"\n",(0,s.jsx)(n.li,{children:"Use bit madness on the string you got from step #2"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"For decrypting, reverse the steps."}),"\n",(0,s.jsx)(n.h2,{id:"submitting",children:"Submitting"}),"\n",(0,s.jsx)(n.p,{children:"In case you have any questions, feel free to reach out to me."}),"\n",(0,s.jsx)(n.hr,{})]})}function a(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},11151:(e,n,r)=>{r.d(n,{Z:()=>o,a:()=>c});var s=r(67294);const t={},i=s.createContext(t);function c(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:c(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/dff2ebad.2596a554.js b/assets/js/dff2ebad.26aca592.js similarity index 55% rename from assets/js/dff2ebad.2596a554.js rename to assets/js/dff2ebad.26aca592.js index 38783df..c26f033 100644 --- a/assets/js/dff2ebad.2596a554.js +++ b/assets/js/dff2ebad.26aca592.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[146],{42492:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>r,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>l,toc:()=>c});var i=n(85893),o=n(11151);const s={title:"1st week of Advent of Code '22 in Rust",description:"Surviving first week in Rust.",date:"2022-12-15T01:15",slug:"aoc-2022/1st-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},a=void 0,l={permalink:"/blog/aoc-2022/1st-week",editUrl:"https://github.com/mfocko/blog/tree/main/blog/aoc-2022/01-week-1.md",source:"@site/blog/aoc-2022/01-week-1.md",title:"1st week of Advent of Code '22 in Rust",description:"Surviving first week in Rust.",date:"2022-12-15T01:15:00.000Z",formattedDate:"December 15, 2022",tags:[{label:"advent-of-code",permalink:"/blog/tags/advent-of-code"},{label:"advent-of-code-2022",permalink:"/blog/tags/advent-of-code-2022"},{label:"rust",permalink:"/blog/tags/rust"}],readingTime:12.4,hasTruncateMarker:!0,authors:[{name:"Matej Focko",email:"me+blog@mfocko.xyz",title:"a.k.a. @mf",url:"https://gitlab.com/mfocko",imageURL:"https://github.com/mfocko.png",key:"mf"}],frontMatter:{title:"1st week of Advent of Code '22 in Rust",description:"Surviving first week in Rust.",date:"2022-12-15T01:15",slug:"aoc-2022/1st-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"2nd week of Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/2nd-week"},nextItem:{title:"Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/intro"}},r={authorsImageUrls:[void 0]},c=[{value:"Day 1: Calorie Counting",id:"day-1-calorie-counting",level:2},{value:"Solution",id:"solution",level:3},{value:"Day 2: Rock Paper Scissors",id:"day-2-rock-paper-scissors",level:2},{value:"Solution",id:"solution-1",level:3},{value:"Day 3: Rucksack Reorganization",id:"day-3-rucksack-reorganization",level:2},{value:"Solution",id:"solution-2",level:3},{value:"Day 4: Camp Cleanup",id:"day-4-camp-cleanup",level:2},{value:"Solution",id:"solution-3",level:3},{value:"Day 5: Supply Stacks",id:"day-5-supply-stacks",level:2},{value:"Solution",id:"solution-4",level:3},{value:"Day 6: Tuning Trouble",id:"day-6-tuning-trouble",level:2},{value:"Solution",id:"solution-5",level:3},{value:"Day 7: No Space Left On Device",id:"day-7-no-space-left-on-device",level:2},{value:"Solution",id:"solution-6",level:3},{value:"Post Mortem",id:"post-mortem",level:2},{value:"Rc<T> vs Rc<RefCell<T>>",id:"rct-vs-rcrefcellt",level:3}];function d(e){const t={a:"a",admonition:"admonition",annotation:"annotation",blockquote:"blockquote",code:"code",del:"del",em:"em",h2:"h2",h3:"h3",li:"li",math:"math",mi:"mi",mrow:"mrow",p:"p",pre:"pre",semantics:"semantics",span:"span",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(t.p,{children:["Let's go through the first week of ",(0,i.jsx)(t.a,{href:"https://adventofcode.com",children:(0,i.jsx)(t.em,{children:"Advent of Code"})})," in Rust."]}),"\n",(0,i.jsx)(t.admonition,{type:"note",children:(0,i.jsxs)(t.p,{children:["If you wish to have a look at the solutions, you can follow them on my ",(0,i.jsx)(t.a,{href:"https://gitlab.com/mfocko/advent-of-code-2022",children:"GitLab"}),".\nMore specifically in the ",(0,i.jsx)(t.a,{href:"https://gitlab.com/mfocko/advent-of-code-2022/-/tree/main/src/bin",children:(0,i.jsx)(t.code,{children:"/src/bin/"})}),"."]})}),"\n",(0,i.jsxs)(t.p,{children:["I will try to summarize my experience with using Rust for the AoC. Trying it out\nages ago, I believe it will be ",(0,i.jsx)(t.em,{children:"pain and suffering"}),", but we will see. For each\nday I will also try to give a tl;dr of the problem, so that you can better imagine\nthe relation to my woes or ","\ud83d\udc4d"," moments."]}),"\n",(0,i.jsx)(t.h2,{id:"day-1-calorie-counting",children:(0,i.jsx)(t.a,{href:"https://adventofcode.com/2022/day/1",children:"Day 1: Calorie Counting"})}),"\n",(0,i.jsx)(t.admonition,{title:"tl;dr",type:"info",children:(0,i.jsx)(t.p,{children:"As the name suggests, we get the calories of the food contained in the elves\nbackpacks and we want to choose the elf that has the most food ;)"})}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:"Wakey wakey!"}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"Programming in Rust at 6am definitely hits. I've also forgotten to mention how I\nhandle samples. With each puzzle you usually get a sample input and expected\noutput. You can use them to verify that your solution works, or usually doesn't."}),"\n",(0,i.jsxs)(t.p,{children:["At first I've decided to put asserts into my ",(0,i.jsx)(t.code,{children:"main"}),", something like"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-rust",children:'assert_eq!(part_1(&sample), 24000);\ninfo!("Part 1: {}", part_1(&input));\n\nassert_eq!(part_2(&sample), 45000);\ninfo!("Part 2: {}", part_2(&input));\n'})}),"\n",(0,i.jsx)(t.p,{children:"However, once you get further, the sample input may take some time to run itself.\nSo in the end, I have decided to turn them into unit tests:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-rust",children:'#[cfg(test)]\nmod tests {\n use super::*;\n\n #[test]\n fn test_part_1() {\n let sample = parse_input("samples/day01.txt");\n assert_eq!(part_1(&sample), 24000);\n }\n\n #[test]\n fn test_part_2() {\n let sample = parse_input("samples/day01.txt");\n assert_eq!(part_2(&sample), 45000);\n }\n}\n'})}),"\n",(0,i.jsxs)(t.p,{children:["And later on I have noticed, it's hard to tell the difference between the days,\nso I further renamed the ",(0,i.jsx)(t.code,{children:"mod"})," from generic ",(0,i.jsx)(t.code,{children:"tests"})," to reflect the days."]}),"\n",(0,i.jsxs)(t.p,{children:["Also after finishing the first day puzzle, I have installed an ",(0,i.jsx)(t.a,{href:"https://github.com/mozilla/sccache",children:(0,i.jsx)(t.code,{children:"sccache"})})," to\ncache the builds, so that the build time is lower, cause it was kinda unbearable."]}),"\n",(0,i.jsx)(t.h3,{id:"solution",children:"Solution"}),"\n",(0,i.jsx)(t.p,{children:"Well, it's a pretty simple problem. You just take the input, sum the calories and\nfind the biggest one. However, if we try to generalize to more than the biggest\none, the fun appears. We have few options:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"keep all the calories, sort them, take what we need"}),"\n",(0,i.jsx)(t.li,{children:"keep all the calories and use max heap"}),"\n",(0,i.jsx)(t.li,{children:"use min heap and maintain at most N calories that we need"}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"day-2-rock-paper-scissors",children:(0,i.jsx)(t.a,{href:"https://adventofcode.com/2022/day/2",children:"Day 2: Rock Paper Scissors"})}),"\n",(0,i.jsx)(t.admonition,{title:"tl;dr",type:"info",children:(0,i.jsxs)(t.p,{children:["You want to know what score did you achieve while playing ",(0,i.jsx)(t.em,{children:"Rock Paper Scissors"}),".\nAnd then you want to be strategic about it."]})}),"\n",(0,i.jsx)(t.p,{children:"Apart from the technical details of the puzzle, it went relatively smooth."}),"\n",(0,i.jsx)(t.h3,{id:"solution-1",children:"Solution"}),"\n",(0,i.jsx)(t.p,{children:"I took relatively na\xefve approach and then tried to simplify it."}),"\n",(0,i.jsx)(t.h2,{id:"day-3-rucksack-reorganization",children:(0,i.jsx)(t.a,{href:"https://adventofcode.com/2022/day/3",children:"Day 3: Rucksack Reorganization"})}),"\n",(0,i.jsx)(t.admonition,{title:"tl;dr",type:"info",children:(0,i.jsx)(t.p,{children:"Let's go reorganize elves' backpacks! Each backpacks has 2 compartments and you\nwant to find the common item among those compartments. Each of them has priority,\nyou care only about the sum."})}),"\n",(0,i.jsx)(t.p,{children:"This is the day where I started to fight the compiler and neither of us decided\nto give up. Let's dive into it \\o/"}),"\n",(0,i.jsx)(t.admonition,{title:"Fun fact",type:"tip",children:(0,i.jsx)(t.p,{children:"Fighting the compiler took me 30 minutes."})}),"\n",(0,i.jsx)(t.p,{children:"We need to find a common item among 2 collections, that's an easy task, right?\nWe can construct 2 sets and find an intersection:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-rust",children:"let top: HashSet = [1, 2, 3].iter().collect();\nlet bottom: HashSet = [3, 4, 5].iter().collect();\n"})}),"\n",(0,i.jsxs)(t.p,{children:["Now, the first issue that we encounter is caused by the fact that we are using\na slice (the ",(0,i.jsx)(t.code,{children:"[\u2026]"}),"), iterator of that returns ",(0,i.jsx)(t.strong,{children:"references"})," to the numbers.\nAnd we get immediately yelled at by the compiler, because the numbers are discarded\nafter running the ",(0,i.jsx)(t.code,{children:".collect"}),". To fix this, we can use ",(0,i.jsx)(t.code,{children:".into_iter"}),":"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-rust",children:"let top: HashSet = [1, 2, 3].into_iter().collect();\nlet bottom: HashSet = [3, 4, 5].into_iter().collect();\n"})}),"\n",(0,i.jsx)(t.p,{children:"This way the numbers will get copied instead of referenced. OK, let's find the\nintersection of those 2 collections:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-rust",children:'println!("Common elements: {:?}", top.intersection(&bottom));\n'})}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:"Common elements: [3]\n"})}),"\n",(0,i.jsx)(t.admonition,{type:"caution",children:(0,i.jsxs)(t.p,{children:["Notice that we need to do ",(0,i.jsx)(t.code,{children:"&bottom"}),". It explicitly specifies that ",(0,i.jsx)(t.code,{children:".intersection"}),"\n",(0,i.jsx)(t.strong,{children:"borrows"})," the ",(0,i.jsx)(t.code,{children:"bottom"}),", i.e. takes an immutable reference to it."]})}),"\n",(0,i.jsx)(t.p,{children:"That's what we want, right? Looks like it! \\o/"}),"\n",(0,i.jsx)(t.p,{children:"Next part wants us to find the common element among all of the backpacks. OK, so\nthat should be fairly easy, we have an intersection and we want to find intersection\nover all of them."}),"\n",(0,i.jsxs)(t.p,{children:["Let's have a look at the type of the ",(0,i.jsx)(t.code,{children:".intersection"})]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-rust",children:"pub fn intersection<'a>(\n\xa0\xa0\xa0\xa0&'a self,\n\xa0\xa0\xa0\xa0other: &'a HashSet\n) -> Intersection<'a, T, S>\n"})}),"\n",(0,i.jsx)(t.p,{children:"OK\u2026 Huh\u2026 But we have an example there!"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-rust",children:"let intersection: HashSet<_> = a.intersection(&b).collect();\n"})}),"\n",(0,i.jsx)(t.p,{children:"Cool, that's all we need."}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-rust",children:'let top: HashSet = [1, 2, 3, 4].into_iter().collect();\nlet bottom: HashSet = [3, 4, 5, 6].into_iter().collect();\nlet top_2: HashSet = [2, 3, 4, 5, 6].into_iter().collect();\nlet bottom_2: HashSet = [4, 5, 6].into_iter().collect();\n\nlet intersection: HashSet<_> = top.intersection(&bottom).collect();\nprintln!("Intersection: {:?}", intersection);\n'})}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:"Intersection: {3, 4}\n"})}),"\n",(0,i.jsxs)(t.p,{children:["Cool, so let's do the intersection with the ",(0,i.jsx)(t.code,{children:"top_2"}),":"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-rust",children:'let top: HashSet = [1, 2, 3, 4].into_iter().collect();\nlet bottom: HashSet = [3, 4, 5, 6].into_iter().collect();\nlet top_2: HashSet = [2, 3, 4, 5, 6].into_iter().collect();\nlet bottom_2: HashSet = [4, 5, 6].into_iter().collect();\n\nlet intersection: HashSet<_> = top.intersection(&bottom).collect();\nlet intersection: HashSet<_> = intersection.intersection(&top_2).collect();\nprintln!("Intersection: {:?}", intersection);\n'})}),"\n",(0,i.jsx)(t.p,{children:"And we get yelled at by the compiler:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:"error[E0308]: mismatched types\n --\x3e src/main.rs:10:58\n |\n10 | let intersection: HashSet<_> = intersection.intersection(&top_2).collect();\n | ------------ ^^^^^^ expected `&i32`, found `i32`\n | |\n | arguments to this function are incorrect\n |\n = note: expected reference `&HashSet<&i32>`\n found reference `&HashSet`\n"})}),"\n",(0,i.jsx)(t.p,{children:"/o\\ What the hell is going on here? Well, the funny thing is, that this operation\ndoesn't return the elements themselves, but the references to them and when we pass\nthe third set, it has just the values themselves, without any references."}),"\n",(0,i.jsx)(t.admonition,{type:"tip",children:(0,i.jsxs)(t.p,{children:["It may seem as a very weird decision, but in fact it makes some sense\u2026 It allows\nyou to do intersection of items that may not be possible to copy. Overall this is\na \u201ctax\u201d for having a borrow checker ",(0,i.jsx)(t.del,{children:"drilling your ass"})," having your back and\nmaking sure you're not doing something naughty that may cause an ",(0,i.jsx)(t.strong,{children:"undefined"}),"\n",(0,i.jsx)(t.strong,{children:"behavior"}),"."]})}),"\n",(0,i.jsxs)(t.p,{children:["To resolve this we need to get an iterator that ",(0,i.jsx)(t.strong,{children:"clones"})," the elements:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-rust",children:'let top: HashSet = [1, 2, 3, 4].into_iter().collect();\nlet bottom: HashSet = [3, 4, 5, 6].into_iter().collect();\nlet top_2: HashSet = [2, 3, 4, 5, 6].into_iter().collect();\nlet bottom_2: HashSet = [4, 5, 6].into_iter().collect();\n\nlet intersection: HashSet<_> = top.intersection(&bottom).cloned().collect();\nlet intersection: HashSet<_> = intersection.intersection(&top_2).cloned().collect();\nlet intersection: HashSet<_> = intersection.intersection(&bottom_2).cloned().collect();\nprintln!("Intersection: {:?}", intersection);\n'})}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:"Intersection: {4}\n"})}),"\n",(0,i.jsx)(t.h3,{id:"solution-2",children:"Solution"}),"\n",(0,i.jsxs)(t.p,{children:["The approach is pretty simple, if you omit the ",(0,i.jsx)(t.em,{children:"1on1 with the compiler"}),". You just\nhave some fun with the set operations :)"]}),"\n",(0,i.jsx)(t.h2,{id:"day-4-camp-cleanup",children:(0,i.jsx)(t.a,{href:"https://adventofcode.com/2022/day/4",children:"Day 4: Camp Cleanup"})}),"\n",(0,i.jsx)(t.admonition,{title:"tl;dr",type:"info",children:(0,i.jsx)(t.p,{children:"Elves are cleaning up the camp and they got overlapping sections to clean up.\nFind how many overlap and can take the day off."})}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.a,{href:"https://doc.rust-lang.org/std/ops/struct.RangeInclusive.html",children:(0,i.jsx)(t.code,{children:"RangeInclusive"})})," is your friend not an enemy :)"]}),"\n",(0,i.jsx)(t.h3,{id:"solution-3",children:"Solution"}),"\n",(0,i.jsxs)(t.p,{children:["Relatively easy, you just need to parse the input and know what you want. Rust's\n",(0,i.jsx)(t.code,{children:"RangeInclusive"})," type helped a lot, cause it took care of all abstractions."]}),"\n",(0,i.jsx)(t.h2,{id:"day-5-supply-stacks",children:(0,i.jsx)(t.a,{href:"https://adventofcode.com/2022/day/5",children:"Day 5: Supply Stacks"})}),"\n",(0,i.jsx)(t.admonition,{title:"tl;dr",type:"info",children:(0,i.jsx)(t.p,{children:"Let's play with stacks of crates."})}),"\n",(0,i.jsx)(t.p,{children:"Very easy problem with very annoying input. You can judge yourself:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:" [D] \n[N] [C] \n[Z] [M] [P]\n 1 2 3 \n\nmove 1 from 2 to 1\nmove 3 from 1 to 3\nmove 2 from 2 to 1\nmove 1 from 1 to 2\n"})}),"\n",(0,i.jsx)(t.p,{children:"Good luck transforming that into something reasonable :)"}),"\n",(0,i.jsx)(t.admonition,{title:"Fun fact",type:"tip",children:(0,i.jsx)(t.p,{children:"Took me 40 minutes to parse this reasonably, including fighting the compiler."})}),"\n",(0,i.jsx)(t.h3,{id:"solution-4",children:"Solution"}),"\n",(0,i.jsxs)(t.p,{children:["For the initial solution I went with a manual solution (as in ",(0,i.jsx)(t.em,{children:"I have done all"}),"\n",(0,i.jsx)(t.em,{children:"the work"}),". Later on I have decided to explore the ",(0,i.jsx)(t.code,{children:"std"})," and interface of the\n",(0,i.jsx)(t.code,{children:"std::vec::Vec"})," and found ",(0,i.jsx)(t.a,{href:"https://doc.rust-lang.org/std/vec/struct.Vec.html#method.split_off",children:(0,i.jsx)(t.code,{children:"split_off"})})," which takes an index and splits (duh)\nthe vector:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-rust",children:"let mut vec = vec![1, 2, 3];\nlet vec2 = vec.split_off(1);\nassert_eq!(vec, [1]);\nassert_eq!(vec2, [2, 3]);\n"})}),"\n",(0,i.jsxs)(t.p,{children:["This helped me simplify my solution a lot and also get rid of some ",(0,i.jsx)(t.em,{children:"edge cases"}),"."]}),"\n",(0,i.jsx)(t.h2,{id:"day-6-tuning-trouble",children:(0,i.jsx)(t.a,{href:"https://adventofcode.com/2022/day/6",children:"Day 6: Tuning Trouble"})}),"\n",(0,i.jsx)(t.admonition,{title:"tl;dr",type:"info",children:(0,i.jsxs)(t.p,{children:["Finding start of the message in a very weird protocol. Start of the message is\ndenoted by ",(0,i.jsxs)(t.span,{className:"katex",children:[(0,i.jsx)(t.span,{className:"katex-mathml",children:(0,i.jsx)(t.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,i.jsxs)(t.semantics,{children:[(0,i.jsx)(t.mrow,{children:(0,i.jsx)(t.mi,{children:"N"})}),(0,i.jsx)(t.annotation,{encoding:"application/x-tex",children:"N"})]})})}),(0,i.jsx)(t.span,{className:"katex-html","aria-hidden":"true",children:(0,i.jsxs)(t.span,{className:"base",children:[(0,i.jsx)(t.span,{className:"strut",style:{height:"0.6833em"}}),(0,i.jsx)(t.span,{className:"mord mathnormal",style:{marginRight:"0.10903em"},children:"N"})]})})]})," unique consecutive characters."]})}),"\n",(0,i.jsx)(t.h3,{id:"solution-5",children:"Solution"}),"\n",(0,i.jsx)(t.p,{children:"A lot of different approaches, knowing that we are dealing with input consisting\nsolely of ASCII letters, I bit the bullet and went with sliding window and\nconstructing sets from that window, checking if the set is as big as the window."}),"\n",(0,i.jsxs)(t.p,{children:["One possible optimization could consist of keeping a bit-vector (i.e. ",(0,i.jsx)(t.code,{children:"usize"}),"\nvariable) of encountered characters and updating it as we go. However this has\na different issue and that is removal of the characters from the left side of the\nwindow. We don't know if the same character is not included later on."]}),"\n",(0,i.jsx)(t.p,{children:"Other option is to do similar thing, but keeping the frequencies of the letters,\nand again knowing we have only ASCII letters we can optimize by having a vector\nof 26 elements that keeps count for each lowercase letter."}),"\n",(0,i.jsx)(t.h2,{id:"day-7-no-space-left-on-device",children:(0,i.jsx)(t.a,{href:"https://adventofcode.com/2022/day/7",children:"Day 7: No Space Left On Device"})}),"\n",(0,i.jsx)(t.admonition,{title:"tl;dr",type:"info",children:(0,i.jsxs)(t.p,{children:["Let's simulate ",(0,i.jsx)(t.a,{href:"https://www.man7.org/linux/man-pages/man1/du.1.html",children:(0,i.jsx)(t.code,{children:"du"})})," to get some stats about our file system and then pinpoint\ndirectories that take a lot of space and should be deleted."]})}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:["I was waiting for this moment, and yet it got me!\n",(0,i.jsx)(t.em,{children:"imagine me swearing for hours"})]}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"solution-6",children:"Solution"}),"\n",(0,i.jsxs)(t.p,{children:["We need to \u201c",(0,i.jsx)(t.em,{children:"build"}),"\u201d a file system from the input that is given in a following form:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:"$ cd /\n$ ls\ndir a\n14848514 b.txt\n8504156 c.dat\ndir d\n$ cd a\n$ ls\ndir e\n29116 f\n2557 g\n62596 h.lst\n$ cd e\n$ ls\n584 i\n$ cd ..\n$ cd ..\n$ cd d\n$ ls\n4060174 j\n8033020 d.log\n5626152 d.ext\n7214296 k\n"})}),"\n",(0,i.jsx)(t.p,{children:"There are few ways in which you can achieve this and also you can assume some\npreconditions, but why would we do that, right? :)"}),"\n",(0,i.jsxs)(t.p,{children:["You can \u201cslap\u201d this in either ",(0,i.jsx)(t.a,{href:"https://doc.rust-lang.org/std/collections/struct.HashMap.html",children:(0,i.jsx)(t.code,{children:"HashMap"})})," or ",(0,i.jsx)(t.a,{href:"https://doc.rust-lang.org/std/collections/struct.BTreeMap.html",children:(0,i.jsx)(t.code,{children:"BTreeMap"})})," and call it a day.\nAnd that would be boring\u2026"]}),"\n",(0,i.jsx)(t.admonition,{type:"tip",children:(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"BTreeMap"})," is quite fitting for this, don't you think?"]})}),"\n",(0,i.jsxs)(t.p,{children:["I always wanted to try allocation on heap in Rust, so I chose to implement a tree.\nI fought with the ",(0,i.jsx)(t.code,{children:"Box"})," for some time and was losing\u2026"]}),"\n",(0,i.jsxs)(t.p,{children:["Then I looked up some implementations of trees or linked lists and decided to try\n",(0,i.jsx)(t.code,{children:"Rc>"}),". And I got my ",(0,i.jsx)(t.em,{children:"ass whopped"})," by the compiler once again. /o\\"]}),"\n",(0,i.jsxs)(t.admonition,{type:"tip",children:[(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"Box"})," represents a dynamically allocated memory on heap. It is a single pointer,\nyou can imagine this as ",(0,i.jsx)(t.code,{children:"std::unique_ptr"})," in C++."]}),(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"Rc"})," represents a dynamically allocated memory on heap. On top of that it is\n",(0,i.jsx)(t.em,{children:"reference counted"})," (that's what the ",(0,i.jsx)(t.code,{children:"Rc"})," stands for). You can imagine this as\n",(0,i.jsx)(t.code,{children:"std::shared_ptr"})," in C++."]}),(0,i.jsxs)(t.p,{children:["Now the fun stuff. Neither of them lets you ",(0,i.jsx)(t.strong,{children:"mutate"})," the contents of the memory."]}),(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"Cell"})," allows you to mutate the memory. Can be used reasonably with types that\ncan be copied, because the memory safety is guaranteed by copying the contents\nwhen there is more than one ",(0,i.jsx)(t.strong,{children:"mutable"})," reference to the memory."]}),(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"RefCell"})," is similar to the ",(0,i.jsx)(t.code,{children:"Cell"}),", but the borrowing rules (how many mutable\nreferences are present) are checked dynamically."]}),(0,i.jsxs)(t.p,{children:["So in the end, if you want something like ",(0,i.jsx)(t.code,{children:"std::shared_ptr"})," in Rust, you want\nto have ",(0,i.jsx)(t.code,{children:"Rc>"}),"."]})]}),"\n",(0,i.jsxs)(t.p,{children:["So, how are we going to represent the file system then? We will use an enumeration,\nhehe, which is an algebraic data type that can store some stuff in itself ","\ud83d\ude29"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-rust",children:"type FileHandle = Rc>;\n\n#[derive(Debug)]\nenum AocFile {\n File(usize),\n Directory(BTreeMap),\n}\n"})}),"\n",(0,i.jsxs)(t.p,{children:["Let's go over it! ",(0,i.jsx)(t.code,{children:"FileHandle"})," represents dynamically allocated ",(0,i.jsx)(t.code,{children:"AocFile"}),", not\nmuch to discuss. What does the ",(0,i.jsx)(t.code,{children:"#[derive(Debug)]"})," do though? It lets us to print\nout the value of that enumeration, it's derived, so it's not as good as if we had\nimplemented it ourselves, but it's good enough for debugging, hence the name."]}),"\n",(0,i.jsxs)(t.p,{children:["Now to the fun part! ",(0,i.jsx)(t.code,{children:"AocFile"})," value can be represented in two ways:"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"File(usize)"}),", e.g. ",(0,i.jsx)(t.code,{children:"AocFile::File(123)"})," and we can pattern match it, if we\nneed to"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"Directory(BTreeMap)"})," will represent the directory and will\ncontain map matching the name of the files (or directories) within to their\nrespective file handles"]}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"I will omit the details about constructing this file system, cause there are a lot\nof technicalities introduced by the nature of the input. However if you are\ninterested, you can have a look at my solution."}),"\n",(0,i.jsx)(t.p,{children:"We need to find small enough directories and also find the smallest directory that\nwill free enough space. Now the question is, how could we do that. And there are\nmultiple ways I will describe."}),"\n",(0,i.jsxs)(t.p,{children:["I have chosen to implement ",(0,i.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Catamorphism#Tree_fold",children:(0,i.jsx)(t.em,{children:"tree catamorphism"})})," ","\ud83d\ude29",". It is basically a fold\nover a tree data structure. We descent down into the leaves and propagate computed\nresults all the way to the root. You can also notice that this approach is very\nsimilar to ",(0,i.jsx)(t.em,{children:"dynamic programming"}),", we find overlapping sections of the computation\nand try to minimize the additional work (in this case: we need to know sizes of\nour descendants, but we have already been there)."]}),"\n",(0,i.jsx)(t.p,{children:"Another approach that has been suggested to me few days later is running DFS on\nthe graph. And, funnily enough, we would still need to combine what we found in\nthe branches where we descent. So in the end, it would work very similarly to my\nsolution."}),"\n",(0,i.jsx)(t.p,{children:"One of the more exotic options would be precomputing the required information at\nthe same time as parsing. That could be done by adding additional fields to the\nnodes which would allow storing such information and updating it as we construct\nthe file system."}),"\n",(0,i.jsx)(t.h2,{id:"post-mortem",children:"Post Mortem"}),"\n",(0,i.jsx)(t.p,{children:"Things that have been brought up in the discussion later on."}),"\n",(0,i.jsxs)(t.h3,{id:"rct-vs-rcrefcellt",children:[(0,i.jsx)(t.code,{children:"Rc"})," vs ",(0,i.jsx)(t.code,{children:"Rc>"})]}),"\n",(0,i.jsx)(t.p,{children:"It has been brought up that I have a contradicting statement regarding the\ndynamically allocated memory. Specifically:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["You can imagine ",(0,i.jsx)(t.code,{children:"Rc"})," as an ",(0,i.jsx)(t.code,{children:"std::shared_ptr"})," (in C++)"]}),"\n",(0,i.jsxs)(t.li,{children:["When you want an equivalent of ",(0,i.jsx)(t.code,{children:"std::shared_ptr"}),", you want to use\n",(0,i.jsx)(t.code,{children:"Rc>"})]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["Now, in Rust it is a bit more complicated, because the type that represents the\n\u201cshared pointer\u201d is ",(0,i.jsx)(t.code,{children:"Rc"}),". What ",(0,i.jsx)(t.code,{children:"RefCell"})," does is making sure that there is\nonly one \u201cowner\u201d of a mutable reference at a time (and dynamically, as opposed\nto the ",(0,i.jsx)(t.code,{children:"Cell"}),")."]}),"\n",(0,i.jsxs)(t.p,{children:["Therefore to be precise and correct about the equivalents of ",(0,i.jsx)(t.code,{children:"std::shared_ptr"}),"\nin Rust, we can say that"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"Rc"})," is an equivalent of a ",(0,i.jsx)(t.code,{children:"const std::shared_ptr"}),","]}),"\n",(0,i.jsxs)(t.li,{children:["and ",(0,i.jsx)(t.code,{children:"Rc>"})," is an equivalent of a ",(0,i.jsx)(t.code,{children:"std::shared_ptr"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["You can easily see that they only differ in the mutability. (And even that is not\nas simple as it seems, because there is also ",(0,i.jsx)(t.code,{children:"Cell"}),")"]})]})}function h(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,t,n)=>{n.d(t,{Z:()=>l,a:()=>a});var i=n(67294);const o={},s=i.createContext(o);function a(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[146],{42492:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>r,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>l,toc:()=>c});var i=n(85893),o=n(11151);const s={title:"1st week of Advent of Code '22 in Rust",description:"Surviving first week in Rust.",date:"2022-12-15T01:15",slug:"aoc-2022/1st-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},a=void 0,l={permalink:"/blog/aoc-2022/1st-week",editUrl:"https://github.com/mfocko/blog/tree/main/blog/aoc-2022/01-week-1.md",source:"@site/blog/aoc-2022/01-week-1.md",title:"1st week of Advent of Code '22 in Rust",description:"Surviving first week in Rust.",date:"2022-12-15T01:15:00.000Z",formattedDate:"December 15, 2022",tags:[{label:"advent-of-code",permalink:"/blog/tags/advent-of-code"},{label:"advent-of-code-2022",permalink:"/blog/tags/advent-of-code-2022"},{label:"rust",permalink:"/blog/tags/rust"}],readingTime:12.4,hasTruncateMarker:!0,authors:[{name:"Matej Focko",email:"me+blog@mfocko.xyz",title:"a.k.a. @mf",url:"https://gitlab.com/mfocko",imageURL:"https://github.com/mfocko.png",key:"mf"}],frontMatter:{title:"1st week of Advent of Code '22 in Rust",description:"Surviving first week in Rust.",date:"2022-12-15T01:15",slug:"aoc-2022/1st-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"2nd week of Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/2nd-week"},nextItem:{title:"Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/intro"}},r={authorsImageUrls:[void 0]},c=[{value:"Day 1: Calorie Counting",id:"day-1-calorie-counting",level:2},{value:"Solution",id:"solution",level:3},{value:"Day 2: Rock Paper Scissors",id:"day-2-rock-paper-scissors",level:2},{value:"Solution",id:"solution-1",level:3},{value:"Day 3: Rucksack Reorganization",id:"day-3-rucksack-reorganization",level:2},{value:"Solution",id:"solution-2",level:3},{value:"Day 4: Camp Cleanup",id:"day-4-camp-cleanup",level:2},{value:"Solution",id:"solution-3",level:3},{value:"Day 5: Supply Stacks",id:"day-5-supply-stacks",level:2},{value:"Solution",id:"solution-4",level:3},{value:"Day 6: Tuning Trouble",id:"day-6-tuning-trouble",level:2},{value:"Solution",id:"solution-5",level:3},{value:"Day 7: No Space Left On Device",id:"day-7-no-space-left-on-device",level:2},{value:"Solution",id:"solution-6",level:3},{value:"Post Mortem",id:"post-mortem",level:2},{value:"Rc<T> vs Rc<RefCell<T>>",id:"rct-vs-rcrefcellt",level:3}];function d(e){const t={a:"a",admonition:"admonition",annotation:"annotation",blockquote:"blockquote",code:"code",del:"del",em:"em",h2:"h2",h3:"h3",li:"li",math:"math",mi:"mi",mrow:"mrow",p:"p",pre:"pre",semantics:"semantics",span:"span",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(t.p,{children:["Let's go through the first week of ",(0,i.jsx)(t.a,{href:"https://adventofcode.com",children:(0,i.jsx)(t.em,{children:"Advent of Code"})})," in Rust."]}),"\n",(0,i.jsx)(t.admonition,{type:"note",children:(0,i.jsxs)(t.p,{children:["If you wish to have a look at the solutions, you can follow them on my ",(0,i.jsx)(t.a,{href:"https://gitlab.com/mfocko/advent-of-code-2022",children:"GitLab"}),".\nMore specifically in the ",(0,i.jsx)(t.a,{href:"https://gitlab.com/mfocko/advent-of-code-2022/-/tree/main/src/bin",children:(0,i.jsx)(t.code,{children:"/src/bin/"})}),"."]})}),"\n",(0,i.jsxs)(t.p,{children:["I will try to summarize my experience with using Rust for the AoC. Trying it out\nages ago, I believe it will be ",(0,i.jsx)(t.em,{children:"pain and suffering"}),", but we will see. For each\nday I will also try to give a tl;dr of the problem, so that you can better imagine\nthe relation to my woes or ","\ud83d\udc4d"," moments."]}),"\n",(0,i.jsx)(t.h2,{id:"day-1-calorie-counting",children:(0,i.jsx)(t.a,{href:"https://adventofcode.com/2022/day/1",children:"Day 1: Calorie Counting"})}),"\n",(0,i.jsx)(t.admonition,{title:"tl;dr",type:"info",children:(0,i.jsx)(t.p,{children:"As the name suggests, we get the calories of the food contained in the elves\nbackpacks and we want to choose the elf that has the most food ;)"})}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:"Wakey wakey!"}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"Programming in Rust at 6am definitely hits. I've also forgotten to mention how I\nhandle samples. With each puzzle you usually get a sample input and expected\noutput. You can use them to verify that your solution works, or usually doesn't."}),"\n",(0,i.jsxs)(t.p,{children:["At first I've decided to put asserts into my ",(0,i.jsx)(t.code,{children:"main"}),", something like"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-rust",children:'assert_eq!(part_1(&sample), 24000);\ninfo!("Part 1: {}", part_1(&input));\n\nassert_eq!(part_2(&sample), 45000);\ninfo!("Part 2: {}", part_2(&input));\n'})}),"\n",(0,i.jsx)(t.p,{children:"However, once you get further, the sample input may take some time to run itself.\nSo in the end, I have decided to turn them into unit tests:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-rust",children:'#[cfg(test)]\nmod tests {\n use super::*;\n\n #[test]\n fn test_part_1() {\n let sample = parse_input("samples/day01.txt");\n assert_eq!(part_1(&sample), 24000);\n }\n\n #[test]\n fn test_part_2() {\n let sample = parse_input("samples/day01.txt");\n assert_eq!(part_2(&sample), 45000);\n }\n}\n'})}),"\n",(0,i.jsxs)(t.p,{children:["And later on I have noticed, it's hard to tell the difference between the days,\nso I further renamed the ",(0,i.jsx)(t.code,{children:"mod"})," from generic ",(0,i.jsx)(t.code,{children:"tests"})," to reflect the days."]}),"\n",(0,i.jsxs)(t.p,{children:["Also after finishing the first day puzzle, I have installed an ",(0,i.jsx)(t.a,{href:"https://github.com/mozilla/sccache",children:(0,i.jsx)(t.code,{children:"sccache"})})," to\ncache the builds, so that the build time is lower, cause it was kinda unbearable."]}),"\n",(0,i.jsx)(t.h3,{id:"solution",children:"Solution"}),"\n",(0,i.jsx)(t.p,{children:"Well, it's a pretty simple problem. You just take the input, sum the calories and\nfind the biggest one. However, if we try to generalize to more than the biggest\none, the fun appears. We have few options:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"keep all the calories, sort them, take what we need"}),"\n",(0,i.jsx)(t.li,{children:"keep all the calories and use max heap"}),"\n",(0,i.jsx)(t.li,{children:"use min heap and maintain at most N calories that we need"}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"day-2-rock-paper-scissors",children:(0,i.jsx)(t.a,{href:"https://adventofcode.com/2022/day/2",children:"Day 2: Rock Paper Scissors"})}),"\n",(0,i.jsx)(t.admonition,{title:"tl;dr",type:"info",children:(0,i.jsxs)(t.p,{children:["You want to know what score did you achieve while playing ",(0,i.jsx)(t.em,{children:"Rock Paper Scissors"}),".\nAnd then you want to be strategic about it."]})}),"\n",(0,i.jsx)(t.p,{children:"Apart from the technical details of the puzzle, it went relatively smooth."}),"\n",(0,i.jsx)(t.h3,{id:"solution-1",children:"Solution"}),"\n",(0,i.jsx)(t.p,{children:"I took relatively na\xefve approach and then tried to simplify it."}),"\n",(0,i.jsx)(t.h2,{id:"day-3-rucksack-reorganization",children:(0,i.jsx)(t.a,{href:"https://adventofcode.com/2022/day/3",children:"Day 3: Rucksack Reorganization"})}),"\n",(0,i.jsx)(t.admonition,{title:"tl;dr",type:"info",children:(0,i.jsx)(t.p,{children:"Let's go reorganize elves' backpacks! Each backpacks has 2 compartments and you\nwant to find the common item among those compartments. Each of them has priority,\nyou care only about the sum."})}),"\n",(0,i.jsx)(t.p,{children:"This is the day where I started to fight the compiler and neither of us decided\nto give up. Let's dive into it \\o/"}),"\n",(0,i.jsx)(t.admonition,{title:"Fun fact",type:"tip",children:(0,i.jsx)(t.p,{children:"Fighting the compiler took me 30 minutes."})}),"\n",(0,i.jsx)(t.p,{children:"We need to find a common item among 2 collections, that's an easy task, right?\nWe can construct 2 sets and find an intersection:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-rust",children:"let top: HashSet = [1, 2, 3].iter().collect();\nlet bottom: HashSet = [3, 4, 5].iter().collect();\n"})}),"\n",(0,i.jsxs)(t.p,{children:["Now, the first issue that we encounter is caused by the fact that we are using\na slice (the ",(0,i.jsx)(t.code,{children:"[\u2026]"}),"), iterator of that returns ",(0,i.jsx)(t.strong,{children:"references"})," to the numbers.\nAnd we get immediately yelled at by the compiler, because the numbers are discarded\nafter running the ",(0,i.jsx)(t.code,{children:".collect"}),". To fix this, we can use ",(0,i.jsx)(t.code,{children:".into_iter"}),":"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-rust",children:"let top: HashSet = [1, 2, 3].into_iter().collect();\nlet bottom: HashSet = [3, 4, 5].into_iter().collect();\n"})}),"\n",(0,i.jsx)(t.p,{children:"This way the numbers will get copied instead of referenced. OK, let's find the\nintersection of those 2 collections:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-rust",children:'println!("Common elements: {:?}", top.intersection(&bottom));\n'})}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:"Common elements: [3]\n"})}),"\n",(0,i.jsx)(t.admonition,{type:"caution",children:(0,i.jsxs)(t.p,{children:["Notice that we need to do ",(0,i.jsx)(t.code,{children:"&bottom"}),". It explicitly specifies that ",(0,i.jsx)(t.code,{children:".intersection"}),"\n",(0,i.jsx)(t.strong,{children:"borrows"})," the ",(0,i.jsx)(t.code,{children:"bottom"}),", i.e. takes an immutable reference to it."]})}),"\n",(0,i.jsx)(t.p,{children:"That's what we want, right? Looks like it! \\o/"}),"\n",(0,i.jsx)(t.p,{children:"Next part wants us to find the common element among all of the backpacks. OK, so\nthat should be fairly easy, we have an intersection and we want to find intersection\nover all of them."}),"\n",(0,i.jsxs)(t.p,{children:["Let's have a look at the type of the ",(0,i.jsx)(t.code,{children:".intersection"})]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-rust",children:"pub fn intersection<'a>(\n\xa0\xa0\xa0\xa0&'a self,\n\xa0\xa0\xa0\xa0other: &'a HashSet\n) -> Intersection<'a, T, S>\n"})}),"\n",(0,i.jsx)(t.p,{children:"OK\u2026 Huh\u2026 But we have an example there!"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-rust",children:"let intersection: HashSet<_> = a.intersection(&b).collect();\n"})}),"\n",(0,i.jsx)(t.p,{children:"Cool, that's all we need."}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-rust",children:'let top: HashSet = [1, 2, 3, 4].into_iter().collect();\nlet bottom: HashSet = [3, 4, 5, 6].into_iter().collect();\nlet top_2: HashSet = [2, 3, 4, 5, 6].into_iter().collect();\nlet bottom_2: HashSet = [4, 5, 6].into_iter().collect();\n\nlet intersection: HashSet<_> = top.intersection(&bottom).collect();\nprintln!("Intersection: {:?}", intersection);\n'})}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:"Intersection: {3, 4}\n"})}),"\n",(0,i.jsxs)(t.p,{children:["Cool, so let's do the intersection with the ",(0,i.jsx)(t.code,{children:"top_2"}),":"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-rust",children:'let top: HashSet = [1, 2, 3, 4].into_iter().collect();\nlet bottom: HashSet = [3, 4, 5, 6].into_iter().collect();\nlet top_2: HashSet = [2, 3, 4, 5, 6].into_iter().collect();\nlet bottom_2: HashSet = [4, 5, 6].into_iter().collect();\n\nlet intersection: HashSet<_> = top.intersection(&bottom).collect();\nlet intersection: HashSet<_> = intersection.intersection(&top_2).collect();\nprintln!("Intersection: {:?}", intersection);\n'})}),"\n",(0,i.jsx)(t.p,{children:"And we get yelled at by the compiler:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:"error[E0308]: mismatched types\n --\x3e src/main.rs:10:58\n |\n10 | let intersection: HashSet<_> = intersection.intersection(&top_2).collect();\n | ------------ ^^^^^^ expected `&i32`, found `i32`\n | |\n | arguments to this function are incorrect\n |\n = note: expected reference `&HashSet<&i32>`\n found reference `&HashSet`\n"})}),"\n",(0,i.jsx)(t.p,{children:"/o\\ What the hell is going on here? Well, the funny thing is, that this operation\ndoesn't return the elements themselves, but the references to them and when we pass\nthe third set, it has just the values themselves, without any references."}),"\n",(0,i.jsx)(t.admonition,{type:"tip",children:(0,i.jsxs)(t.p,{children:["It may seem as a very weird decision, but in fact it makes some sense\u2026 It allows\nyou to do intersection of items that may not be possible to copy. Overall this is\na \u201ctax\u201d for having a borrow checker ",(0,i.jsx)(t.del,{children:"drilling your ass"})," having your back and\nmaking sure you're not doing something naughty that may cause an ",(0,i.jsx)(t.strong,{children:"undefined"}),"\n",(0,i.jsx)(t.strong,{children:"behavior"}),"."]})}),"\n",(0,i.jsxs)(t.p,{children:["To resolve this we need to get an iterator that ",(0,i.jsx)(t.strong,{children:"clones"})," the elements:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-rust",children:'let top: HashSet = [1, 2, 3, 4].into_iter().collect();\nlet bottom: HashSet = [3, 4, 5, 6].into_iter().collect();\nlet top_2: HashSet = [2, 3, 4, 5, 6].into_iter().collect();\nlet bottom_2: HashSet = [4, 5, 6].into_iter().collect();\n\nlet intersection: HashSet<_> = top.intersection(&bottom).cloned().collect();\nlet intersection: HashSet<_> = intersection.intersection(&top_2).cloned().collect();\nlet intersection: HashSet<_> = intersection.intersection(&bottom_2).cloned().collect();\nprintln!("Intersection: {:?}", intersection);\n'})}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:"Intersection: {4}\n"})}),"\n",(0,i.jsx)(t.h3,{id:"solution-2",children:"Solution"}),"\n",(0,i.jsxs)(t.p,{children:["The approach is pretty simple, if you omit the ",(0,i.jsx)(t.em,{children:"1on1 with the compiler"}),". You just\nhave some fun with the set operations :)"]}),"\n",(0,i.jsx)(t.h2,{id:"day-4-camp-cleanup",children:(0,i.jsx)(t.a,{href:"https://adventofcode.com/2022/day/4",children:"Day 4: Camp Cleanup"})}),"\n",(0,i.jsx)(t.admonition,{title:"tl;dr",type:"info",children:(0,i.jsx)(t.p,{children:"Elves are cleaning up the camp and they got overlapping sections to clean up.\nFind how many overlap and can take the day off."})}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.a,{href:"https://doc.rust-lang.org/std/ops/struct.RangeInclusive.html",children:(0,i.jsx)(t.code,{children:"RangeInclusive"})})," is your friend not an enemy :)"]}),"\n",(0,i.jsx)(t.h3,{id:"solution-3",children:"Solution"}),"\n",(0,i.jsxs)(t.p,{children:["Relatively easy, you just need to parse the input and know what you want. Rust's\n",(0,i.jsx)(t.code,{children:"RangeInclusive"})," type helped a lot, cause it took care of all abstractions."]}),"\n",(0,i.jsx)(t.h2,{id:"day-5-supply-stacks",children:(0,i.jsx)(t.a,{href:"https://adventofcode.com/2022/day/5",children:"Day 5: Supply Stacks"})}),"\n",(0,i.jsx)(t.admonition,{title:"tl;dr",type:"info",children:(0,i.jsx)(t.p,{children:"Let's play with stacks of crates."})}),"\n",(0,i.jsx)(t.p,{children:"Very easy problem with very annoying input. You can judge yourself:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:" [D]\n[N] [C]\n[Z] [M] [P]\n 1 2 3\n\nmove 1 from 2 to 1\nmove 3 from 1 to 3\nmove 2 from 2 to 1\nmove 1 from 1 to 2\n"})}),"\n",(0,i.jsx)(t.p,{children:"Good luck transforming that into something reasonable :)"}),"\n",(0,i.jsx)(t.admonition,{title:"Fun fact",type:"tip",children:(0,i.jsx)(t.p,{children:"Took me 40 minutes to parse this reasonably, including fighting the compiler."})}),"\n",(0,i.jsx)(t.h3,{id:"solution-4",children:"Solution"}),"\n",(0,i.jsxs)(t.p,{children:["For the initial solution I went with a manual solution (as in ",(0,i.jsx)(t.em,{children:"I have done all"}),"\n",(0,i.jsx)(t.em,{children:"the work"}),". Later on I have decided to explore the ",(0,i.jsx)(t.code,{children:"std"})," and interface of the\n",(0,i.jsx)(t.code,{children:"std::vec::Vec"})," and found ",(0,i.jsx)(t.a,{href:"https://doc.rust-lang.org/std/vec/struct.Vec.html#method.split_off",children:(0,i.jsx)(t.code,{children:"split_off"})})," which takes an index and splits (duh)\nthe vector:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-rust",children:"let mut vec = vec![1, 2, 3];\nlet vec2 = vec.split_off(1);\nassert_eq!(vec, [1]);\nassert_eq!(vec2, [2, 3]);\n"})}),"\n",(0,i.jsxs)(t.p,{children:["This helped me simplify my solution a lot and also get rid of some ",(0,i.jsx)(t.em,{children:"edge cases"}),"."]}),"\n",(0,i.jsx)(t.h2,{id:"day-6-tuning-trouble",children:(0,i.jsx)(t.a,{href:"https://adventofcode.com/2022/day/6",children:"Day 6: Tuning Trouble"})}),"\n",(0,i.jsx)(t.admonition,{title:"tl;dr",type:"info",children:(0,i.jsxs)(t.p,{children:["Finding start of the message in a very weird protocol. Start of the message is\ndenoted by ",(0,i.jsxs)(t.span,{className:"katex",children:[(0,i.jsx)(t.span,{className:"katex-mathml",children:(0,i.jsx)(t.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,i.jsxs)(t.semantics,{children:[(0,i.jsx)(t.mrow,{children:(0,i.jsx)(t.mi,{children:"N"})}),(0,i.jsx)(t.annotation,{encoding:"application/x-tex",children:"N"})]})})}),(0,i.jsx)(t.span,{className:"katex-html","aria-hidden":"true",children:(0,i.jsxs)(t.span,{className:"base",children:[(0,i.jsx)(t.span,{className:"strut",style:{height:"0.6833em"}}),(0,i.jsx)(t.span,{className:"mord mathnormal",style:{marginRight:"0.10903em"},children:"N"})]})})]})," unique consecutive characters."]})}),"\n",(0,i.jsx)(t.h3,{id:"solution-5",children:"Solution"}),"\n",(0,i.jsx)(t.p,{children:"A lot of different approaches, knowing that we are dealing with input consisting\nsolely of ASCII letters, I bit the bullet and went with sliding window and\nconstructing sets from that window, checking if the set is as big as the window."}),"\n",(0,i.jsxs)(t.p,{children:["One possible optimization could consist of keeping a bit-vector (i.e. ",(0,i.jsx)(t.code,{children:"usize"}),"\nvariable) of encountered characters and updating it as we go. However this has\na different issue and that is removal of the characters from the left side of the\nwindow. We don't know if the same character is not included later on."]}),"\n",(0,i.jsx)(t.p,{children:"Other option is to do similar thing, but keeping the frequencies of the letters,\nand again knowing we have only ASCII letters we can optimize by having a vector\nof 26 elements that keeps count for each lowercase letter."}),"\n",(0,i.jsx)(t.h2,{id:"day-7-no-space-left-on-device",children:(0,i.jsx)(t.a,{href:"https://adventofcode.com/2022/day/7",children:"Day 7: No Space Left On Device"})}),"\n",(0,i.jsx)(t.admonition,{title:"tl;dr",type:"info",children:(0,i.jsxs)(t.p,{children:["Let's simulate ",(0,i.jsx)(t.a,{href:"https://www.man7.org/linux/man-pages/man1/du.1.html",children:(0,i.jsx)(t.code,{children:"du"})})," to get some stats about our file system and then pinpoint\ndirectories that take a lot of space and should be deleted."]})}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:["I was waiting for this moment, and yet it got me!\n",(0,i.jsx)(t.em,{children:"imagine me swearing for hours"})]}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"solution-6",children:"Solution"}),"\n",(0,i.jsxs)(t.p,{children:["We need to \u201c",(0,i.jsx)(t.em,{children:"build"}),"\u201d a file system from the input that is given in a following form:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:"$ cd /\n$ ls\ndir a\n14848514 b.txt\n8504156 c.dat\ndir d\n$ cd a\n$ ls\ndir e\n29116 f\n2557 g\n62596 h.lst\n$ cd e\n$ ls\n584 i\n$ cd ..\n$ cd ..\n$ cd d\n$ ls\n4060174 j\n8033020 d.log\n5626152 d.ext\n7214296 k\n"})}),"\n",(0,i.jsx)(t.p,{children:"There are few ways in which you can achieve this and also you can assume some\npreconditions, but why would we do that, right? :)"}),"\n",(0,i.jsxs)(t.p,{children:["You can \u201cslap\u201d this in either ",(0,i.jsx)(t.a,{href:"https://doc.rust-lang.org/std/collections/struct.HashMap.html",children:(0,i.jsx)(t.code,{children:"HashMap"})})," or ",(0,i.jsx)(t.a,{href:"https://doc.rust-lang.org/std/collections/struct.BTreeMap.html",children:(0,i.jsx)(t.code,{children:"BTreeMap"})})," and call it a day.\nAnd that would be boring\u2026"]}),"\n",(0,i.jsx)(t.admonition,{type:"tip",children:(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"BTreeMap"})," is quite fitting for this, don't you think?"]})}),"\n",(0,i.jsxs)(t.p,{children:["I always wanted to try allocation on heap in Rust, so I chose to implement a tree.\nI fought with the ",(0,i.jsx)(t.code,{children:"Box"})," for some time and was losing\u2026"]}),"\n",(0,i.jsxs)(t.p,{children:["Then I looked up some implementations of trees or linked lists and decided to try\n",(0,i.jsx)(t.code,{children:"Rc>"}),". And I got my ",(0,i.jsx)(t.em,{children:"ass whopped"})," by the compiler once again. /o\\"]}),"\n",(0,i.jsxs)(t.admonition,{type:"tip",children:[(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"Box"})," represents a dynamically allocated memory on heap. It is a single pointer,\nyou can imagine this as ",(0,i.jsx)(t.code,{children:"std::unique_ptr"})," in C++."]}),(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"Rc"})," represents a dynamically allocated memory on heap. On top of that it is\n",(0,i.jsx)(t.em,{children:"reference counted"})," (that's what the ",(0,i.jsx)(t.code,{children:"Rc"})," stands for). You can imagine this as\n",(0,i.jsx)(t.code,{children:"std::shared_ptr"})," in C++."]}),(0,i.jsxs)(t.p,{children:["Now the fun stuff. Neither of them lets you ",(0,i.jsx)(t.strong,{children:"mutate"})," the contents of the memory."]}),(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"Cell"})," allows you to mutate the memory. Can be used reasonably with types that\ncan be copied, because the memory safety is guaranteed by copying the contents\nwhen there is more than one ",(0,i.jsx)(t.strong,{children:"mutable"})," reference to the memory."]}),(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"RefCell"})," is similar to the ",(0,i.jsx)(t.code,{children:"Cell"}),", but the borrowing rules (how many mutable\nreferences are present) are checked dynamically."]}),(0,i.jsxs)(t.p,{children:["So in the end, if you want something like ",(0,i.jsx)(t.code,{children:"std::shared_ptr"})," in Rust, you want\nto have ",(0,i.jsx)(t.code,{children:"Rc>"}),"."]})]}),"\n",(0,i.jsxs)(t.p,{children:["So, how are we going to represent the file system then? We will use an enumeration,\nhehe, which is an algebraic data type that can store some stuff in itself ","\ud83d\ude29"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-rust",children:"type FileHandle = Rc>;\n\n#[derive(Debug)]\nenum AocFile {\n File(usize),\n Directory(BTreeMap),\n}\n"})}),"\n",(0,i.jsxs)(t.p,{children:["Let's go over it! ",(0,i.jsx)(t.code,{children:"FileHandle"})," represents dynamically allocated ",(0,i.jsx)(t.code,{children:"AocFile"}),", not\nmuch to discuss. What does the ",(0,i.jsx)(t.code,{children:"#[derive(Debug)]"})," do though? It lets us to print\nout the value of that enumeration, it's derived, so it's not as good as if we had\nimplemented it ourselves, but it's good enough for debugging, hence the name."]}),"\n",(0,i.jsxs)(t.p,{children:["Now to the fun part! ",(0,i.jsx)(t.code,{children:"AocFile"})," value can be represented in two ways:"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"File(usize)"}),", e.g. ",(0,i.jsx)(t.code,{children:"AocFile::File(123)"})," and we can pattern match it, if we\nneed to"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"Directory(BTreeMap)"})," will represent the directory and will\ncontain map matching the name of the files (or directories) within to their\nrespective file handles"]}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"I will omit the details about constructing this file system, cause there are a lot\nof technicalities introduced by the nature of the input. However if you are\ninterested, you can have a look at my solution."}),"\n",(0,i.jsx)(t.p,{children:"We need to find small enough directories and also find the smallest directory that\nwill free enough space. Now the question is, how could we do that. And there are\nmultiple ways I will describe."}),"\n",(0,i.jsxs)(t.p,{children:["I have chosen to implement ",(0,i.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Catamorphism#Tree_fold",children:(0,i.jsx)(t.em,{children:"tree catamorphism"})})," ","\ud83d\ude29",". It is basically a fold\nover a tree data structure. We descent down into the leaves and propagate computed\nresults all the way to the root. You can also notice that this approach is very\nsimilar to ",(0,i.jsx)(t.em,{children:"dynamic programming"}),", we find overlapping sections of the computation\nand try to minimize the additional work (in this case: we need to know sizes of\nour descendants, but we have already been there)."]}),"\n",(0,i.jsx)(t.p,{children:"Another approach that has been suggested to me few days later is running DFS on\nthe graph. And, funnily enough, we would still need to combine what we found in\nthe branches where we descent. So in the end, it would work very similarly to my\nsolution."}),"\n",(0,i.jsx)(t.p,{children:"One of the more exotic options would be precomputing the required information at\nthe same time as parsing. That could be done by adding additional fields to the\nnodes which would allow storing such information and updating it as we construct\nthe file system."}),"\n",(0,i.jsx)(t.h2,{id:"post-mortem",children:"Post Mortem"}),"\n",(0,i.jsx)(t.p,{children:"Things that have been brought up in the discussion later on."}),"\n",(0,i.jsxs)(t.h3,{id:"rct-vs-rcrefcellt",children:[(0,i.jsx)(t.code,{children:"Rc"})," vs ",(0,i.jsx)(t.code,{children:"Rc>"})]}),"\n",(0,i.jsx)(t.p,{children:"It has been brought up that I have a contradicting statement regarding the\ndynamically allocated memory. Specifically:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["You can imagine ",(0,i.jsx)(t.code,{children:"Rc"})," as an ",(0,i.jsx)(t.code,{children:"std::shared_ptr"})," (in C++)"]}),"\n",(0,i.jsxs)(t.li,{children:["When you want an equivalent of ",(0,i.jsx)(t.code,{children:"std::shared_ptr"}),", you want to use\n",(0,i.jsx)(t.code,{children:"Rc>"})]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["Now, in Rust it is a bit more complicated, because the type that represents the\n\u201cshared pointer\u201d is ",(0,i.jsx)(t.code,{children:"Rc"}),". What ",(0,i.jsx)(t.code,{children:"RefCell"})," does is making sure that there is\nonly one \u201cowner\u201d of a mutable reference at a time (and dynamically, as opposed\nto the ",(0,i.jsx)(t.code,{children:"Cell"}),")."]}),"\n",(0,i.jsxs)(t.p,{children:["Therefore to be precise and correct about the equivalents of ",(0,i.jsx)(t.code,{children:"std::shared_ptr"}),"\nin Rust, we can say that"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"Rc"})," is an equivalent of a ",(0,i.jsx)(t.code,{children:"const std::shared_ptr"}),","]}),"\n",(0,i.jsxs)(t.li,{children:["and ",(0,i.jsx)(t.code,{children:"Rc>"})," is an equivalent of a ",(0,i.jsx)(t.code,{children:"std::shared_ptr"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["You can easily see that they only differ in the mutability. (And even that is not\nas simple as it seems, because there is also ",(0,i.jsx)(t.code,{children:"Cell"}),")"]})]})}function h(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,t,n)=>{n.d(t,{Z:()=>l,a:()=>a});var i=n(67294);const o={},s=i.createContext(o);function a(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f48be158.3578ba3c.js b/assets/js/f48be158.3578ba3c.js new file mode 100644 index 0000000..2bc6ca1 --- /dev/null +++ b/assets/js/f48be158.3578ba3c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[4064],{12326:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>s,toc:()=>d});var o=t(85893),i=t(11151);const r={title:"3rd week of Advent of Code '22 in Rust",description:"Surviving third week in Rust.",date:"2023-07-06T21:00",slug:"aoc-2022/3rd-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},a=void 0,s={permalink:"/blog/aoc-2022/3rd-week",editUrl:"https://github.com/mfocko/blog/tree/main/blog/aoc-2022/03-week-3.md",source:"@site/blog/aoc-2022/03-week-3.md",title:"3rd week of Advent of Code '22 in Rust",description:"Surviving third week in Rust.",date:"2023-07-06T21:00:00.000Z",formattedDate:"July 6, 2023",tags:[{label:"advent-of-code",permalink:"/blog/tags/advent-of-code"},{label:"advent-of-code-2022",permalink:"/blog/tags/advent-of-code-2022"},{label:"rust",permalink:"/blog/tags/rust"}],readingTime:11.57,hasTruncateMarker:!0,authors:[{name:"Matej Focko",email:"me+blog@mfocko.xyz",title:"a.k.a. @mf",url:"https://gitlab.com/mfocko",imageURL:"https://github.com/mfocko.png",key:"mf"}],frontMatter:{title:"3rd week of Advent of Code '22 in Rust",description:"Surviving third week in Rust.",date:"2023-07-06T21:00",slug:"aoc-2022/3rd-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"4th week of Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/4th-week"},nextItem:{title:"Sort the matrix diagonally",permalink:"/blog/leetcode/sort-diagonally"}},l={authorsImageUrls:[void 0]},d=[{value:"Day 15: Beacon Exclusion Zone",id:"day-15-beacon-exclusion-zone",level:2},{value:"Solution",id:"solution",level:3},{value:"Day 16: Proboscidea Volcanium",id:"day-16-proboscidea-volcanium",level:2},{value:"Solution",id:"solution-1",level:3},{value:"Indexing in graph",id:"indexing-in-graph",level:4},{value:"Cartesian product",id:"cartesian-product",level:4},{value:"\u201cImplementing\u201d an iterator",id:"implementing-an-iterator",level:4},{value:"Day 17: Pyroclastic Flow",id:"day-17-pyroclastic-flow",level:2},{value:"Solution",id:"solution-2",level:3},{value:"Collision detection",id:"collision-detection",level:4},{value:"Infinite iterator",id:"infinite-iterator",level:4},{value:"Day 18: Boiling Boulders",id:"day-18-boiling-boulders",level:2},{value:"Solution",id:"solution-3",level:3},{value:"Day 19: Not Enough Minerals",id:"day-19-not-enough-minerals",level:2},{value:"Solution",id:"solution-4",level:3},{value:"Day 20: Grove Positioning System",id:"day-20-grove-positioning-system",level:2},{value:"Solution",id:"solution-5",level:3},{value:".borrow_mut()",id:"borrow_mut",level:4},{value:".borrow_mut() on Rc<RefCell<T>>",id:"borrow_mut-on-rcrefcellt",level:5},{value:"BorrowMut trait",id:"borrowmut-trait",level:5},{value:"Conflict",id:"conflict",level:5},{value:"Day 21: Monkey Math",id:"day-21-monkey-math",level:2},{value:"Solution",id:"solution-6",level:3},{value:"Default trait",id:"default-trait",level:4},{value:"Abusing negation",id:"abusing-negation",level:4}];function c(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",h5:"h5",li:"li",ol:"ol",p:"p",pre:"pre",section:"section",strong:"strong",sup:"sup",ul:"ul",...(0,i.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(n.p,{children:["Let's go through the third week of ",(0,o.jsx)(n.a,{href:"https://adventofcode.com",children:(0,o.jsx)(n.em,{children:"Advent of Code"})})," in Rust."]}),"\n",(0,o.jsx)(n.h2,{id:"day-15-beacon-exclusion-zone",children:(0,o.jsx)(n.a,{href:"https://adventofcode.com/2022/day/15",children:"Day 15: Beacon Exclusion Zone"})}),"\n",(0,o.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,o.jsx)(n.p,{children:"Triangulating a distress beacon based on the information from the sensors."})}),"\n",(0,o.jsx)(n.h3,{id:"solution",children:"Solution"}),"\n",(0,o.jsx)(n.p,{children:"Relatively easy thing to implement, no major Rust issues hit."}),"\n",(0,o.jsx)(n.h2,{id:"day-16-proboscidea-volcanium",children:(0,o.jsx)(n.a,{href:"https://adventofcode.com/2022/day/16",children:"Day 16: Proboscidea Volcanium"})}),"\n",(0,o.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,o.jsx)(n.p,{children:"Finding a max flow in a graph given some time constraints."})}),"\n",(0,o.jsx)(n.h3,{id:"solution-1",children:"Solution"}),"\n",(0,o.jsx)(n.p,{children:"I have used some interesting things to implement this and make it easier for me."}),"\n",(0,o.jsx)(n.h4,{id:"indexing-in-graph",children:"Indexing in graph"}),"\n",(0,o.jsx)(n.p,{children:"I have come across a situation where I needed to keep more information regarding\nthe graph\u2026 In that case you can, of course, create a structure and keep it in,\nbut once you have multiple members in the structure it gets harder to work with\nsince you need to address the fields in the structure. When you work with graph,\nyou frequently need to access the vertices and in this case it felt a lot easier\nto implement the indexing in a graph, rather than explicitly access the\nunderlying data structure."}),"\n",(0,o.jsx)(n.p,{children:"Here you can see a rather short snippet from the solution that allows you to\n\u201cindex\u201d the graph:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-rust",children:"impl Index<&str> for Graph {\n type Output = Vertex;\n\n fn index(&self, index: &str) -> &Self::Output {\n &self.g[index]\n }\n}\n"})}),"\n",(0,o.jsx)(n.h4,{id:"cartesian-product",children:"Cartesian product"}),"\n",(0,o.jsxs)(n.p,{children:["During the implementation I had to utilize Floyd-Warshall algorithm for finding\nthe shortest path between pairs of vertices and utilized the ",(0,o.jsx)(n.code,{children:"iproduct!"})," macro\nfrom the ",(0,o.jsx)(n.a,{href:"https://crates.io/crates/itertools",children:(0,o.jsx)(n.code,{children:"itertools"})}),". It is a very useful higher-order function that allows\nyou to keep the nesting of the loops at a minimum level while still maintaining\nthe same functionality."]}),"\n",(0,o.jsx)(n.h4,{id:"implementing-an-iterator",children:"\u201cImplementing\u201d an iterator"}),"\n",(0,o.jsx)(n.p,{children:"For the second part, you get to split the work between 2 actors. That way you\ncan achieve higher efficiency of the whole process that you're planning, but it\nalso makes it harder to evaluate algorithmically, since you need to check the\ndifferent ways the work can be split."}),"\n",(0,o.jsxs)(n.p,{children:["Being affected by ",(0,o.jsx)(n.em,{children:"functional programming brain damage"}),"\u2122\ufe0f",", I have chosen to\ndo this part by function that returns an iterator over the possible ways:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-rust",children:"fn pairings(\n valves: &BTreeSet,\n) -> impl Iterator, BTreeSet)> + '_ {\n let mapping = valves.iter().collect_vec();\n\n let max_mask = 1 << (valves.len() - 1);\n\n (0..max_mask).map(move |mask| {\n let mut elephant = BTreeSet::new();\n let mut human = BTreeSet::new();\n\n for (i, &v) in mapping.iter().enumerate() {\n if (mask & (1 << i)) == 0 {\n human.insert(v.clone());\n } else {\n elephant.insert(v.clone());\n }\n }\n\n (human, elephant)\n })\n}\n"})}),"\n",(0,o.jsx)(n.h2,{id:"day-17-pyroclastic-flow",children:(0,o.jsx)(n.a,{href:"https://adventofcode.com/2022/day/17",children:"Day 17: Pyroclastic Flow"})}),"\n",(0,o.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,o.jsx)(n.p,{children:"Simulating an autonomous Tetris where pieces get affected by a series of jets of\nhot gas."})}),"\n",(0,o.jsx)(n.h3,{id:"solution-2",children:"Solution"}),"\n",(0,o.jsxs)(n.p,{children:["Similarly to the previous day I have created some iterators ","\ud83d\ude04"]}),"\n",(0,o.jsx)(n.h4,{id:"collision-detection",children:"Collision detection"}),"\n",(0,o.jsx)(n.p,{children:"Once you need to check for collisions it is very helpful to be able to just\niterate through the positions that can actually collide with the wall or other\npiece."}),"\n",(0,o.jsx)(n.p,{children:"To get the desired behaviour, you can just compose few smaller functions:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-rust",children:"fn occupied(shape: &[Vec]) -> impl Iterator + '_ {\n shape.iter().enumerate().flat_map(|(y, row)| {\n row.iter().enumerate().filter_map(move |(x, c)| {\n if c == &'#' {\n Some(Vector2D::new(x as isize, y as isize))\n } else {\n None\n }\n })\n })\n}\n"})}),"\n",(0,o.jsx)(n.p,{children:"In the end, we get relative positions which we can adjust later when given the\nspecific positions from iterator. You can see some interesting parts in this:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:".enumerate()"})," allows us to get both the indices (coordinates) and the line\nor, later on, the character itself,"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:".flat_map()"})," flattens the iterator, i.e. when we return another iterator,\nthey just get chained instead of iterating over iterators (which sounds pretty\ndisturbing, doesn't it?),"]}),"\n",(0,o.jsxs)(n.li,{children:["and finally ",(0,o.jsx)(n.code,{children:".filter_map()"})," which is pretty similar to the \u201cbasic\u201d ",(0,o.jsx)(n.code,{children:".map()"}),"\nwith a one, key, difference that it expects the items of an iterator to be\nmapped to an ",(0,o.jsx)(n.code,{children:"Option"})," from which it ignores nothing (as in ",(0,o.jsx)(n.code,{children:"None"})," ","\ud83d\ude09",")\nand also unwraps the values from ",(0,o.jsx)(n.code,{children:"Some(\u2026)"}),"."]}),"\n"]}),"\n",(0,o.jsx)(n.h4,{id:"infinite-iterator",children:"Infinite iterator"}),"\n",(0,o.jsx)(n.p,{children:"In the solution we cycle through both Tetris-like shapes that fall down and the\njets that move our pieces around. Initially I have implemented my own infinite\niterator that just yields the indices. It is a very simple, yet powerful, piece\nof code:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-rust",children:"struct InfiniteIndex {\n size: usize,\n i: usize,\n}\n\nimpl InfiniteIndex {\n fn new(size: usize) -> InfiniteIndex {\n InfiniteIndex { size, i: size - 1 }\n }\n}\n\nimpl Iterator for InfiniteIndex {\n type Item = usize;\n\n fn next(&mut self) -> Option {\n self.i = (self.i + 1) % self.size;\n Some(self.i)\n }\n}\n"})}),"\n",(0,o.jsxs)(n.p,{children:["However when I'm looking at the code now, it doesn't really make much sense\u2026\nGuess what, we can use a built-in function that is implemented on iterators for\nthat! The function is called ",(0,o.jsx)(n.code,{children:".cycle()"})]}),"\n",(0,o.jsx)(n.p,{children:"On the other hand, I am not going to switch to that function, since it would\nintroduce an another myriad of issues caused by the fact that I create iterators\nright away in the constructor of my structure and the iterators would borrow\nboth the jets and shapes which would introduce a lifetime dependency into the\nstructure."}),"\n",(0,o.jsx)(n.h2,{id:"day-18-boiling-boulders",children:(0,o.jsx)(n.a,{href:"https://adventofcode.com/2022/day/18",children:"Day 18: Boiling Boulders"})}),"\n",(0,o.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,o.jsx)(n.p,{children:"Let's compute a surface area of some obsidian approximated via coordinates of\ncubes."})}),"\n",(0,o.jsx)(n.h3,{id:"solution-3",children:"Solution"}),"\n",(0,o.jsx)(n.p,{children:"This day is kinda interesting, because it shows how easily you can complicate the\nproblem and also how much can you screw yourself over with the optimization and\n\u201csmart\u201d approach."}),"\n",(0,o.jsxs)(n.p,{children:["For the first part you need to find the surface area of an obsidian that is\napproximated by cubes. Now, that is a very easy thing to do, just keep the track\nof already added cubes, and check if the newly added cube touches any face of any\nother cube. Simple, and with a ",(0,o.jsx)(n.code,{children:"BTreeSet"})," relatively efficient way to do it."]}),"\n",(0,o.jsx)(n.p,{children:"However the second part lets you on a secret that there may be some surface area\nfrom the \u201cinside\u201d too and you want to know only the one from the outside of the\nobsidian. I have seen some solutions later, but if you check your data, you might\nnotice that the bounding box of all the cubes isn't that big at all. Therefore I\nchose to pre-construct the box beforehand, fill in the cubes and then just run a\nBFS turning all the lava on the outside into the air. Now you just need to check\ncubes and count how many of their faces touch the air."}),"\n",(0,o.jsx)(n.h2,{id:"day-19-not-enough-minerals",children:(0,o.jsx)(n.a,{href:"https://adventofcode.com/2022/day/19",children:"Day 19: Not Enough Minerals"})}),"\n",(0,o.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,o.jsx)(n.p,{children:"Finding out the best strategy for building robots to collect geodes."})}),"\n",(0,o.jsx)(n.h3,{id:"solution-4",children:"Solution"}),"\n",(0,o.jsxs)(n.p,{children:["Not much interesting stuff to mention apart from the suggestion to never believe\nthat the default implementation given by ",(0,o.jsx)(n.code,{children:"derive"})," macro is what you want, it\ndoesn't have to be. ","\ud83d\ude04"]}),"\n",(0,o.jsx)(n.h2,{id:"day-20-grove-positioning-system",children:(0,o.jsx)(n.a,{href:"https://adventofcode.com/2022/day/20",children:"Day 20: Grove Positioning System"})}),"\n",(0,o.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,o.jsxs)(n.p,{children:["Shuffling around the ",(0,o.jsx)(n.em,{children:"circular linked list"})," to find the coordinates."]})}),"\n",(0,o.jsx)(n.p,{children:"Now, small rant for this day is in place. They've never mentioned that coordinates\ncan repeat and therefore the values are non-unique. This is something that did\nnot happen in the given sample, but was present in the user input. It took \xbba lot\xab\nto realize that this is the issue."}),"\n",(0,o.jsx)(n.h3,{id:"solution-5",children:"Solution"}),"\n",(0,o.jsxs)(n.p,{children:["I have tried implementing a circular linked list for this\u2026 and I have failed\nmiserably. To be fair, I still have no clue why. It was \u201cfun\u201d to play around with\nthe ",(0,o.jsx)(n.code,{children:"Rc>"}),". In the end I failed on ",(0,o.jsx)(n.em,{children:"wrong answer"}),". I have also encountered\na rather interesting issue with ",(0,o.jsx)(n.code,{children:".borrow_mut()"})," method being used on ",(0,o.jsx)(n.code,{children:"Rc>"}),"."]}),"\n",(0,o.jsx)(n.h4,{id:"borrow_mut",children:(0,o.jsx)(n.code,{children:".borrow_mut()"})}),"\n",(0,o.jsx)(n.p,{children:"Consider the following snippet of the code (taken from the documentation):"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-rust",children:'use std::cell::{RefCell, RefMut};\nuse std::collections::HashMap;\nuse std::rc::Rc;\n// use std::borrow::BorrowMut;\n\nfn main() {\n let shared_map: Rc> = Rc::new(RefCell::new(HashMap::new()));\n // Create a new block to limit the scope of the dynamic borrow\n {\n let mut map: RefMut<_> = shared_map.borrow_mut();\n map.insert("africa", 92388);\n map.insert("kyoto", 11837);\n map.insert("piccadilly", 11826);\n map.insert("marbles", 38);\n }\n\n // Note that if we had not let the previous borrow of the cache fall out\n // of scope then the subsequent borrow would cause a dynamic thread panic.\n // This is the major hazard of using `RefCell`.\n let total: i32 = shared_map.borrow().values().sum();\n println!("{total}");\n}\n'})}),"\n",(0,o.jsx)(n.p,{children:"We allocate a hash map on the heap and then in the inner block, we borrow it as\na mutable reference, so that we can use it."}),"\n",(0,o.jsx)(n.admonition,{type:"note",children:(0,o.jsxs)(n.p,{children:["It is a very primitive example for ",(0,o.jsx)(n.code,{children:"Rc>"})," and mutable borrow."]})}),"\n",(0,o.jsxs)(n.p,{children:["If you uncomment the 4th line with ",(0,o.jsx)(n.code,{children:"use std::borrow::BorrowMut;"}),", you cannot\ncompile the code anymore, because of"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:" Compiling playground v0.0.1 (/playground)\nerror[E0308]: mismatched types\n --\x3e src/main.rs:10:34\n |\n10 | let mut map: RefMut<_> = shared_map.borrow_mut();\n | --------- ^^^^^^^^^^^^^^^^^^^^^^^ expected struct `RefMut`, found mutable reference\n | |\n | expected due to this\n |\n = note: expected struct `RefMut<'_, _>`\n found mutable reference `&mut Rc>>`\n\nerror[E0599]: no method named `insert` found for struct `RefMut<'_, _>` in the current scope\n --\x3e src/main.rs:11:13\n |\n11 | map.insert(\"africa\", 92388);\n | ^^^^^^ method not found in `RefMut<'_, _>`\n\nerror[E0599]: no method named `insert` found for struct `RefMut<'_, _>` in the current scope\n --\x3e src/main.rs:12:13\n |\n12 | map.insert(\"kyoto\", 11837);\n | ^^^^^^ method not found in `RefMut<'_, _>`\n\nerror[E0599]: no method named `insert` found for struct `RefMut<'_, _>` in the current scope\n --\x3e src/main.rs:13:13\n |\n13 | map.insert(\"piccadilly\", 11826);\n | ^^^^^^ method not found in `RefMut<'_, _>`\n\nerror[E0599]: no method named `insert` found for struct `RefMut<'_, _>` in the current scope\n --\x3e src/main.rs:14:13\n |\n14 | map.insert(\"marbles\", 38);\n | ^^^^^^ method not found in `RefMut<'_, _>`\n\nSome errors have detailed explanations: E0308, E0599.\nFor more information about an error, try `rustc --explain E0308`.\nerror: could not compile `playground` due to 5 previous errors\n"})}),"\n",(0,o.jsxs)(n.p,{children:["It might seem ",(0,o.jsx)(n.strong,{children:"a bit"})," ridiculous. However, I got to a point where the compiler\nsuggested ",(0,o.jsx)(n.code,{children:"use std::borrow::BorrowMut;"})," and it resulted in breaking parts of the\ncode that worked previously. I think it may be a good idea to go over what is\nhappening here."]}),"\n",(0,o.jsxs)(n.h5,{id:"borrow_mut-on-rcrefcellt",children:[(0,o.jsx)(n.code,{children:".borrow_mut()"})," on ",(0,o.jsx)(n.code,{children:"Rc>"})]}),"\n",(0,o.jsxs)(n.p,{children:["Let's consider a variable ",(0,o.jsx)(n.code,{children:"x"})," of type ",(0,o.jsx)(n.code,{children:"Rc>"}),". What happens when you\ncall ",(0,o.jsx)(n.code,{children:".borrow_mut()"})," on it? We can look at the ",(0,o.jsx)(n.code,{children:"Rc"})," type, and\u2026 hang on! There is\nneither ",(0,o.jsx)(n.code,{children:".borrow_mut()"})," method or ",(0,o.jsx)(n.code,{children:"BorrowMut"})," trait implemented. How can we do it\nthen?"]}),"\n",(0,o.jsxs)(n.p,{children:["Let's go further and we can see that ",(0,o.jsx)(n.code,{children:"RefCell"})," implements a ",(0,o.jsx)(n.code,{children:".borrow_mut()"}),"\nmethod. OK, but how can we call it on the ",(0,o.jsx)(n.code,{children:"Rc"}),"? Easily! ",(0,o.jsx)(n.code,{children:"Rc"})," implements\n",(0,o.jsx)(n.code,{children:"Deref"})," and therefore you can call methods on ",(0,o.jsx)(n.code,{children:"Rc"})," objects as if they were\n",(0,o.jsx)(n.code,{children:"T"})," objects. If we read on ",(0,o.jsxs)(n.em,{children:[(0,o.jsx)(n.code,{children:"Deref"})," coercion"]}),", we can see the following:"]}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:["If ",(0,o.jsx)(n.code,{children:"T"})," implements ",(0,o.jsx)(n.code,{children:"Deref"}),", \u2026:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"\u2026"}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"T"})," implicitly implements all the (immutable) methods of the type ",(0,o.jsx)(n.code,{children:"U"}),"."]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["What is the requirement for the ",(0,o.jsx)(n.code,{children:".borrow_mut()"})," on ",(0,o.jsx)(n.code,{children:"RefCell"}),"? Well, it needs\n",(0,o.jsx)(n.code,{children:"&self"}),", so the ",(0,o.jsx)(n.code,{children:"Deref"})," implements the ",(0,o.jsx)(n.code,{children:".borrow_mut()"})," for the ",(0,o.jsx)(n.code,{children:"Rc>"}),"."]}),"\n",(0,o.jsxs)(n.h5,{id:"borrowmut-trait",children:[(0,o.jsx)(n.code,{children:"BorrowMut"})," trait"]}),"\n",(0,o.jsxs)(n.p,{children:["I have not been able to find a lot on this trait. My guess is that it provides a\nmethod instead of a syntactic sugar (",(0,o.jsx)(n.code,{children:"&mut x"}),") for the mutable borrow. And also\nit provides default implementations for the types:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-rust",children:"impl BorrowMut for String\n\nimpl BorrowMut for &mut T\nwhere\n T: ?Sized,\n\nimpl BorrowMut for T\nwhere\n T: ?Sized,\n\nimpl BorrowMut<[T]> for Vec\nwhere\n A: Allocator,\n\nimpl BorrowMut for Box\nwhere\n A: Allocator,\n T: ?Sized,\n\nimpl BorrowMut<[T]> for [T; N]\n"})}),"\n",(0,o.jsx)(n.h5,{id:"conflict",children:"Conflict"}),"\n",(0,o.jsxs)(n.p,{children:["Now the question is why did it break the code\u2026 My first take was that the type\n",(0,o.jsx)(n.code,{children:"Rc>"})," has some ",(0,o.jsx)(n.em,{children:"specialized"})," implementation of the ",(0,o.jsx)(n.code,{children:".borrow_mut()"})," and\nthe ",(0,o.jsx)(n.code,{children:"use"})," overrides it with the default, which is true ",(0,o.jsx)(n.strong,{children:"in a sense"}),". However\nthere is no ",(0,o.jsx)(n.em,{children:"specialized"})," implementation. Let's have a look at the trait and the\ntype signature on the ",(0,o.jsx)(n.code,{children:"RefCell"}),":"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-rust",children:"// trait\npub trait BorrowMut: Borrow\nwhere\n Borrowed: ?Sized,\n{\n fn borrow_mut(&mut self) -> &mut Borrowed;\n}\n\n// \u2039RefCell.borrow_mut()\u203a type signature\npub fn borrow_mut(&self) -> RefMut<'_, T>\n"})}),"\n",(0,o.jsxs)(n.p,{children:["I think that we can definitely agree on the fact that ",(0,o.jsx)(n.code,{children:"RefMut<'_, T>"})," is not the\n",(0,o.jsx)(n.code,{children:"RefCell"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"In my opinion"}),", ",(0,o.jsx)(n.code,{children:"RefCell"})," implements a ",(0,o.jsx)(n.strong,{children:"separate"})," ",(0,o.jsx)(n.code,{children:".borrow_mut()"})," rather\nthan implementing the interface, because it ",(0,o.jsx)(n.strong,{children:"cannot"})," satisfy the type requirements\nof the trait."]}),"\n",(0,o.jsx)(n.admonition,{type:"caution",children:(0,o.jsxs)(n.p,{children:["I wonder how are we expected to deal with this conflict, if and when, we need\nboth the ",(0,o.jsx)(n.code,{children:".borrow_mut()"})," of the trait and ",(0,o.jsx)(n.code,{children:".borrow_mut()"})," of the ",(0,o.jsx)(n.code,{children:"RefCell"}),"."]})}),"\n",(0,o.jsxs)(n.admonition,{title:"Fun fact",type:"tip",children:[(0,o.jsxs)(n.p,{children:["I was suggested by the compiler to do ",(0,o.jsx)(n.code,{children:"use std::borrow::BorrowMut;"})," and break the\ncode."]}),(0,o.jsxs)(n.p,{children:["So much for the ",(0,o.jsx)(n.em,{children:"almighty"})," and ",(0,o.jsx)(n.em,{children:"helpful"})," compiler\u2026"]})]}),"\n",(0,o.jsx)(n.h2,{id:"day-21-monkey-math",children:(0,o.jsx)(n.a,{href:"https://adventofcode.com/2022/day/21",children:"Day 21: Monkey Math"})}),"\n",(0,o.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,o.jsx)(n.p,{children:"Computing an expression tree and then also finding ideal value for a node."})}),"\n",(0,o.jsx)(n.h3,{id:"solution-6",children:"Solution"}),"\n",(0,o.jsx)(n.p,{children:"Relatively simple, until you get to the 2nd part where you start to practice\na lot of the copy-paste. I have managed to sneak some perverted stuff in there\nthough :) Let's go through the details."}),"\n",(0,o.jsxs)(n.h4,{id:"default-trait",children:[(0,o.jsx)(n.code,{children:"Default"})," trait"]}),"\n",(0,o.jsxs)(n.p,{children:["For the first time and twice I had a need to have a default value for my types,\nenumerations in this case. Rust offers a very nice trait",(0,o.jsx)(n.sup,{children:(0,o.jsx)(n.a,{href:"#user-content-fn-1-990909",id:"user-content-fnref-1-990909","data-footnote-ref":!0,"aria-describedby":"footnote-label",children:"1"})})," that is described\nas:"]}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsx)(n.p,{children:"A trait for giving a type a useful default value."}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["I guess it sums it up nicely. The more interesting part about this is the fact\nthat you can use the ",(0,o.jsx)(n.em,{children:"macro machinery"})," to save yourself some typing. If you have\nenumeration of which the default value doesn't bear any parameter, you can just\ndo",(0,o.jsx)(n.sup,{children:(0,o.jsx)(n.a,{href:"#user-content-fn-2-990909",id:"user-content-fnref-2-990909","data-footnote-ref":!0,"aria-describedby":"footnote-label",children:"2"})}),":"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-rust",children:"#[derive(Default)]\nenum Color {\n #[default]\n White,\n Gray,\n Black,\n}\n"})}),"\n",(0,o.jsx)(n.h4,{id:"abusing-negation",children:"Abusing negation"}),"\n",(0,o.jsxs)(n.p,{children:["If you want to use a ",(0,o.jsx)(n.em,{children:"unary minus"})," operator on your own type, you can implement\na ",(0,o.jsx)(n.code,{children:"Neg"})," trait",(0,o.jsx)(n.sup,{children:(0,o.jsx)(n.a,{href:"#user-content-fn-3-990909",id:"user-content-fnref-3-990909","data-footnote-ref":!0,"aria-describedby":"footnote-label",children:"3"})}),". I was dealing with a binary tree and needed a way how to look\nat the other side, so I have just implemented the negation for flipping between\nleft and right ","\ud83d\ude04"]}),"\n",(0,o.jsxs)(n.section,{"data-footnotes":!0,className:"footnotes",children:[(0,o.jsx)(n.h2,{className:"sr-only",id:"footnote-label",children:"Footnotes"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{id:"user-content-fn-1-990909",children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.a,{href:"https://doc.rust-lang.org/std/default/trait.Default.html",children:(0,o.jsx)(n.code,{children:"Default"})})," docs ",(0,o.jsx)(n.a,{href:"#user-content-fnref-1-990909","data-footnote-backref":"","aria-label":"Back to reference 1",className:"data-footnote-backref",children:"\u21a9"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{id:"user-content-fn-2-990909",children:["\n",(0,o.jsxs)(n.p,{children:["Pardon my example from the graph algorithms ;) ",(0,o.jsx)(n.a,{href:"#user-content-fnref-2-990909","data-footnote-backref":"","aria-label":"Back to reference 2",className:"data-footnote-backref",children:"\u21a9"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{id:"user-content-fn-3-990909",children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.a,{href:"https://doc.rust-lang.org/std/ops/trait.Neg.html",children:(0,o.jsx)(n.code,{children:"Neg"})})," docs ",(0,o.jsx)(n.a,{href:"#user-content-fnref-3-990909","data-footnote-backref":"","aria-label":"Back to reference 3",className:"data-footnote-backref",children:"\u21a9"})]}),"\n"]}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>a});var o=t(67294);const i={},r=o.createContext(i);function a(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f48be158.5e2dd98c.js b/assets/js/f48be158.5e2dd98c.js deleted file mode 100644 index e124484..0000000 --- a/assets/js/f48be158.5e2dd98c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[4064],{12326:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>s,toc:()=>d});var o=t(85893),i=t(11151);const r={title:"3rd week of Advent of Code '22 in Rust",description:"Surviving third week in Rust.",date:"2023-07-06T21:00",slug:"aoc-2022/3rd-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},a=void 0,s={permalink:"/blog/aoc-2022/3rd-week",editUrl:"https://github.com/mfocko/blog/tree/main/blog/aoc-2022/03-week-3.md",source:"@site/blog/aoc-2022/03-week-3.md",title:"3rd week of Advent of Code '22 in Rust",description:"Surviving third week in Rust.",date:"2023-07-06T21:00:00.000Z",formattedDate:"July 6, 2023",tags:[{label:"advent-of-code",permalink:"/blog/tags/advent-of-code"},{label:"advent-of-code-2022",permalink:"/blog/tags/advent-of-code-2022"},{label:"rust",permalink:"/blog/tags/rust"}],readingTime:11.565,hasTruncateMarker:!0,authors:[{name:"Matej Focko",email:"me+blog@mfocko.xyz",title:"a.k.a. @mf",url:"https://gitlab.com/mfocko",imageURL:"https://github.com/mfocko.png",key:"mf"}],frontMatter:{title:"3rd week of Advent of Code '22 in Rust",description:"Surviving third week in Rust.",date:"2023-07-06T21:00",slug:"aoc-2022/3rd-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"4th week of Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/4th-week"},nextItem:{title:"Sort the matrix diagonally",permalink:"/blog/leetcode/sort-diagonally"}},l={authorsImageUrls:[void 0]},d=[{value:"Day 15: Beacon Exclusion Zone",id:"day-15-beacon-exclusion-zone",level:2},{value:"Solution",id:"solution",level:3},{value:"Day 16: Proboscidea Volcanium",id:"day-16-proboscidea-volcanium",level:2},{value:"Solution",id:"solution-1",level:3},{value:"Indexing in graph",id:"indexing-in-graph",level:4},{value:"Cartesian product",id:"cartesian-product",level:4},{value:"\u201cImplementing\u201d an iterator",id:"implementing-an-iterator",level:4},{value:"Day 17: Pyroclastic Flow",id:"day-17-pyroclastic-flow",level:2},{value:"Solution",id:"solution-2",level:3},{value:"Collision detection",id:"collision-detection",level:4},{value:"Infinite iterator",id:"infinite-iterator",level:4},{value:"Day 18: Boiling Boulders",id:"day-18-boiling-boulders",level:2},{value:"Solution",id:"solution-3",level:3},{value:"Day 19: Not Enough Minerals",id:"day-19-not-enough-minerals",level:2},{value:"Solution",id:"solution-4",level:3},{value:"Day 20: Grove Positioning System",id:"day-20-grove-positioning-system",level:2},{value:"Solution",id:"solution-5",level:3},{value:".borrow_mut()",id:"borrow_mut",level:4},{value:".borrow_mut() on Rc<RefCell<T>>",id:"borrow_mut-on-rcrefcellt",level:5},{value:"BorrowMut trait",id:"borrowmut-trait",level:5},{value:"Conflict",id:"conflict",level:5},{value:"Day 21: Monkey Math",id:"day-21-monkey-math",level:2},{value:"Solution",id:"solution-6",level:3},{value:"Default trait",id:"default-trait",level:4},{value:"Abusing negation",id:"abusing-negation",level:4}];function c(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",h5:"h5",li:"li",ol:"ol",p:"p",pre:"pre",section:"section",strong:"strong",sup:"sup",ul:"ul",...(0,i.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(n.p,{children:["Let's go through the third week of ",(0,o.jsx)(n.a,{href:"https://adventofcode.com",children:(0,o.jsx)(n.em,{children:"Advent of Code"})})," in Rust."]}),"\n",(0,o.jsx)(n.h2,{id:"day-15-beacon-exclusion-zone",children:(0,o.jsx)(n.a,{href:"https://adventofcode.com/2022/day/15",children:"Day 15: Beacon Exclusion Zone"})}),"\n",(0,o.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,o.jsx)(n.p,{children:"Triangulating a distress beacon based on the information from the sensors."})}),"\n",(0,o.jsx)(n.h3,{id:"solution",children:"Solution"}),"\n",(0,o.jsx)(n.p,{children:"Relatively easy thing to implement, no major Rust issues hit."}),"\n",(0,o.jsx)(n.h2,{id:"day-16-proboscidea-volcanium",children:(0,o.jsx)(n.a,{href:"https://adventofcode.com/2022/day/16",children:"Day 16: Proboscidea Volcanium"})}),"\n",(0,o.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,o.jsx)(n.p,{children:"Finding a max flow in a graph given some time constraints."})}),"\n",(0,o.jsx)(n.h3,{id:"solution-1",children:"Solution"}),"\n",(0,o.jsx)(n.p,{children:"I have used some interesting things to implement this and make it easier for me."}),"\n",(0,o.jsx)(n.h4,{id:"indexing-in-graph",children:"Indexing in graph"}),"\n",(0,o.jsx)(n.p,{children:"I have come across a situation where I needed to keep more information regarding\nthe graph\u2026 In that case you can, of course, create a structure and keep it in,\nbut once you have multiple members in the structure it gets harder to work with\nsince you need to address the fields in the structure. When you work with graph,\nyou frequently need to access the vertices and in this case it felt a lot easier\nto implement the indexing in a graph, rather than explicitly access the\nunderlying data structure."}),"\n",(0,o.jsx)(n.p,{children:"Here you can see a rather short snippet from the solution that allows you to\n\u201cindex\u201d the graph:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-rust",children:"impl Index<&str> for Graph {\n type Output = Vertex;\n\n fn index(&self, index: &str) -> &Self::Output {\n &self.g[index]\n }\n}\n"})}),"\n",(0,o.jsx)(n.h4,{id:"cartesian-product",children:"Cartesian product"}),"\n",(0,o.jsxs)(n.p,{children:["During the implementation I had to utilize Floyd-Warshall algorithm for finding\nthe shortest path between pairs of vertices and utilized the ",(0,o.jsx)(n.code,{children:"iproduct!"})," macro\nfrom the ",(0,o.jsx)(n.a,{href:"https://crates.io/crates/itertools",children:(0,o.jsx)(n.code,{children:"itertools"})}),". It is a very useful higher-order function that allows\nyou to keep the nesting of the loops at a minimum level while still maintaining\nthe same functionality."]}),"\n",(0,o.jsx)(n.h4,{id:"implementing-an-iterator",children:"\u201cImplementing\u201d an iterator"}),"\n",(0,o.jsx)(n.p,{children:"For the second part, you get to split the work between 2 actors. That way you\ncan achieve higher efficiency of the whole process that you're planning, but it\nalso makes it harder to evaluate algorithmically, since you need to check the\ndifferent ways the work can be split."}),"\n",(0,o.jsxs)(n.p,{children:["Being affected by ",(0,o.jsx)(n.em,{children:"functional programming brain damage"}),"\u2122\ufe0f",", I have chosen to\ndo this part by function that returns an iterator over the possible ways:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-rust",children:"fn pairings(\n valves: &BTreeSet,\n) -> impl Iterator, BTreeSet)> + '_ {\n let mapping = valves.iter().collect_vec();\n\n let max_mask = 1 << (valves.len() - 1);\n\n (0..max_mask).map(move |mask| {\n let mut elephant = BTreeSet::new();\n let mut human = BTreeSet::new();\n\n for (i, &v) in mapping.iter().enumerate() {\n if (mask & (1 << i)) == 0 {\n human.insert(v.clone());\n } else {\n elephant.insert(v.clone());\n }\n }\n\n (human, elephant)\n })\n}\n"})}),"\n",(0,o.jsx)(n.h2,{id:"day-17-pyroclastic-flow",children:(0,o.jsx)(n.a,{href:"https://adventofcode.com/2022/day/17",children:"Day 17: Pyroclastic Flow"})}),"\n",(0,o.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,o.jsx)(n.p,{children:"Simulating an autonomous Tetris where pieces get affected by a series of jets of\nhot gas."})}),"\n",(0,o.jsx)(n.h3,{id:"solution-2",children:"Solution"}),"\n",(0,o.jsxs)(n.p,{children:["Similarly to the previous day I have created some iterators ","\ud83d\ude04"]}),"\n",(0,o.jsx)(n.h4,{id:"collision-detection",children:"Collision detection"}),"\n",(0,o.jsx)(n.p,{children:"Once you need to check for collisions it is very helpful to be able to just\niterate through the positions that can actually collide with the wall or other\npiece."}),"\n",(0,o.jsx)(n.p,{children:"To get the desired behaviour, you can just compose few smaller functions:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-rust",children:"fn occupied(shape: &[Vec]) -> impl Iterator + '_ {\n shape.iter().enumerate().flat_map(|(y, row)| {\n row.iter().enumerate().filter_map(move |(x, c)| {\n if c == &'#' {\n Some(Vector2D::new(x as isize, y as isize))\n } else {\n None\n }\n })\n })\n}\n"})}),"\n",(0,o.jsx)(n.p,{children:"In the end, we get relative positions which we can adjust later when given the\nspecific positions from iterator. You can see some interesting parts in this:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:".enumerate()"})," allows us to get both the indices (coordinates) and the line\nor, later on, the character itself,"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:".flat_map()"})," flattens the iterator, i.e. when we return another iterator,\nthey just get chained instead of iterating over iterators (which sounds pretty\ndisturbing, doesn't it?),"]}),"\n",(0,o.jsxs)(n.li,{children:["and finally ",(0,o.jsx)(n.code,{children:".filter_map()"})," which is pretty similar to the \u201cbasic\u201d ",(0,o.jsx)(n.code,{children:".map()"}),"\nwith a one, key, difference that it expects the items of an iterator to be\nmapped to an ",(0,o.jsx)(n.code,{children:"Option"})," from which it ignores nothing (as in ",(0,o.jsx)(n.code,{children:"None"})," ","\ud83d\ude09",")\nand also unwraps the values from ",(0,o.jsx)(n.code,{children:"Some(\u2026)"}),"."]}),"\n"]}),"\n",(0,o.jsx)(n.h4,{id:"infinite-iterator",children:"Infinite iterator"}),"\n",(0,o.jsx)(n.p,{children:"In the solution we cycle through both Tetris-like shapes that fall down and the\njets that move our pieces around. Initially I have implemented my own infinite\niterator that just yields the indices. It is a very simple, yet powerful, piece\nof code:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-rust",children:"struct InfiniteIndex {\n size: usize,\n i: usize,\n}\n\nimpl InfiniteIndex {\n fn new(size: usize) -> InfiniteIndex {\n InfiniteIndex { size, i: size - 1 }\n }\n}\n\nimpl Iterator for InfiniteIndex {\n type Item = usize;\n\n fn next(&mut self) -> Option {\n self.i = (self.i + 1) % self.size;\n Some(self.i)\n }\n}\n"})}),"\n",(0,o.jsxs)(n.p,{children:["However when I'm looking at the code now, it doesn't really make much sense\u2026\nGuess what, we can use a built-in function that is implemented on iterators for\nthat! The function is called ",(0,o.jsx)(n.code,{children:".cycle()"})]}),"\n",(0,o.jsx)(n.p,{children:"On the other hand, I am not going to switch to that function, since it would\nintroduce an another myriad of issues caused by the fact that I create iterators\nright away in the constructor of my structure and the iterators would borrow\nboth the jets and shapes which would introduce a lifetime dependency into the\nstructure."}),"\n",(0,o.jsx)(n.h2,{id:"day-18-boiling-boulders",children:(0,o.jsx)(n.a,{href:"https://adventofcode.com/2022/day/18",children:"Day 18: Boiling Boulders"})}),"\n",(0,o.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,o.jsx)(n.p,{children:"Let's compute a surface area of some obsidian approximated via coordinates of\ncubes."})}),"\n",(0,o.jsx)(n.h3,{id:"solution-3",children:"Solution"}),"\n",(0,o.jsx)(n.p,{children:"This day is kinda interesting, because it shows how easily you can complicate the\nproblem and also how much can you screw yourself over with the optimization and\n\u201csmart\u201d approach."}),"\n",(0,o.jsxs)(n.p,{children:["For the first part you need to find the surface area of an obsidian that is\napproximated by cubes. Now, that is a very easy thing to do, just keep the track\nof already added cubes, and check if the newly added cube touches any face of any\nother cube. Simple, and with a ",(0,o.jsx)(n.code,{children:"BTreeSet"})," relatively efficient way to do it."]}),"\n",(0,o.jsx)(n.p,{children:"However the second part lets you on a secret that there may be some surface area\nfrom the \u201cinside\u201d too and you want to know only the one from the outside of the\nobsidian. I have seen some solutions later, but if you check your data, you might\nnotice that the bounding box of all the cubes isn't that big at all. Therefore I\nchose to pre-construct the box beforehand, fill in the cubes and then just run a\nBFS turning all the lava on the outside into the air. Now you just need to check\ncubes and count how many of their faces touch the air."}),"\n",(0,o.jsx)(n.h2,{id:"day-19-not-enough-minerals",children:(0,o.jsx)(n.a,{href:"https://adventofcode.com/2022/day/19",children:"Day 19: Not Enough Minerals"})}),"\n",(0,o.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,o.jsx)(n.p,{children:"Finding out the best strategy for building robots to collect geodes."})}),"\n",(0,o.jsx)(n.h3,{id:"solution-4",children:"Solution"}),"\n",(0,o.jsxs)(n.p,{children:["Not much interesting stuff to mention apart from the suggestion to never believe\nthat the default implementation given by ",(0,o.jsx)(n.code,{children:"derive"})," macro is what you want, it\ndoesn't have to be. ","\ud83d\ude04"]}),"\n",(0,o.jsx)(n.h2,{id:"day-20-grove-positioning-system",children:(0,o.jsx)(n.a,{href:"https://adventofcode.com/2022/day/20",children:"Day 20: Grove Positioning System"})}),"\n",(0,o.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,o.jsxs)(n.p,{children:["Shuffling around the ",(0,o.jsx)(n.em,{children:"circular linked list"})," to find the coordinates."]})}),"\n",(0,o.jsx)(n.p,{children:"Now, small rant for this day is in place. They've never mentioned that coordinates\ncan repeat and therefore the values are non-unique. This is something that did\nnot happen in the given sample, but was present in the user input. It took \xbba lot\xab\nto realize that this is the issue."}),"\n",(0,o.jsx)(n.h3,{id:"solution-5",children:"Solution"}),"\n",(0,o.jsxs)(n.p,{children:["I have tried implementing a circular linked list for this\u2026 and I have failed\nmiserably. To be fair, I still have no clue why. It was \u201cfun\u201d to play around with\nthe ",(0,o.jsx)(n.code,{children:"Rc>"}),". In the end I failed on ",(0,o.jsx)(n.em,{children:"wrong answer"}),". I have also encountered\na rather interesting issue with ",(0,o.jsx)(n.code,{children:".borrow_mut()"})," method being used on ",(0,o.jsx)(n.code,{children:"Rc>"}),"."]}),"\n",(0,o.jsx)(n.h4,{id:"borrow_mut",children:(0,o.jsx)(n.code,{children:".borrow_mut()"})}),"\n",(0,o.jsx)(n.p,{children:"Consider the following snippet of the code (taken from the documentation):"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-rust",children:'use std::cell::{RefCell, RefMut};\nuse std::collections::HashMap;\nuse std::rc::Rc;\n// use std::borrow::BorrowMut;\n\nfn main() {\n let shared_map: Rc> = Rc::new(RefCell::new(HashMap::new()));\n // Create a new block to limit the scope of the dynamic borrow\n {\n let mut map: RefMut<_> = shared_map.borrow_mut();\n map.insert("africa", 92388);\n map.insert("kyoto", 11837);\n map.insert("piccadilly", 11826);\n map.insert("marbles", 38);\n }\n\n // Note that if we had not let the previous borrow of the cache fall out\n // of scope then the subsequent borrow would cause a dynamic thread panic.\n // This is the major hazard of using `RefCell`.\n let total: i32 = shared_map.borrow().values().sum();\n println!("{total}");\n}\n'})}),"\n",(0,o.jsx)(n.p,{children:"We allocate a hash map on the heap and then in the inner block, we borrow it as\na mutable reference, so that we can use it."}),"\n",(0,o.jsx)(n.admonition,{type:"note",children:(0,o.jsxs)(n.p,{children:["It is a very primitive example for ",(0,o.jsx)(n.code,{children:"Rc>"})," and mutable borrow."]})}),"\n",(0,o.jsxs)(n.p,{children:["If you uncomment the 4th line with ",(0,o.jsx)(n.code,{children:"use std::borrow::BorrowMut;"}),", you cannot\ncompile the code anymore, because of"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:" Compiling playground v0.0.1 (/playground)\nerror[E0308]: mismatched types\n --\x3e src/main.rs:10:34\n |\n10 | let mut map: RefMut<_> = shared_map.borrow_mut();\n | --------- ^^^^^^^^^^^^^^^^^^^^^^^ expected struct `RefMut`, found mutable reference\n | |\n | expected due to this\n |\n = note: expected struct `RefMut<'_, _>`\n found mutable reference `&mut Rc>>`\n\nerror[E0599]: no method named `insert` found for struct `RefMut<'_, _>` in the current scope\n --\x3e src/main.rs:11:13\n |\n11 | map.insert(\"africa\", 92388);\n | ^^^^^^ method not found in `RefMut<'_, _>`\n\nerror[E0599]: no method named `insert` found for struct `RefMut<'_, _>` in the current scope\n --\x3e src/main.rs:12:13\n |\n12 | map.insert(\"kyoto\", 11837);\n | ^^^^^^ method not found in `RefMut<'_, _>`\n\nerror[E0599]: no method named `insert` found for struct `RefMut<'_, _>` in the current scope\n --\x3e src/main.rs:13:13\n |\n13 | map.insert(\"piccadilly\", 11826);\n | ^^^^^^ method not found in `RefMut<'_, _>`\n\nerror[E0599]: no method named `insert` found for struct `RefMut<'_, _>` in the current scope\n --\x3e src/main.rs:14:13\n |\n14 | map.insert(\"marbles\", 38);\n | ^^^^^^ method not found in `RefMut<'_, _>`\n\nSome errors have detailed explanations: E0308, E0599.\nFor more information about an error, try `rustc --explain E0308`.\nerror: could not compile `playground` due to 5 previous errors\n"})}),"\n",(0,o.jsxs)(n.p,{children:["It might seem ",(0,o.jsx)(n.strong,{children:"a bit"})," ridiculous. However, I got to a point where the compiler\nsuggested ",(0,o.jsx)(n.code,{children:"use std::borrow::BorrowMut;"})," and it resulted in breaking parts of the\ncode that worked previously. I think it may be a good idea to go over what is\nhappening here."]}),"\n",(0,o.jsxs)(n.h5,{id:"borrow_mut-on-rcrefcellt",children:[(0,o.jsx)(n.code,{children:".borrow_mut()"})," on ",(0,o.jsx)(n.code,{children:"Rc>"})]}),"\n",(0,o.jsxs)(n.p,{children:["Let's consider a variable ",(0,o.jsx)(n.code,{children:"x"})," of type ",(0,o.jsx)(n.code,{children:"Rc>"}),". What happens when you\ncall ",(0,o.jsx)(n.code,{children:".borrow_mut()"})," on it? We can look at the ",(0,o.jsx)(n.code,{children:"Rc"})," type, and\u2026 hang on! There is\nneither ",(0,o.jsx)(n.code,{children:".borrow_mut()"})," method or ",(0,o.jsx)(n.code,{children:"BorrowMut"})," trait implemented. How can we do it\nthen?"]}),"\n",(0,o.jsxs)(n.p,{children:["Let's go further and we can see that ",(0,o.jsx)(n.code,{children:"RefCell"})," implements a ",(0,o.jsx)(n.code,{children:".borrow_mut()"}),"\nmethod. OK, but how can we call it on the ",(0,o.jsx)(n.code,{children:"Rc"}),"? Easily! ",(0,o.jsx)(n.code,{children:"Rc"})," implements\n",(0,o.jsx)(n.code,{children:"Deref"})," and therefore you can call methods on ",(0,o.jsx)(n.code,{children:"Rc"})," objects as if they were\n",(0,o.jsx)(n.code,{children:"T"})," objects. If we read on ",(0,o.jsxs)(n.em,{children:[(0,o.jsx)(n.code,{children:"Deref"})," coercion"]}),", we can see the following:"]}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:["If ",(0,o.jsx)(n.code,{children:"T"})," implements ",(0,o.jsx)(n.code,{children:"Deref"}),", \u2026:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"\u2026"}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"T"})," implicitly implements all the (immutable) methods of the type ",(0,o.jsx)(n.code,{children:"U"}),"."]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["What is the requirement for the ",(0,o.jsx)(n.code,{children:".borrow_mut()"})," on ",(0,o.jsx)(n.code,{children:"RefCell"}),"? Well, it needs\n",(0,o.jsx)(n.code,{children:"&self"}),", so the ",(0,o.jsx)(n.code,{children:"Deref"})," implements the ",(0,o.jsx)(n.code,{children:".borrow_mut()"})," for the ",(0,o.jsx)(n.code,{children:"Rc>"}),"."]}),"\n",(0,o.jsxs)(n.h5,{id:"borrowmut-trait",children:[(0,o.jsx)(n.code,{children:"BorrowMut"})," trait"]}),"\n",(0,o.jsxs)(n.p,{children:["I have not been able to find a lot on this trait. My guess is that it provides a\nmethod instead of a syntactic sugar (",(0,o.jsx)(n.code,{children:"&mut x"}),") for the mutable borrow. And also\nit provides default implementations for the types:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-rust",children:"impl BorrowMut for String\n\nimpl BorrowMut for &mut T\nwhere\n T: ?Sized,\n\nimpl BorrowMut for T\nwhere\n T: ?Sized,\n\nimpl BorrowMut<[T]> for Vec\nwhere\n A: Allocator,\n\nimpl BorrowMut for Box\nwhere\n A: Allocator,\n T: ?Sized,\n\nimpl BorrowMut<[T]> for [T; N]\n"})}),"\n",(0,o.jsx)(n.h5,{id:"conflict",children:"Conflict"}),"\n",(0,o.jsxs)(n.p,{children:["Now the question is why did it break the code\u2026 My first take was that the type\n",(0,o.jsx)(n.code,{children:"Rc>"})," has some ",(0,o.jsx)(n.em,{children:"specialized"})," implementation of the ",(0,o.jsx)(n.code,{children:".borrow_mut()"})," and\nthe ",(0,o.jsx)(n.code,{children:"use"})," overrides it with the default, which is true ",(0,o.jsx)(n.strong,{children:"in a sense"}),". However\nthere is no ",(0,o.jsx)(n.em,{children:"specialized"})," implementation. Let's have a look at the trait and the\ntype signature on the ",(0,o.jsx)(n.code,{children:"RefCell"}),":"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-rust",children:"// trait\npub trait BorrowMut: Borrow\nwhere\n Borrowed: ?Sized,\n{\n fn borrow_mut(&mut self) -> &mut Borrowed;\n}\n\n// \u2039RefCell.borrow_mut()\u203a type signature\npub fn borrow_mut(&self) -> RefMut<'_, T>\n"})}),"\n",(0,o.jsxs)(n.p,{children:["I think that we can definitely agree on the fact that ",(0,o.jsx)(n.code,{children:"RefMut<'_, T>"})," is not the\n",(0,o.jsx)(n.code,{children:"RefCell"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"In my opinion"}),", ",(0,o.jsx)(n.code,{children:"RefCell"})," implements a ",(0,o.jsx)(n.strong,{children:"separate"})," ",(0,o.jsx)(n.code,{children:".borrow_mut()"})," rather\nthan implementing the interface, because it ",(0,o.jsx)(n.strong,{children:"cannot"})," satisfy the type requirements\nof the trait."]}),"\n",(0,o.jsx)(n.admonition,{type:"caution",children:(0,o.jsxs)(n.p,{children:["I wonder how are we expected to deal with this conflict, if and when, we need\nboth the ",(0,o.jsx)(n.code,{children:".borrow_mut()"})," of the trait and ",(0,o.jsx)(n.code,{children:".borrow_mut()"})," of the ",(0,o.jsx)(n.code,{children:"RefCell"}),"."]})}),"\n",(0,o.jsxs)(n.admonition,{title:"Fun fact",type:"tip",children:[(0,o.jsxs)(n.p,{children:["I was suggested by the compiler to do ",(0,o.jsx)(n.code,{children:"use std::borrow::BorrowMut;"})," and break the\ncode."]}),(0,o.jsxs)(n.p,{children:["So much for the ",(0,o.jsx)(n.em,{children:"almighty"})," and ",(0,o.jsx)(n.em,{children:"helpful"})," compiler\u2026"]})]}),"\n",(0,o.jsx)(n.h2,{id:"day-21-monkey-math",children:(0,o.jsx)(n.a,{href:"https://adventofcode.com/2022/day/21",children:"Day 21: Monkey Math"})}),"\n",(0,o.jsx)(n.admonition,{title:"tl;dr",type:"info",children:(0,o.jsx)(n.p,{children:"Computing an expression tree and then also finding ideal value for a node."})}),"\n",(0,o.jsx)(n.h3,{id:"solution-6",children:"Solution"}),"\n",(0,o.jsx)(n.p,{children:"Relatively simple, until you get to the 2nd part where you start to practice\na lot of the copy-paste. I have managed to sneak some perverted stuff in there\nthough :) Let's go through the details."}),"\n",(0,o.jsxs)(n.h4,{id:"default-trait",children:[(0,o.jsx)(n.code,{children:"Default"})," trait"]}),"\n",(0,o.jsxs)(n.p,{children:["For the first time and twice I had a need to have a default value for my types,\nenumerations in this case. Rust offers a very nice trait",(0,o.jsx)(n.sup,{children:(0,o.jsx)(n.a,{href:"#user-content-fn-1-990909",id:"user-content-fnref-1-990909","data-footnote-ref":!0,"aria-describedby":"footnote-label",children:"1"})})," that is described\nas:"]}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsx)(n.p,{children:"A trait for giving a type a useful default value."}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["I guess it sums it up nicely. The more interesting part about this is the fact\nthat you can use the ",(0,o.jsx)(n.em,{children:"macro machinery"})," to save yourself some typing. If you have\nenumeration of which the default value doesn't bear any parameter, you can just\ndo",(0,o.jsx)(n.sup,{children:(0,o.jsx)(n.a,{href:"#user-content-fn-2-990909",id:"user-content-fnref-2-990909","data-footnote-ref":!0,"aria-describedby":"footnote-label",children:"2"})}),":"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-rust",children:"#[derive(Default)]\nenum Color {\n #[default]\n White,\n Gray,\n Black,\n}\n"})}),"\n",(0,o.jsx)(n.h4,{id:"abusing-negation",children:"Abusing negation"}),"\n",(0,o.jsxs)(n.p,{children:["If you want to use a ",(0,o.jsx)(n.em,{children:"unary minus"})," operator on your own type, you can implement\na ",(0,o.jsx)(n.code,{children:"Neg"})," trait",(0,o.jsx)(n.sup,{children:(0,o.jsx)(n.a,{href:"#user-content-fn-3-990909",id:"user-content-fnref-3-990909","data-footnote-ref":!0,"aria-describedby":"footnote-label",children:"3"})}),". I was dealing with a binary tree and needed a way how to look\nat the other side, so I have just implemented the negation for flipping between\nleft and right ","\ud83d\ude04"]}),"\n",(0,o.jsxs)(n.section,{"data-footnotes":!0,className:"footnotes",children:[(0,o.jsx)(n.h2,{className:"sr-only",id:"footnote-label",children:"Footnotes"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{id:"user-content-fn-1-990909",children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.a,{href:"https://doc.rust-lang.org/std/default/trait.Default.html",children:(0,o.jsx)(n.code,{children:"Default"})})," docs ",(0,o.jsx)(n.a,{href:"#user-content-fnref-1-990909","data-footnote-backref":"","aria-label":"Back to reference 1",className:"data-footnote-backref",children:"\u21a9"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{id:"user-content-fn-2-990909",children:["\n",(0,o.jsxs)(n.p,{children:["Pardon my example from the graph algorithms ;) ",(0,o.jsx)(n.a,{href:"#user-content-fnref-2-990909","data-footnote-backref":"","aria-label":"Back to reference 2",className:"data-footnote-backref",children:"\u21a9"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{id:"user-content-fn-3-990909",children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.a,{href:"https://doc.rust-lang.org/std/ops/trait.Neg.html",children:(0,o.jsx)(n.code,{children:"Neg"})})," docs ",(0,o.jsx)(n.a,{href:"#user-content-fnref-3-990909","data-footnote-backref":"","aria-label":"Back to reference 3",className:"data-footnote-backref",children:"\u21a9"})]}),"\n"]}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>a});var o=t(67294);const i={},r=o.createContext(i);function a(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/runtime~main.65095f6f.js b/assets/js/runtime~main.3f39a938.js similarity index 91% rename from assets/js/runtime~main.65095f6f.js rename to assets/js/runtime~main.3f39a938.js index ac0236b..cbd6c35 100644 --- a/assets/js/runtime~main.65095f6f.js +++ b/assets/js/runtime~main.3f39a938.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,c,f,d={},b={};function t(e){var a=b[e];if(void 0!==a)return a.exports;var c=b[e]={exports:{}};return d[e].call(c.exports,c,c.exports,t),c.exports}t.m=d,e=[],t.O=(a,c,f,d)=>{if(!c){var b=1/0;for(i=0;i=d)&&Object.keys(t.O).every((e=>t.O[e](c[o])))?c.splice(o--,1):(r=!1,d0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[c,f,d]},t.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return t.d(a,{a:a}),a},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,t.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var d=Object.create(null);t.r(d);var b={};a=a||[null,c({}),c([]),c(c)];for(var r=2&f&&e;"object"==typeof r&&!~a.indexOf(r);r=c(r))Object.getOwnPropertyNames(r).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,t.d(d,b),d},t.d=(e,a)=>{for(var c in a)t.o(a,c)&&!t.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},t.f={},t.e=e=>Promise.all(Object.keys(t.f).reduce(((a,c)=>(t.f[c](e,a),a)),[])),t.u=e=>"assets/js/"+({59:"b1288602",115:"30814625",146:"dff2ebad",281:"2ca64e35",354:"bc0c9d90",494:"1a606400",569:"ddc7679f",635:"c4c4056e",655:"9a3dc578",728:"686a7a89",822:"8c0e532b",866:"4200b1a9",1011:"377f3aa1",1050:"a7098721",1145:"947341b7",1171:"d7f7fb17",1235:"86cd1460",1378:"0220f5fc",1464:"97a42631",1475:"e1d2ae23",1492:"d4b1e057",1494:"16cbc838",1547:"1cd58e77",1648:"48b268a6",1851:"0fcbc6ca",1885:"84d1e0d8",1960:"e31003e9",2125:"06c4a8fc",2177:"3da4b779",2210:"9df0e937",2264:"962da50c",2433:"b5a32f14",2445:"decbf9d1",2482:"dd841e73",2545:"9b91a88c",2606:"08dfa3a2",2741:"d675395f",2997:"d8f4410e",3039:"765ea78b",3086:"cfa2b263",3089:"a6aa9e1f",3184:"7e6d325b",3220:"34ab65f4",3276:"6e3cbca1",3388:"29694455",3519:"4621632b",3561:"95b96bb9",3608:"9e4087bc",3618:"a6a48ea2",3707:"24fecc0a",3713:"698e2076",3731:"087808f1",3734:"0123bc76",3751:"3720c009",3803:"794ef108",3887:"933b95b3",3979:"2af5d0a7",4013:"01a85c17",4064:"f48be158",4195:"c4f5d8e4",4256:"75cccf44",4269:"0bfe45d5",4327:"4e546705",4343:"df0885f0",4368:"a94703ab",4382:"a4c10cf4",4394:"51624505",4562:"976c4f3b",4637:"19d7c045",4638:"2fcf0558",5169:"d79dd549",5287:"6bc697d0",5376:"1535ede8",5430:"52f2a5bf",5521:"9287eafd",5634:"595c7293",5658:"af8b72a7",5701:"3adcbc3a",5775:"8e6bb954",5824:"a80747a0",5934:"f75910c4",5975:"4edd2021",6064:"7ce7faac",6097:"b0291f37",6103:"ccc49370",6179:"d57b4369",6292:"d255bd7f",6306:"4f96b16e",6327:"fb4361d3",6342:"2b89902a",6435:"28d80ff8",6519:"bc2d22bc",6544:"d05e838c",6573:"c580b66a",6864:"bb984793",6890:"22a175ec",7084:"45c9e308",7257:"aa24fd5d",7292:"493c0536",7438:"b8cbf382",7568:"0608d96f",7728:"8a25f659",7743:"df078f58",7755:"ab2721d4",7918:"17896441",7920:"1a4e3797",7926:"3011a4c0",8058:"520f8175",8091:"bb882650",8236:"3d92ba6e",8289:"a2ba8888",8326:"15966941",8387:"eba2374c",8472:"ff82dde7",8480:"8b1802c5",8518:"a7bd4aaa",8520:"62d847b3",8529:"1acf65cc",8610:"6875c492",8643:"ff472cd9",8757:"e89da83e",8786:"a082abd3",8807:"dead8108",8908:"d309b5b1",9066:"8d31a880",9173:"5ca803d2",9179:"b9f7f5c4",9197:"b25fbc58",9228:"66d5ef6c",9249:"70a4540f",9300:"146d9b84",9385:"95f41f0b",9414:"354a7b72",9579:"5c15401e",9661:"5e95c892",9679:"b45dccf0",9731:"7052c0bc",9771:"534d4833",9817:"14eb3368",9898:"0178f9ad",9924:"df203c0f"}[e]||e)+"."+{59:"2a7bb9cd",109:"192a1082",115:"1cb0ad07",130:"b07e32e5",132:"6eeb92f1",146:"2596a554",240:"962c2c3a",281:"e4c24d50",354:"22532279",494:"9499d809",569:"4b5bdacd",635:"3de7285f",655:"07cb1f6c",728:"ebbeda14",822:"8df94607",866:"faadd2c9",1011:"4ebbc06f",1050:"33f429e4",1145:"06e92a4d",1171:"3796c0b9",1235:"f549d2c3",1325:"f9a9e4dd",1378:"6bd42e59",1426:"b2a3e78b",1464:"7eff63e9",1475:"2bc6580d",1492:"c26d5bb6",1494:"eafc393a",1504:"972c6306",1547:"4b0ee92c",1644:"e1df3952",1648:"56c72f30",1763:"dd6ac9f1",1772:"e7125761",1851:"73a3a140",1885:"e078634a",1960:"e9396e0a",2125:"18eb9afc",2177:"1354e52a",2183:"695e6dce",2210:"2c53d1aa",2264:"ea10811e",2433:"68cedca8",2445:"369aa5a6",2482:"c1ec5d72",2545:"5685ebf2",2606:"0462ec4c",2661:"adb036a5",2693:"86767de9",2696:"9c4ce6ae",2700:"eb54ab23",2741:"1f389aac",2997:"e8838bb3",3039:"29a37caf",3076:"0d102429",3086:"efd5103c",3089:"305accbe",3184:"0dc3275f",3220:"5fa3179c",3276:"5d0620d6",3343:"c68ed9e0",3388:"5fa079ce",3519:"bd86e6e4",3561:"f1e9070e",3608:"c1ded62d",3618:"7749d78c",3619:"169a66d1",3707:"0d18355b",3713:"0fda5cee",3731:"0a5fb140",3734:"d7742152",3751:"9d2dcf9d",3803:"5b256546",3887:"6eeb49bf",3979:"928c2eb4",4013:"9b387ded",4064:"5e2dd98c",4195:"b182cb1f",4238:"732f7e6d",4256:"b0cfb80e",4269:"143f3da4",4327:"40303d4d",4343:"2970a5ee",4368:"efd630be",4382:"e91bee7a",4394:"60fbe3b9",4562:"cfe53f32",4637:"fd298b3d",4638:"a6f753b6",4706:"bf286a6c",5169:"0ed0fe01",5269:"a9818fb6",5287:"410760a1",5326:"480380dd",5376:"102142f5",5430:"839d7f40",5521:"7613dea7",5634:"6c273bef",5658:"37a3aa6c",5701:"481c535c",5775:"4d6706b7",5790:"a9566ed9",5824:"b21945df",5934:"750e8d79",5943:"ebdacf10",5975:"ba1a6e92",6064:"fd0f7c12",6097:"5b91d377",6103:"78004ce5",6179:"6f772ce2",6255:"4bb462ce",6292:"da5efa5d",6306:"072f92b8",6327:"b6ca83b5",6342:"5cec8345",6435:"b8c94f5a",6519:"974fe1a5",6544:"3caaf7e6",6573:"aa8d7117",6648:"7d3c04e0",6864:"22b3e630",6890:"504e3826",6945:"1665fd21",6985:"b22ddd47",7084:"57b8321c",7257:"e4465696",7292:"6ae62548",7438:"e3b79fad",7568:"a18c3650",7728:"6cbfa670",7743:"4f109cb4",7755:"6fad72ba",7918:"2ef23eb3",7920:"3807d38b",7926:"bfa0084e",7936:"da5208cb",8016:"f7e4e334",8058:"d9b4c84f",8091:"6eee4002",8236:"e64b02a7",8289:"ab09cb54",8326:"58ddb6d9",8387:"dcc463b2",8472:"c32d56e5",8480:"408315a3",8518:"69e4c2b5",8520:"ea246a7d",8529:"33171995",8610:"5be02386",8643:"a09aa523",8757:"1856d5b6",8786:"6458a62f",8807:"9d966504",8894:"bbb1746a",8908:"924b0302",8955:"88257d8a",9066:"e6f69b2d",9138:"e5753066",9173:"986e22d4",9179:"8dd00486",9197:"90e65bfc",9228:"fc107ca5",9249:"312c2807",9300:"bdf83d64",9385:"b012cd5f",9414:"becd0640",9579:"e4b1c753",9661:"8ef24486",9679:"7ab0cc2a",9731:"54d577f1",9771:"162e2ecd",9817:"1936981e",9893:"04fdeb2a",9898:"568886e5",9924:"a5b6acbb"}[e]+".js",t.miniCssF=e=>{},t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),t.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),f={},t.l=(e,a,c,d)=>{if(f[e])f[e].push(a);else{var b,r;if(void 0!==c)for(var o=document.getElementsByTagName("script"),n=0;n{b.onerror=b.onload=null,clearTimeout(l);var d=f[e];if(delete f[e],b.parentNode&&b.parentNode.removeChild(b),d&&d.forEach((e=>e(c))),a)return a(c)},l=setTimeout(u.bind(null,void 0,{type:"timeout",target:b}),12e4);b.onerror=u.bind(null,b.onerror),b.onload=u.bind(null,b.onload),r&&document.head.appendChild(b)}},t.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.p="/",t.gca=function(e){return e={15966941:"8326",17896441:"7918",29694455:"3388",30814625:"115",51624505:"4394",b1288602:"59",dff2ebad:"146","2ca64e35":"281",bc0c9d90:"354","1a606400":"494",ddc7679f:"569",c4c4056e:"635","9a3dc578":"655","686a7a89":"728","8c0e532b":"822","4200b1a9":"866","377f3aa1":"1011",a7098721:"1050","947341b7":"1145",d7f7fb17:"1171","86cd1460":"1235","0220f5fc":"1378","97a42631":"1464",e1d2ae23:"1475",d4b1e057:"1492","16cbc838":"1494","1cd58e77":"1547","48b268a6":"1648","0fcbc6ca":"1851","84d1e0d8":"1885",e31003e9:"1960","06c4a8fc":"2125","3da4b779":"2177","9df0e937":"2210","962da50c":"2264",b5a32f14:"2433",decbf9d1:"2445",dd841e73:"2482","9b91a88c":"2545","08dfa3a2":"2606",d675395f:"2741",d8f4410e:"2997","765ea78b":"3039",cfa2b263:"3086",a6aa9e1f:"3089","7e6d325b":"3184","34ab65f4":"3220","6e3cbca1":"3276","4621632b":"3519","95b96bb9":"3561","9e4087bc":"3608",a6a48ea2:"3618","24fecc0a":"3707","698e2076":"3713","087808f1":"3731","0123bc76":"3734","3720c009":"3751","794ef108":"3803","933b95b3":"3887","2af5d0a7":"3979","01a85c17":"4013",f48be158:"4064",c4f5d8e4:"4195","75cccf44":"4256","0bfe45d5":"4269","4e546705":"4327",df0885f0:"4343",a94703ab:"4368",a4c10cf4:"4382","976c4f3b":"4562","19d7c045":"4637","2fcf0558":"4638",d79dd549:"5169","6bc697d0":"5287","1535ede8":"5376","52f2a5bf":"5430","9287eafd":"5521","595c7293":"5634",af8b72a7:"5658","3adcbc3a":"5701","8e6bb954":"5775",a80747a0:"5824",f75910c4:"5934","4edd2021":"5975","7ce7faac":"6064",b0291f37:"6097",ccc49370:"6103",d57b4369:"6179",d255bd7f:"6292","4f96b16e":"6306",fb4361d3:"6327","2b89902a":"6342","28d80ff8":"6435",bc2d22bc:"6519",d05e838c:"6544",c580b66a:"6573",bb984793:"6864","22a175ec":"6890","45c9e308":"7084",aa24fd5d:"7257","493c0536":"7292",b8cbf382:"7438","0608d96f":"7568","8a25f659":"7728",df078f58:"7743",ab2721d4:"7755","1a4e3797":"7920","3011a4c0":"7926","520f8175":"8058",bb882650:"8091","3d92ba6e":"8236",a2ba8888:"8289",eba2374c:"8387",ff82dde7:"8472","8b1802c5":"8480",a7bd4aaa:"8518","62d847b3":"8520","1acf65cc":"8529","6875c492":"8610",ff472cd9:"8643",e89da83e:"8757",a082abd3:"8786",dead8108:"8807",d309b5b1:"8908","8d31a880":"9066","5ca803d2":"9173",b9f7f5c4:"9179",b25fbc58:"9197","66d5ef6c":"9228","70a4540f":"9249","146d9b84":"9300","95f41f0b":"9385","354a7b72":"9414","5c15401e":"9579","5e95c892":"9661",b45dccf0:"9679","7052c0bc":"9731","534d4833":"9771","14eb3368":"9817","0178f9ad":"9898",df203c0f:"9924"}[e]||e,t.p+t.u(e)},(()=>{var e={1303:0,532:0};t.f.j=(a,c)=>{var f=t.o(e,a)?e[a]:void 0;if(0!==f)if(f)c.push(f[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var d=new Promise(((c,d)=>f=e[a]=[c,d]));c.push(f[2]=d);var b=t.p+t.u(a),r=new Error;t.l(b,(c=>{if(t.o(e,a)&&(0!==(f=e[a])&&(e[a]=void 0),f)){var d=c&&("load"===c.type?"missing":c.type),b=c&&c.target&&c.target.src;r.message="Loading chunk "+a+" failed.\n("+d+": "+b+")",r.name="ChunkLoadError",r.type=d,r.request=b,f[1](r)}}),"chunk-"+a,a)}},t.O.j=a=>0===e[a];var a=(a,c)=>{var f,d,b=c[0],r=c[1],o=c[2],n=0;if(b.some((a=>0!==e[a]))){for(f in r)t.o(r,f)&&(t.m[f]=r[f]);if(o)var i=o(t)}for(a&&a(c);n{"use strict";var e,a,c,f,d={},b={};function t(e){var a=b[e];if(void 0!==a)return a.exports;var c=b[e]={exports:{}};return d[e].call(c.exports,c,c.exports,t),c.exports}t.m=d,e=[],t.O=(a,c,f,d)=>{if(!c){var b=1/0;for(i=0;i=d)&&Object.keys(t.O).every((e=>t.O[e](c[o])))?c.splice(o--,1):(r=!1,d0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[c,f,d]},t.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return t.d(a,{a:a}),a},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,t.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var d=Object.create(null);t.r(d);var b={};a=a||[null,c({}),c([]),c(c)];for(var r=2&f&&e;"object"==typeof r&&!~a.indexOf(r);r=c(r))Object.getOwnPropertyNames(r).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,t.d(d,b),d},t.d=(e,a)=>{for(var c in a)t.o(a,c)&&!t.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},t.f={},t.e=e=>Promise.all(Object.keys(t.f).reduce(((a,c)=>(t.f[c](e,a),a)),[])),t.u=e=>"assets/js/"+({59:"b1288602",115:"30814625",146:"dff2ebad",281:"2ca64e35",354:"bc0c9d90",494:"1a606400",569:"ddc7679f",635:"c4c4056e",655:"9a3dc578",728:"686a7a89",822:"8c0e532b",866:"4200b1a9",1011:"377f3aa1",1050:"a7098721",1145:"947341b7",1171:"d7f7fb17",1235:"86cd1460",1378:"0220f5fc",1464:"97a42631",1475:"e1d2ae23",1492:"d4b1e057",1494:"16cbc838",1547:"1cd58e77",1648:"48b268a6",1851:"0fcbc6ca",1885:"84d1e0d8",1960:"e31003e9",2125:"06c4a8fc",2177:"3da4b779",2210:"9df0e937",2264:"962da50c",2433:"b5a32f14",2445:"decbf9d1",2482:"dd841e73",2545:"9b91a88c",2606:"08dfa3a2",2741:"d675395f",2997:"d8f4410e",3039:"765ea78b",3086:"cfa2b263",3089:"a6aa9e1f",3184:"7e6d325b",3220:"34ab65f4",3276:"6e3cbca1",3388:"29694455",3519:"4621632b",3561:"95b96bb9",3608:"9e4087bc",3618:"a6a48ea2",3707:"24fecc0a",3713:"698e2076",3731:"087808f1",3734:"0123bc76",3751:"3720c009",3803:"794ef108",3887:"933b95b3",3979:"2af5d0a7",4013:"01a85c17",4064:"f48be158",4195:"c4f5d8e4",4256:"75cccf44",4269:"0bfe45d5",4327:"4e546705",4343:"df0885f0",4368:"a94703ab",4382:"a4c10cf4",4394:"51624505",4562:"976c4f3b",4637:"19d7c045",4638:"2fcf0558",5169:"d79dd549",5287:"6bc697d0",5376:"1535ede8",5430:"52f2a5bf",5521:"9287eafd",5634:"595c7293",5658:"af8b72a7",5701:"3adcbc3a",5775:"8e6bb954",5824:"a80747a0",5934:"f75910c4",5975:"4edd2021",6064:"7ce7faac",6097:"b0291f37",6103:"ccc49370",6179:"d57b4369",6292:"d255bd7f",6306:"4f96b16e",6327:"fb4361d3",6342:"2b89902a",6435:"28d80ff8",6519:"bc2d22bc",6544:"d05e838c",6573:"c580b66a",6864:"bb984793",6890:"22a175ec",7084:"45c9e308",7257:"aa24fd5d",7292:"493c0536",7438:"b8cbf382",7568:"0608d96f",7728:"8a25f659",7743:"df078f58",7755:"ab2721d4",7918:"17896441",7920:"1a4e3797",7926:"3011a4c0",8058:"520f8175",8091:"bb882650",8236:"3d92ba6e",8289:"a2ba8888",8326:"15966941",8387:"eba2374c",8472:"ff82dde7",8480:"8b1802c5",8518:"a7bd4aaa",8520:"62d847b3",8529:"1acf65cc",8610:"6875c492",8643:"ff472cd9",8757:"e89da83e",8786:"a082abd3",8807:"dead8108",8908:"d309b5b1",9066:"8d31a880",9173:"5ca803d2",9179:"b9f7f5c4",9197:"b25fbc58",9228:"66d5ef6c",9249:"70a4540f",9300:"146d9b84",9385:"95f41f0b",9414:"354a7b72",9579:"5c15401e",9661:"5e95c892",9679:"b45dccf0",9731:"7052c0bc",9771:"534d4833",9817:"14eb3368",9898:"0178f9ad",9924:"df203c0f"}[e]||e)+"."+{59:"fa264713",109:"192a1082",115:"1cb0ad07",130:"b07e32e5",132:"6eeb92f1",146:"26aca592",240:"962c2c3a",281:"e4c24d50",354:"22532279",494:"9499d809",569:"4b5bdacd",635:"a7e01235",655:"07cb1f6c",728:"ebbeda14",822:"8df94607",866:"d764baec",1011:"728ad61c",1050:"33f429e4",1145:"06e92a4d",1171:"3796c0b9",1235:"f549d2c3",1325:"f9a9e4dd",1378:"6bd42e59",1426:"b2a3e78b",1464:"7eff63e9",1475:"2bc6580d",1492:"c26d5bb6",1494:"eafc393a",1504:"972c6306",1547:"4b0ee92c",1644:"e1df3952",1648:"56c72f30",1763:"dd6ac9f1",1772:"e7125761",1851:"73a3a140",1885:"f2e0ffd7",1960:"e9396e0a",2125:"18eb9afc",2177:"0020fbfc",2183:"695e6dce",2210:"2c53d1aa",2264:"ea10811e",2433:"68cedca8",2445:"369aa5a6",2482:"c1ec5d72",2545:"5685ebf2",2606:"0462ec4c",2661:"adb036a5",2693:"86767de9",2696:"9c4ce6ae",2700:"eb54ab23",2741:"1f389aac",2997:"e8838bb3",3039:"29a37caf",3076:"0d102429",3086:"ce80265a",3089:"305accbe",3184:"0dc3275f",3220:"5fa3179c",3276:"5d0620d6",3343:"c68ed9e0",3388:"5fa079ce",3519:"bd86e6e4",3561:"f1e9070e",3608:"c1ded62d",3618:"7749d78c",3619:"169a66d1",3707:"0d18355b",3713:"0fda5cee",3731:"0a5fb140",3734:"d7742152",3751:"9d2dcf9d",3803:"b36337bc",3887:"6eeb49bf",3979:"928c2eb4",4013:"9b387ded",4064:"3578ba3c",4195:"b182cb1f",4238:"732f7e6d",4256:"b0cfb80e",4269:"143f3da4",4327:"40303d4d",4343:"2970a5ee",4368:"efd630be",4382:"e91bee7a",4394:"60fbe3b9",4562:"cfe53f32",4637:"fd298b3d",4638:"a6f753b6",4706:"bf286a6c",5169:"0ed0fe01",5269:"a9818fb6",5287:"410760a1",5326:"480380dd",5376:"3c894b1e",5430:"839d7f40",5521:"7613dea7",5634:"6ef41b13",5658:"37a3aa6c",5701:"481c535c",5775:"4d6706b7",5790:"a9566ed9",5824:"b21945df",5934:"750e8d79",5943:"ebdacf10",5975:"ba1a6e92",6064:"fd0f7c12",6097:"5b91d377",6103:"78004ce5",6179:"6f772ce2",6255:"4bb462ce",6292:"da5efa5d",6306:"072f92b8",6327:"b6ca83b5",6342:"5cec8345",6435:"b8c94f5a",6519:"974fe1a5",6544:"c79b079a",6573:"aa8d7117",6648:"7d3c04e0",6864:"22b3e630",6890:"92356088",6945:"1665fd21",6985:"b22ddd47",7084:"57b8321c",7257:"e4465696",7292:"6ae62548",7438:"e3b79fad",7568:"a18c3650",7728:"6cbfa670",7743:"4f109cb4",7755:"6fad72ba",7918:"2ef23eb3",7920:"3807d38b",7926:"bfa0084e",7936:"da5208cb",8016:"f7e4e334",8058:"d9b4c84f",8091:"925fdbba",8236:"e64b02a7",8289:"ab09cb54",8326:"58ddb6d9",8387:"dcc463b2",8472:"c32d56e5",8480:"408315a3",8518:"69e4c2b5",8520:"ea246a7d",8529:"33171995",8610:"5be02386",8643:"a09aa523",8757:"1856d5b6",8786:"6458a62f",8807:"9d966504",8894:"bbb1746a",8908:"924b0302",8955:"88257d8a",9066:"e6f69b2d",9138:"e5753066",9173:"986e22d4",9179:"8dd00486",9197:"90e65bfc",9228:"fc107ca5",9249:"312c2807",9300:"bdf83d64",9385:"b012cd5f",9414:"becd0640",9579:"e4b1c753",9661:"8ef24486",9679:"7ab0cc2a",9731:"acb5879a",9771:"162e2ecd",9817:"1936981e",9893:"04fdeb2a",9898:"568886e5",9924:"a5b6acbb"}[e]+".js",t.miniCssF=e=>{},t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),t.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),f={},t.l=(e,a,c,d)=>{if(f[e])f[e].push(a);else{var b,r;if(void 0!==c)for(var o=document.getElementsByTagName("script"),n=0;n{b.onerror=b.onload=null,clearTimeout(l);var d=f[e];if(delete f[e],b.parentNode&&b.parentNode.removeChild(b),d&&d.forEach((e=>e(c))),a)return a(c)},l=setTimeout(u.bind(null,void 0,{type:"timeout",target:b}),12e4);b.onerror=u.bind(null,b.onerror),b.onload=u.bind(null,b.onload),r&&document.head.appendChild(b)}},t.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.p="/",t.gca=function(e){return e={15966941:"8326",17896441:"7918",29694455:"3388",30814625:"115",51624505:"4394",b1288602:"59",dff2ebad:"146","2ca64e35":"281",bc0c9d90:"354","1a606400":"494",ddc7679f:"569",c4c4056e:"635","9a3dc578":"655","686a7a89":"728","8c0e532b":"822","4200b1a9":"866","377f3aa1":"1011",a7098721:"1050","947341b7":"1145",d7f7fb17:"1171","86cd1460":"1235","0220f5fc":"1378","97a42631":"1464",e1d2ae23:"1475",d4b1e057:"1492","16cbc838":"1494","1cd58e77":"1547","48b268a6":"1648","0fcbc6ca":"1851","84d1e0d8":"1885",e31003e9:"1960","06c4a8fc":"2125","3da4b779":"2177","9df0e937":"2210","962da50c":"2264",b5a32f14:"2433",decbf9d1:"2445",dd841e73:"2482","9b91a88c":"2545","08dfa3a2":"2606",d675395f:"2741",d8f4410e:"2997","765ea78b":"3039",cfa2b263:"3086",a6aa9e1f:"3089","7e6d325b":"3184","34ab65f4":"3220","6e3cbca1":"3276","4621632b":"3519","95b96bb9":"3561","9e4087bc":"3608",a6a48ea2:"3618","24fecc0a":"3707","698e2076":"3713","087808f1":"3731","0123bc76":"3734","3720c009":"3751","794ef108":"3803","933b95b3":"3887","2af5d0a7":"3979","01a85c17":"4013",f48be158:"4064",c4f5d8e4:"4195","75cccf44":"4256","0bfe45d5":"4269","4e546705":"4327",df0885f0:"4343",a94703ab:"4368",a4c10cf4:"4382","976c4f3b":"4562","19d7c045":"4637","2fcf0558":"4638",d79dd549:"5169","6bc697d0":"5287","1535ede8":"5376","52f2a5bf":"5430","9287eafd":"5521","595c7293":"5634",af8b72a7:"5658","3adcbc3a":"5701","8e6bb954":"5775",a80747a0:"5824",f75910c4:"5934","4edd2021":"5975","7ce7faac":"6064",b0291f37:"6097",ccc49370:"6103",d57b4369:"6179",d255bd7f:"6292","4f96b16e":"6306",fb4361d3:"6327","2b89902a":"6342","28d80ff8":"6435",bc2d22bc:"6519",d05e838c:"6544",c580b66a:"6573",bb984793:"6864","22a175ec":"6890","45c9e308":"7084",aa24fd5d:"7257","493c0536":"7292",b8cbf382:"7438","0608d96f":"7568","8a25f659":"7728",df078f58:"7743",ab2721d4:"7755","1a4e3797":"7920","3011a4c0":"7926","520f8175":"8058",bb882650:"8091","3d92ba6e":"8236",a2ba8888:"8289",eba2374c:"8387",ff82dde7:"8472","8b1802c5":"8480",a7bd4aaa:"8518","62d847b3":"8520","1acf65cc":"8529","6875c492":"8610",ff472cd9:"8643",e89da83e:"8757",a082abd3:"8786",dead8108:"8807",d309b5b1:"8908","8d31a880":"9066","5ca803d2":"9173",b9f7f5c4:"9179",b25fbc58:"9197","66d5ef6c":"9228","70a4540f":"9249","146d9b84":"9300","95f41f0b":"9385","354a7b72":"9414","5c15401e":"9579","5e95c892":"9661",b45dccf0:"9679","7052c0bc":"9731","534d4833":"9771","14eb3368":"9817","0178f9ad":"9898",df203c0f:"9924"}[e]||e,t.p+t.u(e)},(()=>{var e={1303:0,532:0};t.f.j=(a,c)=>{var f=t.o(e,a)?e[a]:void 0;if(0!==f)if(f)c.push(f[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var d=new Promise(((c,d)=>f=e[a]=[c,d]));c.push(f[2]=d);var b=t.p+t.u(a),r=new Error;t.l(b,(c=>{if(t.o(e,a)&&(0!==(f=e[a])&&(e[a]=void 0),f)){var d=c&&("load"===c.type?"missing":c.type),b=c&&c.target&&c.target.src;r.message="Loading chunk "+a+" failed.\n("+d+": "+b+")",r.name="ChunkLoadError",r.type=d,r.request=b,f[1](r)}}),"chunk-"+a,a)}},t.O.j=a=>0===e[a];var a=(a,c)=>{var f,d,b=c[0],r=c[1],o=c[2],n=0;if(b.some((a=>0!==e[a]))){for(f in r)t.o(r,f)&&(t.m[f]=r[f]);if(o)var i=o(t)}for(a&&a(c);n - + diff --git a/blog/aoc-2022/1st-week/index.html b/blog/aoc-2022/1st-week/index.html index 9678549..4655e3e 100644 --- a/blog/aoc-2022/1st-week/index.html +++ b/blog/aoc-2022/1st-week/index.html @@ -14,7 +14,7 @@ - + @@ -118,7 +118,7 @@ Find how many overlap and can take the day off.

Day 5: Supply Stacks

tl;dr

Let's play with stacks of crates.

Very easy problem with very annoying input. You can judge yourself:

-
    [D]    
[N] [C]
[Z] [M] [P]
1 2 3

move 1 from 2 to 1
move 3 from 1 to 3
move 2 from 2 to 1
move 1 from 1 to 2
+
    [D]
[N] [C]
[Z] [M] [P]
1 2 3

move 1 from 2 to 1
move 3 from 1 to 3
move 2 from 2 to 1
move 1 from 1 to 2

Good luck transforming that into something reasonable :)

Fun fact

Took me 40 minutes to parse this reasonably, including fighting the compiler.

Solution

diff --git a/blog/aoc-2022/2nd-week/index.html b/blog/aoc-2022/2nd-week/index.html index 95ac7d0..a870488 100644 --- a/blog/aoc-2022/2nd-week/index.html +++ b/blog/aoc-2022/2nd-week/index.html @@ -14,7 +14,7 @@ - + @@ -302,7 +302,7 @@ right? Yes… but actually no 😦

the fun part consists of the fact that in other place, where we were using it, we were passing the &[Vec<T>], but this is coming from a helper functions that take &Vec<Vec<T>> instead. And… we don't implement Index and IndexMut for -those. Just for the slices. 🤯 What are we going to do about it?

+those. Just for the slices. 🤯 What are we going to do about it?

We can either start copy-pasting or be smarter about it… I choose to be smarter, so let's implement a macro! The only difference across the implementations are the types of the outer containers. Implementation doesn't differ at all!

diff --git a/blog/aoc-2022/3rd-week/index.html b/blog/aoc-2022/3rd-week/index.html index dda6385..05fee4d 100644 --- a/blog/aoc-2022/3rd-week/index.html +++ b/blog/aoc-2022/3rd-week/index.html @@ -14,7 +14,7 @@ - + diff --git a/blog/aoc-2022/4th-week/index.html b/blog/aoc-2022/4th-week/index.html index a01ec5a..768fa82 100644 --- a/blog/aoc-2022/4th-week/index.html +++ b/blog/aoc-2022/4th-week/index.html @@ -14,7 +14,7 @@ - + @@ -230,7 +230,7 @@ everything:

You can also see that it simplifies the meaning a bit and it is more explicit than the previous versions.

And for the tests:

-
     #[test]
fn test_from() {
- for (n, s) in EXAMPLES.iter() {
- assert_eq!(from_snafu(s), *n);
+ for (&n, s) in EXAMPLES.iter() {
+ assert_eq!(s.parse::<SNAFU>().unwrap().value, n);
}
}

#[test]
fn test_to() {
- for (n, s) in EXAMPLES.iter() {
- assert_eq!(to_snafu(*n), s.to_string());
+ for (&n, s) in EXAMPLES.iter() {
+ assert_eq!(SNAFU::from(n).to_string(), s.to_string());
}
+
     #[test]
fn test_from() {
- for (n, s) in EXAMPLES.iter() {
- assert_eq!(from_snafu(s), *n);
+ for (&n, s) in EXAMPLES.iter() {
+ assert_eq!(s.parse::<SNAFU>().unwrap().value, n);
}
}

#[test]
fn test_to() {
- for (n, s) in EXAMPLES.iter() {
- assert_eq!(to_snafu(*n), s.to_string());
+ for (&n, s) in EXAMPLES.iter() {
+ assert_eq!(SNAFU::from(n).to_string(), s.to_string());
}

Summary

Let's wrap the whole thing up! Keeping in mind both AoC and the Rust…

Finished advent calendar :smile:

diff --git a/blog/aoc-2022/intro/index.html b/blog/aoc-2022/intro/index.html index 4b1a685..4e49fd2 100644 --- a/blog/aoc-2022/intro/index.html +++ b/blog/aoc-2022/intro/index.html @@ -14,7 +14,7 @@ - + diff --git a/blog/archive/index.html b/blog/archive/index.html index d7eaeb9..64345a7 100644 --- a/blog/archive/index.html +++ b/blog/archive/index.html @@ -14,7 +14,7 @@ - + diff --git a/blog/atom.xml b/blog/atom.xml index 3c265e6..448644b 100644 --- a/blog/atom.xml +++ b/blog/atom.xml @@ -317,7 +317,7 @@ everything:

You can also see that it simplifies the meaning a bit and it is more explicit than the previous versions.

And for the tests:

-
     #[test]
fn test_from() {
- for (n, s) in EXAMPLES.iter() {
- assert_eq!(from_snafu(s), *n);
+ for (&n, s) in EXAMPLES.iter() {
+ assert_eq!(s.parse::<SNAFU>().unwrap().value, n);
}
}

#[test]
fn test_to() {
- for (n, s) in EXAMPLES.iter() {
- assert_eq!(to_snafu(*n), s.to_string());
+ for (&n, s) in EXAMPLES.iter() {
+ assert_eq!(SNAFU::from(n).to_string(), s.to_string());
}
+
     #[test]
fn test_from() {
- for (n, s) in EXAMPLES.iter() {
- assert_eq!(from_snafu(s), *n);
+ for (&n, s) in EXAMPLES.iter() {
+ assert_eq!(s.parse::<SNAFU>().unwrap().value, n);
}
}

#[test]
fn test_to() {
- for (n, s) in EXAMPLES.iter() {
- assert_eq!(to_snafu(*n), s.to_string());
+ for (&n, s) in EXAMPLES.iter() {
+ assert_eq!(SNAFU::from(n).to_string(), s.to_string());
}

Summary

Let's wrap the whole thing up! Keeping in mind both AoC and the Rust…

Finished advent calendar :smile:

@@ -591,7 +591,7 @@ order and return the resulting matrix.

Image describing the problem

Skeleton and initial adjustments

We are given the following skeleton for the C++ and the given challenge:

-
class Solution {
public:
vector<vector<int>> diagonalSort(vector<vector<int>>& mat) {

}
};
+
class Solution {
public:
vector<vector<int>> diagonalSort(vector<vector<int>>& mat) {

}
};

The task is to sort the passed matrix diagonally and then return it. First of all, I don't like to solve this in a web browser, so we'll need to adjust it accordingly for running it locally. We'll start by including the vector header and using @@ -1078,7 +1078,7 @@ right? Yes… but actually no 😦

the fun part consists of the fact that in other place, where we were using it, we were passing the &[Vec<T>], but this is coming from a helper functions that take &Vec<Vec<T>> instead. And… we don't implement Index and IndexMut for -those. Just for the slices. 🤯 What are we going to do about it?

+those. Just for the slices. 🤯 What are we going to do about it?

We can either start copy-pasting or be smarter about it… I choose to be smarter, so let's implement a macro! The only difference across the implementations are the types of the outer containers. Implementation doesn't differ at all!

@@ -1217,7 +1217,7 @@ Find how many overlap and can take the day off.

Day 5: Supply Stacks

tl;dr

Let's play with stacks of crates.

Very easy problem with very annoying input. You can judge yourself:

-
    [D]    
[N] [C]
[Z] [M] [P]
1 2 3

move 1 from 2 to 1
move 3 from 1 to 3
move 2 from 2 to 1
move 1 from 1 to 2
+
    [D]
[N] [C]
[Z] [M] [P]
1 2 3

move 1 from 2 to 1
move 3 from 1 to 3
move 2 from 2 to 1
move 1 from 1 to 2

Good luck transforming that into something reasonable :)

Fun fact

Took me 40 minutes to parse this reasonably, including fighting the compiler.

Solution

diff --git a/blog/feed.json b/blog/feed.json index 34380cc..22db6f5 100644 --- a/blog/feed.json +++ b/blog/feed.json @@ -25,7 +25,7 @@ }, { "id": "https://blog.mfocko.xyz/blog/aoc-2022/4th-week", - "content_html": "

Let's go through the fourth week of Advent of Code in Rust.

\n

Day 22: Monkey Map

\n
tl;dr

Simulating a movement on a 2D map with given instructions. Map becomes a cube in\nthe 2nd part…

\n
Rant

This was the most obnoxious problem of this year… and a lot of Rust issues have\nbeen hit.

\n

Solution

\n

It seems like a very simple problem to solve, but with very obnoxious changes in\nthe 2nd part and also it's relatively hard to decompose »properly«.

\n

Column iterator

\n

In the first part of the problem it was needed to know the boundaries of each\nrow and column, since I stored them in Vec<Vec<char>> and padded with spaces\nto ensure I have a rectangular 2D “array”. However when you wanted to go through\neach row and column to determine the boundaries, it was very easy to do for the\nrows (cause each row is a Vec element), but not for the columns, since they\nspan multiple rows.

\n

For this use case I have implemented my own column iterator:

\n
pub struct ColumnIterator<'a, T> {
map: &'a [Vec<T>],
column: usize,

i: usize,
}

impl<'a, T> ColumnIterator<'a, T> {
pub fn new(map: &'a [Vec<T>], column: usize) -> ColumnIterator<'a, T> {
Self { map, column, i: 0 }
}
}

impl<'a, T> Iterator for ColumnIterator<'a, T> {
type Item = &'a T;

fn next(&mut self) -> Option<Self::Item> {
if self.i >= self.map.len() {
return None;
}

self.i += 1;
Some(&self.map[self.i - 1][self.column])
}
}
\n

Given this piece of an iterator, it is very easy to factor out the common\nfunctionality between the rows and columns into:

\n
let mut find_boundaries = |constructor: fn(usize) -> Orientation,
iterator: &mut dyn Iterator<Item = &char>,
upper_bound,
i| {
let mut first_non_empty = iterator.enumerate().skip_while(|&(_, &c)| c == ' ');
let start = first_non_empty.next().unwrap().0 as isize;

let mut last_non_empty = first_non_empty.skip_while(|&(_, &c)| c != ' ');
let end = last_non_empty.next().unwrap_or((upper_bound, &'_')).0 as isize;

boundaries.insert(constructor(i), start..end);
};
\n

And then use it as such:

\n
// construct all horizontal boundaries
(0..map.len()).for_each(|row| {
find_boundaries(
Orientation::horizontal,
&mut map[row].iter(),
map[row].len(),
row,
);
});

// construct all vertical boundaries
(0..map[0].len()).for_each(|col| {
find_boundaries(
Orientation::vertical,
&mut ColumnIterator::new(&map, col),
map.len(),
col,
);
});
\n

Walking around the map

\n

Once the 2nd part got introduced, you start to think about a way how not to\ncopy-paste a lot of stuff (I haven't avoided it anyways…). In this problem, I've\nchosen to introduce a trait (i.e. interface) for 2D and 3D walker.

\n
trait Wrap: Clone {
type State;

// simulation
fn is_blocked(&self) -> bool;
fn step(&mut self, steps: isize);
fn turn_left(&mut self);
fn turn_right(&mut self);

// movement
fn next(&self) -> (Self::State, Direction);

// final answer
fn answer(&self) -> Output;
}
\n

Each walker maintains its own state and also provides the functions that are\nused during the simulation. The “promised” methods are separated into:

\n
    \n
  • simulation-related: that are used during the simulation from the .fold()
  • \n
  • movement-related: just a one method that holds most of the logic differences\nbetween 2D and 3D
  • \n
  • final answer: which extracts the proof of solution from the\nimplementation-specific walker
  • \n
\n

Both 2D and 3D versions borrow the original input and therefore you must\nannotate the lifetime of it:

\n
struct Wrap2D<'a> {
input: &'a Input,
position: Position,
direction: Direction,
}
impl<'a> Wrap2D<'a> {
fn new(input: &'a Input) -> Wrap2D<'a> {
// …
\n

Problems

\n

I have used a lot of closures for this problem and once I introduced a parameter\nthat was of unknown type (apart from the fact it implements a specific trait), I\ngot suggested a “fix” for the compilation error that resulted in something that\nwas not possible to parse, cause it, more than likely, violated the grammar.

\n

In a similar fashion, I have been suggested changes that led to a code that\ndidn't make sense by just looking at it (there was no need to try the changes),\nfor example one suggested change in the closure parameter caused disapperance of\nthe parameter name. 😄

\n

Clippy

\n

I have to admit that Clippy was rather helpful here, I'll include two examples\nof rather smart suggestions.

\n

When writing the parsing for this problem, the first thing I have spotted on the\nchar was the .is_digit() function that takes a radix as a parameter. Clippy\nnoticed that I use radix = 10 and suggested switching to .is_ascii_digit()\nthat does exactly the same thing:

\n
-                .take_while(|c| c.is_digit(10))
+ .take_while(|c| c.is_ascii_digit())
\n

Another useful suggestion appeared when working with the iterators and I wanted\nto get the nnn-th element from it. You know the .skip(), you know the\n.next(), just “slap” them together and we're done for 😁 Well, I got\nsuggested to use .nth() that does exactly the combination of the two mentioned\nmethods on iterators:

\n
-            match it.clone().skip(skip).next().unwrap() {
+ match it.clone().nth(skip).unwrap() {
\n

Day 23: Unstable Diffusion

\n
tl;dr

Simulating movement of elves around with a set of specific rules.

\n

Solution

\n

There's not much to mention since it's just a cellular automaton simulation\n(even though the AoC rules for cellular automatons usually get out of hand\n😉).

\n

Although I had a need to determine boundaries of the elves' positions and ended\nup with a nasty DRY violation. Knowing that you you're looking for maximum and\nminimum that are, of course, exactly the same except for initial values and\ncomparators, it looks like a rather simple fix, but typing in Rust is something\nelse, right? In the end I settled for a function that computes both boundaries\nwithout any duplication while using a closure:

\n
fn get_bounds(positions: &Input) -> (Vector2D<isize>, Vector2D<isize>) {
let f = |init, cmp: &dyn Fn(isize, isize) -> isize| {
positions
.iter()
.fold(Vector2D::new(init, init), |acc, elf| {
Vector2D::new(cmp(acc.x(), elf.x()), cmp(acc.y(), elf.y()))
})
};

(f(isize::MAX, &min::<isize>), f(isize::MIN, &max::<isize>))
}
\n

This function returns a pair of 2D vectors that represent opposite points of the\nbounding rectangle of all elves.

\n

You might ask why would we need a closure and the answer is that positions\ncannot be captured from within the nested function, only via closure. One more\nfun fact on top of that is the type of the comparator

\n
&dyn Fn(isize, isize) -> isize
\n

Once we remove the dyn keyword, compiler yells at us and also includes a way\nhow to get a more thorough explanation of the error by running

\n

$ rustc --explain E0782

\n

which shows us

\n

Trait objects must include the dyn keyword.

\n

Erroneous code example:

\n
trait Foo {}
fn test(arg: Box<Foo>) {} // error!
\n

Trait objects are a way to call methods on types that are not known until\nruntime but conform to some trait.

\n

Trait objects should be formed with Box<dyn Foo>, but in the code above\ndyn is left off.

\n

This makes it harder to see that arg is a trait object and not a\nsimply a heap allocated type called Foo.

\n

To fix this issue, add dyn before the trait name.

\n
trait Foo {}
fn test(arg: Box<dyn Foo>) {} // ok!
\n

This used to be allowed before edition 2021, but is now an error.

\n
Rant

Not all of the explanations are helpful though, in some cases they might be even\nmore confusing than helpful, since they address very simple use cases.

As you can see, even in this case there are two sides to the explanations:

    \n
  • it explains why you need to use dyn, but
  • \n
  • it still mentions that trait objects need to be heap-allocated via Box<T>\nthat, as you can see in my snippet, does not apply here 😄 IMO it's\ncaused by the fact that we are borrowing it and therefore we don't need to\ncare about the size or whereabouts of it.
  • \n
\n
C++ parallel

If you dive into the explanation above, you can notice that the Box<dyn Trait>\npattern is very helpful for using types that are not known during compile-time.\nYou would use a very similar approach in C++ when parsing some data structure\nfrom input (let's say JSON for example).

On the other hand, in this case, it doesn't really make much sense, cause you\ncan clearly see that the types are known during the compile-time, which in\nC++ could be easily resolved by templating the helper function.

\n

Day 24: Blizzard Basin

\n
tl;dr

Navigating your way through a basin with series of blizzards that move around\nyou as you move.

\n
caution

It's second to last day and I went “bonkers” on the Rust 😄 Proceed to\nread Solution part on your own risk.

\n

Solution

\n

You are given a map with blizzards all over the place and you're supposed to\nfind the minimum time it requires you to walk through the basin without getting\nin any of the blizzards.

\n

Breakdown

\n

Relatively simple, yet a bit annoying, approach can be taken. It's technically\na shortest-path algorithm implementation with some relaxation restrictions and\nbeing able to stay on one position for some time, so each vertex of the graph\nis determined by the position on the map and the timestamp. I have chosen to\nuse Vector3D<usize>, since x and y attributes can be used for the position\nand, well, let's use z for a timestamp, cause why not, right? 😉

\n

Evaluating the blizzards

\n
caution

I think that this is the most perverted abuse of the traits in the whole 4 weeks\nof AoC in Rust…

\n

The blizzards move along their respective directions in time and loop around in\ntheir respective row/column. Each vertex holds position and time, so we can\njust index the basin with the vertex itself, right? Yes, we can 😈

\n
Fun fact

While writing this part, I've recognized unnecessary verbosity in the code and\ncleaned it up a bit. The changed version is shown here and the original was just\nmore verbose.

\n

I'll skip the boring parts of checking bounds and entry/exit of the basin 😉\nWe can easily calculate positions of the blizzards using a modular arithmetics:

\n
impl Index<Position> for Basin {
type Output = char;

fn index(&self, index: Position) -> &Self::Output {
// ‹skipped boring parts›

// We need to account for the loops of the blizzards
let width = self.cols - 2;
let height = self.rows - 2;

let blizzard_origin = |size, d, t, i| ((i - 1 + size + d * (t % size)) % size + 1) as usize;
[
(
index.y() as usize,
blizzard_origin(width, -1, index.z(), index.x()),
'>',
),
(
index.y() as usize,
blizzard_origin(width, 1, index.z(), index.x()),
'<',
),
(
blizzard_origin(height, -1, index.z(), index.y()),
index.x() as usize,
'v',
),
(
blizzard_origin(height, 1, index.z(), index.y()),
index.x() as usize,
'^',
),
]
.iter()
.find_map(|&(y, x, direction)| {
if self.map[y][x] == direction {
Some(&self.map[y][x])
} else {
None
}
})
.unwrap_or(&'.')
}
}
\n

As you can see, there is an expression for calculating the original position and\nit's used multiple times, so why not take it out to a lambda, right? 😉

\n

I couldn't get the rustfmt to format the for-loop nicely, so I've just\ndecided to go with iterating over an elements of a slice. I have used, once\nagain, a combination of two functions (find_map in this case) to do 2 things\nat once and at the end, if we haven't found any blizzard, we just return the\nempty space.

\n

I think it's a very nice (and naughty) way how to use the Index trait, don't\nyou think?

\n

Shortest-path algorithm

\n

For the shortest path you can choose and adjust any of the common shortest-path\nalgorithms, in my case, I have decided to use A* instead of Dijkstra's\nalgorithm, since it better reflects the cost function.

\n
Comparison of costs

With the Dijkstra's algorithm I would proceed with the time attribute used as\na priority for the queue.

Whereas with the A*, I have chosen to use both time and Manhattan distance\nthat promotes vertices closer to the exit and with a minimum time taken.

\n

Cost function is, of course, a closure 😉

\n
let cost = |p: Position| p.z() as usize + exit.y().abs_diff(p.y()) + exit.x().abs_diff(p.x());
\n

And also for checking the possible moves from the current vertex, I have\nimplemented, yet another, closure that yields an iterator with the next moves:

\n
let next_positions = |p| {
[(0, 0, 1), (0, -1, 1), (0, 1, 1), (-1, 0, 1), (1, 0, 1)]
.iter()
.filter_map(move |&(x, y, t)| {
let next_p = p + Vector3D::new(x, y, t);

if basin[next_p] == '.' {
Some(next_p)
} else {
None
}
})
};
\n

Min-heap

\n

In this case I had a need to use the priority queue taking the elements with the\nlowest cost as the prioritized ones. Rust only offers you the BinaryHeap and\nthat is a max-heap. One of the ways how to achieve a min-heap is to put the\nelements in wrapped in a Reverse (as is even showed in the linked docs of\nthe BinaryHeap). However the wrapping affects the type of the heap and also\npopping the most prioritized elements yields values wrapped in the Reverse.

\n

For this purpose I have just taken the max-heap and wrapped it as a whole in a\nseparate structure providing just the desired methods:

\n
use std::cmp::{Ord, Reverse};
use std::collections::BinaryHeap;

pub struct MinHeap<T> {
heap: BinaryHeap<Reverse<T>>,
}

impl<T: Ord> MinHeap<T> {
pub fn new() -> MinHeap<T> {
MinHeap {
heap: BinaryHeap::new(),
}
}

pub fn push(&mut self, item: T) {
self.heap.push(Reverse(item))
}

pub fn pop(&mut self) -> Option<T> {
self.heap.pop().map(|Reverse(x)| x)
}
}

impl<T: Ord> Default for MinHeap<T> {
fn default() -> Self {
Self::new()
}
}
\n

Rest is just the algorithm implementation which is not that interesting.

\n

Day 25: Full of Hot Air

\n
tl;dr

Playing around with a numbers in a special base.

\n

Getting flashbacks to the IB111 Foundations of Programming… Very nice “problem”\nwith a rather easy solution, as the last day always seems to be.

\n

Solution

\n

Implementing 2 functions, converting from the SNAFU base and back to the SNAFU\nbase representation. Let's do a bit more though! I have implemented two functions:

\n
    \n
  • from_snafu
  • \n
  • to_snafu
  • \n
\n

Now it is apparent that all I do is number to string and string to number. Hmm…\nthat sounds familiar, doesn't it? Let's introduce a structure for the SNAFU numbers\nand implement the traits that we need.

\n

Let's start with a structure:

\n
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
struct SNAFU {
value: i64,
}
\n

Converting from &str

\n

We will start by implementing the FromStr trait that will help us parse our input.\nThis is rather simple, I can just take the from_snafu function, copy-paste it\ninto the from_str method and the number I get will be wrapped in Result and\nSNAFU structure.

\n

Converting to String

\n

This is more fun. In some cases you need to implement only one trait and others\nare automatically implemented using that one trait. In our case, if you look in\nthe documentation, you can see that ToString trait is automatically implemented\nfor any type that implements Display trait.

\n

Let's implement the Display trait then. We should be able to use the to_snafu\nfunction and just take the self.value from the SNAFU structure.

\n

And for the convenience of tests, we can also implement a rather simple From<i64>\ntrait for the SNAFU.

\n

Adjusting the code

\n

After those changes we need to adjust the code and tests.

\n

Parsing of the input is very easy, before we have used the lines, now we parse\neverything:

\n
     fn parse_input<P: AsRef<Path>>(pathname: P) -> Input {
- file_to_lines(pathname)
+ file_to_structs(pathname)
}
\n

Part 1 needs to be adjusted a bit too:

\n
     fn part_1(input: &Input) -> Output {
- to_snafu(input.iter().map(|s| from_snafu(s)).sum())
+ SNAFU::from(input.iter().map(|s| s.value).sum::<i64>()).to_string()
}
\n

You can also see that it simplifies the meaning a bit and it is more explicit than\nthe previous versions.

\n

And for the tests:

\n
     #[test]
fn test_from() {
- for (n, s) in EXAMPLES.iter() {
- assert_eq!(from_snafu(s), *n);
+ for (&n, s) in EXAMPLES.iter() {
+ assert_eq!(s.parse::<SNAFU>().unwrap().value, n);
}
}

#[test]
fn test_to() {
- for (n, s) in EXAMPLES.iter() {
- assert_eq!(to_snafu(*n), s.to_string());
+ for (&n, s) in EXAMPLES.iter() {
+ assert_eq!(SNAFU::from(n).to_string(), s.to_string());
}
\n

Summary

\n

Let's wrap the whole thing up! Keeping in mind both AoC and the Rust…

\n

\"Finished

\n

Advent of Code

\n

This year was quite fun, even though most of the solutions and posts came in\nlater on (cough in '23 cough). Day 22 was the most obnoxious one… And also\nit feels like I used priority queues and tree data structures a lot 👀

\n

with Rust

\n

I must admit that a lot of compiler warnings and errors were very useful. Even\nthough I still found some instances where they didn't help at all or cause even\nworse issues than I had. Compilation times have been addressed with the caching.

\n

Building my first tree data structure in Rust has been a very “interesting”\njourney. Being able to write a more generic BFS algorithm that allows you to not\nduplicate code while still mantaining the desired functionality contributes to\na very readable code.

\n

I am definitely much more aware of the basic things that bloated Python is\nmissing, yet Rust has them…

\n

Using explicit types and writing down placeholder functions with todo!()\nmacros is very pleasant, since it allows you to easily navigate the type system\nduring the development when you don't even need to be sure how are you going to\nput the smaller pieces together.

\n

I have used a plethora of traits and also implemented some of them to either be\nidiomatic, or exploit the syntactic sugar they offer. Deriving the default trait\nimplementation is also very helpful in a lot of cases, e.g. debugging output,\ncopying, equality comparison, etc.

\n

I confess to touching more “cursed” parts of the Rust, such as macros to\ndeclutter the copy-paste for tests or writing my own structures that need to\ncarry a lifetime for their own fields.

\n

tl;dr Relatively pleasant language until you hit brick wall 😉

\n
\n

See you next year! Maybe in Rust, maybe not 🙃

", + "content_html": "

Let's go through the fourth week of Advent of Code in Rust.

\n

Day 22: Monkey Map

\n
tl;dr

Simulating a movement on a 2D map with given instructions. Map becomes a cube in\nthe 2nd part…

\n
Rant

This was the most obnoxious problem of this year… and a lot of Rust issues have\nbeen hit.

\n

Solution

\n

It seems like a very simple problem to solve, but with very obnoxious changes in\nthe 2nd part and also it's relatively hard to decompose »properly«.

\n

Column iterator

\n

In the first part of the problem it was needed to know the boundaries of each\nrow and column, since I stored them in Vec<Vec<char>> and padded with spaces\nto ensure I have a rectangular 2D “array”. However when you wanted to go through\neach row and column to determine the boundaries, it was very easy to do for the\nrows (cause each row is a Vec element), but not for the columns, since they\nspan multiple rows.

\n

For this use case I have implemented my own column iterator:

\n
pub struct ColumnIterator<'a, T> {
map: &'a [Vec<T>],
column: usize,

i: usize,
}

impl<'a, T> ColumnIterator<'a, T> {
pub fn new(map: &'a [Vec<T>], column: usize) -> ColumnIterator<'a, T> {
Self { map, column, i: 0 }
}
}

impl<'a, T> Iterator for ColumnIterator<'a, T> {
type Item = &'a T;

fn next(&mut self) -> Option<Self::Item> {
if self.i >= self.map.len() {
return None;
}

self.i += 1;
Some(&self.map[self.i - 1][self.column])
}
}
\n

Given this piece of an iterator, it is very easy to factor out the common\nfunctionality between the rows and columns into:

\n
let mut find_boundaries = |constructor: fn(usize) -> Orientation,
iterator: &mut dyn Iterator<Item = &char>,
upper_bound,
i| {
let mut first_non_empty = iterator.enumerate().skip_while(|&(_, &c)| c == ' ');
let start = first_non_empty.next().unwrap().0 as isize;

let mut last_non_empty = first_non_empty.skip_while(|&(_, &c)| c != ' ');
let end = last_non_empty.next().unwrap_or((upper_bound, &'_')).0 as isize;

boundaries.insert(constructor(i), start..end);
};
\n

And then use it as such:

\n
// construct all horizontal boundaries
(0..map.len()).for_each(|row| {
find_boundaries(
Orientation::horizontal,
&mut map[row].iter(),
map[row].len(),
row,
);
});

// construct all vertical boundaries
(0..map[0].len()).for_each(|col| {
find_boundaries(
Orientation::vertical,
&mut ColumnIterator::new(&map, col),
map.len(),
col,
);
});
\n

Walking around the map

\n

Once the 2nd part got introduced, you start to think about a way how not to\ncopy-paste a lot of stuff (I haven't avoided it anyways…). In this problem, I've\nchosen to introduce a trait (i.e. interface) for 2D and 3D walker.

\n
trait Wrap: Clone {
type State;

// simulation
fn is_blocked(&self) -> bool;
fn step(&mut self, steps: isize);
fn turn_left(&mut self);
fn turn_right(&mut self);

// movement
fn next(&self) -> (Self::State, Direction);

// final answer
fn answer(&self) -> Output;
}
\n

Each walker maintains its own state and also provides the functions that are\nused during the simulation. The “promised” methods are separated into:

\n
    \n
  • simulation-related: that are used during the simulation from the .fold()
  • \n
  • movement-related: just a one method that holds most of the logic differences\nbetween 2D and 3D
  • \n
  • final answer: which extracts the proof of solution from the\nimplementation-specific walker
  • \n
\n

Both 2D and 3D versions borrow the original input and therefore you must\nannotate the lifetime of it:

\n
struct Wrap2D<'a> {
input: &'a Input,
position: Position,
direction: Direction,
}
impl<'a> Wrap2D<'a> {
fn new(input: &'a Input) -> Wrap2D<'a> {
// …
\n

Problems

\n

I have used a lot of closures for this problem and once I introduced a parameter\nthat was of unknown type (apart from the fact it implements a specific trait), I\ngot suggested a “fix” for the compilation error that resulted in something that\nwas not possible to parse, cause it, more than likely, violated the grammar.

\n

In a similar fashion, I have been suggested changes that led to a code that\ndidn't make sense by just looking at it (there was no need to try the changes),\nfor example one suggested change in the closure parameter caused disapperance of\nthe parameter name. 😄

\n

Clippy

\n

I have to admit that Clippy was rather helpful here, I'll include two examples\nof rather smart suggestions.

\n

When writing the parsing for this problem, the first thing I have spotted on the\nchar was the .is_digit() function that takes a radix as a parameter. Clippy\nnoticed that I use radix = 10 and suggested switching to .is_ascii_digit()\nthat does exactly the same thing:

\n
-                .take_while(|c| c.is_digit(10))
+ .take_while(|c| c.is_ascii_digit())
\n

Another useful suggestion appeared when working with the iterators and I wanted\nto get the nnn-th element from it. You know the .skip(), you know the\n.next(), just “slap” them together and we're done for 😁 Well, I got\nsuggested to use .nth() that does exactly the combination of the two mentioned\nmethods on iterators:

\n
-            match it.clone().skip(skip).next().unwrap() {
+ match it.clone().nth(skip).unwrap() {
\n

Day 23: Unstable Diffusion

\n
tl;dr

Simulating movement of elves around with a set of specific rules.

\n

Solution

\n

There's not much to mention since it's just a cellular automaton simulation\n(even though the AoC rules for cellular automatons usually get out of hand\n😉).

\n

Although I had a need to determine boundaries of the elves' positions and ended\nup with a nasty DRY violation. Knowing that you you're looking for maximum and\nminimum that are, of course, exactly the same except for initial values and\ncomparators, it looks like a rather simple fix, but typing in Rust is something\nelse, right? In the end I settled for a function that computes both boundaries\nwithout any duplication while using a closure:

\n
fn get_bounds(positions: &Input) -> (Vector2D<isize>, Vector2D<isize>) {
let f = |init, cmp: &dyn Fn(isize, isize) -> isize| {
positions
.iter()
.fold(Vector2D::new(init, init), |acc, elf| {
Vector2D::new(cmp(acc.x(), elf.x()), cmp(acc.y(), elf.y()))
})
};

(f(isize::MAX, &min::<isize>), f(isize::MIN, &max::<isize>))
}
\n

This function returns a pair of 2D vectors that represent opposite points of the\nbounding rectangle of all elves.

\n

You might ask why would we need a closure and the answer is that positions\ncannot be captured from within the nested function, only via closure. One more\nfun fact on top of that is the type of the comparator

\n
&dyn Fn(isize, isize) -> isize
\n

Once we remove the dyn keyword, compiler yells at us and also includes a way\nhow to get a more thorough explanation of the error by running

\n

$ rustc --explain E0782

\n

which shows us

\n

Trait objects must include the dyn keyword.

\n

Erroneous code example:

\n
trait Foo {}
fn test(arg: Box<Foo>) {} // error!
\n

Trait objects are a way to call methods on types that are not known until\nruntime but conform to some trait.

\n

Trait objects should be formed with Box<dyn Foo>, but in the code above\ndyn is left off.

\n

This makes it harder to see that arg is a trait object and not a\nsimply a heap allocated type called Foo.

\n

To fix this issue, add dyn before the trait name.

\n
trait Foo {}
fn test(arg: Box<dyn Foo>) {} // ok!
\n

This used to be allowed before edition 2021, but is now an error.

\n
Rant

Not all of the explanations are helpful though, in some cases they might be even\nmore confusing than helpful, since they address very simple use cases.

As you can see, even in this case there are two sides to the explanations:

    \n
  • it explains why you need to use dyn, but
  • \n
  • it still mentions that trait objects need to be heap-allocated via Box<T>\nthat, as you can see in my snippet, does not apply here 😄 IMO it's\ncaused by the fact that we are borrowing it and therefore we don't need to\ncare about the size or whereabouts of it.
  • \n
\n
C++ parallel

If you dive into the explanation above, you can notice that the Box<dyn Trait>\npattern is very helpful for using types that are not known during compile-time.\nYou would use a very similar approach in C++ when parsing some data structure\nfrom input (let's say JSON for example).

On the other hand, in this case, it doesn't really make much sense, cause you\ncan clearly see that the types are known during the compile-time, which in\nC++ could be easily resolved by templating the helper function.

\n

Day 24: Blizzard Basin

\n
tl;dr

Navigating your way through a basin with series of blizzards that move around\nyou as you move.

\n
caution

It's second to last day and I went “bonkers” on the Rust 😄 Proceed to\nread Solution part on your own risk.

\n

Solution

\n

You are given a map with blizzards all over the place and you're supposed to\nfind the minimum time it requires you to walk through the basin without getting\nin any of the blizzards.

\n

Breakdown

\n

Relatively simple, yet a bit annoying, approach can be taken. It's technically\na shortest-path algorithm implementation with some relaxation restrictions and\nbeing able to stay on one position for some time, so each vertex of the graph\nis determined by the position on the map and the timestamp. I have chosen to\nuse Vector3D<usize>, since x and y attributes can be used for the position\nand, well, let's use z for a timestamp, cause why not, right? 😉

\n

Evaluating the blizzards

\n
caution

I think that this is the most perverted abuse of the traits in the whole 4 weeks\nof AoC in Rust…

\n

The blizzards move along their respective directions in time and loop around in\ntheir respective row/column. Each vertex holds position and time, so we can\njust index the basin with the vertex itself, right? Yes, we can 😈

\n
Fun fact

While writing this part, I've recognized unnecessary verbosity in the code and\ncleaned it up a bit. The changed version is shown here and the original was just\nmore verbose.

\n

I'll skip the boring parts of checking bounds and entry/exit of the basin 😉\nWe can easily calculate positions of the blizzards using a modular arithmetics:

\n
impl Index<Position> for Basin {
type Output = char;

fn index(&self, index: Position) -> &Self::Output {
// ‹skipped boring parts›

// We need to account for the loops of the blizzards
let width = self.cols - 2;
let height = self.rows - 2;

let blizzard_origin = |size, d, t, i| ((i - 1 + size + d * (t % size)) % size + 1) as usize;
[
(
index.y() as usize,
blizzard_origin(width, -1, index.z(), index.x()),
'>',
),
(
index.y() as usize,
blizzard_origin(width, 1, index.z(), index.x()),
'<',
),
(
blizzard_origin(height, -1, index.z(), index.y()),
index.x() as usize,
'v',
),
(
blizzard_origin(height, 1, index.z(), index.y()),
index.x() as usize,
'^',
),
]
.iter()
.find_map(|&(y, x, direction)| {
if self.map[y][x] == direction {
Some(&self.map[y][x])
} else {
None
}
})
.unwrap_or(&'.')
}
}
\n

As you can see, there is an expression for calculating the original position and\nit's used multiple times, so why not take it out to a lambda, right? 😉

\n

I couldn't get the rustfmt to format the for-loop nicely, so I've just\ndecided to go with iterating over an elements of a slice. I have used, once\nagain, a combination of two functions (find_map in this case) to do 2 things\nat once and at the end, if we haven't found any blizzard, we just return the\nempty space.

\n

I think it's a very nice (and naughty) way how to use the Index trait, don't\nyou think?

\n

Shortest-path algorithm

\n

For the shortest path you can choose and adjust any of the common shortest-path\nalgorithms, in my case, I have decided to use A* instead of Dijkstra's\nalgorithm, since it better reflects the cost function.

\n
Comparison of costs

With the Dijkstra's algorithm I would proceed with the time attribute used as\na priority for the queue.

Whereas with the A*, I have chosen to use both time and Manhattan distance\nthat promotes vertices closer to the exit and with a minimum time taken.

\n

Cost function is, of course, a closure 😉

\n
let cost = |p: Position| p.z() as usize + exit.y().abs_diff(p.y()) + exit.x().abs_diff(p.x());
\n

And also for checking the possible moves from the current vertex, I have\nimplemented, yet another, closure that yields an iterator with the next moves:

\n
let next_positions = |p| {
[(0, 0, 1), (0, -1, 1), (0, 1, 1), (-1, 0, 1), (1, 0, 1)]
.iter()
.filter_map(move |&(x, y, t)| {
let next_p = p + Vector3D::new(x, y, t);

if basin[next_p] == '.' {
Some(next_p)
} else {
None
}
})
};
\n

Min-heap

\n

In this case I had a need to use the priority queue taking the elements with the\nlowest cost as the prioritized ones. Rust only offers you the BinaryHeap and\nthat is a max-heap. One of the ways how to achieve a min-heap is to put the\nelements in wrapped in a Reverse (as is even showed in the linked docs of\nthe BinaryHeap). However the wrapping affects the type of the heap and also\npopping the most prioritized elements yields values wrapped in the Reverse.

\n

For this purpose I have just taken the max-heap and wrapped it as a whole in a\nseparate structure providing just the desired methods:

\n
use std::cmp::{Ord, Reverse};
use std::collections::BinaryHeap;

pub struct MinHeap<T> {
heap: BinaryHeap<Reverse<T>>,
}

impl<T: Ord> MinHeap<T> {
pub fn new() -> MinHeap<T> {
MinHeap {
heap: BinaryHeap::new(),
}
}

pub fn push(&mut self, item: T) {
self.heap.push(Reverse(item))
}

pub fn pop(&mut self) -> Option<T> {
self.heap.pop().map(|Reverse(x)| x)
}
}

impl<T: Ord> Default for MinHeap<T> {
fn default() -> Self {
Self::new()
}
}
\n

Rest is just the algorithm implementation which is not that interesting.

\n

Day 25: Full of Hot Air

\n
tl;dr

Playing around with a numbers in a special base.

\n

Getting flashbacks to the IB111 Foundations of Programming… Very nice “problem”\nwith a rather easy solution, as the last day always seems to be.

\n

Solution

\n

Implementing 2 functions, converting from the SNAFU base and back to the SNAFU\nbase representation. Let's do a bit more though! I have implemented two functions:

\n
    \n
  • from_snafu
  • \n
  • to_snafu
  • \n
\n

Now it is apparent that all I do is number to string and string to number. Hmm…\nthat sounds familiar, doesn't it? Let's introduce a structure for the SNAFU numbers\nand implement the traits that we need.

\n

Let's start with a structure:

\n
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
struct SNAFU {
value: i64,
}
\n

Converting from &str

\n

We will start by implementing the FromStr trait that will help us parse our input.\nThis is rather simple, I can just take the from_snafu function, copy-paste it\ninto the from_str method and the number I get will be wrapped in Result and\nSNAFU structure.

\n

Converting to String

\n

This is more fun. In some cases you need to implement only one trait and others\nare automatically implemented using that one trait. In our case, if you look in\nthe documentation, you can see that ToString trait is automatically implemented\nfor any type that implements Display trait.

\n

Let's implement the Display trait then. We should be able to use the to_snafu\nfunction and just take the self.value from the SNAFU structure.

\n

And for the convenience of tests, we can also implement a rather simple From<i64>\ntrait for the SNAFU.

\n

Adjusting the code

\n

After those changes we need to adjust the code and tests.

\n

Parsing of the input is very easy, before we have used the lines, now we parse\neverything:

\n
     fn parse_input<P: AsRef<Path>>(pathname: P) -> Input {
- file_to_lines(pathname)
+ file_to_structs(pathname)
}
\n

Part 1 needs to be adjusted a bit too:

\n
     fn part_1(input: &Input) -> Output {
- to_snafu(input.iter().map(|s| from_snafu(s)).sum())
+ SNAFU::from(input.iter().map(|s| s.value).sum::<i64>()).to_string()
}
\n

You can also see that it simplifies the meaning a bit and it is more explicit than\nthe previous versions.

\n

And for the tests:

\n
     #[test]
fn test_from() {
- for (n, s) in EXAMPLES.iter() {
- assert_eq!(from_snafu(s), *n);
+ for (&n, s) in EXAMPLES.iter() {
+ assert_eq!(s.parse::<SNAFU>().unwrap().value, n);
}
}

#[test]
fn test_to() {
- for (n, s) in EXAMPLES.iter() {
- assert_eq!(to_snafu(*n), s.to_string());
+ for (&n, s) in EXAMPLES.iter() {
+ assert_eq!(SNAFU::from(n).to_string(), s.to_string());
}
\n

Summary

\n

Let's wrap the whole thing up! Keeping in mind both AoC and the Rust…

\n

\"Finished

\n

Advent of Code

\n

This year was quite fun, even though most of the solutions and posts came in\nlater on (cough in '23 cough). Day 22 was the most obnoxious one… And also\nit feels like I used priority queues and tree data structures a lot 👀

\n

with Rust

\n

I must admit that a lot of compiler warnings and errors were very useful. Even\nthough I still found some instances where they didn't help at all or cause even\nworse issues than I had. Compilation times have been addressed with the caching.

\n

Building my first tree data structure in Rust has been a very “interesting”\njourney. Being able to write a more generic BFS algorithm that allows you to not\nduplicate code while still mantaining the desired functionality contributes to\na very readable code.

\n

I am definitely much more aware of the basic things that bloated Python is\nmissing, yet Rust has them…

\n

Using explicit types and writing down placeholder functions with todo!()\nmacros is very pleasant, since it allows you to easily navigate the type system\nduring the development when you don't even need to be sure how are you going to\nput the smaller pieces together.

\n

I have used a plethora of traits and also implemented some of them to either be\nidiomatic, or exploit the syntactic sugar they offer. Deriving the default trait\nimplementation is also very helpful in a lot of cases, e.g. debugging output,\ncopying, equality comparison, etc.

\n

I confess to touching more “cursed” parts of the Rust, such as macros to\ndeclutter the copy-paste for tests or writing my own structures that need to\ncarry a lifetime for their own fields.

\n

tl;dr Relatively pleasant language until you hit brick wall 😉

\n
\n

See you next year! Maybe in Rust, maybe not 🙃

", "url": "https://blog.mfocko.xyz/blog/aoc-2022/4th-week", "title": "4th week of Advent of Code '22 in Rust", "summary": "Surviving fourth week in Rust.", @@ -59,7 +59,7 @@ }, { "id": "https://blog.mfocko.xyz/blog/leetcode/sort-diagonally", - "content_html": "

Let's try to solve one of the LeetCode challenges in easy and hard mode at the\nsame time.

\n\n

Problem description

\n

A matrix diagonal is a diagonal line of cells starting from some cell in\neither the topmost row or leftmost column and going in the bottom-right direction\nuntil reaching the matrix's end. For example, the matrix diagonal starting\nfrom mat[2][0], where mat is a 6 x 3 matrix, includes cells mat[2][0],\nmat[3][1], and mat[4][2].

\n

Given an m x n matrix mat of integers, sort each matrix diagonal in ascending\norder and return the resulting matrix.

\n

Example

\n

\"Image

\n

Skeleton and initial adjustments

\n

We are given the following skeleton for the C++ and the given challenge:

\n
class Solution {
public:
vector<vector<int>> diagonalSort(vector<vector<int>>& mat) {

}
};
\n

The task is to sort the passed matrix diagonally and then return it. First of all,\nI don't like to solve this in a web browser, so we'll need to adjust it accordingly\nfor running it locally. We'll start by including the vector header and using\nfully-qualified namespaces1 and also adding few tests:

\n
#include <cassert>
#include <vector>

using matrix = std::vector<std::vector<int>>;

class Solution {
public:
matrix diagonalSort(matrix& mat)
{
}
};

static void test_case_1()
{
// Input: mat = [[3,3,1,1],[2,2,1,2],[1,1,1,2]]
// Output: [[1,1,1,1],[1,2,2,2],[1,2,3,3]]

Solution s;
assert((s.diagonalSort(std::vector { std::vector { 3, 3, 1, 1 },
std::vector { 2, 2, 1, 2 },
std::vector { 1, 1, 1, 2 } })
== std::vector { std::vector { 1, 1, 1, 1 },
std::vector { 1, 2, 2, 2 },
std::vector { 1, 2, 3, 3 } }));
}

static void test_case_2()
{
// Input: mat =
// [[11,25,66,1,69,7],[23,55,17,45,15,52],[75,31,36,44,58,8],[22,27,33,25,68,4],[84,28,14,11,5,50]]
// Output:
// [[5,17,4,1,52,7],[11,11,25,45,8,69],[14,23,25,44,58,15],[22,27,31,36,50,66],[84,28,75,33,55,68]]

Solution s;
assert((s.diagonalSort(std::vector { std::vector { 11, 25, 66, 1, 69, 7 },
std::vector { 23, 55, 17, 45, 15, 52 },
std::vector { 75, 31, 36, 44, 58, 8 },
std::vector { 22, 27, 33, 25, 68, 4 },
std::vector { 84, 28, 14, 11, 5, 50 } })
== std::vector { std::vector { 5, 17, 4, 1, 52, 7 },
std::vector { 11, 11, 25, 45, 8, 69 },
std::vector { 14, 23, 25, 44, 58, 15 },
std::vector { 22, 27, 31, 36, 50, 66 },
std::vector { 84, 28, 75, 33, 55, 68 } }));
}

int main()
{
test_case_1();
test_case_2();

return 0;
}
\n

We need to return the matrix, but we're given a reference to the input matrix. We\ncan easily abuse the C++ here and just switch the reference to value, this way\nthe matrix will be copied when passed to the function, we can sort the copy and\njust return it back. And we also get yelled by the compiler for the fact that the\nmethod doesn't return anything yet, so to make it “shut up” we will just return\nthe input for now:

\n
-    matrix diagonalSort(matrix& mat)
+ matrix diagonalSort(matrix mat)
{
+ return mat;
}
\n

Now, we get the copy and we're good to go.

\n

Naïve solution

\n

As you may know, C++ offers a plethora of functions that can be used to your\nadvantage, given that you know how to “bend” the data structures accordingly.

\n

What does that mean for us? Well, we have an std::sort, we can use it, right?\nLet's have a look at it:

\n
template< class RandomIt >
void sort( RandomIt first, RandomIt last );
\n

This overload is more than we need. What does it do? It just sorts the elements\nin the range [first, last) using operator< on them. We can't sort the whole\nmatrix using this, but… we can sort just »one« diagonal without doing much work\non our end.

\n

What is the RandomIt type though? If we look more into the documentation, we\ncan easily find the requirements for it and also learn that it's a random access\niterator and allows swapping its values at the same time.

\n
Random access iterator

What is the random access iterator though? We can find it in a documentation\nand see the following description:

\n

A LegacyRandomAccessIterator is a LegacyBidirectionalIterator\nthat can be moved to point to any element in constant time.

\n

After that we can see all the requirements for it being listed. I don't feel like\nreading them right now, so we will just use it and see where the compilation blows\nup, i.e. “compiler-assisted development2 if you will ;)

\n

Now we know that we can use std::sort to sort the diagonal itself, but we also\nneed to get the diagonals somehow. I'm rather lazy, so I'll just delegate it to\nsomeone else3. And that way we get

\n
matrix diagonalSort(matrix mat)
{
// we iterate over the diagonals
for (auto d : diagonals(mat)) {
// and we sort each diagonal
std::sort(d.begin(), d.end());
}

// we take the matrix by copy, so we can sort in-situ and return the copy
// that we sorted
return mat;
}
\n

This solution looks very simple, doesn't it? Well, cause it is.\nLet's try compiling it:

\n
matrix-sort.cpp:11:23: error: use of undeclared identifier 'diagonals' [clang-diagnostic-error]
for (auto d : diagonals(mat)) {
^
Found compiler error(s).
make: *** [makefile:14: tidy] Error 1
\n

OK, seems about right. We haven't implemented the diagonals yet. And based on\nwhat we've written so far, we need a function or a class diagonals that will\ngive us the diagonals we need.

\n

Implementing the diagonals

\n

Cool, so we need the function that will let us go through each and every diagonal\nin our matrix. We use the for-range loop, so whatever we get back from the\ndiagonals must support .begin() and .end(). Since I am a masochist, we will\ndo such functionality for a matrix of any type, not just the int from the challenge.

\n

As I said, we need to be able to

\n
    \n
  • construct the object
  • \n
  • get the beginning
  • \n
  • get the end (the “sentinel”)
  • \n
\n
template <typename T>
class diagonals {
using matrix_t = std::vector<std::vector<T>>;

matrix_t& _matrix;

public:
diagonals(matrix_t& m)
: _matrix(m)
{
}
diagonals_iter begin()
{
/* TODO */
}
diagonals_iter end()
{
/* TODO */
}
};
\n

Now we have a diagonals that we can use to go through the diagonals. We haven't\nimplemented the core of it yet. Let's go through what we have for now.

\n

We have a templated class with templated T that is used as a placeholder for any\ntype we would store in the matrix. Because I'm lazy, I have defined the matrix_t\ntype that is a “shortcut” for std::vector<std::vector<T>>, so I don't have to\ntype it out all the time. Of course, we need to store the matrix, we are given,\nas a private attribute. And then just have the constructor and the 2 methods we\nneed for the for-range.

\n

Iterating over diagonals

\n

Now that we have an object that will allow us to iterate through the diagonals,\nwe need to implement the iterating itself. We need to go through all of them, so\nwe have multiple options how to do so. I have decided to start from the “main”\ndiagonal that starts at (0, 0) index and then proceed with the diagonals starting\nin the first row, followed by the rest of the diagonals in the first column.

\n

We need to be able to tell that we've iterated through all of them, and also we\nneed to know which diagonal is next. For that purpose we will pass the indices\nof the first cell on the diagonal. That way we can always tell how to move forward.

\n

We will start by updating the begin and end to reflect our choice accordingly.

\n
diagonals_iter begin() { return diagonals_iter { _matrix, 0, 0 }; }
diagonals_iter end() { return diagonals_iter { _matrix, 0, _matrix.size() }; }
\n

For the begin we return the first diagonal that starts at (0, 0). And because\nwe have decided to do the diagonals in the first column at the end, the first\ndiagonal that is not a valid one is the one at (0, height). Apart from the\nindices, we also need to pass reference to the matrix itself.

\n
note

You may have noticed that we also include the diagonals that have length 1,\nspecifically the ones at (0, height - 1) and (width - 1, 0). We are implementing\nan iterator that should not care about the way it's being used. Therefore, we\ndon't care about the fact they don't need to be sorted.

\n

Cool, let's leave the iterator itself to someone else, right?4

\n

Implementing the iterator over diagonals

\n

We can start with a simple skeleton based on the information that we pass from\nthe diagonals. Also to utilize the matrix_t and also contain implementation\ndetails hidden away, we will put this code into the diagonals class.

\n
class diagonals_iter {
matrix_t& m;
std::size_t x;
std::size_t y;

public:
diagonals_iter(matrix_t& matrix, std::size_t x, std::size_t y)
: m(matrix)
, x(x)
, y(y)
{
}
};
\n

In this case we will be implementing a “simple” forward iterator, so we don't\nneed to implement a lot. Notably it will be:

\n
    \n
  • inequality operator (we need to know when we reach the end and have nothing to\niterate over)
  • \n
  • preincrementation operator (we need to be able to move around the iterable)
  • \n
  • dereference operator (we need to be able to retrieve the objects we iterate\nover)
  • \n
\n
class diagonals_iter {
matrix_t& m;
std::size_t x;
std::size_t y;

public:
diagonals_iter(matrix_t& matrix, std::size_t x, std::size_t y)
: m(matrix)
, x(x)
, y(y)
{
}

bool operator!=(const diagonals_iter& rhs) const
{
// iterators are not equal if they reference different matrices, or
// their positions differ
return m != rhs.m || x != rhs.x || y != rhs.y;
}

diagonals_iter& operator++()
{
if (y != 0) {
// iterating through diagonals down the first column
y++;
return *this;
}

// iterating the diagonals along the first row
x++;
if (x == m.front().size()) {
// switching to diagonals in the first column
x = 0;
y++;
}

return *this;
}

diagonal<T> operator*() const { return diagonal { m, x, y }; }
};
\n

Let's go one-by-one. Inequality operator is rather simple, just compare iterator's\nattributes field-by-field. If you think about it, checking inequality of two 2D\nvectors may be a bit inefficient, therefore, we can swap around and check it as\na last thing.

\n
-        return m != rhs.m || x != rhs.x || y != rhs.y;
+ return x != rhs.x || y != rhs.y || m != rhs.m;
\n

Preincrementation is where the magic happens. If you have a better look, you can\nsee two branches of this operation:

\n
    \n
  1. When y != 0 (we're iterating over the diagonals in the first column)\nIn this case, we just bump the row and we're done.
  2. \n
  3. When y == 0 (we're iterating over the diagonals in the first row)\nIn this case, we bump the column and check if we haven't gotten out of bounds,\ni.e. the end of the first row. If we get out of the bounds, we're continuing\nwith the second diagonal in the first column.
  4. \n
\n

Dereferencing the iterator must “yield” something. In our case it will be the\ndiagonal that we want to sort. For sorting we need just the iterators that can\nmove around said diagonal. The simplest thing, we can do, is to delegate it to\nsomething else. In our case it will be a class called diagonal.

\n

Implementing the diagonal itself

\n

After implementing the iterator over diagonals, we know that all we need to describe\na diagonal is the matrix itself and the “start” of the diagonal (row and column).\nAnd we also know that the diagonal must provide some iterators for the std::sort\nfunction. We can start with the following skeleton:

\n
template <typename T>
class diagonal {
using matrix_t = std::vector<std::vector<T>>;

matrix_t& matrix;
std::size_t x;
std::size_t y;

public:
diagonal(matrix_t& matrix, std::size_t x, std::size_t y)
: matrix(matrix)
, x(x)
, y(y)
{
}

diagonal_iter begin() const { return diagonal_iter { matrix, x, y }; }

diagonal_iter end() const
{
auto max_x = matrix[y].size();
auto max_y = matrix.size();

// we need to find the distance in which we get out of bounds (either in
// column or row)
auto steps = std::min(max_x - x, max_y - y);

return diagonal_iter { matrix, x + steps, y + steps };
}
};
\n

Initialization is rather simple, we just “keep” the stuff we get, begin is the\nsimplest, we just delegate.

\n

In case of the end, it gets more complicated. We need to know where is the “end”\nof the diagonal. Since end should point to the first element “after” the iterable,\nwe know that it's the first position of the iterator where either y becomes\nmatrix.size() or x becomes matrix[y].size(). Also we are moving along diagonal,\nduh, therefore we can deduce the first “position” afterwards by minimal amount of\nsteps to get out of the any column or row, hence std::min(max_x - x, max_y - y).\nFinal position is then computed simply by adding the steps to the beginning of\nthe diagonal.

\n

Now we just need to finish the iterator for the diagonal itself and we're done.

\n

Implementing diagonal_iter

\n

This part is the hardest from all we need to do. It's because of the requirements\nof the std::sort that requires us to implement a random access iterator. I have\nbriefly described it above, and “in a nutshell” it means that we need to implement\nan iterator that can move in constant time along the diagonal in any amount of\nsteps.

\n

Let's go through all of the functionality that our iterator needs to support to\nbe used in std::sort. We need the usual operations like:

\n
    \n
  • equality/inequality
  • \n
  • incrementation
  • \n
  • dereferencing
  • \n
\n

We will also add all the types that our iterator uses with the category of the\niterator, i.e. what interface it supports:

\n
class diagonal_iter {
// we need to keep reference to the matrix itself
matrix_t& m;

// we need to be able to tell our current position
std::size_t x;
std::size_t y;

public:
using difference_type = std::ptrdiff_t;
using value_type = T;
using pointer = T*;
using reference = T&;
using iterator_category = std::random_access_iterator_tag;

diagonal_iter(matrix_t& matrix,
std::size_t x,
std::size_t y)
: m(matrix)
, x(x)
, y(y)
{
}

bool operator==(const diagonal_iter& rhs) const
{
return x == rhs.x && y == rhs.y && m == rhs.m;
}

diagonal_iter& operator++()
{
// we are moving along the diagonal, so we increment both ‹x› and ‹y› at
// the same time
x++;
y++;
return *this;
}

reference operator*() const { return m[y][x]; }
};
\n

This is pretty similar to the previous iterator, but now we need to implement the\nremaining requirements of the random access iterator. Let's see what those are:

\n
    \n
  • decrementation - cause we need to be able to move backwards too, since _random _\naccess iterator extends the interface of bidirectional iterator
  • \n
  • moving the iterator in either direction by steps given as an integer
  • \n
  • being able to tell the distance between two iterators
  • \n
  • define an ordering on the iterators
  • \n
\n

Let's fill them in:

\n
class diagonal_iter {
// we need to keep reference to the matrix itself
matrix_t& m;

// we need to be able to tell our current position
std::size_t x;
std::size_t y;

public:
using difference_type = std::ptrdiff_t;
using value_type = T;
using pointer = T*;
using reference = T&;
using iterator_category = std::random_access_iterator_tag;

diagonal_iter(matrix_t& matrix,
std::size_t x,
std::size_t y)
: m(matrix)
, x(x)
, y(y)
{
}

bool operator==(const diagonal_iter& rhs) const
{
return x == rhs.x && y == rhs.y && m == rhs.m;
}

diagonal_iter& operator++()
{
// we are moving along the diagonal, so we increment both ‹x› and ‹y› at
// the same time
x++;
y++;
return *this;
}

reference operator*() const { return m[y][x]; }

// exactly opposite to the incrementation
diagonal_iter operator--()
{
x--;
y--;
return *this;
}

// moving ‹n› steps back is same as calling decrementation ‹n›-times, so we
// can just return a new iterator and subtract ‹n› from both coordinates in
// the matrix
diagonal_iter operator-(difference_type n) const
{
return diagonal_iter { m, x - n, y - n };
}

// here we assume that we are given two iterators on the same diagonal
difference_type operator-(const diagonal_iter& rhs) const
{
assert(m == rhs.m);
return x - rhs.x;
}

// counterpart of moving ‹n› steps backwards
diagonal_iter operator+(difference_type n) const
{
return diagonal_iter { m, x + n, y + n };
}

// we compare the coordinates, and also assume that those 2 iterators are
// lying on the same diagonal
bool operator<(const diagonal_iter& rhs) const
{
assert(m == rhs.m);
return x < rhs.x && y < rhs.y;
}
};
\n

At this point we could probably try and compile it, right? If we do so, we will\nget yelled at by a compiler for the following reasons:

\n
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1792:11: error: object of type 'diagonal<int>::diagonal_iter' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]
__last = __next;
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1817:11: note: in instantiation of function template specialization 'std::__unguarded_linear_insert<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Val_less_iter>' requested here
std::__unguarded_linear_insert(__i,
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1849:9: note: in instantiation of function template specialization 'std::__insertion_sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__insertion_sort(__first, __first + int(_S_threshold), __comp);
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1940:9: note: in instantiation of function template specialization 'std::__final_insertion_sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__final_insertion_sort(__first, __last, __comp);
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization 'std::__sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());
^
matrix-sort.cpp:161:18: note: in instantiation of function template specialization 'std::sort<diagonal<int>::diagonal_iter>' requested here
std::sort(d.begin(), d.end());
^
matrix-sort.cpp:17:19: note: copy assignment operator of 'diagonal_iter' is implicitly deleted because field 'm' is of reference type 'diagonal<int>::matrix_t &' (aka 'vector<std::vector<int>> &')
matrix_t& m;
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1830:2: error: no matching function for call to '__unguarded_linear_insert' [clang-diagnostic-error]
std::__unguarded_linear_insert(__i,
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1850:9: note: in instantiation of function template specialization 'std::__unguarded_insertion_sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__unguarded_insertion_sort(__first + int(_S_threshold), __last,
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1940:9: note: in instantiation of function template specialization 'std::__final_insertion_sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__final_insertion_sort(__first, __last, __comp);
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization 'std::__sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());
^
matrix-sort.cpp:161:18: note: in instantiation of function template specialization 'std::sort<diagonal<int>::diagonal_iter>' requested here
std::sort(d.begin(), d.end());
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1782:5: note: candidate template ignored: substitution failure [with _RandomAccessIterator = diagonal<int>::diagonal_iter, _Compare = __gnu_cxx::__ops::_Val_less_iter]
__unguarded_linear_insert(_RandomAccessIterator __last,
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1923:11: error: object of type 'diagonal<int>::diagonal_iter' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]
__last = __cut;
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1937:9: note: in instantiation of function template specialization 'std::__introsort_loop<diagonal<int>::diagonal_iter, long, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__introsort_loop(__first, __last,
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization 'std::__sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());
^
matrix-sort.cpp:161:18: note: in instantiation of function template specialization 'std::sort<diagonal<int>::diagonal_iter>' requested here
std::sort(d.begin(), d.end());
^
matrix-sort.cpp:17:19: note: copy assignment operator of 'diagonal_iter' is implicitly deleted because field 'm' is of reference type 'diagonal<int>::matrix_t &' (aka 'vector<std::vector<int>> &')
matrix_t& m;
^
\n

That's a lot of noise, isn't it? Let's focus on the important parts:

\n
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1792:11: error: object of type 'diagonal<int>::diagonal_iter' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]

matrix-sort.cpp:17:19: note: copy assignment operator of 'diagonal_iter' is implicitly deleted because field 'm' is of reference type 'diagonal<int>::matrix_t &' (aka 'vector<std::vector<int>> &')
matrix_t& m;
^
\n

Ah! We have a reference in our iterator, and this prevents us from having a copy\nassignment operator (that is used “somewhere” in the sorting algorithm). Well…\nLet's just wrap it!

\n
# we need to keep a different type than reference
- matrix_t& m;
+ std::reference_wrapper<matrix_t> m;

# in comparison we need to get the reference out of the wrapper first
- return x == rhs.x && y == rhs.y && m == rhs.m;
+ return x == rhs.x && y == rhs.y && m.get() == rhs.m.get();

# same when we return a reference to the “cell” in the matrix
- reference operator*() const { return m[y][x]; }
+ reference operator*() const { return m.get()[y][x]; }

# and finally in the assertions that we set for the “distance” and “less than”
- assert(m == rhs.m);
+ assert(m.get() == rhs.m.get());
\n

We're done now! We have written an iterator over diagonals for a 2D vector. You can have a look at the final result here.

\n

Footnotes

\n
    \n
  1. \n

    just because I'm used to it and don't care about your opinion ;)

    \n
  2. \n
  3. \n

    exercise at your own risk

    \n
  4. \n
  5. \n

    me in 5 minutes in fact, but don't make me scared

    \n
  6. \n
  7. \n

    me in the next section…

    \n
  8. \n
\n
", + "content_html": "

Let's try to solve one of the LeetCode challenges in easy and hard mode at the\nsame time.

\n\n

Problem description

\n

A matrix diagonal is a diagonal line of cells starting from some cell in\neither the topmost row or leftmost column and going in the bottom-right direction\nuntil reaching the matrix's end. For example, the matrix diagonal starting\nfrom mat[2][0], where mat is a 6 x 3 matrix, includes cells mat[2][0],\nmat[3][1], and mat[4][2].

\n

Given an m x n matrix mat of integers, sort each matrix diagonal in ascending\norder and return the resulting matrix.

\n

Example

\n

\"Image

\n

Skeleton and initial adjustments

\n

We are given the following skeleton for the C++ and the given challenge:

\n
class Solution {
public:
vector<vector<int>> diagonalSort(vector<vector<int>>& mat) {

}
};
\n

The task is to sort the passed matrix diagonally and then return it. First of all,\nI don't like to solve this in a web browser, so we'll need to adjust it accordingly\nfor running it locally. We'll start by including the vector header and using\nfully-qualified namespaces1 and also adding few tests:

\n
#include <cassert>
#include <vector>

using matrix = std::vector<std::vector<int>>;

class Solution {
public:
matrix diagonalSort(matrix& mat)
{
}
};

static void test_case_1()
{
// Input: mat = [[3,3,1,1],[2,2,1,2],[1,1,1,2]]
// Output: [[1,1,1,1],[1,2,2,2],[1,2,3,3]]

Solution s;
assert((s.diagonalSort(std::vector { std::vector { 3, 3, 1, 1 },
std::vector { 2, 2, 1, 2 },
std::vector { 1, 1, 1, 2 } })
== std::vector { std::vector { 1, 1, 1, 1 },
std::vector { 1, 2, 2, 2 },
std::vector { 1, 2, 3, 3 } }));
}

static void test_case_2()
{
// Input: mat =
// [[11,25,66,1,69,7],[23,55,17,45,15,52],[75,31,36,44,58,8],[22,27,33,25,68,4],[84,28,14,11,5,50]]
// Output:
// [[5,17,4,1,52,7],[11,11,25,45,8,69],[14,23,25,44,58,15],[22,27,31,36,50,66],[84,28,75,33,55,68]]

Solution s;
assert((s.diagonalSort(std::vector { std::vector { 11, 25, 66, 1, 69, 7 },
std::vector { 23, 55, 17, 45, 15, 52 },
std::vector { 75, 31, 36, 44, 58, 8 },
std::vector { 22, 27, 33, 25, 68, 4 },
std::vector { 84, 28, 14, 11, 5, 50 } })
== std::vector { std::vector { 5, 17, 4, 1, 52, 7 },
std::vector { 11, 11, 25, 45, 8, 69 },
std::vector { 14, 23, 25, 44, 58, 15 },
std::vector { 22, 27, 31, 36, 50, 66 },
std::vector { 84, 28, 75, 33, 55, 68 } }));
}

int main()
{
test_case_1();
test_case_2();

return 0;
}
\n

We need to return the matrix, but we're given a reference to the input matrix. We\ncan easily abuse the C++ here and just switch the reference to value, this way\nthe matrix will be copied when passed to the function, we can sort the copy and\njust return it back. And we also get yelled by the compiler for the fact that the\nmethod doesn't return anything yet, so to make it “shut up” we will just return\nthe input for now:

\n
-    matrix diagonalSort(matrix& mat)
+ matrix diagonalSort(matrix mat)
{
+ return mat;
}
\n

Now, we get the copy and we're good to go.

\n

Naïve solution

\n

As you may know, C++ offers a plethora of functions that can be used to your\nadvantage, given that you know how to “bend” the data structures accordingly.

\n

What does that mean for us? Well, we have an std::sort, we can use it, right?\nLet's have a look at it:

\n
template< class RandomIt >
void sort( RandomIt first, RandomIt last );
\n

This overload is more than we need. What does it do? It just sorts the elements\nin the range [first, last) using operator< on them. We can't sort the whole\nmatrix using this, but… we can sort just »one« diagonal without doing much work\non our end.

\n

What is the RandomIt type though? If we look more into the documentation, we\ncan easily find the requirements for it and also learn that it's a random access\niterator and allows swapping its values at the same time.

\n
Random access iterator

What is the random access iterator though? We can find it in a documentation\nand see the following description:

\n

A LegacyRandomAccessIterator is a LegacyBidirectionalIterator\nthat can be moved to point to any element in constant time.

\n

After that we can see all the requirements for it being listed. I don't feel like\nreading them right now, so we will just use it and see where the compilation blows\nup, i.e. “compiler-assisted development2 if you will ;)

\n

Now we know that we can use std::sort to sort the diagonal itself, but we also\nneed to get the diagonals somehow. I'm rather lazy, so I'll just delegate it to\nsomeone else3. And that way we get

\n
matrix diagonalSort(matrix mat)
{
// we iterate over the diagonals
for (auto d : diagonals(mat)) {
// and we sort each diagonal
std::sort(d.begin(), d.end());
}

// we take the matrix by copy, so we can sort in-situ and return the copy
// that we sorted
return mat;
}
\n

This solution looks very simple, doesn't it? Well, cause it is.\nLet's try compiling it:

\n
matrix-sort.cpp:11:23: error: use of undeclared identifier 'diagonals' [clang-diagnostic-error]
for (auto d : diagonals(mat)) {
^
Found compiler error(s).
make: *** [makefile:14: tidy] Error 1
\n

OK, seems about right. We haven't implemented the diagonals yet. And based on\nwhat we've written so far, we need a function or a class diagonals that will\ngive us the diagonals we need.

\n

Implementing the diagonals

\n

Cool, so we need the function that will let us go through each and every diagonal\nin our matrix. We use the for-range loop, so whatever we get back from the\ndiagonals must support .begin() and .end(). Since I am a masochist, we will\ndo such functionality for a matrix of any type, not just the int from the challenge.

\n

As I said, we need to be able to

\n
    \n
  • construct the object
  • \n
  • get the beginning
  • \n
  • get the end (the “sentinel”)
  • \n
\n
template <typename T>
class diagonals {
using matrix_t = std::vector<std::vector<T>>;

matrix_t& _matrix;

public:
diagonals(matrix_t& m)
: _matrix(m)
{
}
diagonals_iter begin()
{
/* TODO */
}
diagonals_iter end()
{
/* TODO */
}
};
\n

Now we have a diagonals that we can use to go through the diagonals. We haven't\nimplemented the core of it yet. Let's go through what we have for now.

\n

We have a templated class with templated T that is used as a placeholder for any\ntype we would store in the matrix. Because I'm lazy, I have defined the matrix_t\ntype that is a “shortcut” for std::vector<std::vector<T>>, so I don't have to\ntype it out all the time. Of course, we need to store the matrix, we are given,\nas a private attribute. And then just have the constructor and the 2 methods we\nneed for the for-range.

\n

Iterating over diagonals

\n

Now that we have an object that will allow us to iterate through the diagonals,\nwe need to implement the iterating itself. We need to go through all of them, so\nwe have multiple options how to do so. I have decided to start from the “main”\ndiagonal that starts at (0, 0) index and then proceed with the diagonals starting\nin the first row, followed by the rest of the diagonals in the first column.

\n

We need to be able to tell that we've iterated through all of them, and also we\nneed to know which diagonal is next. For that purpose we will pass the indices\nof the first cell on the diagonal. That way we can always tell how to move forward.

\n

We will start by updating the begin and end to reflect our choice accordingly.

\n
diagonals_iter begin() { return diagonals_iter { _matrix, 0, 0 }; }
diagonals_iter end() { return diagonals_iter { _matrix, 0, _matrix.size() }; }
\n

For the begin we return the first diagonal that starts at (0, 0). And because\nwe have decided to do the diagonals in the first column at the end, the first\ndiagonal that is not a valid one is the one at (0, height). Apart from the\nindices, we also need to pass reference to the matrix itself.

\n
note

You may have noticed that we also include the diagonals that have length 1,\nspecifically the ones at (0, height - 1) and (width - 1, 0). We are implementing\nan iterator that should not care about the way it's being used. Therefore, we\ndon't care about the fact they don't need to be sorted.

\n

Cool, let's leave the iterator itself to someone else, right?4

\n

Implementing the iterator over diagonals

\n

We can start with a simple skeleton based on the information that we pass from\nthe diagonals. Also to utilize the matrix_t and also contain implementation\ndetails hidden away, we will put this code into the diagonals class.

\n
class diagonals_iter {
matrix_t& m;
std::size_t x;
std::size_t y;

public:
diagonals_iter(matrix_t& matrix, std::size_t x, std::size_t y)
: m(matrix)
, x(x)
, y(y)
{
}
};
\n

In this case we will be implementing a “simple” forward iterator, so we don't\nneed to implement a lot. Notably it will be:

\n
    \n
  • inequality operator (we need to know when we reach the end and have nothing to\niterate over)
  • \n
  • preincrementation operator (we need to be able to move around the iterable)
  • \n
  • dereference operator (we need to be able to retrieve the objects we iterate\nover)
  • \n
\n
class diagonals_iter {
matrix_t& m;
std::size_t x;
std::size_t y;

public:
diagonals_iter(matrix_t& matrix, std::size_t x, std::size_t y)
: m(matrix)
, x(x)
, y(y)
{
}

bool operator!=(const diagonals_iter& rhs) const
{
// iterators are not equal if they reference different matrices, or
// their positions differ
return m != rhs.m || x != rhs.x || y != rhs.y;
}

diagonals_iter& operator++()
{
if (y != 0) {
// iterating through diagonals down the first column
y++;
return *this;
}

// iterating the diagonals along the first row
x++;
if (x == m.front().size()) {
// switching to diagonals in the first column
x = 0;
y++;
}

return *this;
}

diagonal<T> operator*() const { return diagonal { m, x, y }; }
};
\n

Let's go one-by-one. Inequality operator is rather simple, just compare iterator's\nattributes field-by-field. If you think about it, checking inequality of two 2D\nvectors may be a bit inefficient, therefore, we can swap around and check it as\na last thing.

\n
-        return m != rhs.m || x != rhs.x || y != rhs.y;
+ return x != rhs.x || y != rhs.y || m != rhs.m;
\n

Preincrementation is where the magic happens. If you have a better look, you can\nsee two branches of this operation:

\n
    \n
  1. When y != 0 (we're iterating over the diagonals in the first column)\nIn this case, we just bump the row and we're done.
  2. \n
  3. When y == 0 (we're iterating over the diagonals in the first row)\nIn this case, we bump the column and check if we haven't gotten out of bounds,\ni.e. the end of the first row. If we get out of the bounds, we're continuing\nwith the second diagonal in the first column.
  4. \n
\n

Dereferencing the iterator must “yield” something. In our case it will be the\ndiagonal that we want to sort. For sorting we need just the iterators that can\nmove around said diagonal. The simplest thing, we can do, is to delegate it to\nsomething else. In our case it will be a class called diagonal.

\n

Implementing the diagonal itself

\n

After implementing the iterator over diagonals, we know that all we need to describe\na diagonal is the matrix itself and the “start” of the diagonal (row and column).\nAnd we also know that the diagonal must provide some iterators for the std::sort\nfunction. We can start with the following skeleton:

\n
template <typename T>
class diagonal {
using matrix_t = std::vector<std::vector<T>>;

matrix_t& matrix;
std::size_t x;
std::size_t y;

public:
diagonal(matrix_t& matrix, std::size_t x, std::size_t y)
: matrix(matrix)
, x(x)
, y(y)
{
}

diagonal_iter begin() const { return diagonal_iter { matrix, x, y }; }

diagonal_iter end() const
{
auto max_x = matrix[y].size();
auto max_y = matrix.size();

// we need to find the distance in which we get out of bounds (either in
// column or row)
auto steps = std::min(max_x - x, max_y - y);

return diagonal_iter { matrix, x + steps, y + steps };
}
};
\n

Initialization is rather simple, we just “keep” the stuff we get, begin is the\nsimplest, we just delegate.

\n

In case of the end, it gets more complicated. We need to know where is the “end”\nof the diagonal. Since end should point to the first element “after” the iterable,\nwe know that it's the first position of the iterator where either y becomes\nmatrix.size() or x becomes matrix[y].size(). Also we are moving along diagonal,\nduh, therefore we can deduce the first “position” afterwards by minimal amount of\nsteps to get out of the any column or row, hence std::min(max_x - x, max_y - y).\nFinal position is then computed simply by adding the steps to the beginning of\nthe diagonal.

\n

Now we just need to finish the iterator for the diagonal itself and we're done.

\n

Implementing diagonal_iter

\n

This part is the hardest from all we need to do. It's because of the requirements\nof the std::sort that requires us to implement a random access iterator. I have\nbriefly described it above, and “in a nutshell” it means that we need to implement\nan iterator that can move in constant time along the diagonal in any amount of\nsteps.

\n

Let's go through all of the functionality that our iterator needs to support to\nbe used in std::sort. We need the usual operations like:

\n
    \n
  • equality/inequality
  • \n
  • incrementation
  • \n
  • dereferencing
  • \n
\n

We will also add all the types that our iterator uses with the category of the\niterator, i.e. what interface it supports:

\n
class diagonal_iter {
// we need to keep reference to the matrix itself
matrix_t& m;

// we need to be able to tell our current position
std::size_t x;
std::size_t y;

public:
using difference_type = std::ptrdiff_t;
using value_type = T;
using pointer = T*;
using reference = T&;
using iterator_category = std::random_access_iterator_tag;

diagonal_iter(matrix_t& matrix,
std::size_t x,
std::size_t y)
: m(matrix)
, x(x)
, y(y)
{
}

bool operator==(const diagonal_iter& rhs) const
{
return x == rhs.x && y == rhs.y && m == rhs.m;
}

diagonal_iter& operator++()
{
// we are moving along the diagonal, so we increment both ‹x› and ‹y› at
// the same time
x++;
y++;
return *this;
}

reference operator*() const { return m[y][x]; }
};
\n

This is pretty similar to the previous iterator, but now we need to implement the\nremaining requirements of the random access iterator. Let's see what those are:

\n
    \n
  • decrementation - cause we need to be able to move backwards too, since _random _\naccess iterator extends the interface of bidirectional iterator
  • \n
  • moving the iterator in either direction by steps given as an integer
  • \n
  • being able to tell the distance between two iterators
  • \n
  • define an ordering on the iterators
  • \n
\n

Let's fill them in:

\n
class diagonal_iter {
// we need to keep reference to the matrix itself
matrix_t& m;

// we need to be able to tell our current position
std::size_t x;
std::size_t y;

public:
using difference_type = std::ptrdiff_t;
using value_type = T;
using pointer = T*;
using reference = T&;
using iterator_category = std::random_access_iterator_tag;

diagonal_iter(matrix_t& matrix,
std::size_t x,
std::size_t y)
: m(matrix)
, x(x)
, y(y)
{
}

bool operator==(const diagonal_iter& rhs) const
{
return x == rhs.x && y == rhs.y && m == rhs.m;
}

diagonal_iter& operator++()
{
// we are moving along the diagonal, so we increment both ‹x› and ‹y› at
// the same time
x++;
y++;
return *this;
}

reference operator*() const { return m[y][x]; }

// exactly opposite to the incrementation
diagonal_iter operator--()
{
x--;
y--;
return *this;
}

// moving ‹n› steps back is same as calling decrementation ‹n›-times, so we
// can just return a new iterator and subtract ‹n› from both coordinates in
// the matrix
diagonal_iter operator-(difference_type n) const
{
return diagonal_iter { m, x - n, y - n };
}

// here we assume that we are given two iterators on the same diagonal
difference_type operator-(const diagonal_iter& rhs) const
{
assert(m == rhs.m);
return x - rhs.x;
}

// counterpart of moving ‹n› steps backwards
diagonal_iter operator+(difference_type n) const
{
return diagonal_iter { m, x + n, y + n };
}

// we compare the coordinates, and also assume that those 2 iterators are
// lying on the same diagonal
bool operator<(const diagonal_iter& rhs) const
{
assert(m == rhs.m);
return x < rhs.x && y < rhs.y;
}
};
\n

At this point we could probably try and compile it, right? If we do so, we will\nget yelled at by a compiler for the following reasons:

\n
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1792:11: error: object of type 'diagonal<int>::diagonal_iter' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]
__last = __next;
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1817:11: note: in instantiation of function template specialization 'std::__unguarded_linear_insert<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Val_less_iter>' requested here
std::__unguarded_linear_insert(__i,
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1849:9: note: in instantiation of function template specialization 'std::__insertion_sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__insertion_sort(__first, __first + int(_S_threshold), __comp);
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1940:9: note: in instantiation of function template specialization 'std::__final_insertion_sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__final_insertion_sort(__first, __last, __comp);
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization 'std::__sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());
^
matrix-sort.cpp:161:18: note: in instantiation of function template specialization 'std::sort<diagonal<int>::diagonal_iter>' requested here
std::sort(d.begin(), d.end());
^
matrix-sort.cpp:17:19: note: copy assignment operator of 'diagonal_iter' is implicitly deleted because field 'm' is of reference type 'diagonal<int>::matrix_t &' (aka 'vector<std::vector<int>> &')
matrix_t& m;
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1830:2: error: no matching function for call to '__unguarded_linear_insert' [clang-diagnostic-error]
std::__unguarded_linear_insert(__i,
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1850:9: note: in instantiation of function template specialization 'std::__unguarded_insertion_sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__unguarded_insertion_sort(__first + int(_S_threshold), __last,
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1940:9: note: in instantiation of function template specialization 'std::__final_insertion_sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__final_insertion_sort(__first, __last, __comp);
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization 'std::__sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());
^
matrix-sort.cpp:161:18: note: in instantiation of function template specialization 'std::sort<diagonal<int>::diagonal_iter>' requested here
std::sort(d.begin(), d.end());
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1782:5: note: candidate template ignored: substitution failure [with _RandomAccessIterator = diagonal<int>::diagonal_iter, _Compare = __gnu_cxx::__ops::_Val_less_iter]
__unguarded_linear_insert(_RandomAccessIterator __last,
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1923:11: error: object of type 'diagonal<int>::diagonal_iter' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]
__last = __cut;
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1937:9: note: in instantiation of function template specialization 'std::__introsort_loop<diagonal<int>::diagonal_iter, long, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__introsort_loop(__first, __last,
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization 'std::__sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());
^
matrix-sort.cpp:161:18: note: in instantiation of function template specialization 'std::sort<diagonal<int>::diagonal_iter>' requested here
std::sort(d.begin(), d.end());
^
matrix-sort.cpp:17:19: note: copy assignment operator of 'diagonal_iter' is implicitly deleted because field 'm' is of reference type 'diagonal<int>::matrix_t &' (aka 'vector<std::vector<int>> &')
matrix_t& m;
^
\n

That's a lot of noise, isn't it? Let's focus on the important parts:

\n
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1792:11: error: object of type 'diagonal<int>::diagonal_iter' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]

matrix-sort.cpp:17:19: note: copy assignment operator of 'diagonal_iter' is implicitly deleted because field 'm' is of reference type 'diagonal<int>::matrix_t &' (aka 'vector<std::vector<int>> &')
matrix_t& m;
^
\n

Ah! We have a reference in our iterator, and this prevents us from having a copy\nassignment operator (that is used “somewhere” in the sorting algorithm). Well…\nLet's just wrap it!

\n
# we need to keep a different type than reference
- matrix_t& m;
+ std::reference_wrapper<matrix_t> m;

# in comparison we need to get the reference out of the wrapper first
- return x == rhs.x && y == rhs.y && m == rhs.m;
+ return x == rhs.x && y == rhs.y && m.get() == rhs.m.get();

# same when we return a reference to the “cell” in the matrix
- reference operator*() const { return m[y][x]; }
+ reference operator*() const { return m.get()[y][x]; }

# and finally in the assertions that we set for the “distance” and “less than”
- assert(m == rhs.m);
+ assert(m.get() == rhs.m.get());
\n

We're done now! We have written an iterator over diagonals for a 2D vector. You can have a look at the final result here.

\n

Footnotes

\n
    \n
  1. \n

    just because I'm used to it and don't care about your opinion ;)

    \n
  2. \n
  3. \n

    exercise at your own risk

    \n
  4. \n
  5. \n

    me in 5 minutes in fact, but don't make me scared

    \n
  6. \n
  7. \n

    me in the next section…

    \n
  8. \n
\n
", "url": "https://blog.mfocko.xyz/blog/leetcode/sort-diagonally", "title": "Sort the matrix diagonally", "summary": "Compiler assisted development.", @@ -76,7 +76,7 @@ }, { "id": "https://blog.mfocko.xyz/blog/aoc-2022/2nd-week", - "content_html": "

Let's go through the second week of Advent of Code in Rust.

\n

Day 8: Treetop Tree House

\n
tl;dr

We get a forest and we want to know how many trees are visible from the outside.\nApart from that we want to find the best view.

\n

Nothing interesting. We are moving around 2D map though. And indexing can get a\nbit painful when doing so, let's refactor it a bit ;) During the preparation for\nthe AoC, I have written Vector2D and now it's time to extend it with indexing\nof Vec of Vecs. In my solution I was manipulating with indices in the following\nway:

\n
    \n
  • swapping them
  • \n
  • checking whether they are correct indices for the Vec<Vec<T>>
  • \n
  • indexing Vec<Vec<T>> with them
  • \n
\n
caution

I'm getting familiar with Rust and starting to “abuse” it… While doing so, I'm\nalso uncovering some “features” that I don't really like. Therefore I will mark\nall of my rants with thicc «↯» mark and will try to “lock” them into their\nown “box of hell”.

\n

Swapping indices

\n

Relatively simple implementation, just take the values, swap them and return new\nvector.

\n
impl<T: Copy> Vector2D<T> {
pub fn swap(&self) -> Self {
Self {
x: self.y,
y: self.x,
}
}
}
\n

Pretty straight-forward implementation, but let's talk about the T: Copy. We\nneed to use it, since we are returning a new vector, with swapped values.\nIf we had values that cannot be copied, the only thing we could do, would be a\nvector of references (and it would also introduce a lifetime, to which we'll get\nlater on). This is pretty similar with the operations on sets from the first week.

\n

Indexing Vec

\n

I will start with the indexing, cause bound-checking is a bit more… complicated\nthan I would like to.

\n
pub fn index<'a, T, U>(v: &'a [Vec<U>], idx: &Vector2D<T>) -> &'a U
where
usize: TryFrom<T>,
<usize as TryFrom<T>>::Error: Debug,
T: Copy,
{
let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());
&v[y][x]
}
\n

Let's talk about this mess… Body of the function is probably the most easy part\nand should not be hard to understand, we just take the x and y and convert\nthem both to usize type that can be used later on for indexing.

\n

The type signature of the function is where the fun is at 😉 We are trying\nto convert unknown type to usize, so we must bound the T as a type that can\nbe converted to usize, that's how we got usize: TryFrom<T> which basically\nsays that usize must implement TryFrom<T> trait and therefore allows us to\nconvert the indices to actual usize indices. Using .unwrap() also forces us\nto bound the error that can occur when converting T into usize, that's how\nwe get <usize as TryFrom<T>>::Error: Debug which loosely means

\n
\n

error during conversion of T into usize must implement Debug,\ni.e. can be printed in some way or other

\n
\n

T: Copy is required by .try_into() which takes T by-value.

\n

And now we are left only with the first line of the definition.

\n
note

Skilled Rustaceans might notice that this implementation is rather flaky and can\nbreak in multiple places at once. I'll get back to it…

\n

Let's split it in multiple parts:

\n
    \n
  • v: &'a [Vec<U>] represents the 2D Vec, we are indexing, Vec implements\nSlice trait and clippy recommends using &[T] to &Vec<T>, exact details\nare unknown to me
  • \n
  • idx: &Vector2D<T> represents the indices which we use, we take them by\nreference to avoid an unnecessary copy
  • \n
  • -> &'a U means that we are returning a reference to some value of type U.\nNow the question is what does the 'a mean, we can also see it as a generic\ntype declared along T and U. And the answer is relatively simple, 'a\nrepresents a lifetime. We take the v by a reference and return a reference,\nborrow checker validates all of the borrows (or references), so we need to\nspecify that our returned value has the same lifetime as the vector we have\ntaken by a reference, i.e. returned reference must live at least as long as the\nv. This way we can “be sure” that the returned reference is valid.
  • \n
\n
Issues
\n

First issue that our implementation has is the fact that we cannot get a mutable\nreference out of that function. This could be easily resolved by introducing new\nfunction, e.g. index_mut. Which I have actually done while writing this part:

\n
pub fn index_mut<'a, T, U>(v: &'a mut [Vec<U>], idx: &Vector2D<T>) -> &'a mut U
where
usize: TryFrom<T>,
<usize as TryFrom<T>>::Error: Debug,
T: Copy,
{
let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());
&mut v[y][x]
}
\n
«↯» Why can't we use one function?

When we consider a Vec<T>, we don't need to consider containers as T, Rust\nimplements indexing as traits Index<T> and IndexMut<T> that do the dirty work\nbehind syntactic sugar of container[idx].

However, implementing of traits is not allowed for external types, i.e. types\nthat you haven't defined yourself. This means that you can implement indexing\nover containers that you have implemented yourself, but you cannot use your own\ntypes for indexing “built-in” types.

Another part of this rabbit hole is trait SliceIndex<T> that is of a relevance\nbecause of

impl<T, I> Index<I> for [T]
where
I: SliceIndex<[T]>

impl<T, I, A> Index<I> for Vec<T, A>
where
I: SliceIndex<[T]>,
A: Allocator

impl<T, I, const N: usize> Index<I> for [T; N]
where
[T]: Index<I>

In other words, if your type implements SliceIndex<T> trait, it can be used\nfor indexing. As of now, this trait has all of its required methods experimental\nand is marked as unsafe.

\n

Another problem is a requirement for indexing either [Vec<T>] or Vec<Vec<T>>.\nThis requirement could be countered by removing inner type Vec<T> and constraining\nit by a trait Index (or IndexMut respectively) in a following way

\n
pub fn index<'a, C, T>(v: &'a [C], idx: &Vector2D<T>) -> &'a C::Output
where
usize: TryFrom<T>,
<usize as TryFrom<T>>::Error: Debug,
T: Copy,
C: Index<usize>
{
let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());
&v[y][x]
}
\n

Given this, we can also give a more meaningful typename for indexing type, such\nas I.

\n

Checking bounds

\n

Now we can get to the boundary checks, it is very similar, but a more… dirty.\nFirst approach that came up was to convert the indices in Vector2D to usize,\nbut when you add the indices up, e.g. when checking the neighbors, you can end\nup with negative values which, unlike in C++, causes an error (instead of underflow\nthat you can use to your advantage; you can easily guess how).

\n

So how can we approach this then? Well… we will convert the bounds instead of\nthe indices and that lead us to:

\n
pub fn in_range<T, U>(v: &[Vec<U>], idx: &Vector2D<T>) -> bool
where
usize: TryInto<T>,
<usize as TryInto<T>>::Error: Debug,
T: PartialOrd + Copy,
{
idx.y >= 0.try_into().unwrap()
&& idx.y < v.len().try_into().unwrap()
&& idx.x >= 0.try_into().unwrap()
&& idx.x
< v[TryInto::<usize>::try_into(idx.y).unwrap()]
.len()
.try_into()
.unwrap()
}
\n

You can tell that it's definitely a shitty code. Let's improve it now! We will\nget back to the original idea, but do it better. We know that we cannot convert\nnegative values into usize, but we also know that conversion like that\nreturns a Result<T, E> which we can use to our advantage.

\n
pub fn in_range<T, U>(v: &[Vec<U>], idx: &Vector2D<T>) -> bool
where
T: Copy,
usize: TryFrom<T>,
{
usize::try_from(idx.y)
.and_then(|y| usize::try_from(idx.x).map(|x| y < v.len() && x < v[y].len()))
.unwrap_or(false)
}
\n

Result<T, E> is a type similar to Either in Haskell and it allows us to chain\nmultiple operations on correct results or propagate the original error without\ndoing anything. Let's dissect it one-by-one.

\n

try_from is a method implemented in TryFrom trait, that allows you to convert\ntypes and either successfully convert them or fail (with a reasonable error). This\nmethod returns Result<T, E>.

\n

We call and_then on that result, let's have a look at the type signature of\nand_then, IMO it explains more than enough:

\n
pub fn and_then<U, F>(self, op: F) -> Result<U, E>
where
F: FnOnce(T) -> Result<U, E>
\n

OK… So it takes the result and a function and returns another result with\ndifferent value and different error. However we can see that the function, which\nrepresents an operation on a result, takes just the value, i.e. it doesn't care\nabout any previous error. To make it short:

\n
\n

and_then allows us to run an operation, which can fail, on the correct result

\n
\n

We parsed a y index and now we try to convert the x index with try_from\nagain, but on that result we use map rather than and_then, why would that be?

\n
pub fn map<U, F>(self, op: F) -> Result<U, E>
where
F: FnOnce(T) -> U
\n

Huh… map performs an operation that cannot fail. And finally we use\nunwrap_or which takes the value from result, or in case of an error returns the\ndefault that we define.

\n

How does this work then? If y is negative, the conversion fails and the error\npropagates all the way to unwrap_or, if y can be a correct usize value, then\nwe do the same with x. If x is negative, we propagate the error as with y,\nand if it's not, then we check whether it exceeds the higher bounds or not.

\n

Solution

\n

Relatively simple, you just need follow the rules and not get too smart, otherwise\nit will get back at you.

\n

Day 9: Rope Bridge

\n
tl;dr

We get a rope with knots and we want to track how many different positions are\nvisited with the rope's tail.

\n

By this day, I have come to a conclusion that current skeleton for each day\ngenerates a lot of boilerplate. And even though it can be easily copied, it's\njust a waste of space and unnecessary code. Let's “simplify” this (on one end\nwhile creating monster on the other end). I've gone through what we need in the\npreparations for the AoC. Let's sum up our requirements:

\n
    \n
  • parsing
  • \n
  • part 1 & 2
  • \n
  • running on sample / input
  • \n
  • tests
  • \n
\n

Parsing and implementation of both parts is code that changes each day and we\ncannot do anything about it. However running and testing can be simplified!

\n

Let's introduce and export a new module solution that will take care of all of\nthis. We will start by introducing a trait for each day.

\n
pub trait Solution<Input, Output: Display> {
fn parse_input<P: AsRef<Path>>(pathname: P) -> Input;

fn part_1(input: &Input) -> Output;
fn part_2(input: &Input) -> Output;
}
\n

This does a lot of work for us already, we have defined a trait and for each day\nwe will create a structure representing a specific day. That structure will also\nimplement the Solution trait.

\n

Now we need to get rid of the boilerplate, we can't get rid of the main function,\nbut we can at least move out the functionality.

\n
fn run(type_of_input: &str) -> Result<()>
where
Self: Sized,
{
tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from_default_env())
.with_target(false)
.with_file(true)
.with_line_number(true)
.without_time()
.compact()
.init();
color_eyre::install()?;

let input = Self::parse_input(format!(\"{}s/{}.txt\", type_of_input, Self::day()));

info!(\"Part 1: {}\", Self::part_1(&input));
info!(\"Part 2: {}\", Self::part_2(&input));

Ok(())
}

fn main() -> Result<()>
where
Self: Sized,
{
Self::run(\"input\")
}
\n

This is all part of the Solution trait, which can implement methods while being\ndependent on what is provided by the implementing types. In this case, we just\nneed to bound the Output type to implement Display that is necessary for the\ninfo! and format string there.

\n

Now we can get to first of the nasty things we are going to do… And it is the\nday() method that you can see being used when constructing path to the input\nfile. That method will generate a name of the file, e.g. day01 and we know that\nwe can somehow deduce it from the structure name, given we name it reasonably.

\n
fn day() -> String {
let mut day = String::from(type_name::<Self>().split(\"::\").next().unwrap());
day.make_ascii_lowercase();

day.to_string()
}
\n
type_name

This feature is still experimental and considered to be internal, it is not\nadvised to use it any production code.

\n

And now we can get to the nastiest stuff 😩 We will generate the tests!

\n

We want to be able to generate tests for sample input in a following way:

\n
test_sample!(day_01, Day01, 42, 69);
\n

There's not much we can do, so we will write a macro to generate the tests for us.

\n
#[macro_export]
macro_rules! test_sample {
($mod_name:ident, $day_struct:tt, $part_1:expr, $part_2:expr) => {
#[cfg(test)]
mod $mod_name {
use super::*;

#[test]
fn test_part_1() {
let sample =
$day_struct::parse_input(&format!(\"samples/{}.txt\", $day_struct::day()));
assert_eq!($day_struct::part_1(&sample), $part_1);
}

#[test]
fn test_part_2() {
let sample =
$day_struct::parse_input(&format!(\"samples/{}.txt\", $day_struct::day()));
assert_eq!($day_struct::part_2(&sample), $part_2);
}
}
};
}
\n

We have used it in a similar way as macros in C/C++, one of the things that we\ncan use to our advantage is defining “type” of the parameters for the macro. All\nparameters have their name prefixed with $ sign and you can define various “forms”\nof your macro. Let's go through it!

\n

We have following parameters:

\n
    \n
  • $mod_name which represents the name for the module with tests, it is typed\nwith ident which means that we want a valid identifier to be passed in.
  • \n
  • $day_struct represents the structure that will be used for tests, it is typed\nwith tt which represents a token tree, in our case it is a type.
  • \n
  • $part_X represents the expected output for the Xth part and is of type expr\nwhich literally means an expression.
  • \n
\n

Apart from that we need to use #[macro_export] to mark the macro as exported\nfor usage outside of the module. Now our skeleton looks like:

\n
use aoc_2022::*;

type Input = String;
type Output = String;

struct DayXX;
impl Solution<Input, Output> for DayXX {
fn parse_input<P: AsRef<Path>>(pathname: P) -> Input {
file_to_string(pathname)
}

fn part_1(input: &Input) -> Output {
todo!()
}

fn part_2(input: &Input) -> Output {
todo!()
}
}

fn main() -> Result<()> {
// DayXX::run(\"sample\")
DayXX::main()
}

// test_sample!(day_XX, DayXX, , );
\n

Solution

\n

Not much to talk about, it is relatively easy to simulate.

\n

Day 10: Cathode-Ray Tube

\n
tl;dr

Emulating basic arithmetic operations on a CPU and drawing on CRT based on the\nCPU's accumulator.

\n

In this day I have discovered an issue with my design of the Solution trait.\nAnd the issue is caused by different types of Output for the part 1 and part 2.

\n

Problem is relatively simple and consists of simulating a CPU, I have approached\nit in a following way:

\n
fn evaluate_instructions(instructions: &[Instruction], mut out: Output) -> Output {
instructions
.iter()
.fold(State::new(), |state, instruction| {
state.execute(instruction, &mut out)
});

out
}
\n

We just take the instructions, we have some state of the CPU and we execute the\ninstructions one-by-one. Perfect usage of the fold (or reduce as you may know\nit from other languages).

\n

You can also see that we have an Output type, so the question is how can we fix\nthat problem. And the answer is very simple and functional. Rust allows you to\nhave an enumeration that can bear some other values apart from the type itself.

\n
tip

We could've seen something like this with the Result<T, E> type that can be\ndefined as

enum Result<T, E> {
Ok(T),
Err(E)
}
What does that mean though?

When we have an Ok value, it has the result itself, and when we get an Err\nvalue, it has the error. This also allows us to handle results in a rather\npretty way:

match do_something(x) {
Ok(y) => {
println!(\"SUCCESS: {}\", y);
},
Err(y) => {
eprintln!(\"ERROR: {}\", y);
}
}
\n

My solution has a following outline:

\n
fn execute(&self, i: &Instruction, output: &mut Output) -> State {
// execute the instruction

// collect results if necessary
match output {
Output::Part1(x) => self.execute_part_1(y, x),
Output::Part2(x) => self.execute_part_2(y, x),
}

// return the obtained state
new_state
}
\n

You might think that it's a perfectly reasonable thing to do. Yes, but notice\nthat the match statement doesn't collect the changes in any way and also we\npass output by &mut, so it is shared across each iteration of the fold.

\n

The dirty and ingenious thing is that xs are passed by &mut too and therefore\nthey are directly modified by the helper functions. To sum it up and let it sit

\n
\n

We are collecting the result into an enumeration that is shared\nacross all iterations of fold.

\n
\n

Solution

\n

Similar to Day 9, but there are some technical details that can get you.

\n

Day 11: Monkey in the Middle

\n
tl;dr

Simulation of monkeys throwing stuff around and measuring your stress levels\nwhile your stuff is being passed around.

\n

I think I decided to use regular expressions here for the first time, cause\nparsing the input was a pain.

\n

Also I didn't expect to implement Euclidean algorithm in Rust…

\n

Solution

\n

Again, we're just running a simulation. Though I must admit it was very easy to\nmake a small technical mistakes that could affect the final results very late.

\n

Day 12: Hill Climbing Algorithm

\n
tl;dr

Finding shortest path up the hill and also shortest path down to the ground while\nalso rolling down the hill…

\n

As I have said in the tl;dr, we are looking for the shortest path, but the start\nand goal differ for the part 1 and 2. So I have decided to refactor my solution\nto a BFS algorithm that takes necessary parameters via functions:

\n
fn bfs<F, G>(
graph: &[Vec<char>], start: &Position, has_edge: F, is_target: G
) -> Option<usize>
where
F: Fn(&[Vec<char>], &Position, &Position) -> bool,
G: Fn(&[Vec<char>], &Position) -> bool
\n

We pass the initial vertex from the caller and everything else is left to the BFS\nalgorithm, based on the has_edge and is_target functions.

\n

This was easy! And that is not very usual in Rust once you want to pass around\nfunctions. 👀

\n

Solution

\n

Looking for the shortest path… Must be Dijkstra, right? Nope! Half of the\nReddit got jebaited though. In all fairness, nothing stops you from implementing\nthe Dijkstra's algorithm for finding the shortest path, but if you know that\nall connected vertices are in a unit (actually d=1d = 1d=1) distance from each other,\nthen you know that running Dijkstra is equivalent to running BFS, only with worse\ntime complexity, because of the priority heap instead of the queue.

\n

Day 13: Distress Signal

\n
tl;dr

Processing packets with structured data from the distress signal.

\n

You can implement a lot of traits if you want to. It is imperative to implement\nordering on the packets. I had a typo, so I also proceeded to implement a Display\ntrait for debugging purposes:

\n
impl Display for Packet {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Packet::Integer(x) => write!(f, \"{x}\"),
Packet::List(lst) => write!(f, \"[{}]\", lst.iter().map(|p| format!(\"{p}\")).join(\",\")),
}
}
}
\n

Solution

\n

A lot of technical details… Parsing is nasty too…

\n

Day 14: Regolith Reservoir

\n
tl;dr

Let's simulate falling sand grain-by-grain.

\n

Again, both parts are relatively similar with minimal changes, so it is a good\nidea to refactor it a bit. Similar approach to the BFS above. Also this is the\nfirst day where I ran into efficiency issues and had to redo my solution to speed\nit up just a bit.

\n

Solution

\n

Tedious.

\n

Post Mortem

\n

Indexing

\n

I was asked about the indexing after publishing the blog. And truly it is rather\ncomplicated topic, especially after releasing SliceIndex<I> trait. I couldn't\nleave it be, so I tried to implement the Index and IndexMut trait.

\n
note

I have also mentioned that the SliceIndex trait is unsafe, but truth be told,\nonly unsafe part are the 2 methods that are named *unchecked*. Anyways, I will\nbe implementing the Index* traits for now, rather than the SliceIndex.

\n

It's relatively straightforward…

\n
impl<I, C> Index<Vector2D<I>> for [C]
where
I: Copy + TryInto<usize>,
<I as TryInto<usize>>::Error: Debug,
C: Index<usize>,
{
type Output = C::Output;

fn index(&self, index: Vector2D<I>) -> &Self::Output {
let (x, y): (usize, usize) =
(index.x.try_into().unwrap(), index.y.try_into().unwrap());
&self[y][x]
}
}

impl<I, C> IndexMut<Vector2D<I>> for [C]
where
I: Copy + TryInto<usize>,
<I as TryInto<usize>>::Error: Debug,
C: IndexMut<usize>,
{
fn index_mut(&mut self, index: Vector2D<I>) -> &mut Self::Output {
let (x, y): (usize, usize) =
(index.x.try_into().unwrap(), index.y.try_into().unwrap());
&mut self[y][x]
}
}
\n

We can see a lot of similarities to the implementation of index and index_mut\nfunctions. In the end, they are 1:1, just wrapped in the trait that provides a\nsyntax sugar for container[idx].

\n
note

I have also switched from using the TryFrom to TryInto trait, since it better\nmatches what we are using, the .try_into rather than usize::try_from.

Also implementing TryFrom automatically provides you with a TryInto trait,\nsince it is relatively easy to implement. Just compare the following:

pub trait TryFrom<T>: Sized {
type Error;

fn try_from(value: T) -> Result<Self, Self::Error>;
}

pub trait TryInto<T>: Sized {
type Error;

fn try_into(self) -> Result<T, Self::Error>;
}
\n

OK, so we have our trait implemented, we should be able to use container[index],\nright? Yes… but actually no 😦

\n
error[E0277]: the type `[std::vec::Vec<i8>]` cannot be indexed by `aoc_2022::Vector2D<usize>`
--> src/bin/day08.rs:26:18
|
26 | if trees[pos] > tallest {
| ^^^ slice indices are of type `usize` or ranges of `usize`
|
= help: the trait `std::slice::SliceIndex<[std::vec::Vec<i8>]>` is not implemented for `aoc_2022::Vector2D<usize>`
= note: required for `std::vec::Vec<std::vec::Vec<i8>>` to implement `std::ops::Index<aoc_2022::Vector2D<usize>>`

error[E0277]: the type `[std::vec::Vec<i8>]` cannot be indexed by `aoc_2022::Vector2D<usize>`
--> src/bin/day08.rs:30:28
|
30 | max(tallest, trees[pos])
| ^^^ slice indices are of type `usize` or ranges of `usize`
|
= help: the trait `std::slice::SliceIndex<[std::vec::Vec<i8>]>` is not implemented for `aoc_2022::Vector2D<usize>`
= note: required for `std::vec::Vec<std::vec::Vec<i8>>` to implement `std::ops::Index<aoc_2022::Vector2D<usize>>`

error[E0277]: the type `[std::vec::Vec<i8>]` cannot be indexed by `aoc_2022::Vector2D<isize>`
--> src/bin/day08.rs:52:28
|
52 | let max_height = trees[position];
| ^^^^^^^^ slice indices are of type `usize` or ranges of `usize`
|
= help: the trait `std::slice::SliceIndex<[std::vec::Vec<i8>]>` is not implemented for `aoc_2022::Vector2D<isize>`
= note: required for `std::vec::Vec<std::vec::Vec<i8>>` to implement `std::ops::Index<aoc_2022::Vector2D<isize>>`
\n

Why? We have it implemented for the slices ([C]), why doesn't it work? Well,\nthe fun part consists of the fact that in other place, where we were using it,\nwe were passing the &[Vec<T>], but this is coming from a helper functions that\ntake &Vec<Vec<T>> instead. And… we don't implement Index and IndexMut for\nthose. Just for the slices. 🤯 What are we going to do about it?

\n

We can either start copy-pasting or be smarter about it… I choose to be smarter,\nso let's implement a macro! The only difference across the implementations are\nthe types of the outer containers. Implementation doesn't differ at all!

\n

Implementing the macro can be done in a following way:

\n
macro_rules! generate_indices {
($container:ty) => {
impl<I, C> Index<Vector2D<I>> for $container
where
I: Copy + TryInto<usize>,
<I as TryInto<usize>>::Error: Debug,
C: Index<usize>,
{
type Output = C::Output;

fn index(&self, index: Vector2D<I>) -> &Self::Output {
let (x, y): (usize, usize) =
(index.x.try_into().unwrap(), index.y.try_into().unwrap());
&self[y][x]
}
}

impl<I, C> IndexMut<Vector2D<I>> for $container
where
I: Copy + TryInto<usize>,
<I as TryInto<usize>>::Error: Debug,
C: IndexMut<usize>,
{
fn index_mut(&mut self, index: Vector2D<I>) -> &mut Self::Output {
let (x, y): (usize, usize) =
(index.x.try_into().unwrap(), index.y.try_into().unwrap());
&mut self[y][x]
}
}
};
}
\n

And now we can simply do

\n
generate_indices!(VecDeque<C>);
generate_indices!([C]);
generate_indices!(Vec<C>);
// generate_indices!([C; N], const N: usize);
\n

The last type (I took the inspiration from the implementations of the Index and\nIndexMut traits) is a bit problematic, because of the const N: usize part,\nwhich I haven't managed to be able to parse. And that's how I got rid of the error.

\n
note

If I were to use 2D-indexing over [C; N] slices, I'd probably just go with the\ncopy-paste, cause the cost of this “monstrosity” outweighs the benefits of no DRY.

\n

Cause of the problem

\n

This issue is relatively funny. If you don't use any type aliases, just the raw\ntypes, you'll get suggested certain changes by the clippy. For example if you\nconsider the following piece of code

\n
fn get_sum(nums: &Vec<i32>) -> i32 {
nums.iter().sum()
}

fn main() {
let nums = vec![1, 2, 3];
println!(\"Sum: {}\", get_sum(&nums));
}
\n

and you run clippy on it, you will get

\n
Checking playground v0.0.1 (/playground)
warning: writing `&Vec` instead of `&[_]` involves a new object where a slice will do
--> src/main.rs:1:18
|
1 | fn get_sum(nums: &Vec<i32>) -> i32 {
| ^^^^^^^^^ help: change this to: `&[i32]`
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg
= note: `#[warn(clippy::ptr_arg)]` on by default

warning: `playground` (bin \"playground\") generated 1 warning
Finished dev [unoptimized + debuginfo] target(s) in 0.61s
\n

However, if you introduce a type alias, such as

\n
type Numbers = Vec<i32>;
\n

Then clippy won't say anything, cause there is literally nothing to suggest.\nHowever the outcome is not the same…

", + "content_html": "

Let's go through the second week of Advent of Code in Rust.

\n

Day 8: Treetop Tree House

\n
tl;dr

We get a forest and we want to know how many trees are visible from the outside.\nApart from that we want to find the best view.

\n

Nothing interesting. We are moving around 2D map though. And indexing can get a\nbit painful when doing so, let's refactor it a bit ;) During the preparation for\nthe AoC, I have written Vector2D and now it's time to extend it with indexing\nof Vec of Vecs. In my solution I was manipulating with indices in the following\nway:

\n
    \n
  • swapping them
  • \n
  • checking whether they are correct indices for the Vec<Vec<T>>
  • \n
  • indexing Vec<Vec<T>> with them
  • \n
\n
caution

I'm getting familiar with Rust and starting to “abuse” it… While doing so, I'm\nalso uncovering some “features” that I don't really like. Therefore I will mark\nall of my rants with thicc «↯» mark and will try to “lock” them into their\nown “box of hell”.

\n

Swapping indices

\n

Relatively simple implementation, just take the values, swap them and return new\nvector.

\n
impl<T: Copy> Vector2D<T> {
pub fn swap(&self) -> Self {
Self {
x: self.y,
y: self.x,
}
}
}
\n

Pretty straight-forward implementation, but let's talk about the T: Copy. We\nneed to use it, since we are returning a new vector, with swapped values.\nIf we had values that cannot be copied, the only thing we could do, would be a\nvector of references (and it would also introduce a lifetime, to which we'll get\nlater on). This is pretty similar with the operations on sets from the first week.

\n

Indexing Vec

\n

I will start with the indexing, cause bound-checking is a bit more… complicated\nthan I would like to.

\n
pub fn index<'a, T, U>(v: &'a [Vec<U>], idx: &Vector2D<T>) -> &'a U
where
usize: TryFrom<T>,
<usize as TryFrom<T>>::Error: Debug,
T: Copy,
{
let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());
&v[y][x]
}
\n

Let's talk about this mess… Body of the function is probably the most easy part\nand should not be hard to understand, we just take the x and y and convert\nthem both to usize type that can be used later on for indexing.

\n

The type signature of the function is where the fun is at 😉 We are trying\nto convert unknown type to usize, so we must bound the T as a type that can\nbe converted to usize, that's how we got usize: TryFrom<T> which basically\nsays that usize must implement TryFrom<T> trait and therefore allows us to\nconvert the indices to actual usize indices. Using .unwrap() also forces us\nto bound the error that can occur when converting T into usize, that's how\nwe get <usize as TryFrom<T>>::Error: Debug which loosely means

\n
\n

error during conversion of T into usize must implement Debug,\ni.e. can be printed in some way or other

\n
\n

T: Copy is required by .try_into() which takes T by-value.

\n

And now we are left only with the first line of the definition.

\n
note

Skilled Rustaceans might notice that this implementation is rather flaky and can\nbreak in multiple places at once. I'll get back to it…

\n

Let's split it in multiple parts:

\n
    \n
  • v: &'a [Vec<U>] represents the 2D Vec, we are indexing, Vec implements\nSlice trait and clippy recommends using &[T] to &Vec<T>, exact details\nare unknown to me
  • \n
  • idx: &Vector2D<T> represents the indices which we use, we take them by\nreference to avoid an unnecessary copy
  • \n
  • -> &'a U means that we are returning a reference to some value of type U.\nNow the question is what does the 'a mean, we can also see it as a generic\ntype declared along T and U. And the answer is relatively simple, 'a\nrepresents a lifetime. We take the v by a reference and return a reference,\nborrow checker validates all of the borrows (or references), so we need to\nspecify that our returned value has the same lifetime as the vector we have\ntaken by a reference, i.e. returned reference must live at least as long as the\nv. This way we can “be sure” that the returned reference is valid.
  • \n
\n
Issues
\n

First issue that our implementation has is the fact that we cannot get a mutable\nreference out of that function. This could be easily resolved by introducing new\nfunction, e.g. index_mut. Which I have actually done while writing this part:

\n
pub fn index_mut<'a, T, U>(v: &'a mut [Vec<U>], idx: &Vector2D<T>) -> &'a mut U
where
usize: TryFrom<T>,
<usize as TryFrom<T>>::Error: Debug,
T: Copy,
{
let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());
&mut v[y][x]
}
\n
«↯» Why can't we use one function?

When we consider a Vec<T>, we don't need to consider containers as T, Rust\nimplements indexing as traits Index<T> and IndexMut<T> that do the dirty work\nbehind syntactic sugar of container[idx].

However, implementing of traits is not allowed for external types, i.e. types\nthat you haven't defined yourself. This means that you can implement indexing\nover containers that you have implemented yourself, but you cannot use your own\ntypes for indexing “built-in” types.

Another part of this rabbit hole is trait SliceIndex<T> that is of a relevance\nbecause of

impl<T, I> Index<I> for [T]
where
I: SliceIndex<[T]>

impl<T, I, A> Index<I> for Vec<T, A>
where
I: SliceIndex<[T]>,
A: Allocator

impl<T, I, const N: usize> Index<I> for [T; N]
where
[T]: Index<I>

In other words, if your type implements SliceIndex<T> trait, it can be used\nfor indexing. As of now, this trait has all of its required methods experimental\nand is marked as unsafe.

\n

Another problem is a requirement for indexing either [Vec<T>] or Vec<Vec<T>>.\nThis requirement could be countered by removing inner type Vec<T> and constraining\nit by a trait Index (or IndexMut respectively) in a following way

\n
pub fn index<'a, C, T>(v: &'a [C], idx: &Vector2D<T>) -> &'a C::Output
where
usize: TryFrom<T>,
<usize as TryFrom<T>>::Error: Debug,
T: Copy,
C: Index<usize>
{
let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());
&v[y][x]
}
\n

Given this, we can also give a more meaningful typename for indexing type, such\nas I.

\n

Checking bounds

\n

Now we can get to the boundary checks, it is very similar, but a more… dirty.\nFirst approach that came up was to convert the indices in Vector2D to usize,\nbut when you add the indices up, e.g. when checking the neighbors, you can end\nup with negative values which, unlike in C++, causes an error (instead of underflow\nthat you can use to your advantage; you can easily guess how).

\n

So how can we approach this then? Well… we will convert the bounds instead of\nthe indices and that lead us to:

\n
pub fn in_range<T, U>(v: &[Vec<U>], idx: &Vector2D<T>) -> bool
where
usize: TryInto<T>,
<usize as TryInto<T>>::Error: Debug,
T: PartialOrd + Copy,
{
idx.y >= 0.try_into().unwrap()
&& idx.y < v.len().try_into().unwrap()
&& idx.x >= 0.try_into().unwrap()
&& idx.x
< v[TryInto::<usize>::try_into(idx.y).unwrap()]
.len()
.try_into()
.unwrap()
}
\n

You can tell that it's definitely a shitty code. Let's improve it now! We will\nget back to the original idea, but do it better. We know that we cannot convert\nnegative values into usize, but we also know that conversion like that\nreturns a Result<T, E> which we can use to our advantage.

\n
pub fn in_range<T, U>(v: &[Vec<U>], idx: &Vector2D<T>) -> bool
where
T: Copy,
usize: TryFrom<T>,
{
usize::try_from(idx.y)
.and_then(|y| usize::try_from(idx.x).map(|x| y < v.len() && x < v[y].len()))
.unwrap_or(false)
}
\n

Result<T, E> is a type similar to Either in Haskell and it allows us to chain\nmultiple operations on correct results or propagate the original error without\ndoing anything. Let's dissect it one-by-one.

\n

try_from is a method implemented in TryFrom trait, that allows you to convert\ntypes and either successfully convert them or fail (with a reasonable error). This\nmethod returns Result<T, E>.

\n

We call and_then on that result, let's have a look at the type signature of\nand_then, IMO it explains more than enough:

\n
pub fn and_then<U, F>(self, op: F) -> Result<U, E>
where
F: FnOnce(T) -> Result<U, E>
\n

OK… So it takes the result and a function and returns another result with\ndifferent value and different error. However we can see that the function, which\nrepresents an operation on a result, takes just the value, i.e. it doesn't care\nabout any previous error. To make it short:

\n
\n

and_then allows us to run an operation, which can fail, on the correct result

\n
\n

We parsed a y index and now we try to convert the x index with try_from\nagain, but on that result we use map rather than and_then, why would that be?

\n
pub fn map<U, F>(self, op: F) -> Result<U, E>
where
F: FnOnce(T) -> U
\n

Huh… map performs an operation that cannot fail. And finally we use\nunwrap_or which takes the value from result, or in case of an error returns the\ndefault that we define.

\n

How does this work then? If y is negative, the conversion fails and the error\npropagates all the way to unwrap_or, if y can be a correct usize value, then\nwe do the same with x. If x is negative, we propagate the error as with y,\nand if it's not, then we check whether it exceeds the higher bounds or not.

\n

Solution

\n

Relatively simple, you just need follow the rules and not get too smart, otherwise\nit will get back at you.

\n

Day 9: Rope Bridge

\n
tl;dr

We get a rope with knots and we want to track how many different positions are\nvisited with the rope's tail.

\n

By this day, I have come to a conclusion that current skeleton for each day\ngenerates a lot of boilerplate. And even though it can be easily copied, it's\njust a waste of space and unnecessary code. Let's “simplify” this (on one end\nwhile creating monster on the other end). I've gone through what we need in the\npreparations for the AoC. Let's sum up our requirements:

\n
    \n
  • parsing
  • \n
  • part 1 & 2
  • \n
  • running on sample / input
  • \n
  • tests
  • \n
\n

Parsing and implementation of both parts is code that changes each day and we\ncannot do anything about it. However running and testing can be simplified!

\n

Let's introduce and export a new module solution that will take care of all of\nthis. We will start by introducing a trait for each day.

\n
pub trait Solution<Input, Output: Display> {
fn parse_input<P: AsRef<Path>>(pathname: P) -> Input;

fn part_1(input: &Input) -> Output;
fn part_2(input: &Input) -> Output;
}
\n

This does a lot of work for us already, we have defined a trait and for each day\nwe will create a structure representing a specific day. That structure will also\nimplement the Solution trait.

\n

Now we need to get rid of the boilerplate, we can't get rid of the main function,\nbut we can at least move out the functionality.

\n
fn run(type_of_input: &str) -> Result<()>
where
Self: Sized,
{
tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from_default_env())
.with_target(false)
.with_file(true)
.with_line_number(true)
.without_time()
.compact()
.init();
color_eyre::install()?;

let input = Self::parse_input(format!(\"{}s/{}.txt\", type_of_input, Self::day()));

info!(\"Part 1: {}\", Self::part_1(&input));
info!(\"Part 2: {}\", Self::part_2(&input));

Ok(())
}

fn main() -> Result<()>
where
Self: Sized,
{
Self::run(\"input\")
}
\n

This is all part of the Solution trait, which can implement methods while being\ndependent on what is provided by the implementing types. In this case, we just\nneed to bound the Output type to implement Display that is necessary for the\ninfo! and format string there.

\n

Now we can get to first of the nasty things we are going to do… And it is the\nday() method that you can see being used when constructing path to the input\nfile. That method will generate a name of the file, e.g. day01 and we know that\nwe can somehow deduce it from the structure name, given we name it reasonably.

\n
fn day() -> String {
let mut day = String::from(type_name::<Self>().split(\"::\").next().unwrap());
day.make_ascii_lowercase();

day.to_string()
}
\n
type_name

This feature is still experimental and considered to be internal, it is not\nadvised to use it any production code.

\n

And now we can get to the nastiest stuff 😩 We will generate the tests!

\n

We want to be able to generate tests for sample input in a following way:

\n
test_sample!(day_01, Day01, 42, 69);
\n

There's not much we can do, so we will write a macro to generate the tests for us.

\n
#[macro_export]
macro_rules! test_sample {
($mod_name:ident, $day_struct:tt, $part_1:expr, $part_2:expr) => {
#[cfg(test)]
mod $mod_name {
use super::*;

#[test]
fn test_part_1() {
let sample =
$day_struct::parse_input(&format!(\"samples/{}.txt\", $day_struct::day()));
assert_eq!($day_struct::part_1(&sample), $part_1);
}

#[test]
fn test_part_2() {
let sample =
$day_struct::parse_input(&format!(\"samples/{}.txt\", $day_struct::day()));
assert_eq!($day_struct::part_2(&sample), $part_2);
}
}
};
}
\n

We have used it in a similar way as macros in C/C++, one of the things that we\ncan use to our advantage is defining “type” of the parameters for the macro. All\nparameters have their name prefixed with $ sign and you can define various “forms”\nof your macro. Let's go through it!

\n

We have following parameters:

\n
    \n
  • $mod_name which represents the name for the module with tests, it is typed\nwith ident which means that we want a valid identifier to be passed in.
  • \n
  • $day_struct represents the structure that will be used for tests, it is typed\nwith tt which represents a token tree, in our case it is a type.
  • \n
  • $part_X represents the expected output for the Xth part and is of type expr\nwhich literally means an expression.
  • \n
\n

Apart from that we need to use #[macro_export] to mark the macro as exported\nfor usage outside of the module. Now our skeleton looks like:

\n
use aoc_2022::*;

type Input = String;
type Output = String;

struct DayXX;
impl Solution<Input, Output> for DayXX {
fn parse_input<P: AsRef<Path>>(pathname: P) -> Input {
file_to_string(pathname)
}

fn part_1(input: &Input) -> Output {
todo!()
}

fn part_2(input: &Input) -> Output {
todo!()
}
}

fn main() -> Result<()> {
// DayXX::run(\"sample\")
DayXX::main()
}

// test_sample!(day_XX, DayXX, , );
\n

Solution

\n

Not much to talk about, it is relatively easy to simulate.

\n

Day 10: Cathode-Ray Tube

\n
tl;dr

Emulating basic arithmetic operations on a CPU and drawing on CRT based on the\nCPU's accumulator.

\n

In this day I have discovered an issue with my design of the Solution trait.\nAnd the issue is caused by different types of Output for the part 1 and part 2.

\n

Problem is relatively simple and consists of simulating a CPU, I have approached\nit in a following way:

\n
fn evaluate_instructions(instructions: &[Instruction], mut out: Output) -> Output {
instructions
.iter()
.fold(State::new(), |state, instruction| {
state.execute(instruction, &mut out)
});

out
}
\n

We just take the instructions, we have some state of the CPU and we execute the\ninstructions one-by-one. Perfect usage of the fold (or reduce as you may know\nit from other languages).

\n

You can also see that we have an Output type, so the question is how can we fix\nthat problem. And the answer is very simple and functional. Rust allows you to\nhave an enumeration that can bear some other values apart from the type itself.

\n
tip

We could've seen something like this with the Result<T, E> type that can be\ndefined as

enum Result<T, E> {
Ok(T),
Err(E)
}
What does that mean though?

When we have an Ok value, it has the result itself, and when we get an Err\nvalue, it has the error. This also allows us to handle results in a rather\npretty way:

match do_something(x) {
Ok(y) => {
println!(\"SUCCESS: {}\", y);
},
Err(y) => {
eprintln!(\"ERROR: {}\", y);
}
}
\n

My solution has a following outline:

\n
fn execute(&self, i: &Instruction, output: &mut Output) -> State {
// execute the instruction

// collect results if necessary
match output {
Output::Part1(x) => self.execute_part_1(y, x),
Output::Part2(x) => self.execute_part_2(y, x),
}

// return the obtained state
new_state
}
\n

You might think that it's a perfectly reasonable thing to do. Yes, but notice\nthat the match statement doesn't collect the changes in any way and also we\npass output by &mut, so it is shared across each iteration of the fold.

\n

The dirty and ingenious thing is that xs are passed by &mut too and therefore\nthey are directly modified by the helper functions. To sum it up and let it sit

\n
\n

We are collecting the result into an enumeration that is shared\nacross all iterations of fold.

\n
\n

Solution

\n

Similar to Day 9, but there are some technical details that can get you.

\n

Day 11: Monkey in the Middle

\n
tl;dr

Simulation of monkeys throwing stuff around and measuring your stress levels\nwhile your stuff is being passed around.

\n

I think I decided to use regular expressions here for the first time, cause\nparsing the input was a pain.

\n

Also I didn't expect to implement Euclidean algorithm in Rust…

\n

Solution

\n

Again, we're just running a simulation. Though I must admit it was very easy to\nmake a small technical mistakes that could affect the final results very late.

\n

Day 12: Hill Climbing Algorithm

\n
tl;dr

Finding shortest path up the hill and also shortest path down to the ground while\nalso rolling down the hill…

\n

As I have said in the tl;dr, we are looking for the shortest path, but the start\nand goal differ for the part 1 and 2. So I have decided to refactor my solution\nto a BFS algorithm that takes necessary parameters via functions:

\n
fn bfs<F, G>(
graph: &[Vec<char>], start: &Position, has_edge: F, is_target: G
) -> Option<usize>
where
F: Fn(&[Vec<char>], &Position, &Position) -> bool,
G: Fn(&[Vec<char>], &Position) -> bool
\n

We pass the initial vertex from the caller and everything else is left to the BFS\nalgorithm, based on the has_edge and is_target functions.

\n

This was easy! And that is not very usual in Rust once you want to pass around\nfunctions. 👀

\n

Solution

\n

Looking for the shortest path… Must be Dijkstra, right? Nope! Half of the\nReddit got jebaited though. In all fairness, nothing stops you from implementing\nthe Dijkstra's algorithm for finding the shortest path, but if you know that\nall connected vertices are in a unit (actually d=1d = 1d=1) distance from each other,\nthen you know that running Dijkstra is equivalent to running BFS, only with worse\ntime complexity, because of the priority heap instead of the queue.

\n

Day 13: Distress Signal

\n
tl;dr

Processing packets with structured data from the distress signal.

\n

You can implement a lot of traits if you want to. It is imperative to implement\nordering on the packets. I had a typo, so I also proceeded to implement a Display\ntrait for debugging purposes:

\n
impl Display for Packet {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Packet::Integer(x) => write!(f, \"{x}\"),
Packet::List(lst) => write!(f, \"[{}]\", lst.iter().map(|p| format!(\"{p}\")).join(\",\")),
}
}
}
\n

Solution

\n

A lot of technical details… Parsing is nasty too…

\n

Day 14: Regolith Reservoir

\n
tl;dr

Let's simulate falling sand grain-by-grain.

\n

Again, both parts are relatively similar with minimal changes, so it is a good\nidea to refactor it a bit. Similar approach to the BFS above. Also this is the\nfirst day where I ran into efficiency issues and had to redo my solution to speed\nit up just a bit.

\n

Solution

\n

Tedious.

\n

Post Mortem

\n

Indexing

\n

I was asked about the indexing after publishing the blog. And truly it is rather\ncomplicated topic, especially after releasing SliceIndex<I> trait. I couldn't\nleave it be, so I tried to implement the Index and IndexMut trait.

\n
note

I have also mentioned that the SliceIndex trait is unsafe, but truth be told,\nonly unsafe part are the 2 methods that are named *unchecked*. Anyways, I will\nbe implementing the Index* traits for now, rather than the SliceIndex.

\n

It's relatively straightforward…

\n
impl<I, C> Index<Vector2D<I>> for [C]
where
I: Copy + TryInto<usize>,
<I as TryInto<usize>>::Error: Debug,
C: Index<usize>,
{
type Output = C::Output;

fn index(&self, index: Vector2D<I>) -> &Self::Output {
let (x, y): (usize, usize) =
(index.x.try_into().unwrap(), index.y.try_into().unwrap());
&self[y][x]
}
}

impl<I, C> IndexMut<Vector2D<I>> for [C]
where
I: Copy + TryInto<usize>,
<I as TryInto<usize>>::Error: Debug,
C: IndexMut<usize>,
{
fn index_mut(&mut self, index: Vector2D<I>) -> &mut Self::Output {
let (x, y): (usize, usize) =
(index.x.try_into().unwrap(), index.y.try_into().unwrap());
&mut self[y][x]
}
}
\n

We can see a lot of similarities to the implementation of index and index_mut\nfunctions. In the end, they are 1:1, just wrapped in the trait that provides a\nsyntax sugar for container[idx].

\n
note

I have also switched from using the TryFrom to TryInto trait, since it better\nmatches what we are using, the .try_into rather than usize::try_from.

Also implementing TryFrom automatically provides you with a TryInto trait,\nsince it is relatively easy to implement. Just compare the following:

pub trait TryFrom<T>: Sized {
type Error;

fn try_from(value: T) -> Result<Self, Self::Error>;
}

pub trait TryInto<T>: Sized {
type Error;

fn try_into(self) -> Result<T, Self::Error>;
}
\n

OK, so we have our trait implemented, we should be able to use container[index],\nright? Yes… but actually no 😦

\n
error[E0277]: the type `[std::vec::Vec<i8>]` cannot be indexed by `aoc_2022::Vector2D<usize>`
--> src/bin/day08.rs:26:18
|
26 | if trees[pos] > tallest {
| ^^^ slice indices are of type `usize` or ranges of `usize`
|
= help: the trait `std::slice::SliceIndex<[std::vec::Vec<i8>]>` is not implemented for `aoc_2022::Vector2D<usize>`
= note: required for `std::vec::Vec<std::vec::Vec<i8>>` to implement `std::ops::Index<aoc_2022::Vector2D<usize>>`

error[E0277]: the type `[std::vec::Vec<i8>]` cannot be indexed by `aoc_2022::Vector2D<usize>`
--> src/bin/day08.rs:30:28
|
30 | max(tallest, trees[pos])
| ^^^ slice indices are of type `usize` or ranges of `usize`
|
= help: the trait `std::slice::SliceIndex<[std::vec::Vec<i8>]>` is not implemented for `aoc_2022::Vector2D<usize>`
= note: required for `std::vec::Vec<std::vec::Vec<i8>>` to implement `std::ops::Index<aoc_2022::Vector2D<usize>>`

error[E0277]: the type `[std::vec::Vec<i8>]` cannot be indexed by `aoc_2022::Vector2D<isize>`
--> src/bin/day08.rs:52:28
|
52 | let max_height = trees[position];
| ^^^^^^^^ slice indices are of type `usize` or ranges of `usize`
|
= help: the trait `std::slice::SliceIndex<[std::vec::Vec<i8>]>` is not implemented for `aoc_2022::Vector2D<isize>`
= note: required for `std::vec::Vec<std::vec::Vec<i8>>` to implement `std::ops::Index<aoc_2022::Vector2D<isize>>`
\n

Why? We have it implemented for the slices ([C]), why doesn't it work? Well,\nthe fun part consists of the fact that in other place, where we were using it,\nwe were passing the &[Vec<T>], but this is coming from a helper functions that\ntake &Vec<Vec<T>> instead. And… we don't implement Index and IndexMut for\nthose. Just for the slices. 🤯 What are we going to do about it?

\n

We can either start copy-pasting or be smarter about it… I choose to be smarter,\nso let's implement a macro! The only difference across the implementations are\nthe types of the outer containers. Implementation doesn't differ at all!

\n

Implementing the macro can be done in a following way:

\n
macro_rules! generate_indices {
($container:ty) => {
impl<I, C> Index<Vector2D<I>> for $container
where
I: Copy + TryInto<usize>,
<I as TryInto<usize>>::Error: Debug,
C: Index<usize>,
{
type Output = C::Output;

fn index(&self, index: Vector2D<I>) -> &Self::Output {
let (x, y): (usize, usize) =
(index.x.try_into().unwrap(), index.y.try_into().unwrap());
&self[y][x]
}
}

impl<I, C> IndexMut<Vector2D<I>> for $container
where
I: Copy + TryInto<usize>,
<I as TryInto<usize>>::Error: Debug,
C: IndexMut<usize>,
{
fn index_mut(&mut self, index: Vector2D<I>) -> &mut Self::Output {
let (x, y): (usize, usize) =
(index.x.try_into().unwrap(), index.y.try_into().unwrap());
&mut self[y][x]
}
}
};
}
\n

And now we can simply do

\n
generate_indices!(VecDeque<C>);
generate_indices!([C]);
generate_indices!(Vec<C>);
// generate_indices!([C; N], const N: usize);
\n

The last type (I took the inspiration from the implementations of the Index and\nIndexMut traits) is a bit problematic, because of the const N: usize part,\nwhich I haven't managed to be able to parse. And that's how I got rid of the error.

\n
note

If I were to use 2D-indexing over [C; N] slices, I'd probably just go with the\ncopy-paste, cause the cost of this “monstrosity” outweighs the benefits of no DRY.

\n

Cause of the problem

\n

This issue is relatively funny. If you don't use any type aliases, just the raw\ntypes, you'll get suggested certain changes by the clippy. For example if you\nconsider the following piece of code

\n
fn get_sum(nums: &Vec<i32>) -> i32 {
nums.iter().sum()
}

fn main() {
let nums = vec![1, 2, 3];
println!(\"Sum: {}\", get_sum(&nums));
}
\n

and you run clippy on it, you will get

\n
Checking playground v0.0.1 (/playground)
warning: writing `&Vec` instead of `&[_]` involves a new object where a slice will do
--> src/main.rs:1:18
|
1 | fn get_sum(nums: &Vec<i32>) -> i32 {
| ^^^^^^^^^ help: change this to: `&[i32]`
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg
= note: `#[warn(clippy::ptr_arg)]` on by default

warning: `playground` (bin \"playground\") generated 1 warning
Finished dev [unoptimized + debuginfo] target(s) in 0.61s
\n

However, if you introduce a type alias, such as

\n
type Numbers = Vec<i32>;
\n

Then clippy won't say anything, cause there is literally nothing to suggest.\nHowever the outcome is not the same…

", "url": "https://blog.mfocko.xyz/blog/aoc-2022/2nd-week", "title": "2nd week of Advent of Code '22 in Rust", "summary": "Surviving second week in Rust.", @@ -93,7 +93,7 @@ }, { "id": "https://blog.mfocko.xyz/blog/aoc-2022/1st-week", - "content_html": "

Let's go through the first week of Advent of Code in Rust.

\n
note

If you wish to have a look at the solutions, you can follow them on my GitLab.\nMore specifically in the /src/bin/.

\n

I will try to summarize my experience with using Rust for the AoC. Trying it out\nages ago, I believe it will be pain and suffering, but we will see. For each\nday I will also try to give a tl;dr of the problem, so that you can better imagine\nthe relation to my woes or 👍 moments.

\n

Day 1: Calorie Counting

\n
tl;dr

As the name suggests, we get the calories of the food contained in the elves\nbackpacks and we want to choose the elf that has the most food ;)

\n
\n

Wakey wakey!

\n
\n

Programming in Rust at 6am definitely hits. I've also forgotten to mention how I\nhandle samples. With each puzzle you usually get a sample input and expected\noutput. You can use them to verify that your solution works, or usually doesn't.

\n

At first I've decided to put asserts into my main, something like

\n
assert_eq!(part_1(&sample), 24000);
info!(\"Part 1: {}\", part_1(&input));

assert_eq!(part_2(&sample), 45000);
info!(\"Part 2: {}\", part_2(&input));
\n

However, once you get further, the sample input may take some time to run itself.\nSo in the end, I have decided to turn them into unit tests:

\n
#[cfg(test)]
mod tests {
use super::*;

#[test]
fn test_part_1() {
let sample = parse_input(\"samples/day01.txt\");
assert_eq!(part_1(&sample), 24000);
}

#[test]
fn test_part_2() {
let sample = parse_input(\"samples/day01.txt\");
assert_eq!(part_2(&sample), 45000);
}
}
\n

And later on I have noticed, it's hard to tell the difference between the days,\nso I further renamed the mod from generic tests to reflect the days.

\n

Also after finishing the first day puzzle, I have installed an sccache to\ncache the builds, so that the build time is lower, cause it was kinda unbearable.

\n

Solution

\n

Well, it's a pretty simple problem. You just take the input, sum the calories and\nfind the biggest one. However, if we try to generalize to more than the biggest\none, the fun appears. We have few options:

\n
    \n
  • keep all the calories, sort them, take what we need
  • \n
  • keep all the calories and use max heap
  • \n
  • use min heap and maintain at most N calories that we need
  • \n
\n

Day 2: Rock Paper Scissors

\n
tl;dr

You want to know what score did you achieve while playing Rock Paper Scissors.\nAnd then you want to be strategic about it.

\n

Apart from the technical details of the puzzle, it went relatively smooth.

\n

Solution

\n

I took relatively naïve approach and then tried to simplify it.

\n

Day 3: Rucksack Reorganization

\n
tl;dr

Let's go reorganize elves' backpacks! Each backpacks has 2 compartments and you\nwant to find the common item among those compartments. Each of them has priority,\nyou care only about the sum.

\n

This is the day where I started to fight the compiler and neither of us decided\nto give up. Let's dive into it \\o/

\n
Fun fact

Fighting the compiler took me 30 minutes.

\n

We need to find a common item among 2 collections, that's an easy task, right?\nWe can construct 2 sets and find an intersection:

\n
let top: HashSet<i32> = [1, 2, 3].iter().collect();
let bottom: HashSet<i32> = [3, 4, 5].iter().collect();
\n

Now, the first issue that we encounter is caused by the fact that we are using\na slice (the […]), iterator of that returns references to the numbers.\nAnd we get immediately yelled at by the compiler, because the numbers are discarded\nafter running the .collect. To fix this, we can use .into_iter:

\n
let top: HashSet<i32> = [1, 2, 3].into_iter().collect();
let bottom: HashSet<i32> = [3, 4, 5].into_iter().collect();
\n

This way the numbers will get copied instead of referenced. OK, let's find the\nintersection of those 2 collections:

\n
println!(\"Common elements: {:?}\", top.intersection(&bottom));
\n
Common elements: [3]
\n
caution

Notice that we need to do &bottom. It explicitly specifies that .intersection\nborrows the bottom, i.e. takes an immutable reference to it.

\n

That's what we want, right? Looks like it! \\o/

\n

Next part wants us to find the common element among all of the backpacks. OK, so\nthat should be fairly easy, we have an intersection and we want to find intersection\nover all of them.

\n

Let's have a look at the type of the .intersection

\n
pub fn intersection<'a>(
    &'a self,
    other: &'a HashSet<T, S>
) -> Intersection<'a, T, S>
\n

OK… Huh… But we have an example there!

\n
let intersection: HashSet<_> = a.intersection(&b).collect();
\n

Cool, that's all we need.

\n
let top: HashSet<i32> = [1, 2, 3, 4].into_iter().collect();
let bottom: HashSet<i32> = [3, 4, 5, 6].into_iter().collect();
let top_2: HashSet<i32> = [2, 3, 4, 5, 6].into_iter().collect();
let bottom_2: HashSet<i32> = [4, 5, 6].into_iter().collect();

let intersection: HashSet<_> = top.intersection(&bottom).collect();
println!(\"Intersection: {:?}\", intersection);
\n
Intersection: {3, 4}
\n

Cool, so let's do the intersection with the top_2:

\n
let top: HashSet<i32> = [1, 2, 3, 4].into_iter().collect();
let bottom: HashSet<i32> = [3, 4, 5, 6].into_iter().collect();
let top_2: HashSet<i32> = [2, 3, 4, 5, 6].into_iter().collect();
let bottom_2: HashSet<i32> = [4, 5, 6].into_iter().collect();

let intersection: HashSet<_> = top.intersection(&bottom).collect();
let intersection: HashSet<_> = intersection.intersection(&top_2).collect();
println!(\"Intersection: {:?}\", intersection);
\n

And we get yelled at by the compiler:

\n
error[E0308]: mismatched types
--> src/main.rs:10:58
|
10 | let intersection: HashSet<_> = intersection.intersection(&top_2).collect();
| ------------ ^^^^^^ expected `&i32`, found `i32`
| |
| arguments to this function are incorrect
|
= note: expected reference `&HashSet<&i32>`
found reference `&HashSet<i32>`
\n

/o\\ What the hell is going on here? Well, the funny thing is, that this operation\ndoesn't return the elements themselves, but the references to them and when we pass\nthe third set, it has just the values themselves, without any references.

\n
tip

It may seem as a very weird decision, but in fact it makes some sense… It allows\nyou to do intersection of items that may not be possible to copy. Overall this is\na “tax” for having a borrow checker drilling your ass having your back and\nmaking sure you're not doing something naughty that may cause an undefined\nbehavior.

\n

To resolve this we need to get an iterator that clones the elements:

\n
let top: HashSet<i32> = [1, 2, 3, 4].into_iter().collect();
let bottom: HashSet<i32> = [3, 4, 5, 6].into_iter().collect();
let top_2: HashSet<i32> = [2, 3, 4, 5, 6].into_iter().collect();
let bottom_2: HashSet<i32> = [4, 5, 6].into_iter().collect();

let intersection: HashSet<_> = top.intersection(&bottom).cloned().collect();
let intersection: HashSet<_> = intersection.intersection(&top_2).cloned().collect();
let intersection: HashSet<_> = intersection.intersection(&bottom_2).cloned().collect();
println!(\"Intersection: {:?}\", intersection);
\n
Intersection: {4}
\n

Solution

\n

The approach is pretty simple, if you omit the 1on1 with the compiler. You just\nhave some fun with the set operations :)

\n

Day 4: Camp Cleanup

\n
tl;dr

Elves are cleaning up the camp and they got overlapping sections to clean up.\nFind how many overlap and can take the day off.

\n

RangeInclusive is your friend not an enemy :)

\n

Solution

\n

Relatively easy, you just need to parse the input and know what you want. Rust's\nRangeInclusive type helped a lot, cause it took care of all abstractions.

\n

Day 5: Supply Stacks

\n
tl;dr

Let's play with stacks of crates.

\n

Very easy problem with very annoying input. You can judge yourself:

\n
    [D]    
[N] [C]
[Z] [M] [P]
1 2 3

move 1 from 2 to 1
move 3 from 1 to 3
move 2 from 2 to 1
move 1 from 1 to 2
\n

Good luck transforming that into something reasonable :)

\n
Fun fact

Took me 40 minutes to parse this reasonably, including fighting the compiler.

\n

Solution

\n

For the initial solution I went with a manual solution (as in I have done all\nthe work. Later on I have decided to explore the std and interface of the\nstd::vec::Vec and found split_off which takes an index and splits (duh)\nthe vector:

\n
let mut vec = vec![1, 2, 3];
let vec2 = vec.split_off(1);
assert_eq!(vec, [1]);
assert_eq!(vec2, [2, 3]);
\n

This helped me simplify my solution a lot and also get rid of some edge cases.

\n

Day 6: Tuning Trouble

\n
tl;dr

Finding start of the message in a very weird protocol. Start of the message is\ndenoted by NNN unique consecutive characters.

\n

Solution

\n

A lot of different approaches, knowing that we are dealing with input consisting\nsolely of ASCII letters, I bit the bullet and went with sliding window and\nconstructing sets from that window, checking if the set is as big as the window.

\n

One possible optimization could consist of keeping a bit-vector (i.e. usize\nvariable) of encountered characters and updating it as we go. However this has\na different issue and that is removal of the characters from the left side of the\nwindow. We don't know if the same character is not included later on.

\n

Other option is to do similar thing, but keeping the frequencies of the letters,\nand again knowing we have only ASCII letters we can optimize by having a vector\nof 26 elements that keeps count for each lowercase letter.

\n

Day 7: No Space Left On Device

\n
tl;dr

Let's simulate du to get some stats about our file system and then pinpoint\ndirectories that take a lot of space and should be deleted.

\n
\n

I was waiting for this moment, and yet it got me!\nimagine me swearing for hours

\n
\n

Solution

\n

We need to “build” a file system from the input that is given in a following form:

\n
$ cd /
$ ls
dir a
14848514 b.txt
8504156 c.dat
dir d
$ cd a
$ ls
dir e
29116 f
2557 g
62596 h.lst
$ cd e
$ ls
584 i
$ cd ..
$ cd ..
$ cd d
$ ls
4060174 j
8033020 d.log
5626152 d.ext
7214296 k
\n

There are few ways in which you can achieve this and also you can assume some\npreconditions, but why would we do that, right? :)

\n

You can “slap” this in either HashMap or BTreeMap and call it a day.\nAnd that would be boring…

\n
tip

BTreeMap is quite fitting for this, don't you think?

\n

I always wanted to try allocation on heap in Rust, so I chose to implement a tree.\nI fought with the Box<T> for some time and was losing…

\n

Then I looked up some implementations of trees or linked lists and decided to try\nRc<Cell<T>>. And I got my ass whopped by the compiler once again. /o\\

\n
tip

Box<T> represents a dynamically allocated memory on heap. It is a single pointer,\nyou can imagine this as std::unique_ptr<T> in C++.

Rc<T> represents a dynamically allocated memory on heap. On top of that it is\nreference counted (that's what the Rc stands for). You can imagine this as\nstd::shared_ptr<T> in C++.

Now the fun stuff. Neither of them lets you mutate the contents of the memory.

Cell<T> allows you to mutate the memory. Can be used reasonably with types that\ncan be copied, because the memory safety is guaranteed by copying the contents\nwhen there is more than one mutable reference to the memory.

RefCell<T> is similar to the Cell<T>, but the borrowing rules (how many mutable\nreferences are present) are checked dynamically.

So in the end, if you want something like std::shared_ptr<T> in Rust, you want\nto have Rc<RefCell<T>>.

\n

So, how are we going to represent the file system then? We will use an enumeration,\nhehe, which is an algebraic data type that can store some stuff in itself 😩

\n
type FileHandle = Rc<RefCell<AocFile>>;

#[derive(Debug)]
enum AocFile {
File(usize),
Directory(BTreeMap<String, FileHandle>),
}
\n

Let's go over it! FileHandle represents dynamically allocated AocFile, not\nmuch to discuss. What does the #[derive(Debug)] do though? It lets us to print\nout the value of that enumeration, it's derived, so it's not as good as if we had\nimplemented it ourselves, but it's good enough for debugging, hence the name.

\n

Now to the fun part! AocFile value can be represented in two ways:

\n
    \n
  • File(usize), e.g. AocFile::File(123) and we can pattern match it, if we\nneed to
  • \n
  • Directory(BTreeMap<String, FileHandle>) will represent the directory and will\ncontain map matching the name of the files (or directories) within to their\nrespective file handles
  • \n
\n

I will omit the details about constructing this file system, cause there are a lot\nof technicalities introduced by the nature of the input. However if you are\ninterested, you can have a look at my solution.

\n

We need to find small enough directories and also find the smallest directory that\nwill free enough space. Now the question is, how could we do that. And there are\nmultiple ways I will describe.

\n

I have chosen to implement tree catamorphism 😩. It is basically a fold\nover a tree data structure. We descent down into the leaves and propagate computed\nresults all the way to the root. You can also notice that this approach is very\nsimilar to dynamic programming, we find overlapping sections of the computation\nand try to minimize the additional work (in this case: we need to know sizes of\nour descendants, but we have already been there).

\n

Another approach that has been suggested to me few days later is running DFS on\nthe graph. And, funnily enough, we would still need to combine what we found in\nthe branches where we descent. So in the end, it would work very similarly to my\nsolution.

\n

One of the more exotic options would be precomputing the required information at\nthe same time as parsing. That could be done by adding additional fields to the\nnodes which would allow storing such information and updating it as we construct\nthe file system.

\n

Post Mortem

\n

Things that have been brought up in the discussion later on.

\n

Rc<T> vs Rc<RefCell<T>>

\n

It has been brought up that I have a contradicting statement regarding the\ndynamically allocated memory. Specifically:

\n
    \n
  • You can imagine Rc<T> as an std::shared_ptr<T> (in C++)
  • \n
  • When you want an equivalent of std::shared_ptr<T>, you want to use\nRc<RefCell<T>>
  • \n
\n

Now, in Rust it is a bit more complicated, because the type that represents the\n“shared pointer” is Rc<T>. What RefCell<T> does is making sure that there is\nonly one “owner” of a mutable reference at a time (and dynamically, as opposed\nto the Cell<T>).

\n

Therefore to be precise and correct about the equivalents of std::shared_ptr<T>\nin Rust, we can say that

\n
    \n
  • Rc<T> is an equivalent of a const std::shared_ptr<T>,
  • \n
  • and Rc<RefCell<T>> is an equivalent of a std::shared_ptr<T>.
  • \n
\n

You can easily see that they only differ in the mutability. (And even that is not\nas simple as it seems, because there is also Cell<T>)

", + "content_html": "

Let's go through the first week of Advent of Code in Rust.

\n
note

If you wish to have a look at the solutions, you can follow them on my GitLab.\nMore specifically in the /src/bin/.

\n

I will try to summarize my experience with using Rust for the AoC. Trying it out\nages ago, I believe it will be pain and suffering, but we will see. For each\nday I will also try to give a tl;dr of the problem, so that you can better imagine\nthe relation to my woes or 👍 moments.

\n

Day 1: Calorie Counting

\n
tl;dr

As the name suggests, we get the calories of the food contained in the elves\nbackpacks and we want to choose the elf that has the most food ;)

\n
\n

Wakey wakey!

\n
\n

Programming in Rust at 6am definitely hits. I've also forgotten to mention how I\nhandle samples. With each puzzle you usually get a sample input and expected\noutput. You can use them to verify that your solution works, or usually doesn't.

\n

At first I've decided to put asserts into my main, something like

\n
assert_eq!(part_1(&sample), 24000);
info!(\"Part 1: {}\", part_1(&input));

assert_eq!(part_2(&sample), 45000);
info!(\"Part 2: {}\", part_2(&input));
\n

However, once you get further, the sample input may take some time to run itself.\nSo in the end, I have decided to turn them into unit tests:

\n
#[cfg(test)]
mod tests {
use super::*;

#[test]
fn test_part_1() {
let sample = parse_input(\"samples/day01.txt\");
assert_eq!(part_1(&sample), 24000);
}

#[test]
fn test_part_2() {
let sample = parse_input(\"samples/day01.txt\");
assert_eq!(part_2(&sample), 45000);
}
}
\n

And later on I have noticed, it's hard to tell the difference between the days,\nso I further renamed the mod from generic tests to reflect the days.

\n

Also after finishing the first day puzzle, I have installed an sccache to\ncache the builds, so that the build time is lower, cause it was kinda unbearable.

\n

Solution

\n

Well, it's a pretty simple problem. You just take the input, sum the calories and\nfind the biggest one. However, if we try to generalize to more than the biggest\none, the fun appears. We have few options:

\n
    \n
  • keep all the calories, sort them, take what we need
  • \n
  • keep all the calories and use max heap
  • \n
  • use min heap and maintain at most N calories that we need
  • \n
\n

Day 2: Rock Paper Scissors

\n
tl;dr

You want to know what score did you achieve while playing Rock Paper Scissors.\nAnd then you want to be strategic about it.

\n

Apart from the technical details of the puzzle, it went relatively smooth.

\n

Solution

\n

I took relatively naïve approach and then tried to simplify it.

\n

Day 3: Rucksack Reorganization

\n
tl;dr

Let's go reorganize elves' backpacks! Each backpacks has 2 compartments and you\nwant to find the common item among those compartments. Each of them has priority,\nyou care only about the sum.

\n

This is the day where I started to fight the compiler and neither of us decided\nto give up. Let's dive into it \\o/

\n
Fun fact

Fighting the compiler took me 30 minutes.

\n

We need to find a common item among 2 collections, that's an easy task, right?\nWe can construct 2 sets and find an intersection:

\n
let top: HashSet<i32> = [1, 2, 3].iter().collect();
let bottom: HashSet<i32> = [3, 4, 5].iter().collect();
\n

Now, the first issue that we encounter is caused by the fact that we are using\na slice (the […]), iterator of that returns references to the numbers.\nAnd we get immediately yelled at by the compiler, because the numbers are discarded\nafter running the .collect. To fix this, we can use .into_iter:

\n
let top: HashSet<i32> = [1, 2, 3].into_iter().collect();
let bottom: HashSet<i32> = [3, 4, 5].into_iter().collect();
\n

This way the numbers will get copied instead of referenced. OK, let's find the\nintersection of those 2 collections:

\n
println!(\"Common elements: {:?}\", top.intersection(&bottom));
\n
Common elements: [3]
\n
caution

Notice that we need to do &bottom. It explicitly specifies that .intersection\nborrows the bottom, i.e. takes an immutable reference to it.

\n

That's what we want, right? Looks like it! \\o/

\n

Next part wants us to find the common element among all of the backpacks. OK, so\nthat should be fairly easy, we have an intersection and we want to find intersection\nover all of them.

\n

Let's have a look at the type of the .intersection

\n
pub fn intersection<'a>(
    &'a self,
    other: &'a HashSet<T, S>
) -> Intersection<'a, T, S>
\n

OK… Huh… But we have an example there!

\n
let intersection: HashSet<_> = a.intersection(&b).collect();
\n

Cool, that's all we need.

\n
let top: HashSet<i32> = [1, 2, 3, 4].into_iter().collect();
let bottom: HashSet<i32> = [3, 4, 5, 6].into_iter().collect();
let top_2: HashSet<i32> = [2, 3, 4, 5, 6].into_iter().collect();
let bottom_2: HashSet<i32> = [4, 5, 6].into_iter().collect();

let intersection: HashSet<_> = top.intersection(&bottom).collect();
println!(\"Intersection: {:?}\", intersection);
\n
Intersection: {3, 4}
\n

Cool, so let's do the intersection with the top_2:

\n
let top: HashSet<i32> = [1, 2, 3, 4].into_iter().collect();
let bottom: HashSet<i32> = [3, 4, 5, 6].into_iter().collect();
let top_2: HashSet<i32> = [2, 3, 4, 5, 6].into_iter().collect();
let bottom_2: HashSet<i32> = [4, 5, 6].into_iter().collect();

let intersection: HashSet<_> = top.intersection(&bottom).collect();
let intersection: HashSet<_> = intersection.intersection(&top_2).collect();
println!(\"Intersection: {:?}\", intersection);
\n

And we get yelled at by the compiler:

\n
error[E0308]: mismatched types
--> src/main.rs:10:58
|
10 | let intersection: HashSet<_> = intersection.intersection(&top_2).collect();
| ------------ ^^^^^^ expected `&i32`, found `i32`
| |
| arguments to this function are incorrect
|
= note: expected reference `&HashSet<&i32>`
found reference `&HashSet<i32>`
\n

/o\\ What the hell is going on here? Well, the funny thing is, that this operation\ndoesn't return the elements themselves, but the references to them and when we pass\nthe third set, it has just the values themselves, without any references.

\n
tip

It may seem as a very weird decision, but in fact it makes some sense… It allows\nyou to do intersection of items that may not be possible to copy. Overall this is\na “tax” for having a borrow checker drilling your ass having your back and\nmaking sure you're not doing something naughty that may cause an undefined\nbehavior.

\n

To resolve this we need to get an iterator that clones the elements:

\n
let top: HashSet<i32> = [1, 2, 3, 4].into_iter().collect();
let bottom: HashSet<i32> = [3, 4, 5, 6].into_iter().collect();
let top_2: HashSet<i32> = [2, 3, 4, 5, 6].into_iter().collect();
let bottom_2: HashSet<i32> = [4, 5, 6].into_iter().collect();

let intersection: HashSet<_> = top.intersection(&bottom).cloned().collect();
let intersection: HashSet<_> = intersection.intersection(&top_2).cloned().collect();
let intersection: HashSet<_> = intersection.intersection(&bottom_2).cloned().collect();
println!(\"Intersection: {:?}\", intersection);
\n
Intersection: {4}
\n

Solution

\n

The approach is pretty simple, if you omit the 1on1 with the compiler. You just\nhave some fun with the set operations :)

\n

Day 4: Camp Cleanup

\n
tl;dr

Elves are cleaning up the camp and they got overlapping sections to clean up.\nFind how many overlap and can take the day off.

\n

RangeInclusive is your friend not an enemy :)

\n

Solution

\n

Relatively easy, you just need to parse the input and know what you want. Rust's\nRangeInclusive type helped a lot, cause it took care of all abstractions.

\n

Day 5: Supply Stacks

\n
tl;dr

Let's play with stacks of crates.

\n

Very easy problem with very annoying input. You can judge yourself:

\n
    [D]
[N] [C]
[Z] [M] [P]
1 2 3

move 1 from 2 to 1
move 3 from 1 to 3
move 2 from 2 to 1
move 1 from 1 to 2
\n

Good luck transforming that into something reasonable :)

\n
Fun fact

Took me 40 minutes to parse this reasonably, including fighting the compiler.

\n

Solution

\n

For the initial solution I went with a manual solution (as in I have done all\nthe work. Later on I have decided to explore the std and interface of the\nstd::vec::Vec and found split_off which takes an index and splits (duh)\nthe vector:

\n
let mut vec = vec![1, 2, 3];
let vec2 = vec.split_off(1);
assert_eq!(vec, [1]);
assert_eq!(vec2, [2, 3]);
\n

This helped me simplify my solution a lot and also get rid of some edge cases.

\n

Day 6: Tuning Trouble

\n
tl;dr

Finding start of the message in a very weird protocol. Start of the message is\ndenoted by NNN unique consecutive characters.

\n

Solution

\n

A lot of different approaches, knowing that we are dealing with input consisting\nsolely of ASCII letters, I bit the bullet and went with sliding window and\nconstructing sets from that window, checking if the set is as big as the window.

\n

One possible optimization could consist of keeping a bit-vector (i.e. usize\nvariable) of encountered characters and updating it as we go. However this has\na different issue and that is removal of the characters from the left side of the\nwindow. We don't know if the same character is not included later on.

\n

Other option is to do similar thing, but keeping the frequencies of the letters,\nand again knowing we have only ASCII letters we can optimize by having a vector\nof 26 elements that keeps count for each lowercase letter.

\n

Day 7: No Space Left On Device

\n
tl;dr

Let's simulate du to get some stats about our file system and then pinpoint\ndirectories that take a lot of space and should be deleted.

\n
\n

I was waiting for this moment, and yet it got me!\nimagine me swearing for hours

\n
\n

Solution

\n

We need to “build” a file system from the input that is given in a following form:

\n
$ cd /
$ ls
dir a
14848514 b.txt
8504156 c.dat
dir d
$ cd a
$ ls
dir e
29116 f
2557 g
62596 h.lst
$ cd e
$ ls
584 i
$ cd ..
$ cd ..
$ cd d
$ ls
4060174 j
8033020 d.log
5626152 d.ext
7214296 k
\n

There are few ways in which you can achieve this and also you can assume some\npreconditions, but why would we do that, right? :)

\n

You can “slap” this in either HashMap or BTreeMap and call it a day.\nAnd that would be boring…

\n
tip

BTreeMap is quite fitting for this, don't you think?

\n

I always wanted to try allocation on heap in Rust, so I chose to implement a tree.\nI fought with the Box<T> for some time and was losing…

\n

Then I looked up some implementations of trees or linked lists and decided to try\nRc<Cell<T>>. And I got my ass whopped by the compiler once again. /o\\

\n
tip

Box<T> represents a dynamically allocated memory on heap. It is a single pointer,\nyou can imagine this as std::unique_ptr<T> in C++.

Rc<T> represents a dynamically allocated memory on heap. On top of that it is\nreference counted (that's what the Rc stands for). You can imagine this as\nstd::shared_ptr<T> in C++.

Now the fun stuff. Neither of them lets you mutate the contents of the memory.

Cell<T> allows you to mutate the memory. Can be used reasonably with types that\ncan be copied, because the memory safety is guaranteed by copying the contents\nwhen there is more than one mutable reference to the memory.

RefCell<T> is similar to the Cell<T>, but the borrowing rules (how many mutable\nreferences are present) are checked dynamically.

So in the end, if you want something like std::shared_ptr<T> in Rust, you want\nto have Rc<RefCell<T>>.

\n

So, how are we going to represent the file system then? We will use an enumeration,\nhehe, which is an algebraic data type that can store some stuff in itself 😩

\n
type FileHandle = Rc<RefCell<AocFile>>;

#[derive(Debug)]
enum AocFile {
File(usize),
Directory(BTreeMap<String, FileHandle>),
}
\n

Let's go over it! FileHandle represents dynamically allocated AocFile, not\nmuch to discuss. What does the #[derive(Debug)] do though? It lets us to print\nout the value of that enumeration, it's derived, so it's not as good as if we had\nimplemented it ourselves, but it's good enough for debugging, hence the name.

\n

Now to the fun part! AocFile value can be represented in two ways:

\n
    \n
  • File(usize), e.g. AocFile::File(123) and we can pattern match it, if we\nneed to
  • \n
  • Directory(BTreeMap<String, FileHandle>) will represent the directory and will\ncontain map matching the name of the files (or directories) within to their\nrespective file handles
  • \n
\n

I will omit the details about constructing this file system, cause there are a lot\nof technicalities introduced by the nature of the input. However if you are\ninterested, you can have a look at my solution.

\n

We need to find small enough directories and also find the smallest directory that\nwill free enough space. Now the question is, how could we do that. And there are\nmultiple ways I will describe.

\n

I have chosen to implement tree catamorphism 😩. It is basically a fold\nover a tree data structure. We descent down into the leaves and propagate computed\nresults all the way to the root. You can also notice that this approach is very\nsimilar to dynamic programming, we find overlapping sections of the computation\nand try to minimize the additional work (in this case: we need to know sizes of\nour descendants, but we have already been there).

\n

Another approach that has been suggested to me few days later is running DFS on\nthe graph. And, funnily enough, we would still need to combine what we found in\nthe branches where we descent. So in the end, it would work very similarly to my\nsolution.

\n

One of the more exotic options would be precomputing the required information at\nthe same time as parsing. That could be done by adding additional fields to the\nnodes which would allow storing such information and updating it as we construct\nthe file system.

\n

Post Mortem

\n

Things that have been brought up in the discussion later on.

\n

Rc<T> vs Rc<RefCell<T>>

\n

It has been brought up that I have a contradicting statement regarding the\ndynamically allocated memory. Specifically:

\n
    \n
  • You can imagine Rc<T> as an std::shared_ptr<T> (in C++)
  • \n
  • When you want an equivalent of std::shared_ptr<T>, you want to use\nRc<RefCell<T>>
  • \n
\n

Now, in Rust it is a bit more complicated, because the type that represents the\n“shared pointer” is Rc<T>. What RefCell<T> does is making sure that there is\nonly one “owner” of a mutable reference at a time (and dynamically, as opposed\nto the Cell<T>).

\n

Therefore to be precise and correct about the equivalents of std::shared_ptr<T>\nin Rust, we can say that

\n
    \n
  • Rc<T> is an equivalent of a const std::shared_ptr<T>,
  • \n
  • and Rc<RefCell<T>> is an equivalent of a std::shared_ptr<T>.
  • \n
\n

You can easily see that they only differ in the mutability. (And even that is not\nas simple as it seems, because there is also Cell<T>)

", "url": "https://blog.mfocko.xyz/blog/aoc-2022/1st-week", "title": "1st week of Advent of Code '22 in Rust", "summary": "Surviving first week in Rust.", diff --git a/blog/index.html b/blog/index.html index 753fdb1..dfe66c3 100644 --- a/blog/index.html +++ b/blog/index.html @@ -14,7 +14,7 @@ - + diff --git a/blog/leetcode/sort-diagonally/index.html b/blog/leetcode/sort-diagonally/index.html index 13a3ce0..f09be2c 100644 --- a/blog/leetcode/sort-diagonally/index.html +++ b/blog/leetcode/sort-diagonally/index.html @@ -14,7 +14,7 @@ - + @@ -35,7 +35,7 @@ order and return the resulting matrix.

Image describing the problem

Skeleton and initial adjustments

We are given the following skeleton for the C++ and the given challenge:

-
class Solution {
public:
vector<vector<int>> diagonalSort(vector<vector<int>>& mat) {

}
};
+
class Solution {
public:
vector<vector<int>> diagonalSort(vector<vector<int>>& mat) {

}
};

The task is to sort the passed matrix diagonally and then return it. First of all, I don't like to solve this in a web browser, so we'll need to adjust it accordingly for running it locally. We'll start by including the vector header and using diff --git a/blog/rss.xml b/blog/rss.xml index a92a327..8d68eb4 100644 --- a/blog/rss.xml +++ b/blog/rss.xml @@ -314,7 +314,7 @@ everything:

You can also see that it simplifies the meaning a bit and it is more explicit than the previous versions.

And for the tests:

-
     #[test]
fn test_from() {
- for (n, s) in EXAMPLES.iter() {
- assert_eq!(from_snafu(s), *n);
+ for (&n, s) in EXAMPLES.iter() {
+ assert_eq!(s.parse::<SNAFU>().unwrap().value, n);
}
}

#[test]
fn test_to() {
- for (n, s) in EXAMPLES.iter() {
- assert_eq!(to_snafu(*n), s.to_string());
+ for (&n, s) in EXAMPLES.iter() {
+ assert_eq!(SNAFU::from(n).to_string(), s.to_string());
}
+
     #[test]
fn test_from() {
- for (n, s) in EXAMPLES.iter() {
- assert_eq!(from_snafu(s), *n);
+ for (&n, s) in EXAMPLES.iter() {
+ assert_eq!(s.parse::<SNAFU>().unwrap().value, n);
}
}

#[test]
fn test_to() {
- for (n, s) in EXAMPLES.iter() {
- assert_eq!(to_snafu(*n), s.to_string());
+ for (&n, s) in EXAMPLES.iter() {
+ assert_eq!(SNAFU::from(n).to_string(), s.to_string());
}

Summary

Let's wrap the whole thing up! Keeping in mind both AoC and the Rust…

Finished advent calendar :smile:

@@ -580,7 +580,7 @@ order and return the resulting matrix.

Image describing the problem

Skeleton and initial adjustments

We are given the following skeleton for the C++ and the given challenge:

-
class Solution {
public:
vector<vector<int>> diagonalSort(vector<vector<int>>& mat) {

}
};
+
class Solution {
public:
vector<vector<int>> diagonalSort(vector<vector<int>>& mat) {

}
};

The task is to sort the passed matrix diagonally and then return it. First of all, I don't like to solve this in a web browser, so we'll need to adjust it accordingly for running it locally. We'll start by including the vector header and using @@ -1063,7 +1063,7 @@ right? Yes… but actually no 😦

the fun part consists of the fact that in other place, where we were using it, we were passing the &[Vec<T>], but this is coming from a helper functions that take &Vec<Vec<T>> instead. And… we don't implement Index and IndexMut for -those. Just for the slices. 🤯 What are we going to do about it?

+those. Just for the slices. 🤯 What are we going to do about it?

We can either start copy-pasting or be smarter about it… I choose to be smarter, so let's implement a macro! The only difference across the implementations are the types of the outer containers. Implementation doesn't differ at all!

@@ -1198,7 +1198,7 @@ Find how many overlap and can take the day off.

Day 5: Supply Stacks

tl;dr

Let's play with stacks of crates.

Very easy problem with very annoying input. You can judge yourself:

-
    [D]    
[N] [C]
[Z] [M] [P]
1 2 3

move 1 from 2 to 1
move 3 from 1 to 3
move 2 from 2 to 1
move 1 from 1 to 2
+
    [D]
[N] [C]
[Z] [M] [P]
1 2 3

move 1 from 2 to 1
move 3 from 1 to 3
move 2 from 2 to 1
move 1 from 1 to 2

Good luck transforming that into something reasonable :)

Fun fact

Took me 40 minutes to parse this reasonably, including fighting the compiler.

Solution

diff --git a/blog/tags/admin/index.html b/blog/tags/admin/index.html index 4eef209..5a344e8 100644 --- a/blog/tags/admin/index.html +++ b/blog/tags/admin/index.html @@ -14,7 +14,7 @@ - + diff --git a/blog/tags/advent-of-code-2022/index.html b/blog/tags/advent-of-code-2022/index.html index e718542..3621bac 100644 --- a/blog/tags/advent-of-code-2022/index.html +++ b/blog/tags/advent-of-code-2022/index.html @@ -14,7 +14,7 @@ - + diff --git a/blog/tags/advent-of-code/index.html b/blog/tags/advent-of-code/index.html index 0454069..794e115 100644 --- a/blog/tags/advent-of-code/index.html +++ b/blog/tags/advent-of-code/index.html @@ -14,7 +14,7 @@ - + diff --git a/blog/tags/copr/index.html b/blog/tags/copr/index.html index 039fd1c..d11b0e0 100644 --- a/blog/tags/copr/index.html +++ b/blog/tags/copr/index.html @@ -14,7 +14,7 @@ - + diff --git a/blog/tags/cpp/index.html b/blog/tags/cpp/index.html index 961f352..e8685b0 100644 --- a/blog/tags/cpp/index.html +++ b/blog/tags/cpp/index.html @@ -14,7 +14,7 @@ - + diff --git a/blog/tags/index.html b/blog/tags/index.html index f2ed7aa..02f30a7 100644 --- a/blog/tags/index.html +++ b/blog/tags/index.html @@ -14,7 +14,7 @@ - + diff --git a/blog/tags/iterators/index.html b/blog/tags/iterators/index.html index 4d1aa6f..202adbb 100644 --- a/blog/tags/iterators/index.html +++ b/blog/tags/iterators/index.html @@ -14,7 +14,7 @@ - + diff --git a/blog/tags/leetcode/index.html b/blog/tags/leetcode/index.html index c8fc62b..58c1271 100644 --- a/blog/tags/leetcode/index.html +++ b/blog/tags/leetcode/index.html @@ -14,7 +14,7 @@ - + diff --git a/blog/tags/red-hat/index.html b/blog/tags/red-hat/index.html index a985354..bfe1d55 100644 --- a/blog/tags/red-hat/index.html +++ b/blog/tags/red-hat/index.html @@ -14,7 +14,7 @@ - + diff --git a/blog/tags/rust/index.html b/blog/tags/rust/index.html index 2a171c4..00b7a7f 100644 --- a/blog/tags/rust/index.html +++ b/blog/tags/rust/index.html @@ -14,7 +14,7 @@ - + diff --git a/blog/tags/vps/index.html b/blog/tags/vps/index.html index 9000f9d..96081ae 100644 --- a/blog/tags/vps/index.html +++ b/blog/tags/vps/index.html @@ -14,7 +14,7 @@ - + diff --git a/blog/tags/🏭/index.html b/blog/tags/🏭/index.html index a7e01ad..549ae2d 100644 --- a/blog/tags/🏭/index.html +++ b/blog/tags/🏭/index.html @@ -14,7 +14,7 @@ - + diff --git a/c/bonuses/seminar-03/index.html b/c/bonuses/seminar-03/index.html index 2ed7fb6..468147a 100644 --- a/c/bonuses/seminar-03/index.html +++ b/c/bonuses/seminar-03/index.html @@ -16,7 +16,7 @@ - + diff --git a/c/bonuses/seminar-04/index.html b/c/bonuses/seminar-04/index.html index 955abc3..2817c68 100644 --- a/c/bonuses/seminar-04/index.html +++ b/c/bonuses/seminar-04/index.html @@ -16,7 +16,7 @@ - + diff --git a/c/bonuses/seminar-05-06/index.html b/c/bonuses/seminar-05-06/index.html index fdc57c2..6714682 100644 --- a/c/bonuses/seminar-05-06/index.html +++ b/c/bonuses/seminar-05-06/index.html @@ -16,7 +16,7 @@ - + @@ -114,6 +114,6 @@ which is encrypted character H using this method.

For decrypting, reverse the steps.

Submitting

In case you have any questions, feel free to reach out to me.

-
+
\ No newline at end of file diff --git a/c/bonuses/seminar-08/index.html b/c/bonuses/seminar-08/index.html index dd349a2..a362465 100644 --- a/c/bonuses/seminar-08/index.html +++ b/c/bonuses/seminar-08/index.html @@ -16,7 +16,7 @@ - + @@ -94,6 +94,6 @@ Implementation and format of the pretty-print is totally up to you. :)

Submitting

In case you have any questions, feel free to reach out to me.

-
+
\ No newline at end of file diff --git a/c/bonuses/seminar-10/index.html b/c/bonuses/seminar-10/index.html index e203f01..9fecb92 100644 --- a/c/bonuses/seminar-10/index.html +++ b/c/bonuses/seminar-10/index.html @@ -16,7 +16,7 @@ - + @@ -136,6 +136,6 @@ it is a not requirement at all and you can still get all points for the bonus ;)

Submitting

In case you have any questions, feel free to reach out to me.

-
+
\ No newline at end of file diff --git a/c/category/bonuses/index.html b/c/category/bonuses/index.html index f8046c9..559aeb1 100644 --- a/c/category/bonuses/index.html +++ b/c/category/bonuses/index.html @@ -16,7 +16,7 @@ - + diff --git a/c/category/practice-exams/index.html b/c/category/practice-exams/index.html index c59b9d3..f43944b 100644 --- a/c/category/practice-exams/index.html +++ b/c/category/practice-exams/index.html @@ -16,7 +16,7 @@ - + diff --git a/c/index.html b/c/index.html index 35b3121..7543212 100644 --- a/c/index.html +++ b/c/index.html @@ -14,10 +14,10 @@ - + - + \ No newline at end of file diff --git a/c/mr/index.html b/c/mr/index.html index 742ba1a..ff467c6 100644 --- a/c/mr/index.html +++ b/c/mr/index.html @@ -14,7 +14,7 @@ - + @@ -87,6 +87,6 @@ For the sake of safety, do not continue without clean repository. Then with comm be main or trunk.

aisa$ git status
# Check if repository is clean

# If you know, what is your default branch, you can skip next command.
aisa$ git branch
# Find the default branch in the list; should be one of the `master`, `main` or
# `trunk` and you should not have more than one of those.
# In case the list clears the terminal and you cannot see shell prompt, you can
# press `q` to quit the pager.

aisa$ git checkout master

-

Adapted from: https://www.fi.muni.cz/~xlacko1/pb071/mr.html

+

Adapted from: https://www.fi.muni.cz/~xlacko1/pb071/mr.html

\ No newline at end of file diff --git a/c/pexam/cams/index.html b/c/pexam/cams/index.html index 40fd00a..75421cf 100644 --- a/c/pexam/cams/index.html +++ b/c/pexam/cams/index.html @@ -16,7 +16,7 @@ - + diff --git a/c/pexam/garbage_collect/index.html b/c/pexam/garbage_collect/index.html index 7b8dc78..7e3a277 100644 --- a/c/pexam/garbage_collect/index.html +++ b/c/pexam/garbage_collect/index.html @@ -16,7 +16,7 @@ - + diff --git a/contributions/index.html b/contributions/index.html index fb40e90..7d39896 100644 --- a/contributions/index.html +++ b/contributions/index.html @@ -14,10 +14,10 @@ - + -

Contributions

Many of my contributions to open-source projects.

tmt

Description

The `tmt` tool provides a user-friendly way to work with tests. You can comfortably create new tests, safely and easily run tests across different environments, review test results, debug test code and enable tests in the CI using a consistent and concise config.

Contribution

Just a smallish contribution to the docs related to the changes implemented on the Packit side.

Fedora Infrastructure Ansible

Description

Collection of Ansible playbooks that powers the Fedora Infrastructure.

Contribution

I have adjusted the groups in the Bodhi playbooks after Packit has been granted the privileges to propose updates without restrictions.

Bodhi

Description

Bodhi is a web-system that facilitates the process of publishing updates for a Fedora-based software distribution.

Contribution

I have adjusted the client, so that it doesn't show secrets in terminal when you log in to the Bodhi via browser.

Gluetool Modules Collection

Description

Modules for gluetool — a command line centric framework usable for glueing modules into a pipeline.

Contribution
  • I have proposed a possible implementation of git merging that was later on extended.
  • I have tried to help out with Copr module after they deprecated older version of their API.

Pagure

Description

Pagure is a git-centered forge, python based using pygit2.

Contribution

I have added an API endpoint for reopening pull requests.

Copr

Description

RPM build system - upstream for Copr.

Contribution
  • Supporting external repositories for custom SRPM build method.
  • Allowing admins of Copr repositories to build without the need to ask for explicit builder permissions.

python-gitlab

Description

A python wrapper for the GitLab API.

Contribution

I have contributed support for the merge_ref on merge requests that hasn't been supported, yet it was present in the GitLab API.

PatternFly React

Description

A set of React components for the PatternFly project.

Contribution

When working on Packit Dashboard, I have spotted smaller bugs that were present in this project and fixed them upstream to provide better experience for our users.

Fira Code

Description

Free monospaced font with programming ligatures.

Contribution

I have set up a GitHub Action for building the font on each push to the default branch allowing users to install bleeding edge version of the font.

nixpkgs

Description

Nixpkgs is a collection of over 80,000 software packages that can be installed with the Nix package manager. It also implements NixOS, a purely-functional Linux distribution.

Contribution

When I was trying out the nixpkgs, I have tried to bump .NET Core to the latest version. My changes haven't been accepted as they required bumping of multiple more packages that depended upon the .NET Core.

Darcula

Description

A theme for Visual Studio Code based on Darcula theme from Jetbrains IDEs.

Contribution

I have contributed support for diff files, though the project doesn't seem to be live anymore, so it hasn't been accepted as of now.

Packit

Description

An open source project aiming to ease the integration of your project with Fedora Linux, CentOS Stream and other distributions.

Contribution

Have a look at my pull requests.

Snitch

Description

Language agnostic tool that collects TODOs in the source code and reports them as Issues.

Contribution
  • Environment variable support for self-hosted GitLab instances
  • GitLab support

Karel the Robot

Description

Karel the robot is in general an educational programming language for beginners, created by Richard E. Pattis. This is implementation of Karel the Robot for C programming language.

This project is used for educational purposes at TUKE.

Contribution

I have contributed some refactoring tips to the author of the library.

+

Contributions

Many of my contributions to open-source projects.

tmt

Description

The `tmt` tool provides a user-friendly way to work with tests. You can comfortably create new tests, safely and easily run tests across different environments, review test results, debug test code and enable tests in the CI using a consistent and concise config.

Contribution

Just a smallish contribution to the docs related to the changes implemented on the Packit side.

Fedora Infrastructure Ansible

Description

Collection of Ansible playbooks that powers the Fedora Infrastructure.

Contribution

I have adjusted the groups in the Bodhi playbooks after Packit has been granted the privileges to propose updates without restrictions.

Bodhi

Description

Bodhi is a web-system that facilitates the process of publishing updates for a Fedora-based software distribution.

Contribution

I have adjusted the client, so that it doesn't show secrets in terminal when you log in to the Bodhi via browser.

Gluetool Modules Collection

Description

Modules for gluetool — a command line centric framework usable for glueing modules into a pipeline.

Contribution
  • I have proposed a possible implementation of git merging that was later on extended.
  • I have tried to help out with Copr module after they deprecated older version of their API.

Pagure

Description

Pagure is a git-centered forge, python based using pygit2.

Contribution

I have added an API endpoint for reopening pull requests.

Copr

Description

RPM build system - upstream for Copr.

Contribution
  • Supporting external repositories for custom SRPM build method.
  • Allowing admins of Copr repositories to build without the need to ask for explicit builder permissions.

python-gitlab

Description

A python wrapper for the GitLab API.

Contribution

I have contributed support for the merge_ref on merge requests that hasn't been supported, yet it was present in the GitLab API.

PatternFly React

Description

A set of React components for the PatternFly project.

Contribution

When working on Packit Dashboard, I have spotted smaller bugs that were present in this project and fixed them upstream to provide better experience for our users.

Fira Code

Description

Free monospaced font with programming ligatures.

Contribution

I have set up a GitHub Action for building the font on each push to the default branch allowing users to install bleeding edge version of the font.

nixpkgs

Description

Nixpkgs is a collection of over 80,000 software packages that can be installed with the Nix package manager. It also implements NixOS, a purely-functional Linux distribution.

Contribution

When I was trying out the nixpkgs, I have tried to bump .NET Core to the latest version. My changes haven't been accepted as they required bumping of multiple more packages that depended upon the .NET Core.

Darcula

Description

A theme for Visual Studio Code based on Darcula theme from Jetbrains IDEs.

Contribution

I have contributed support for diff files, though the project doesn't seem to be live anymore, so it hasn't been accepted as of now.

Packit

Description

An open source project aiming to ease the integration of your project with Fedora Linux, CentOS Stream and other distributions.

Contribution

Have a look at my pull requests.

Snitch

Description

Language agnostic tool that collects TODOs in the source code and reports them as Issues.

Contribution
  • Environment variable support for self-hosted GitLab instances
  • GitLab support

Karel the Robot

Description

Karel the robot is in general an educational programming language for beginners, created by Richard E. Pattis. This is implementation of Karel the Robot for C programming language.

This project is used for educational purposes at TUKE.

Contribution

I have contributed some refactoring tips to the author of the library.

\ No newline at end of file diff --git a/cpp/category/exceptions-and-raii/index.html b/cpp/category/exceptions-and-raii/index.html index 0326e95..1811abf 100644 --- a/cpp/category/exceptions-and-raii/index.html +++ b/cpp/category/exceptions-and-raii/index.html @@ -16,7 +16,7 @@ - + diff --git a/cpp/environment/index.html b/cpp/environment/index.html index 7e5e55f..875a45a 100644 --- a/cpp/environment/index.html +++ b/cpp/environment/index.html @@ -16,7 +16,7 @@ - + diff --git a/cpp/exceptions-and-raii/placeholders/index.html b/cpp/exceptions-and-raii/placeholders/index.html index 48884d3..45f494f 100644 --- a/cpp/exceptions-and-raii/placeholders/index.html +++ b/cpp/exceptions-and-raii/placeholders/index.html @@ -16,7 +16,7 @@ - + diff --git a/cpp/index.html b/cpp/index.html index 9b54458..f5ff420 100644 --- a/cpp/index.html +++ b/cpp/index.html @@ -14,10 +14,10 @@ - + - + \ No newline at end of file diff --git a/files/algorithms/graphs/iterative-and-iterators.tar.bz2 b/files/algorithms/graphs/iterative-and-iterators.tar.bz2 index d6321c0cc0ccf0941b5a2ae0576315e3b27063b7..a3b509808fb2567f633a1d16a7ac619fa2a8cba2 100644 GIT binary patch delta 1904 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 JgonaQLBN)gRp|f# diff --git a/files/algorithms/graphs/iterative-and-iterators.tar.gz b/files/algorithms/graphs/iterative-and-iterators.tar.gz index 86bc85a54c8b77d1b4394feffd80faf77d77fd4c..aa52875aa431221bfda250e5c15bae55b287cde9 100644 GIT binary patch literal 1936 zcmV;B2XFWviwFP!000001MON{Z`w!{&NEW~!z|hdqf&=U0I4BVo9nLB+islnq3VNU zhTx5{>3B>+D}LEN>`&UiuxDm$d|_-XL33&5Jeb&X=FGXD4;-6fVp4mCUzzUkmCf%w z;_qG)b2|2Q%bybO@14!40o2{wW1r1lr^)Y|y&nH$)NXcnntPqSZmZYpH9I?OvDMr` zjSbH&MS)LEg3t~LTo;pkzM*H`6sVJgzVvC~l;mtwyoox}%_eNBIe`4tHs5*F2 zc~L=#u}v|d^E2WF(*b(~4?hHS8c<_C#eR z-RyI53T${EIF5Pc-~o2oM}K$ufUB{a)#F8lKVv4q-9vlx>5-jN|30yHw{-@q@m{Bs zTmL|r`tLRxtsT_amI6ie%{!mvi1|~2BHalZY|8I5Ly_NpI*HiufKIp%H{tbNF zy+-GApW?}WC3&YGd5!~})%ILpKf~Z3+uE;GT2Ml*=Z40^q7VILhJ7vG|{wofAwEBuVA zezlIOU)hDS%bZ;ZyUf_-mR;`H5cD@ z?Jg~lY0HJ{zYT|%oLv*UKyXT{^fAjlC&O#3343SN%$^Jr_lIAG>9!0LUBeW5z68_V z8m763W-${fa~u)zE@qmQalvgFXWo^O6eeOZ)3-8y3YIQNaS==d;tJ+?ePR};zo`3nMkwvw{RdXUwxqOg_FnepeSo^j5T?klc!`JA0QYHP^_AL+o#>3xeRDO#(8fE!TZP)h4 zDXv;JCW}h?uSI3?_yK9r{D(+wJo_1~ng4sOMmvlDdcdyc|2@#A&f8+wG+(Us>pAj8KLd_qaEqAYXA)T9ymgWy^>eGP*7$B7$EM56@BwN)s{ z9K$8c?2n^RV4D`F_h+u}m%7NV@D3b}w3jcLtT4HBNTPYhg-m<>W8jZ9Ei_sL^$b&n z8+`5%zEZ1YZMYrV4n`UmapVP1ngi63*~8qVK`)?}VKDu`f`sv5iZCsO4jA98cq#JK zFYyNb9oYOH-%+iWmpVe8H_ZZurRSn@{v7MHbY9|-#Dj+pL|B%E2t#_N(mkQ_Q9uZG zY1!0g?sCCGp#~_iDoWxfZdoEHVhKyz5|7GdN7|!2OJW()REd{)zO49ZqiPKsYY0g% z5uE&i9OIE0IJAFJN0$RF(Np;YG;+*qzm6_Y0Jmr;m@iESiaC?aY&>1W<4Ll5DIH#n zSm60dx)X~_SOaWH|1rYK<%4LacsWbO9 zl0z((lK{3-DbaeK44z#mDhsIyo}PSvvOM;m4o3c&sR;ic-Vgq7cYCcB{NHIS{C^*` zDgHm)BL0`7d}_Lu98{OX=Ej==`e?GbDis3DKNQ~|ZW-Sn=HvSZ2l77%!5>Nyd{(6- zJVplz*ppT&%BYw#gTzIy#LMAS)(qM2TVDelL>ciX`x_L^B2&(zpSb)pgxhkkEjZVr z?EnrGtjAagl|gIB29XI-Q;)JMjp>5g{*ogBzxRvq>kLFK_Y{LxmRd42FiWF>lIg}s z#CcW}<0LKP&37#Cf-mSLYUXbXvw&|3a%^Li4(==mVlO0hvGPb57Q}|}?<0j@6CW3- zej2cu$KUXBK{H>^gS*C?Ff;PNu2|*U_iH{R#BMMNQ#&qdp0{;|{^oVWTUsSip8`cL0a6(pdF}z$7@lLwHe_B9 zC)Z@KPOPV~TXN3;VKy04(h9g`fG?$9gt{_K?wbAR7%N}YwfMWa_!Tj46`9{DLn-Wa zARFhYMQ)B*sY^UmD|0k|$7rxlWT090bk^m?Avs+hM^NKJ+Uw(Gu4Q(DE(-MHzu^9E z`ae{^aL6RoJn~#>+O99rRW_dZZ`(y~PXC;YQs_()?(G}IPF$*xMXz$BLjEfUu+L;l z=RBG61wEk`qR)&T!T*1){{LUA*J?F(Q1d>Nd*<{15xoDG#J|&Ox7NgeTgs{UKlJav z()hQ!YvR8xMT!(D WQlvVzfPyhhNo5sEX literal 1932 zcmV;72XpuziwFP!000001MON{bJ{o*&NDOp4_am)%#=DnAj~ugoy~Q3rnlWV=|iUv z4v655v8g1J&_A2<%f#AePEzp}l-D@WY< zgl=CGdorSCpH7JX_ttvU0NQQ0`De4+X^Q)1w<|t5?KF3{n(a=z)7tHHcHlWIHoIG> zvF5p@D4@(H2yKzT^DxQh8~FX3qV*?A`yU~`xX;k};O3zE&gm1M`a@>EKe0@BRPDW} zyr>|=*(R8<*%|SJNsm8*haUnq379pT;NHm{-rr8#ha8qot}#0$_88y#VKC%LY+-1P(;tX{)^%dbp>N!3`1bOGgkEf7LR$h|F=83|KA7w_s_opb-ZhI zKBEke_bSOd^T>By=&X+KQS%Igf1LharQ$)?rW3o5kwgjTyXf70*QOMONfSQf1P*3S zADwaDeaZ;P@1Y}tZH7%#yL@e=hs?us5 zRlo8JrQQsy`!<6X=&E#rdQGS0j!BPmS8Vy16p{1hx)km4ek1;mrg@%}_Yg{3+5odJ4h zJDwqv`|}qB_-rX_iyl#&~aO<=7Eg*<`kF)j3}e#g!ZNl_j2JPbrWT z)%F^4z;Qn5p>xKURAMAUszpwMD;Ih%IM7IYCfn86$f0J`ck_FBERRbPEj23$dBikt z&LQGRiw`}*>gdY%U64UB1D`MwEGf&~F|k>M{vf#hn|%X<`NxSDjAf$)$+cxD$Q>gj ztL%@XP+*%8r}t-}@0YsFuJ8^Vjf|HsxvVg`Oh}?x#)Vva^J73qh7lSqgL;M;#|>0C zM6A?mSsQLgj*F2YL>&16lx7b#RQ7N;8PE&ZWf)8v^dVs=OcAc7)B)q0B`-yu`X%0A zz5|=z<2z>5@={02^Cwxru<%?|&YxqQ7S2mNQh4ytg$S#%5MfBqRJtcrJ_-oI9xI#r z++7}6DAfQZmPIN2BrHqhL@Z%pTjEi<>_~f5WJxSTnJV$J$d@HQtyQgIV+|qcC4!Sb zkYhZw1DEYz)X`1LNRBOnUAN7cswaqFO|cK6A!#N z$+XA})Dj06aHJnF5l_CTOxVz9zMh8_6KqNSi#i&glPTb8p#VbOOSvqOEp_gmMskS7 zauUE+DJ5FZlOeJTMP;EBA<|RqPnO5t)4|9;GZo?g!~4PiJGP9*TlyKs-FgI z7V)?IT+l4m^Wd)aCd`aHuq#)^_PB98V%S`S|HRnZ00La~{d;BGi>>a@YJv$5{EIt|i{h#jl7(tH}IL8A{==1Nk^l zEednwN?qZhTA8E8J4TClA`4Bkr}Hi^56S8BID#4%%3dEY3oWw~bY7sJ_yzZOoBmM! z!XcAT^T_v@?RZq7t7<%n-?od~oc=i(rO=ro+?zLupSVyVi(b`6h5T18V4v}X%|tTg z3wlB?M4uTwg8%YEGXAah ziui9zIUWCp{{E+k|L#tswIcqTQtp|@Uy~+Hnlx$Bq)C$|O`0@m(xgd~CQX_&Y0{)g SlO|0+5B(2>BfN0{Pyhf5#M;sT diff --git a/files/algorithms/paths/bf-to-astar.tar.bz2 b/files/algorithms/paths/bf-to-astar.tar.bz2 index 9a279e9ff6de982aba163ebfe193116e9c5c56f2..d65e4154e9902916764361596e7509f286a5ce0a 100644 GIT binary patch delta 3162 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 LoG3_cjLHOns|b~c literal 5882 zcmV*B>`|MY|o5A;$pI!&O?>pYrL3?7UKD)GrnS1Tt_VzmHd*`|B?w78I&ut#H z?q>JHgYU7e^A7uIXv%xmcXt-to2=<~&Tln*x?8w7?Lt#XAOd7fG|8aU+L)7SntGn5 zhMtJg=?_um002D@{ZP;)0W=W;Y7qtr5J^*v1hWB>pjrhot>B0^0}Df&_B zdYWnJsi&xVYCS;013&<1GyrG-0FzNf$V?>KWQhJ#0> z8UO$R|9wD_lmrc(-@%LoaRNozfJlHM2n%EY1U-*0nuqT8e7H?Z*t0WO5ivdU~G7$u7ff6W@Ra1c7?TQ`TP06ou z`}$ue+xTS5ku%PNvXidl%{@^O!slt2y`A;9S&z~>OlRA&j&RV2j}%&XmOnME$EB-E z-@K%}0`j_0QM2T37x>5n#Soo4l?zYW6eL7kf%HSWRzu>vx$z8@EX-QPirp<|z8SDD zVx<&p$t+$<82|HDx8I@IS5LxH=n-^+Qn+iQKdZ$$|s01`n$KoVxCWGH8tp_&Ppp!;S!JXYB!+~7goLu8KyW)14H_~Z ze6Am(e?LgJNb(&o)8(h#9=e#IKGDKFeDS;aJbQ(68D<>D*mkiesZA~8VUdm*IxaVX zc762wwm^MTjt1MnGraQRJ_8;}IfBycv{6R<0D|zU8gmL9N{14mR;XQAp#=&QEVV-E zP_oqwu*iaAn^B2I+=pLO%}@a#9DPTrIpG$R_Z+i`)ghHLwO%s@457#b=qOlFsuVg3 z7qX#3g;+!d5dpb&T`#ci(rvK(&<=E zz~5e;K6=Sbp6T%fYK9UpvDGli@li4?W6E zohJuOpOh-T>J>K0D%v6>{w^U1LJ*X~n`pqfnxv5d4GO%Ny?ZVuh=rw)FM(l9bY`BI zwfB&n9%!lubn8zdNhFd z3f*h0VVp%PNZ|CB=#4Kn_LVdyKg6eN3K5uqY=OiVF7^2;j+{}MH zuf73rTR7o1aFJ8U4W&2G$HcmO6uBs4D0wc{GK>l`3b*`_>4_C6QBy+%-onz3 z#Tks20bY_!45CEqmLTq4RdsYZBXf4PZFFhfjjdCU9fR9!gxA<|>P)v*YdA83ybDs$ zlBQfhwseV|I#FEKl29=ahk*)Kq1KqtO40iC>g?X=o+ZtZxH zd43<-ENY^Ryn49!|F0fBM|aasR~eV%4vjlh8i{AmRN(8J^iosx%05q*=lS684l1*) zCj3rtAXN#ne3X2$(Mx}#l?L`;PlJ~-`wYTw2{H&w7C3u5*XRc-`lK=EIe@tht|u=> zh$N@c2O)rq5n^bYv0avK#L)56UU#pn9)@jb+G5(`EG!M*^TeLjGEgKS+=aWU@M9rv zFG-m$Np(j;cC^=wKG1XA|BannA9U&a$(Z}rQ%$b0Wy!u8gFsmwV zHj0sqn8t+>@z0IaQWRe^ka~OG{ZywVMDb<^*H1&&!L}A5U1hHrP1IxZ`sM3Wc~k3^ z^;ZVaA3>Xen;AnYG-Xjv^Dqn|;pEWx(7FR|OX=LVFK3udi4=*-H4mh5q& z8DGF+PI3qUYu~s=PL&i*eb97oLTRcFMq6}Ksoa7;JCX@Rcu0d}F^E{0&gwdv0?&b8 z4IH^ws8LQUuja#cGYqJi45!~o80VY2yQFcdnkZV4uON}T#tyXnM@rSX9C~Jr2OiA! zrs2(&?k|I;4pC(HI^2!ptvS7RId#h?VbqRJ89~(U@ra4*0wKNFK7*Jr->X*2qMrSt z5S|R3CugLh_^*U~;XRp18TVCQ$7It=qGh+&>hV5Jk_iNh6J(JbAqt_!2-=fD2?8V* z$Zg%BX$xJbD8MqrP#R2?iHkS>Z*Kj{F8kpKd=ZR&v5b4KGv*9v1w21TaZvEzzmx?t0-ZIW5=KZ+ zDGeYe+rFM0D<_sB@ygOP3Tbol#YA3g5cm|7NH@TKkrbd(Wh2`U zrv}nu?}DKew)$X5O@jy^^)D=T8Ts^6Or#VP9rP7Ir3GmSLq%*oPQKL0)m|3DWE+iBlGjF3E9OBoJ~h zNc7yW>Cop3#-+|MZ{~+nsRF1g5TJyrHBqkn6$~{NPFM&XDD)tGmSj&M@cqw0Qb?2t zgWXS?gb!1~{16`P#0)uok3$L1G56xc&@mW{MwtQ-G@ZU(+$Ra|`-DA)i_mgZt+ZO$ zcMiXZ7;?>Z@;A&2-ig~>?3DmuL4IQNA%5;cQU2OsL`OpEhcWckAf`w)J=(7^J;t*f z3lf@4J0;ye4+dO(=$sbmhOg_Rh)HI6E6DW3#k2QrO1tc2n*(B>I;> zrQ|`X9**Nq=v?s!&r&fAilJ0S;YBWcgRiD0XTqA!(Quj%L!vPpkl>m(BH*LRfq=n) z$-BRPKyD*9!i*NNCndA9cX43TOG>4t*RkP*=R-vA(V;J|-|=Oe zkW1t13Zk={cf@d!L5SPDcSjDZLhu5-ZpM1^%T1A;x*-6I+R#c#{zQ{qbr zK}cq}4HMjnay;YGfwQ4z33DAb%nXy*8vY0$itd&s;5ose6UW<##Drdh1JM@A+g1&X zD5|QGF{GcA3%SgudSFlW%~v`T>7O{2mi<05U3dU#?cN*=KS(ozI0FC%NvdyvLKe`M zVl=8;EUwDLHw@88cC?hAY))0q)m+P$834FL43ls|lizTy_zf*+7+im+;A3VG5fe3M_LaN4WfJzEJ z0Gwhh11T1~t<{34peZr8aHuMjJhC}+AdJH>FfAEiN8nqBu)$?nr<6riP4KtII9{&% zT@XAswG<)*g(O4Z5#w6aCd(Pal`LHeo2iE|HXzud87M^!q&PYPaqxV>fN%;!Bk>!F zWB}lwgg2XrXNVGx#=8+os4J^1ftnS4fG=Zp&}|hULJSmSQ!)q_T;TZMWCeTAIQu@& z>fvz5YFO**dUYerUpq4+z>H{zg>y?o&{NuSWltnx#X|$wEp~#O&{K80IY&C&iF802 zRVv6t#bc48LNqx;iW71uu!)20wHwbSdaF=Q+=_Hi?6+>GS?a$|xl)|h>_12d7C$@q z_jt|xT|nao`Y4^^HP{@Gc=g#h%^=uxQ^C{aiY8H-B%{Y`%Q-Z9CZB803HxW0Gz#_!Yt^#qA0>K4{VY$NgUI^=L zve;xD=w+F57~hHyDdFIj3|j4j9zC`XgbWxn$hFB4)1PjqN1QTIk5-MPl+;7B3wo4e zrUE2|rW%xb>mVdaDC%a1rYd@2>41GlHm^!}rrM{RQ@EMY$`VIlEL?jo9z)2Fq6nHE zVUrD!(c|stDpwT=N=1dVqr;f~y&XTuA?E%*Kks%S@YwF-iJPcQhYj(64LTb3Ofwm~ z8yk9w+!HTiJKIPZ@&#RxDY_J^qLL~?0tAY%ffR+%*OiVK)26j3%#5`s%LB(~DXpCcm z0$typJG!Q41ih5P_DtM}@|OAG&4%#hp?2Z;*^J{D(EJ%lDQI#$)&(fF3@SxHQ4nB= zYj1+E85CfrD^LqjwwgH@s+1FCPd1g7#}4w8FaiiTO(w(HOC|3?dWV>h$TNpdRLL6@ zfkdQaIi966?mHhatDj!EYqBC74bHU^87w^8l&*cS>r_TTKB9tzq6W&JD#ucqmju-) z*{&K!4S=^2YEWnhBZmR*Q{ND$mvF?E9=1qX7I-?S0P|S}8-xoJ!Wp&WRV`g$$$&^QdTdMf9q~tb{A$29dD$J_U z+-$ieC{zWKv4Sy06yn7s5IX_!TXS^W!LJa?0Saa|&dk%E0)k%@<6N+)h(y;d05CB! zCdItUt|7`vyb4Z4PnP_96v%sWA}6{dA6 znO8VFB2eNI8`3xJ-ZuYY0018bmV+ag@M<1Kf?>p>_JR#6ZO zm;8$n7)Hw^X4V7jZPVUSrI z=4I)%r6qZ48D*B*Z+J2`+(5g1`lA-w)YcUOFHYU@x;NBL1dc*AiG+v?2OU>VVQbF9 zYanR7zP#Q(py%KsZUG=31fpbMw5rqu+)h2y?k+vfL-(bhDHCt~52z3P2nxXB1_4fC Q6kq=raz!{$ko6!Dr@G&UOaK4? diff --git a/files/algorithms/recursion/karel-1.tar.gz b/files/algorithms/recursion/karel-1.tar.gz index 90ac7c46a56633eae8f3820d9cd0f93a76ff03bb..536af5ad9a263c61e54c6e977cb4db1e2fe58695 100644 GIT binary patch literal 6582 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 diff --git a/files/algorithms/recursion/pyramid-slide-down.tar.gz b/files/algorithms/recursion/pyramid-slide-down.tar.gz index b6beba926b179bd90de0196f927da35525bf627a..35eebe3af0e1f11773aaecf312780b964dfa79a3 100644 GIT binary patch literal 1424 zcmV;B1#kKviwFP!000001MON{Z=*&O&U1dn+4RL$2n7tr-mG11w^g-jvs*RUzC>2V z+7pM?1_U^XmCb+enG2Y!okZTWE1gfa7>SGx!@ITF2hfpPeKNf5uK`;cf8!k71gI z%TJO1w|C;VR%Z`=H6x{fJ+o31O42-~oF2d3@Veam%S(>XBAzT+APVC=*BF07K& zivbSeRS>YaU2Yam|Jm06jly3>VVnXVYJHXZ3;k^zd+X%%@Gx3^Uied(F1#dxY)-)a zAs|#AmM+DEAEdAdgE>pmb3ToJ!dcY8lb4gr2}E*&b(JPZ)|F(!35+0Mx1vMI>kAgl z(`yvNP%_1hLPZQtz?`5F8N5CXqxHwDj*@AT)pDB|wg{_sw-Cuy7z0lc*66jSVx8jo z@d%7lI5}AtQ_s_fIJ|8Qcs8ekf5Jc2VXz1ElBT}R}rWl40)IuGTt7K7tc3e9cg3$igwS8-4jHzxRzvP!PJ zOm0Gd220NmI_GKZ2XmYRUOZ2VgLJ-5Qnu8?RjNlQl6HV72sP`aRSipp0p>l+O_L8(7j*za2t_K7&hxVJQ1#M%V;egF`gUZIR|YF(T0O< zv!y0HF4L5Ld74>q_yD?mka!ga^0(7gDO1M4{q>ZrY0DUREDoRR=*Mz-9z54(J7P5Y za?zm507V@!Kxo!bVPSWFDCZ3?ZO?2eDT?vz2g++tEHyEB18Hg4lfeoPa;90O@sVrM zG+euNH43rAhr|Dxk`P`HQJw$)5;Hbi?~VQMh+2LzXVDwUyl51`m)W|gTbc9oG})SFzQy-6b#CFp z8u;G_&%a@Nq<_!he@5RV{`V3n@jo&0Uzz@mYxEC!7-uYRz{r|q5|`fqZRTEEZV6U6 z;@4rHTew<&1G08mdn7rmUk{%^|A_w)|EnfQ{Ezq_@jv2!IU4xiMHumm$^IDN4*utu zX6^aEZCb?tUIMk}{}(Z1XI@l&0YFU(^{*1MX&BGo_b~BOKNQTNLj2I~f-PB)Ch#s? zMqccFUa&Wr!npA7q})hNF3B#!P9_L(?diE9a<4`Z>)2>|#$92CH{N2!K3;LPuD(u-k+!+)zo?I65Yrj+dN)#Anf)wd+@+(_+ z^0GF(DzbUQ07lQ+P{{EV@7Lt(wY152(k^3{HM#SsOmvxXv`X_#wZ{EYp6b@S;?mlj zZLIBcr?YEis8^LTv2mvm>&{(LQ}x8oiMCF(b)u~kZJlWAL?93d1OkCTAP@)y0)apv e5C{YUfj}S-2m}IwKp+qvjeh|lXH}m7PyhfcmA+&E literal 1421 zcmV;81#bZhr z%=GdO%iW}rMSldd>kM`7xFEW!=_^8^v>RY`0LNNzkT|- z9xm1Z(}3e4ocY;xZ{go{M7~;{M7ON-P%djRI6kG&+(y12o3Lz|ghg?Ej2|hh13KHu2zkE$I!oPZ5HNiY|J=uZKYmT9UFc4E{Ay&cSaV zt=lNy*QK7-GJ}L3y6{XcBeS)5+mk*AJcL2BuEP`I`nHVL6fRO7l#j^#|Md5p)Y?sZIv=)4BVfkWDQ%!z+-XvTt`2q$MfL1Hro-S;mSpW zDt#1n!~mgLU4@0+?m*5PURuj&DJhEa?EA{AC6<~PyuP$Fuw<~pgPdt*X?)~bG<45y zU5!HQ@Zs>krX++HL|o_pza)%JS9@dsJNdt5n|hW1o0d)d|0Pgj`Eul+&G9uMg@j2q zCegga`mdlPNN)pSHmXcjv8$W}qu%%u?Ts6$7`Kd_f|!nmMWwC8^vjo;sPF-!#`B`_ z*f>$RR;_iFlvPbsXdAhFzFFSrZsDR&-Lk2G+MVNnj=s$ykzXReM1G0<68Zgqp@IK> z@Piw+NBZ|1{---0@xPZqiT{a_|H|}lRHJ{$!#HDk1A5*pleqN_&}Qzn<(6QDBYqwB zxrM8(Z$Q>AYmX#{_3Pmi=pXSv;(yfyiT@G*BmPJHZ;b~2cM-+>VzNI5xP$*WhEaR| zZyP%Czn4Jm`Ts@2*qI+!UjR^(Lj9{GY!W3?_&rL4EQkbis1QH2J7)_PW+}Xj7O|iB zpXcmNt}rV6J1I9(lS{ITsFMpqQhR!?h}^3oBt2|2J>#x0!yA9TWFN1%TDQ0HA=S4& z49@Q?3TG8UyTcimE;%dT>}znQ4CzIdSrB^!fh)&eVdtezHOlJ&(en65F!3kXtSr4A zjaW4*Z*!=Z8S>s<>6y8j62*S}d0MCD-{8)mnDO|sm|y#y>Q|z`C=+H#htpr#sb~jHw<9-tPO=6Pw{@udcBr58Bf|}?6M|z9+inMGme+pI#aE2zqC$u>s@haZN@g% z_PNv9wKCMJO1apmQ;2ovE~%+{V&_C#C)zsE)`_-Gv~?m72m}IwKp+qZ1OkCTAP@)y b0)apv5C{YUfj}S-2#?0UA_mu&08jt`O$pM% diff --git a/files/algorithms/time-complexity/extend.tar.bz2 b/files/algorithms/time-complexity/extend.tar.bz2 index 6bdf00da0399102972a9953094d59be2d3b61ec5..2b8ba9bdac4856721c6a0b801e047f4e4d4ae01c 100644 GIT binary patch literal 4074 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 literal 4081 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 diff --git a/files/algorithms/time-complexity/extend.tar.gz b/files/algorithms/time-complexity/extend.tar.gz index ac28254c1171b65b966a3c580c934c7b748d62a2..ab4e23e6b6c826977cc76316212c66332d255008 100644 GIT binary patch literal 3912 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 WpZe6NKJ{te)Bgczc)SJxpa1}W>9fcH literal 3911 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 S78MZw!tO|?3K9giqKF_gXXqIK delta 2553 zcmVS#tm z=`f6&)HHwJqes*A*9&J^a9YIxdi;ER@Cth`VW!%96gkP91t6&rWkpgG?;9U$`Tga8 z@2k^7l=})&lP9fFbx+Qwf1TB?54ARbRZ^+HcMV19N|;q%U2>|bVp{2h!DSCNFRA<9 z*QriZbHVj7eGmL#`EC8!-Tm1$a{R?PM=51G(vs?2rVA-PP}L$|1mLJN@&^GQfW&qVER9I^4GDz<#f-X?wdC|tLmlFaVf}LX68}! zvSei`dtke|l4nIq9L_#3c&J*Ej0;C`o5 zyEoo@rA`6Hu=XdJxVpx_CXyEPq+A^kTDnful%{g*p?dzY2J`@nte`EZL?C(>AkmV5(+sdh~F&Clt{% zPDP7~i=w42(pv3hBB_%F$GNi8xyLhBg{Gz`{;X2dg|1FYVdHA}hww3f78h*cOz$y` zhmmE^2}x>mvT|g`c^Ns>@k|+Y+2OVp`5la07U-UrLlfU}=PoXx-7nb2c20jDF?B?BuLK&x9Q62-@F&j|xkh0#(#NWi6(}H$5?D63_o)t_c zOsvak%{6J5r;L0Kj*s_$LxwyGPW*oV=+TVF)m7NLVfm#7>X;NvYz+we;4a8!{0UXO(xC;T|5P?XW_q>42&>;+$##N1{cc>9nYEU z!NZ+ayjJF6g7WoWx$?WP@>{yq@j7GFIi;p<-OZnK2V|wAqZURO%E@w;KN9XY{VZ#+ zew3ahiASuWic%?cCCPC3){DZSFjIzAR3{kojun?|eIuWys=9ceN|U+mdtY1hKkfQo zV?;R(n=WjlX3H>tY}vDCVs^P1c{SAPpOwgS3NvB%hg^2pdgn~)oQ>g`K?f7UPju=9 z6j0EKu)y~$kFVaU zVJo&CTfB4Y>t0&bW!R}{JB*eyP&XlR#faGo3PVfg{e0Me4Vr1<=JMyD8hjiw}E5ap>rmwD^&Fs+qg(Rsd z?mucj{re%u_A#E;ZW%|(K2%wwkM^^EMlB!F$0gG#n^n{1nz|fLwk}y5MT(PSclAau z&B)-4(V(5ZC7af?z`yPHO&g@j(Z>roVuonH-SqN*;&DYkdZC&$G*omZ5y$RFyyRi! zM=~UZ8J&Jo!W+k7k?YfF_^L$U#x%eEhbTM{L(Xiss^A8#>?oBnm8x*{Mbrq2L;e_6BPcYm2PS|0~fg3iI{?l=T zdwrL2u!W1y@L@MQqB$MX$&pbQ8OI>ahis&{R)RVh>s+yEbF-LW;CP}lf?+m@$#GGj zsC)F?IwLVksBX0Iej`+CCT0)D)O18Xtl}IlZBgh<9b-3_DIv<8Gm>C!8zNe&xiO)C zZ%sJZ(pkcr<4I+?Ci!jFMA?Jbn-#24cf_J-Qe;jv@{~}iH@EbU6eT;-N>7=>k#xFD z4AI~ySt=TB#Cn>4#P+Y+^Iodc{QRs&ir@}wgLRi^SB(my|u=wgT4Z?QP zKLH#JPQF=aa06+8b&UtYo>AUyGDQ!6N3GD%s){0a195^ZZlte4Az-fsr@T^rQ`?o;<_Rdl2(q=ESyL@@(4YhChxg?3>J z5s_$B5^jk)3=B)kz{3^`ORD+H-X-QQ=7pDFsJtjKVzVYIVMETQXsEz;oHP~{#mR2D zra~76=oFbPG*LleSw*7ir6jpYX(L4vFv1NS$$8D=Pa369$gv(hU2=6BB%707@P1S~ zc^s|NStp)U6*vvjmsq4e2fj0Z-(@0FV+u~W>F{nuznt+&ntikGjodJA6p6i)S=m)l zK6n)pUO1{+B(Fi|ETno7OxiFWbfyiRsg&vzI#yCzTk7`Or)A1Q6f$9 z<^f_A6mT6`Jr$sKDL5q1XC_Wmrpa_QFH+WuNasr+Z7iv1zJ$S|J6B^8REc2UxMrma zlBCVXOygATR9lW16pQBYXg#wxn~G-4rwS4lr(z7iK3Uhr diff --git a/files/c/bonuses/03.tar.gz b/files/c/bonuses/03.tar.gz index a0e57b9d0b097b6475e803c224381977a61822d1..092989d1f0ab8ed5674985f8d220cf75fbe21105 100644 GIT binary patch delta 2338 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 If&fqe0RNki#Q*>R diff --git a/files/c/bonuses/04.tar.bz2 b/files/c/bonuses/04.tar.bz2 index 3fafe46558bf935563e28b4962ce80b3ebef71cc..67629d5ac11d173d2124a1b9fd611eef6b3727e0 100644 GIT binary patch literal 2548 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 AUjP6A diff --git a/files/c/bonuses/04.tar.gz b/files/c/bonuses/04.tar.gz index 4bd1c25026f3e412530ee924c6044dba224756d4..7d68c8be719955962a21ba0d020c67ebe8fe17b1 100644 GIT binary patch delta 2487 zcmV;o2}t(C6U7sd7=H;NkdS7kC7GkdZJ8vH2c+$rzTz>q09|aElWdaoO}_hE$u<~c zY)X^dU7vR*#g??Y+Mn8$TdD0gFSQ$dLAb-q&Ykn(@u33nx>ggv)#Ib8e6JoK%U|(W zdwuYtT04TDa@{exl+vKUZN{z{~PNL(rr2-W0z?Tv1xAVjTSft0vfB- z_J%ff`JSbH$Hg4SPNCPi?lzSk5+mh__oI7L$`_@1-EX|RP>{DC*eG{ccO7kL;+$p} zDxSX<#1iz6KYx9C4}e0bpcGl=VD6~VwJ-_1=Tia=cr|@dFbHK$iHRAy)fgpo%yVRf z3eC&LxuQ1JX6N#%b)j_C))~5N^qU_+oTjPKG3s=IOU$wd)a!SZ->w@M=tKLum_z6# zaybx243AwC+)d(_P-8kZu}8~h=tHw9m-ZZH)3JGvxPLny!=|zE22m`;LwlbwV>W|j zLW2S8_ZN*1J(OSUMGicmJ?tt zRn&GzJ%3ZKx=Ir!ipvsy`4Y&uKgG- zw%L(--BVOaL2a~qEw$G_YjsYl3l9J7h<#kB)b_nldP*M2`M*-FRwDTymQ}L+{~Yj= zP~CJ5jPhQJ&O>SphU$<%h+UqXLR3*lrrg5JCVxgT_ooalh8>qtRC$|w_{E~)?*lUa z#hLh&Jd)$TR(oBG#Qy;dXYv0WkQV<#+crf8h)D|JAqFLZOceV&J2|w2{xxI-k5F@h z^&5_$zL?sOLZHNwzc4~M0ZeCtk%cXrL9sK%IvEjcpy54or*O_AjT*?bZ!r@Thqg)Ht@TLBZq`4KFt}Sp8n&K+VW7=YXO)h;T%0`0->h z;31XN)aK~Qm&dV}7I-O8KBzCfPxOk|pdBa+=wCS>S05evXvK|X7RBA?>hL_zE!8&Hlc7Bd~!nYs>|X^hCq`4)8N`J0#pqeFQa#?e8G>v3S#wP*-!u77@U z9*RLVq?9ECz}`v=HA`7bh?DPFbv&u&Z#%HF#S5_9#3qXfBT%2}U=a=W?D>NiGd!&S zM6JfCa)QZt;-HV-&w6!t;SVe~1XYO*VI!*Brl-M}HHjf3R3gyV3MJHA_E2T82$DY< zFzWDL1?}OxLabdp9n4?DR$6N$=>is0laT}!e^kg{0)sby(0uW&93DX{Sy=29oj`#m zAL>57eB0eEB9BZIN2pukh=;nj1NpLyA|Nc4?lOj3!$AeWso(f4_%c`(35cyYBi+I@f)*^Im-?rh48`tNp&! zZuJ%QqSLu5aP|`?T47$o-@Fv~j$=#9rhm-L2Yduc zI*c(-66kFHwAceweupf+AZa( zO;rclC+;%reS2K=s7op;8Q_v>wUpxHz|zE{G>+%%SqhHTqmsBdN?;lI*2p$Z`Sp)P~r*e^$%l9}DNe+&0BbE9 zhWr2)Zn$#LuW!1tUaxPqvMyG}xJnqjTkIq620MA_!jfO%@muoZqo10NO+#T=zOP-p zJ*0-Rif5P#&oyk@e~QNSrn&7jA$kYr{q@mX?$7#3aUUPrj~dxa*H-J&ZTiXiyef#R zEuL5fo1CrB><61x$&aXo4bI)?)<_;7?cMar-SX=jpRTe zRQ|tWaCGti-=iS`jb~aDeVSYiCkP*#1>$7izS&&*ZWEgdEo>0iN|SNDh=W)u;%fHo z-7sAWsK{4~^<^1mTiYqtNjE*R9?MQbLd?>AF}eLplvA8b+u@essEpOprb#{~&BhGH zYw6ees-HmyDH&vtK?WIQkU<6+WRO7y8Dx+_1{q|KK?WIQkip*-{sMP0Tyy|X004gs B-q8R6 delta 2485 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 diff --git a/files/c/bonuses/05-06.tar.bz2 b/files/c/bonuses/05-06.tar.bz2 index dfa56b007f09fd3a9e944629568c15628379fc8c..46099839df5f361032570ae7ba08cfac9e5428e4 100644 GIT binary patch literal 3646 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 PPyZKkML1B9@nY>4F;>gw diff --git a/files/c/bonuses/05-06.tar.gz b/files/c/bonuses/05-06.tar.gz index d397bb664a00de0c7422091e1769684eb2559e04..e2deaa05a98ba937bcf92af59d9157b52338f4b5 100644 GIT binary patch delta 1818 zcmV+#2j%#l8=xDIfPcO1{r&yw?t@CTwzs$afK=`qNEZ37M;$^QIKE{uC!bHZwRem9 z|DmK!VCVZ2!!joRr0=lzzTq&v{95U%jZT}?o>tb^)*g~m$9~H+k7%|vG)BHdJ;S!v zrlPg%G7vzW3fj`hEaAufA z`M@;aqXUzzQC;t|=xrG|$fLglS+`_D4GZO@xIE^1{S+(o!MtG)4uXl~Kn(^8O{Rv) z9CA$^%dkf7nlU70xh4Is^yR+XX`MEjO1IxQCM~HapMWB=Nv#p-bYYSVwp*h1y2{zP z)Fk!x`T80m4}Xd8f?(pXk#B;j@$nl(nodn7WZ4d>%Q9zGJ;%02<_&TE(Fiaz{TE^} zRE}(3FvqbSV8hi5r+(Fx>MAM4Sa`!N*>pYq#mMrjRTxN36Ni8B97;B)OsAG-Xr=Wv zX1Wa3{g@^#^|hQ-<+b7Z)C91;ZrDVA@&x+8i$=`r2Y>6?*Vzzk3a!Ki@$p{YlGASE zwbWBcU+(t$DztZ%e!J5@R!+N$3?1vU8oqfG>bNy!&ctwCHCRc{fw`bo?^W1W{#R+vZ%OX$;bB4nzuU zTYJbokCF2>xYu#{iaP70T)wgm9bWMrc<$EY$7|#<=`zoEEC`iX%yF4c0x8giy{~*r zL;r<-WOE56Q`@jSh~Az}yfI4;+#uIuLmQJZb$`i#F^gypqYzV3*wC>je2igDeUD73 zLnjPGJtd7{qFo3ghD+M#%_fHG37go?4I~cV)QM$#AQ|OBjI}iszCng*oH#U8;#WQs zB%}}C%oM!ON$Kyfsl!}mc|6||dpI*>1L2_T4Ppq)0a}g?1qyhf+6ZB5O&f!~KMtlS zLw`bdA+7T^#I(NlHxHg$k4dj{+`$3(HrPAP@r<_wP;vTaYq!x3{yK0BHYDRnOO-~hq}z;;!@^~Tgg9v@YvxUJBcSPz$Yj?XsI(w>nag#<=y(A>E;T*lRN zaji6hRtjnXiav~)Q4`)T))Ey9u9W_OdDvqoLEX;{$dLe9KmGOe|bvjeo%kFJq0dO-F;5F~)FD?{192h_7vo1H;3hob)ED zX|Qp8eMP<=+K@G`u>p>fsM9Yf28|-xJVFPyAM8NFoxxyqgk#JO&gqgT zMEtSN_ek{zE}Uv%Urks7oRl*eV%JPI^u%ZiUJy$}eAhNq1%?Cp$kLG+rGG)<@fnVG zfsrr@CXYOPw0jNC1(w0_4{hHOGX=?4>^Z=`rZ>or(m<&26of;g6?+4ROB)V5BI#cn z-Z&_3@YsusCG^XxDAcVMux4U=ic2|wH<2Cr8{mB{O;(AnpWo(I7|;4(Xwjy^e| zXN4_`Z6Vw)6bL((N*^(T)q@gl(`-CS?c=@g*OJxPQR_63{J84|p$NA$Aq)lrFON^p zZSy6*a(ZqWFU7Jtb{IWo4-PXmNaAcD3h?!LNmLWJa37U1SAV30MSqM*Z&^oqxCRDD zv#lVsxW38Nj1MEvw}hJCL2deJQFG;5G`77Bl(&2pnvRK+=|8m+UF?PlX~GS|=xa}> zHrN0Uzt|kF*>_XQeq#PuwRBxnSC>v0OW5w$zJ2@p6yN`jKi?dS?|C1v_E~ZHSX@4S;^kwG4Hegh#kJuw z*M>P}R9yHK7k*#q!tWy%S=`-yzPr2osY{A$xZ)b_`@Dv`r<$y|Kr1fLmbgFzt9!`5 z)L2}BecvSR|HSvHKieFOzyDvUR(I0(f7_KxasT%vDE|H@#FKCbH37A=rU&o^2)@$x I-T-(20A9$9RsaA1 delta 1818 zcmV+#2j%#n8=f1GfPdZXz1`g!v{!3;dzA;Ia^FC*$ag*J5c0tBEsHt%e7dc@Th#v# zC2ayb-=7$kG4UsThrRa=hw0_lN>^=k+NAchvc9(VkeoX9Tc&wLv#p^q@*V0KwzW1D zt!0;i0P0lGmNo~r<-41M$#i|qWnNkBoOfkKCD8D6%%7U*P=DSi@_A1>YAS>?!z{`N zruiNnm~4&edY?sa%fLY%{T;}bRHB9D^ zYwB2rHFDRCAt}o(>35|s_vKFOw9!<${l+nANj>=l6p>A8jYy{plVq^n61CS=&d#MK zskhJ9*9dt?e18`N6Nim_6HJYd-yqU-YBC|qc1T^8Ijib9wly+ui0h9=fSKvP5R0L5 zWb=YKj_m*&u3k9xtEN;}Nh!v{8*a&_>*+5>mS3&HKx&#e{DbFEvN>fswLC*Bt*LVqQO3&wswohG0`@B`%1M_xhHcb{nsy zo}@68chGZS>XNaijC18qe^xz4iWy`|K9?jL$d6!uVgU*7no! zf4c(gMSuMN0`$+$0?@|bj)=Q|dJ$}8r$OecX9=)&GtzNMl6 zLO-&(gp#RkSRO=g&nDiOr3Y@1>#?DY$(Xuiz<-!UG>1`$sVHpd*b_d+u%^C8rqrPm z2BMyl#xT(?1QEj}?ek_6L-mABZ080Nhi~e{vOSQD@*u|A8VcVa!!%AD8Y=NCp9vDu z2XAHy-shzBci7ZnF0(wIZ;3se8M1+JQ1%8f1m*xO$A$t0yijd~u(hU*!QLMSQLHJhDpTB6=uE7KOFYMC8)<3J$dEz;BQ|L6TpKRq>bba9 z8bK=swE#sQ#>}V*?-y%{3^Pjdd6HU2mVY>e9blH`+)O>82_qxOPZpV)6fF}rd2mB0 z6i`}tbaK* z`2tf7pu11gwtgp_;#C7S;a7noEHIv6N01qcKN#&I5(>zsH~1HJh;`*+qS2_|%<6L` zIb-BTp%;Z~2m5;s=7>(@`kDrF4Sh4|L{}(`IjkRyNSoOPS zIKI9jUk`1_n%CF>M@iJ_7Zig=5p5o!1KSUFAmPqnFuHMN==i4vW@o}NW(VhV$rB>} zSm%4B`U4kEwXm-yECEi+nGCUOCL4NUGzBk+B_h6S8>#}sfqZ1?$c)k;@qhRXN4vmC z7zL9@9zNQ=2Im6H;P{8O?}(X#%Vm!KXs}QEdU$h=4KcBq#`WQTH{WY+eSsL%2mz zX(RVx$wwB57WNAZkQsIFqko3UG~^`N&F`Q#{j{jLaxEI$-UiBBz6wpp#L4uZT8S=p!-O>9hGF!zr&Akj zfQMgfj@RtFDP=z~f2>-%F1Fpf=Lay^kJPJ6CyXU*_iNw2eSM1Wf5)G1j>Y%C_AhG=`SWhJU0F4&6VA?rMX##l7q|b1(a>xO^-wA3yQ(F~^3AYs2E&aG7hv z95X5|{E7>|uXN$}5sNJD?mpk$-Tl-h#Wh@U4flOs!`)L&R$QPJ7idddpn=srtm zuE4%;68C@N`_!Lpj>X^quT-l$>HELx{$6qa_a!L){wKt$o0D`0GXbTus0Z)`2#@^& I?f`fI0Gl|G7ytkO diff --git a/files/c/bonuses/08.tar.bz2 b/files/c/bonuses/08.tar.bz2 index d04a5c4b2086ba6950e7f5679400fbf57ff74003..2780842b5e3908fa872a9493066babc0666aa802 100644 GIT binary patch literal 73567 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 z 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 diff --git a/files/c/bonuses/08.tar.gz b/files/c/bonuses/08.tar.gz index a135d8c6ef9e34530694102cab8971eb027d73e3..f7a4c730e72caf7f3b7d03accbf8ed2fb7be39ee 100644 GIT binary patch literal 106229 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 literal 106229 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 diff --git a/files/c/bonuses/10.tar.bz2 b/files/c/bonuses/10.tar.bz2 index e232b9d60fc83a2b776c6ff85a4679373777c6cc..cee162273a90e19ee035951ac00c21e2af92807e 100644 GIT binary patch literal 234833 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
US!v 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%0D$IOiC8L)L2~9xY4Y;Jv%!0)XQl1R=mNpe$7K}C zd~kAH%>-o-V9hPipat^`6#@5XX|5STN>Eg3_uprLp%$+eqo-Z-`J`dx{%2?Ml}$n4CEx^b6Vh`5P16N zJnG^jH1^tN5sgOei@o@C88>niqk9iP7&0&tkPC}$%-Zv8H#Sa{8v)(D`y{x1yoZHX z$xH2C4mK`wQ2NJL%xNk`Hf7SFMH&VJkLqv`dHSkLgMCDajbHbR(yEJDx{;CGa}L@M zuf|DwNHa0DKtWkF7U=VnRDdRie#*6LIH&`fWoo-RWSOq4X%M4$yG($WjiX)kq56sG zb2aA#`eiIVr4p#udhmU|USVh1MfYLCmB707ZW6{3_IF)F@ zxd^>~;MxzBi8de8E!ODcw&sp~&0kR$^(HD`(UEkx3M+C6u`+Oto{Oe`1W5+Rbi)WC z5efcjP$N;-ue#1B#;eDM-QA=L-RJoo08y4rlSeq++2^(rlF7o9w@BQvEXBja@C>;? z0fFFPz|+3FaOb{|qP$PCTHx*~tI9?v{{&?x9r$vnAO#!{{i3gJQ6TWB2+<&rWM*bS z(A!`))|~=yJTphv9Ofdne0T8rZ_H`>Z(fX z&1^4>k*znaVfzju!TDq}cG{@vR!xS6aRWC;M!|(gbDi|OD!sVHjLgDJkYM&m9203H z9mi1zE!~lh(pcfNBa?H;rr-Ty)+JOwT4zR8N68de+~%(y8d%&Qs6fK1jbrN|fiP~O z|JhcG_+T7Cci3UBIbJQk!pDLl!|PNfko;-tR2pQQj`{QJTQ?qBL7Sq0;rd~G-^VAG z;cmC2f7y5k$0kY_dcZma{MRy&EDXoI4xdk8#}dCNQ70iLNfU<~(#oGTiuCEOT$%_o zQA{yJR#DT)3~J$K zBrDtEV`LSHgyrUyeQ3raVu&oIFc)8Kw5j1JjAOs`WrXjq|$U(Eq~T#?jex2NnRRaI^5G1A63KaTUU zkiFFQ%=Vx8x1qe5je3|21cXOtpC743bb0WmRaKf8 z4p;l@=1qICGS7*;S|E9S))pCIIZo9nVWC zKkMTp_6@&g1iSWb{H0M&dC{~|_E_J=_rSDFuS&MDG$ z?SN0iHdIq`(8)ovc0aVKwCsoG1>n1`RjY$5)E7Mz7(d|aHaS}yY(am#U@rz6YPZFO zw2J{HtgOLQz`>@Koo5OX*KMU67;hWonN!zyf@KWnch3!_`^cYbcbS<+)0M+7{M^be zE0#V4WIWSq4LIMS|6oP|YA4vbpXx?VBlt_fC5{#s=Gv&D$Bx4Y{?g9mTg&keTmWq; z!^(-fHnRET6zuxVAei%L+dXqjCr;^<_Hy}svLYc(>sP6QswP@j`;Z7BgYcFvDBJ;1 z%a_c8&WNIYtcDb)ZuV-ml&RCyW>VUKQ90#RGmZ)?8r!Sfi=rZL(1E(EAM3x?gC=xB zNoB6B1q`!8sxhM3z6P zoI%mnA0Wys+aUh(OMi|x_w>Rq$X|bsB+l2niBpMCJjaTK zV{u4+$a$(SbFeI22y}sv%Z;Pkas)^QKn3XbjGMXxw5t}N%z!d@ql5w#Xl%=n!s{nD zLan%V>H;DM`5c?FVV_#sVS@01b?Q z0aMYD2Nxq)NQ5W%xvQ#HmH6yc0g1A4Cz1q43Gm{`3vv}8L6ZZv0sz?&kbO5Y6KNoj zFxbT1Yb>L{1`3sYY(R?#rks9;z*vYtB|w!3v4YWbQ-4zKVf|sXUtE7B3<8-cV|Q5( zYaS;aWNp;wh4-JwFLnvBXzxsDPs-G*CxADJKk3cCeIHv&=xbtnw*MvU^gC>T$RMbA ztRs6+95}^Q7z3t34BWL{@MGZOatTjOxFrW#E}5PrG~ia@?WKWz)(*e(?Hd}0$222j z+VPVvE50wwDL3mkO-xe)Z43C=i$m({cfc$sq6up6Pq<0PSJ#6Caoj8yQD-US9dN;n zKEEsXdy-EkLM=m-qR63v+lCz>XZHG=H?u)XZ0o!yKYhmSjeScLXPn4^}hQA` zt@3tkkA!n`mf|jODjP?8nF4);ZR}jF`a`JfKpz`1gR^pXM~rn1>0S%(g`8jj)uW>T z!2;$!M6Ee3X6r@(N03#YYtxnea)NHnS_{+D+@@DIN3d~cq9o@0+lNLEMnhY)F(Wag z*A5RQ@DDtt#@otAL1G&R)}}#(;OQCyLTtWFlMy;*0}b!1MUlw-m2Pt+WoOoBM=YHb zwJK_pvt{uOWpFFthesRrdyIO!&hy1XW!`sREGpLn$wi~cSJCX@atm&X25;fAK^N^< zZ!WzvHf&|K&vGOeBb21I=N57IP{0$rlLb?)9lW2qUOc!dY^$1eJR;sedF-X!lpq*; zFy3zduPWfwz%w9ZW*Zs|23S-L@f~TB!QzY6l9Fh_w^&tQqUG!i8w+ueA~ObL0RJ=b z*i8lF^9VubRARJ3&NHoeC1PQ zG2NW?3GOS#PweMC`>?G_iEKC(&e>J#evyUW+%Zm`QlZwW!1;mvtY*jp7;2m4dP%eO zOhEM@bw|-Z5kh$MFI~!epCmNzJmK&iGB7I)8rermo281FYyggfJ7SxO=D#AFr$C&?^GTEwQ7PzQ zIeYIGsiND&IK0IoNXl9Y%~r&lXn8-Mu_+i)qsZ>0kR@dG{iA*v_KQoZZ#8}zzQRIS zqncSRG&B6d45Mb|j6|`c(r3RMSaHF5f*6MruA*MA$E=Mw&C=)*m1T*&RiIa{aI7)t zjx=I@eQRM0@tTfZ(D?REX5roz55J5U{B(i zA>NATUc)0KMlSu!R04>r-Zmvh8~Nh@jyuy^FcX_!&HEzS8G!fnTQ;0N8i0)@llvYI zrAx}Hf}F_y=QG9@{4+^1`;b>sO5`GPRVWczaEsY>Sc2mY9fviT@ISB+~02R zFnxWKZh?^lKJC+vX$mVs#?j^Wmf2k9AvtX5NRuMgD`M>Wd&Nbtf<1rc?ljw5Gis!b z11MG0%PDs=Yx3njhP6PsX(0~5j8-P&@MUWlt)l7Pj{{&W2mk{{Lze%>UDkG9aa?9US~y>L&NT$q$Iro1Vket8o05ScCPCTF z2nIZkr`4BJdg2(r1GDDA|CH-wBL@?F#8Ti$d@PJLstbDeBU z{Tn2rHnFAt)=npSugu9Jkd*XwtHW>EZZ4A?WTu~<4{dsU5AytqW>Bi$?ub);Biijy z#%+)ZOr6X;hCLAecMK{aV~a1AS(+Lc!x!=d{%!ANIz&T0ko4gSiRQ&i-L0(CS|m z%Y?lg0UdNJYmb@$C3yY9*EAdpl05(|W26{Gyu|(`sa_oUm-0;b#^7(`$Vu85j_vWW zhsNkpo4NE9^Yvew{{(EaFMU1mn8ytOl<>DD3EcX_)%io+N<_VGYqEAodpJvN%w&P0 zfjkI*(Ogw)owy)@%QeJ-&@Jl~W`WG!4y%evd#vK0uM?=>UFr+p1WxGVuHK_I&QEk6 z_cnYXQf{B^<)e4sCsVMH$>Lb0$9y7HK}09C6pZ*7n42$|?DW@kt9st*AP%M%kN=B0 zAc5OcW5aI!!{AzBYrDODkBaFHZpQ5g-d>Y_%z|Nq2J5EHgnx7JtZw!Z8pSZ-JrcML znV#EUFqn(PH;B;6T;<+_u) zd>{k?gBY-c5ujAy#zX>gP%Hw-2tgVaKu9A7U>O6vUaV=>ZtZ-DcuurGy9Cu7+~=jU ziG#;Egrv-j7&9X>Mt=mLP|VDU20XhvYM?#>6z>&)4~g>iaKB*PD|YF@2SU#c5#8$4 ziSir748Ku>ntxu-?$nF`5QrqZ#r_TaGS&@7N-_=q@#FfXVD>jj6X^H`?ZDLzC3rJ& zP-)y`&U-H!z0~+IQPBJYBy(Qb|3}F;7oO=Zg4@tl>}vH(N~-QXy`xyKQRk2RlWLjgoF35^9=eg zg|y2ToZEL7&43^RAE_()Q_5oTM!PS9Ue^%bQ&<_emEwHM1hQdg68z>Gl6Hu1;FrIn z^}IFNnCm$yW%2f%*arfj;|lqiSw8kF-ax3c)6 zrForDU`s$dJO=8lKP}Y!*^vbmSb!e34{5W1Guy@NZ%n)Rtcg_p`VA_}Qa`15!RqL$ zx45|CptPJqJYr}anV#+iX3YjcpHn`44x{4(WBRc{Zd@0Swt*`wwFoLVNmV)ZSR3j} zk1vtyKg+}5a?vjflg8LivzEV(j74wg$pm}OYiXutH5c3Xee$mfh4~qwO)Iy7yJrYX5=bt5EG~C@TZ%;mX#E4C;=gJ(1@Y!`%I8 z%z;yTm%RIT>fVXbNA^p#8~nfxT_tG5NwVk725aBcq;ela5b{xV8Q?*NCmRa0PaAG z+^DLA12?lE7?2`L6j4P1l7__0ffq$2qKp+nflmt(Nd&T4h$WB}Ah@r4?Y~{;Z#_~L zLlypJ<0Z?P)lk))vd+$?T~jOD)9oY832O7mF=`0V(?wf{-}Q(Has#U)vtO>rGi#G% zSYk3VZi2_&B{N0D-D%TK7mr#7MSjwBS(21+R1CQ^K0I2dNuT#Ad(yU48RC7T*w3)P@(`L7q2VkIPp0av#QdnS4`LM&sOm4oMJ;rvnHln6VG1y z*FK`;LEOPYkRpY%+3L|ybRKBiwmrff;##hBL5|5vtI5-9AGO(7THQtZou>sHTOJlt z1=W6=#XIwCYZnqGcuwKKC={fC8H?R6D143D6cG@Q1VkpwQb5QPy(KN59snRg^ce=kKmh2d zAXTGe43hMef-*8EBO*b7K|lavF%C;O06>6Phz~K5pW~$MPtw8uu)Oc>mauvE|HQA! zr5&SlBM{b2r_LC*7X6&RhgWA7I;tf_mBJRkSc69K{EKck1L>XDM@@7O7f8?ZB7(Kz zy*0A(J#N8uQn|~AZMCwy81bA|tqK0Zi5bAUv4)`imga1qE~{Jq!vbW2xs&jSvGyda zl6k;7umD@3ZZJ{Q$WxZgeNQ^hj+z_?srjAyzXgyI6;RzoW1-&zn*z4fA3GZ_p#LA* zzSK$bk576eZIQGGkbqriGvT-0$|&43^SwSBRMnHZl#MX>yH$#h9uXivh7$tdXiFh3cTN66PZ{4 zjCoKp*3pgkbMn&;{UvY;+TAt_*JV7(E%CTR$;(hyahrtjSZ9-_xmvOpMhp8No=*w6 zoMV=g`IjnR0DvpV z0PzSTz99h9)nQ)WR;_iqT>T6xBfF$M97~1W^vD1Z2?h)$k1TEOkP8B12ghoFLTL5^ z0Gre1i7UznYGUD>DU*SS-qX9Zm-+KeGRl^StXaZXYHB-A<1x-%f(#pB&=&kh-JM9U z`}VCaA2l?+v*#pe;mh`Lv0goAmbnhX5zx$7g`*NYy1ybzO5WCoT8Bz^gsZfcVgZ0S)(1=f_D`HmQ<&gQu?JSzQV zi|&0mFDfDcFkr~Y$i!$tfMr*$KBhD8ajHCB%A(R70|6#3BX0w`-D7{;GMip~^O2Jj zH6(rdkqw1Y=qF?Re@_aR0;DOJ>z&oc6>J3>w;#LKxU(wniFJ}FQbAvG_)P!IDYPHnjj-8F8C7Jd;M7CFXW%XG$({sgL(al6dc ztsF3XxvH#`cyk4>2A^@Q>h8 zZeux6fe+O|z(ixeSMzWe5YR(%&s`!0P64NFF!gTA`1m_nAE>w+$Ea&7BAdBK#jAudjg3*N8NK3wcz@%v+{x$QDPnIU8Hd|FLj{pFM&*`ts6yONWjPDQYL#|nT}uisgUnD z99qtKa13WBV(`Na))e;>mD6fTZ^l;u6FP6zIaB}Cb?iq^wC{TDMOkR%YEt4P<1+O) zS|*2Nfg3wx_{H*}vA>o}*JCVE!`HC?zrx5HnsX>15&#!vxn3B6Jh*!0NFOapI)LDx zjKFKCwG)k5^^Z8&X1m??t*(G+CZwW(Bh(N!b9O`4eqZ0SoB*x2seX>1!9GSE)utH; zs9C--#V8atw=sQ3Smvx<2JTyz&EFXtMn_FfP^Y&sp^#U|xP>%OzFj63D}30@bsim; z=Z+}Za#J|s^dwP;x=sLe0_&b*>EFlrt!nf(Eir&i{p1bG<}GQ>>0sLBs8;%S^WO$@ zc-`+7pnDH771*Ua4p}>w2D^5xhj7Z`O$Egl^#XwgR303(1%}<60E(Z)a!AJ&Kev{e zt6GeRh=$7TPi|I-m(gl?;N*)QG}jlF>O5AC!aJ{FxD3Cn?4nF3>& z<{~NE@mLAzKg@vw083Mtce!@uaGO2*?jaC!cWQAaH-Zo^r|!kw?P^xTT_ zeGxe9VXhh8N8=cWG_bMD=KVNOY9Wz~r3J#_3@`ol3laCLGN>B(ZMY*iwkDiWr$J>L zFDIW6zzr$sK;^zLWNB_$^q3XIPkkm{=m-o($jiAiqlUQaQ~*F4Li)*wMf`ho!;kZh z8X2wxFf!oPvN->TsbppZ+H0wC+mU1AAw?(D_IG^Y`RDebC>i1+M@fQYpSsyF5U9JD z@Yc{KRw#e3dl}G|S$C2%zDHuw^NXuXJ5e}ymD(_ zDPiKv`>pO6^o=481wjiNax=6}l?Q?_&XSE}17!)1TpqhPDie(E?~RP%=&;2j?zZwf z1rlACz^#gwpZMxkKSk6xgFAQrZ8=L=ks|s~249(zyymKWp;@?&pr!`ULGnZh58>Ct z5$=DjEO54IkhTeG+Qs9JdD`l1-q~4c5&w;?yup62{RDKViO@ammov?~0yQJe92O}U z>q)`6)>DN@2Q;isUd-n3?7+X#K7$4hS34gx1UJWfvX=RVu+ta&_p7VEh|g-F^F2%S zV=37a&Q-ORpH{2BGh09+*8B_EIdjgSRZM~6LC;n>P(www;( zD*yxo)d3myF|-Ts*5bFP!bvbLFJN~&pi-ugLBXbqjL|W~DFZxMa|?*KkqM|5gsFiS z%g;@dkj5y#A-a}T{TRvhx^;8BdnXB}Jh_+60Ejhs#se51YQswh2BCO>;kpuOByPyT z3!xDLy8;9f*c15zFtGwG6O_Q@Vt=q(+B_pN0Ga@QHslZsdSLRIobMCMGdqiNmiKZM zt@sl9+@Dvue1IZQoXDMwEJleqz6Aa1CmVWqv-h_Czc+fo<{XLI%^4q5x8n=NMw2tw;;8|wlQmW}|qpakGCbMP^ z>Ge$ShP}aWdEySDoS#Tk#=}uJ*hQu=vZGG+(=55R zo)=oV6Ezr3b&WCAaaVE4j4E7_F*-j0%_KrZ9PC!OWc#YvY>$XX@U=p5`7o}vZ+-KI zii*T`rq(|nUE1b1%Ed?C=4G822!xouLPFvk94%Azc04><^$PB1^V_6S5?~-Zq zGBL+b`j{w;ApjBnLq7ZA**d2)eX2Fb(`n&mD0ES*?*8e^?rh>|xU z!US=WFYFPp{gcJ5 zbW}}luTt$`nfEq~yI3qM>*^G#Ai$ibW2^HXqeTicbZo5}B=`>86G*Mg@dDV#E6nJO zc@5(kudXAtN(iPz#~Pk7+6M`d55L!I!KFfr5yJW?2NN)=e;%l_3-OP1z3ypQM`$-= z#kp&QBPis8718wxZdPsxou0Y9+g@fvN^uF$ISb@3!hr1 z#1VI%X|qG^WBf{fl+kixK<*iZUr#t?`bKMJDRo#CdL^6>m}AGyeQHv(IvTmA@hDtg z7zsYrF=HC7k3~;iXq%gZsGEpFH%Ynmb+T_ng_pKx{a-@jq>K<#>4vQR6&rXjTGPaP zSy%ljVMEV{A+pKcs<#MAC=TZabxd#oK@Vw6{o|FX>}KMq{D#Ut%=Lm3mP^Ry!kDHE+0$jsP)&ff60e~{y34K=B*Q(g; z8Qh*=WIkTODL#vtonhuKnYMS}J>6oo?H=K+l9l0$I<80G9svz$fIu@KXC8r-w;Djx z*5z!|1d1Du6+33@Ubn>r%CVuBW~65TKG*q36mvlT0PWa*@o@*Gxc-gBp5wu@B~EiF zuEeDV=Mk~g>Vw9Lm`clSNdI9sZQCU>B$iFemlZL+#*a4|(h4t^39>PjB|jBf!J*MN zll6VBV%JX^8EZc0l~j8v;7s3|&Ro~fYF4fdZ)C{-ghUx+{ioZeh1;>}0&F1H3W=(} zGJ94^>~TNWQ$q%_a<<*h)oDh2EKY>bM);Yd!QZj}d3OdEai&{?6@ELNH+*#HNzw@J z^F|qRI;oRpV9Zr%TZ-1v&|h~0x7vHfP$wjVLaaim>mcM`n$p!&Id4*&*9dZFOBuW3 zN*?Ou9s8zyVFE4>N?VTZXk_kcQEe{uNK1>4sBh0wMtg5*0)MCfm&UE|2s-Wlr?|nn z>JE^2qmHQY2yL2Nrk1{TD#+h4mUqCnw|?1z@Ns#>dowG6Bb5quZfsF@5%%(yYK{~4 zeeyS!T1}IUj}gTFv+lliW{&ky4)B*6dfQqT=J!Kkxsei)>QyLYJAB+F`qU}`vog^$ zNV67tV1*0h18tLx{ZhBsRFRik_{~?#aFeAZ=!1N!R@5!ddXFPW@L(PMA5<_?vqh099TwsV6s6%lx^ zD3LEsiqp^RpNr|~Gbpb(KC!;(DPrbiAnXpZnxtxk7RBMYR||@;Y#%*dr`4NA&HwB zgjrfW@rcftR)R8zpY=R%WAHk!?;pO*^$$+!uSBALK~Q^+E)ZVwavwM#aE$GG3*bm9 zxGcQBoJ@?z=wF3HqyyYBuap1480!<|EQ}}Tnw%=ixNn*Muet`rFp2dxAOrgpk;KCL z;)a09T-KtH95yK9xbQFzX0f_<%symqHJ-1KeL!$bjC2LZ8O8TvN`3kB)4d%+Aujr{_g zalXZznO^o(*;V9*XS00?E8omgntFh+x|6wNVxyNkDsm}eR$wWXfuRnDch7uQQ(GU4 z<~YyaZG-tC;G^gC=)_H5Zr5LITZRA^M#$!NjCv-45ev4K(XQ~^*;4^!Ds$RiVlvoH z_A4ssy!fOM20fGz8`|)irqdvtw9byVES`p`=(vF`u?1wYPd6N#+Pm}yjDR&WKa!9E zxNLpSx-j$R<_h--Z}K%aDnr=UsN@%#lNF)JJ-u-e3*}CMFms3IMLt|Id8F%1u%IJA zYX|8}(Ltfcf^-zZpHiX;*_@Jh51|gNJ19V+1;r5iaP>{$^Xd4Tx%%h7hg#GOe zdc=0KZJu~Prdc!TTEEAcda}T$jNeIo^THObdT52}yEK&;um{}2#J(RtYBU!sNMzSm zI07-5kstV~YCNZPtiqS9E|R0VkOJTx2$m_{JLs|7U94o!F+w}Z58Hrp{0`=b2}VkC z|IcH1S*gOI;t{@NdHmu!sj&jl<;LRa`XavKzRVGi!QE8oNL49zL{CoSoDJwLbW`>VCi5>#^Ac&E}2CE}S(Mvp9h!#SH zk1bCUK{6J2K<))^#h7EIFh{|PaFa3B-zq970;T3{!`f0G@yZ7UW3f(;SEA^qx<_nU zv0u9Tk-UzN`4*~=hP+IpjWq&=TlMmzX{wL7W;8B4G?PW_~L zMKd4)z;FqostCqM;~4`{>&2z&Y{;sX$>A-7%}#dEzcWU=<2${b?^2BHBTzF!00RSx zKt6)kXTyK1pGxATgPrjbRSx{o5nfJ;c?Bg#=8W$moHs|oWsJGIIl~Q1iqP_uN%%a> z=-M(ZL_jc=9T>0xO=DZ=ug)k`==3+%;c1q7UCqjUU21_oOB_ukjDM>jOXMNS=8 z8_j|OBb36MXL7T?n>?r2fy|wiu0LyqlZ6G15N3exXaFD}%q0jTEs89gmwJB(Ep6HG z9e6#SEx8l4K;Zl*G_aSfcLEK7d~|$wdkoRh8XZ52K`j_T0S6-FjLuiKnxf#KVhN(U%*?qy3j7t;%bx;{}~w(5t)eu8L=dyaUmem05c#BKcWOy z(ga>$dsWsXfC#Z>L=4P<10Vo00LTZEA>95j#9f7eMzKf%JIB7frHiYM#4sS{Mn((= z^gR#6U48L8izdhs1bRMB?|{4~1qKj6Vm!CkK~KrmQUJSQBa&dj9*OLT2|kR+3=aSR z2HWi3FV#_PY^Y@U1bNg(mO7_w8o)(<$t^N}-TM=){{LQEqO)dsTi*lyVY!g=`i7z) zpV6LT;N(~IEc&e{^hL`%5nK8vfoxO!bV)fG72oj8gxWy^RHa)VJJDm8+90+OnpI}} z$_ZK!sqr+WSftUe0gl2XW-d0Kd{U9B=pZO71@|9&htK;fE_&SrxJ;x~JthpX zC867I?Hf%-ZhQTdmpp3NP=X9<3yU6%1|~ytfIIG=HoO1jdK>7it0fRZOO>}#Es&UJPns}y zRe%UwJPu14z16JNzhJRo0%eMVWcUUCti8heafwsJjrrTjgH++ls(P2We6j9?X_TQuXhi(!Z-3I6!#mBF(Y){m@ymt|DFFC5NzA1 zAvyOsUo=xc!;0vMvZ?dR#TF1P(z_(mGrfSLqUWBp1opco|9-0_jL?bPSy8j*Wc?31 zMA5B9Z#}pG(X-KPgoWpDeniZ><4M#YKXb4@<_JfwG*XVuLkPlq#Y)72$VE_)6{`n6 zj>rLpC<+1=76$D2ZmjxcWgbj~WQ@L<`(1!A5MUXCGB&UnYVIbk&jIhXKk2npub<-& zlrcrqwzlZf6HZ|Hq08!}M8XoA#!DKF9~_;$Llk}yeq;))Kdraj$2qS>A)Wyw;FF1O zZU$w}KkTtvq4#v${qI{mmDO(@+o|TuW0+fdd}RB-oG}R&$>db8EiL4_aUZz>zSXtu z1Ttglsa_E5kD_bgY57pY)t>8sdic-f-rww^`QC5M7AmfHG*6iy`-;Kt?gtT@(xv|M z`H!1V2=MHC;X&6tKOuCJ>7-e_>bD%*sHS7`wdZgcp9M~Y1CGIgyDxMl>~sx{y-!gW zS=ZvDywMnr)w53H|1s(g*^AZeh=_#3@V$zr-z&L|06ioT;gO7^r4ZIpnG%FtmCa%s zK>+Bt%kPvbB1kg7y_B*+=ok#coL?mQGolm#hkv3TQ^>|RCrpgU7%)ag3>iE3EStP2 zC1vvD2FjyNq!4o`A{HzTCQ)xT6n{z;7*b1OfXV^9NS!LAlUsXO3-1>D8MJBlHIRP} zG@%)Rx_ARXUW28j!ODO%kngU%FXs4E$PU}!w;JKxAs90CL@UZhYQ0Z^3 z`W3zcT)7sUv7pYF@Ca5gyTv`60l&P%@fN=^42LRdtGc?lBNEYku8L}dV*6MJX!DTJ zu>585Rvr9lRa>Qy{z{gT?kBQRY7h5J1PEY7M?wWX&dzzHT_H@R(-ZU=%41rp^2rs< zgOuyswz6zcefi*hU7s+sqvg^L2O7f}oH9tWp_N%3nc4L8tdHssa5#Ih1X=kh+Jfr2 z*O_3N*d7ifP7@fR;qnm$26F1V_F6voPy9flX-XW)oTV{33nu0B-E6k!3TmIM(R0%7 z10ti$4mJ4lqL%|zC+5&#RUWiL#ew)tiw{v0P<)WajN=*yiQ1h2VS9LO9TRt>AU8J* zmf;|3Dfb)dwY|ZyfyP>Ett5tK)|$1}X%rsc7bcSg_4CZ>)OR0L5MXz5KOn1y7V6}J zV>*|6{v!svb{zpXjJQ%E3v>}RWvFUb2d=|&A{60?qh zE{J2;BS+KXh?*5kzvn;6BNj86u7~g>Oed{ZIBb>^IKYC-xFTJ-Xy8+k@XMQnO>R^^ z5^=q8z$GyR*eaaZu_oWpRd$8r!4ufWBGM$|X0{mauBxMeqEZp2dEQ51tSk1KbZNG& zUvrI-u~D9KS4$9wInP@nDj|`WGa#<3lO4YVz_8veZ}EU+isfx310?qHr2qi7@&^G# zzcQ7I1^yY*<{7>)z*GaZAKDoS)@s)((tkV7rjd#5aV0X`KZW*7&k><|=j_LT z7|Yi+opg#(!O+BpKc81l0GK};7002i*WWCF&R-hn#eiz{S!wd*+%fc*2Qm+}K%h}T zVI+efNl7G-MuZ@ZIaCsaF-C!!un`j9%@Xv6cg)=EM!MOI?E5 zzkg5XQnvGTG`_EEjMokCd2!(RQ_MV)|RY{`RioCfoS_ z7CS;NhoF0#bbPjJ@=sq$u}-d7r?-LD5>si)Btofk(;yZ*PWMYMb!npp_C0jC)FK4Libtu_|8JNwCX zhJN)4=F7u!*8~E<0WX~dH;%eGwVK{RVh&*dwyc0=D>-U-l)(Zb3uV*FWEhgHpilya zN&_N6fM$S3JLpLf5d$EWqB#vXP5~f6|BtZ#Zmf%#jA9Al?dw&F$kw8{J*PlKL$uM? z-SWk5hzM&H!Qc=py>O5fA^|M5+MHgUcIu+balc}@Fr9vMSP`ZgM-T}B84(CgzV1&k zYgvH;t#c3pNsi*c~;5rJin45Zct;O zhtaygT)Xd4|K(5mXjt+qmn9)Y>LPps0)|@W<(dt7`1KB^t#aSzs$@>%JJ! zfc{1-%ncW-`s4I>vlH<^?h*kbS_x1$kqfKwiCEu`1@)#bOAY+7su(O)lc%h zj0tq*3R9Eft{MNWFySNC`Ej#zNShwMv1{RhSJHVa*LK~*vL6@TqT}%2a+wnrB=xCh zIX2`6-|9!JBKJb%7YzZwY52!l_|DmV(RvsaJee3OuAm`(=%G6d#we^c+7M_?pIhOl zMU}|KyWmJB+Gf5e5c&`>!WZQDl#Xi|JB3tyEI^pTQPf=p$_o?GP%?{hGr~a}Y8o7h z=ShFUxgqmC;KA5z)Iv;(fB;KCw7)UOY?{^A7!aPF4*!eb^FX)9{++srbmm8W+Dw9Z zs~wc&4HTlP?PLK@FVg^n(S%9lwo$z6kJA%{DBW;6aL^7s8rVhF(?st|orkn!=P!Co zjkU+Ja_YIvNjob$`sUstv6s2Qm9+}%ZAN8FV~ zlne+MQo{t~>@ArQ!sS6Kzs1RnsuQqDR`vSzM)mPt195<}hUk3T*Cr7Fj?c69hplY<7e8+idrJ5kKEfzw!;dWe^YYCL zBuq68kVp+L&{t(VVS#GlnEW2p&EaAL8zYJtN?lY^`TL`8$m92qL8f;YXGXS}7^0%W z1s@vAfyLkp&`C28O_gK@Nf) z0^kS*sjeftNdP;bg5U)J1fhb^kf>B1+%et&3OFuA7~|M-`yw(IA>(!aM>~)O-5>>{ z3g^VCEe`Vf)DUV6k!@M%0R{lj7z6-Zz#>qb0R|7*&=d?K^E;V*bOcQxmxjx;0E3L& zer$mhi4?)=_*bpL{%%AghFXW@ zQ?djhVS{#i_-*tG_hz$s0N-ek0j}VwS5YL8?5F4v8(5fuoqLtu7Cp|l%xYnPER9U@ z{E;elL;_3fsHBF-!UuA0s(_4Cv{nwUPFiYFufn8;cMovogd>3z=2#aGM;rrItsObfV753F(OEbV107`wb=L>Lk*z`19-ZDcu5L?5I1Qhli5=H zdbBm~;3E^+7dpVN^|%@22hDjVpUn#b%%Lv}cSy^e&f}%!wGyq+9ot&-^!DI!4_AKk zf18!F0DHT&M3=b5Tyb?9g#eu2z*DjiUv1KJK?z};y5bPrxxQLLe@eOM6r_Y^o$$n?5S_-xFt{*t zhz*S_NDgK3J?~S5U?VI^1jP+B8c^HQ+PF(5QMrptyll;EV@4x1fsu3TO!8QQgy_Y@1GT zN?amYvL&;9Y1b1fx6FeCh-V!)_~)8$UjWcP$Zo7W?4EvDV-KryRStM-+n;KR@wuH3 z*WM>GbV!Xxtx6nCLUJN@f~z$3^1@j>D7CBP^?QdynK;d=Bw{ zHXE_!c#qJ0qDIH?E_EFzb6)TTNy8s6|Dvd~_6}X9*6>6G>5!>kd>?S+_1qee4*-Ov z25B&pJi$Fwng{bB2G%U3!&^9Hz;#&oQBSiM$3Qzx;ShqZI^IWy{N**STnN_Rn8_ZMv19r%gO%VPq$gKg=y&)|Q~VXfl2MY2!{WiRB5_RqR+qOvWPRCP_b)CRRYsZEQla-@|!Ea3hC9!94pf z?%GNkaOI@xrOB;F;mJ{q20qN9WR*Vr(C&+WtTDp!tO{ju((NXrd%M>>x60pl-PYZ2 zvMBaNzm(c;To3)ZtXn$E7yg;IJKIZ@-}^ZYjTs<%4GJF6#A7lhAG5yaM73Bp0v)kY zDtf=LT3*FGkH$wST^=5kV^i!gl0Mw5BR6GLVXbS$+*7s-CE;c4yF2K2J!6?7&5IZ| z+2pQlfa>2>_+L7@g+ONG`wZ*J$<|tk@KDtP z-)a`jvc<^l-;+({M-<^Nx7s2g_WRw{$Jmy^+%5Q^aqAzVNR$E(wl7CRFESxbHz~*h zDjobWxPr&xqe^HVHa)-Z_;E+K<9^F{0Vv1IYP2Gt;&z*$8PWuPYkKb*!lPH@JoS%h z{??9(tmPVZsxQm=PzA6F3s)ZHD^eFKS*2|>S6%r=qa{jW`86+8SKl>y#mBCWr#XT^ zAWZXe8b5jNGVWpUt&+tm%#J?`vw=^avoqWyPeVI2zMzh$v3bE3jV0*g?V2I?Xa8P| zyc_+z)SK1Td9%uM#VM3biUzt#NXR+SWrGvWl!no-7xrrQPSBrSj zx0*FwW~`I6=Z)lyA=7YnJ^oKebJ?zNcf+E)Ov*-abSTHI0)Ea|01Ox~B)b`ta&WjE zw0}zrz&&Rf?b}T19&A|HcC{OfwbgJ*lIc3sQD9v0RY|TUA8m~n+aFK)R?FM$aE~+V zdq2PKmZxBGuA0RR9EKHiSO$xbE?P6h>wwW|k;A1ZZ(mEw_SMtkgJtm3S4RrE2|ifYVh zw@K)CKI+~wXurUiOI`6!DEW7U9iU)0qKb;%tk!}GKYee40f#oGPUkwRXJul%U}QAB zx^twi+RtF54%Kqp0MB#x@-!?Ah+ap=L?9It@Iu_@bFS6D^Fjf+4u2uc5Fl5BB|}p| zlZprm#c5FDPGHBB0T5O@_)xHwP`XOugc*=B1_1v+A|4^XB~TD!01|@=g3s7%aVXC#9~e8v zg~@?;T+6Mai-J&RwFv=`qlK9v)qns3%3g7{aw2mwCSeE^bh1d@_j*pm3vDO}h*a;_ zYO|3SJ6=6@&Vg}I07RlLzZ^+x{W^qYR!eOfh|PZgo~gMWnt^3ru8D&_gbhrwjN+s1 zCEDDlvGgqU9cd5@%f_dsrIOR`r^^*8Q|d2wXd%5f3BJUerf(JPz3JiL@F2@{5+N^p zAE(;v{+53$zGMjuzNs0b24uuplpd_s|<$|$FcipSQM7I&*JuKbd}c62hZePI&sGs8LY4-VRG zm7iEaT{k*jHRARD?PhY4j%Q6H^lkaW|4PsJx>Z#aQ`O}}Wxf=x z&BA%$MJ51qVGN=p+Y>;~cEJ2Z;i<34^uVZrFZe$m_o-pJ-tq=4OMPI}r+AOU=XAQc z#18f76r&FS-9eGr5FcDg)5xv?$G#Xa*v`O~{~mT`#BTySyK5{va~#|2f#rF~%AwH7 zJMnOkwc3ji%*?vS&8o6`#5Lg5*>1O<N&`?0@jj6_9-1MjNum+vd`DIRGjoO$NEAY6TO#Spnt(dvPHl zBZ}(n|6shW{oK0-z+_nGsZG_=d)^fZKl3Zs-?^o~TgW&sI$t~$ONNk_(>zoXT!7s8 z{Pgrj=8mWwval~rqF|uS!Tqd#h00M864{E)=-7{lr0E83kG#q8-Y%M4TxE-P({*I2 z#@YSQTYBa*2bT3xH6X}T+frRHDMA7eWC*QN${|(50|6CA1PG7`Bt)W!?i3roX=EC zDYx7qddZdWarf1a$@#&>`CS5l@-)w^5J>M--1uBR;29#z@1!Ds;ZWM-%Y0|FWY zVbV{rQ6(d3=x^&W6*f-HgHiy%bO(5NLx}&*q%`IXpnDsQOlHQe?a$EEE}MW%a|-yJ zhad`LxB)K~dF>`D)64YD^l2AKu6CB?1^zTH_>Odj|GIhqoCL(c02MsJ7g)d|1w{rz zNsNl){!l@XAh1TX$RGkDa0o#PgeW2)qm*2!2|`nCpDAKd02pMdgbb7h8nHHkxCB^| z!((zvumPALN0Owx`1p>qI8so3e1;LNuzSbM?rFUU{00RTs_zcN$?hggMqT}KzZZfE zF2>XZ1}#403##OAx0CionBM>R3G?_=tf8@K=3WYrtDriYP?*OCI}oXgvVXcMiBDCz zHK)@$&B}7o&N7IZ3@PnGU=%Je160KR0$A7tLpbmmBHol7d`vJ#Ee#6(+L-nlELe;7 zMZ3TbM`4$Sk^_F*7T@^-NoOWY^!9kEaba=;5(KJvZ<#kt1g!C|?GYj4`O9nSUOH3D zu{FEP*lJ@|M20%KoBW4husGL1+aX8g%(ZYOw!03=wIoa^@i?po-E4wlHF!eRnq?tG zE*=bRCWq{I5EM(9NmtaYz^H#tPShX1>*aSs+22sU`Z#@UgnK_oUy@B2*5PKM;-A&6zXDj+@Q;2BN1+N+Kk|1T2DG%z zW8sEO4bargu>0&a>;Nr1yD2mNA2n^Eb~X{k%9>Qy<9r+VB7D~|iFwyAL~yl2-C`1A9z#sRN%Q0}nqGdXLCuf@Ql0 z3}s|FU_V*re;_-)eC@Mv)_7p$5$BD5s-6-}Mr3TlmVTfnDM}tQ}M?% z*|}0W{T+)ovu5O#a)?(IJ*x6ru+&@xi}NxoeU-jsifQaXpR$quA9gej4s(7tj^N?m z(u<3&L0N>pE&w*c)~D*bU+s--bxuN|SDPVX&FGLoYm9(+w6o&T-6{}VI%WSykh|xb zfEbt-^Z`QRg&7z!%Wd`A`PLFS%lc6fG~CJ3l=0C zSfrj^wd#Pg&;ZOV5J2eBicRW0^YBuATK5XE%Z{#fIo=ux*t{KD1?<6@6*PMg{$}-v z)=XZtoV#^_T+B%Z!~u~~jGF=*PbSaHVWoSiY-8PmHJR%ov|tDj2$OBHa!C(BSb!t| z$Pg`l`3-^8D$k$qbyD3AURK4M5@Dw$zq?+yS8>`=&31VbAC)nOiaDwTUjXjIztLV~ z(4Y60EfM%o5l-zT{1_rE((*kjIX)!mcWZt%f_zxg>pLvWjE4DenUI{ugs(FWSXd4q zbGp7u{hFRF^+^S}B+BOwDymL8sK@C_jr2`-p4?Gf_Gp5wvmL-d(cm&|k|VLhPm0X* zSwmzI7z2_S#g;PcXOTb;c2DWi%+B{=_hA3m3Z@!9?E0&V9kZB~pjK9~_vgak^OSBi zylZ5Qp0XArc$@brB;g?Lo{HLtgL#v7gY}FcY-Q@FnrQ_(p$0W);6tcduqnh#KB|dl zn$nTlD9}HYtP89Iw2tj_v{E)`a$f$vLCkhDqF|sG%)pqXuyZt^-+7DmIN} z$yWDY4!tjdPh3;%NBFHgKZc6Fr9}w&nerlE(eKGNQ><$HEmxo5_oU4FV{NWca2c~Q zLB7&BEum1^w9l!^^&Y<5)Fz%MiI6AW_lf51VLO0FY$>q73y__H@EWE-qRdzK2vAXx zoub=n#0oC=74*a6ui^IxT9v!6 zgw5RQEG7VCKttM7Pb^C#)Q|c$2Tf=H)wqeiJoR?C>`FEVoXJ zD_(ZRSZU0AAYq6RFhU5cfNIa&ov~{^7qa~-tY3=~VZs6kEtq0TH9EXR69FtpOdaKC zal%k1LQkf{lr!w;VzKM{wt7RI)O9zZ^LP;nQz&tO!V#7rxw|+U*0>1?G=<&rJPD`nnN_hL96H0OZ{_v2fCn>NplV=Dk%7`6Lh zK%?u+oH7lM0@6u=u&W*m-9J>ToQ<`KYHFO$Zf5hjDOeFe_ROf7Wj^GLx^98Y6Ja4; zqs5SdXZT1tImqp0hoc>Gz$_3%U0|35$LY*_7LFp}7n#;pi`1{Upn z4(EM&cjaYqXRPJiX;qBsmy@V41`k4#dep)QrwnWn0?NMT6;y{n)V{ApXA=^iSGDS4 z+nM-YD26JPWT$8yAce;RfT^K?NQ6OYJ;@^E@rlctWDEdLbU;-exfnsb!3jmVley z(CZj1T!<6YHp8j1?t5p`Dy?a7{liqaoVBYpg!ldFadm%XGDx`v+ zT%#>h9$`m*8-Z$uBh)($=D)`f1p)4c%BXyx_1Q!Xp`0+LA_wL7o`T^mp)Mj@YY+7I zPjv|W7%NuTnC_Z}EfoNA<%yGFTMjuN34Sh5cAPktDc)Y;htyf2z3aL&_A;7r$@32 z2PKeH&JBBF%2uviQ)Q>6Im1+JWOi}>1zse-cMHDatz#`%pFTJtHErLB3VR=qZwaNW zsw+5$Gk#7PfNO~S2ANOr6Wf&;==_t{|Eeu6HOUoe59*a`y`hjL5&(4-&G49~eh}Yp zOH~v(wjQ=KlzL>QVzp)R_iuj?G`MH=VJyD2f=%LPn+n}knydQulI__L@CWBYCkwfmng+;ZLj!6i5h9Ph7zF03QQ?dz5s}rg7`nV+Y5w(sVThPcXmkL zB`^fgvOI8rtOK0~ACYfb!S>}Ktl)Y{^lz3VB~E5&F5>=SSi9e@=~Ay7g$_Yt2mQvw z_S6mXQ~itf@#o=FndWvqnj9|SA!&FVA_w~Ud|~aN{wP^B!H9|13vgDnKXC`gea=aR zNuo=#(HHe$M<(}JRxf^v0c%IehEhqC|D4Q++fafrC$AWhJK~mMorM}x14j02q8eOqqMbbqd9$~#%y(;2myE{s z8f-fnTw+j*Nqz5fkjU6KroY$qaGs|Lx7fNO#5r{1G}!rb+m6N7*KcQ9{XG`P%=SZj zvvs*k()GI*Y<+HZD&TL4P-LXu-=9GYO!z-g7f{YG>D$y$nO@s4^sTD~(mJ zke@k|c_Z}nl9AbI0(1iZDjuD)$s?nc11hMo#9|_!%H8QoWoLG6QQ)XHVREc9EX^~ zd7}T^!u6Wzqlqhm1+epxUGEjc_y$Wh1phD~pC>|rtu3l5nS6?ZsDJYly(=WJfhu4N z=d){8JWavzd-5jazKapI{<3$|y9yCD<9=E-&jU~p)Mi4-J*xv2-MSWLzGBA18o8W8xUTyTVAwC`xwM!+x_Xd|G9n}r0qO9PCTyH{N?V;9z8 zAxc1_5EI536}w8~0lC(_CUVh>JVtYe9o4zm^$&3s>&L=FO5#ax*GTVMRg;b9-($X2 zJA}kVmq&LyXTtZVcVoZWo(vZoFK1PLv!`ay*7L$Y5eB5eE^f8;K~#qnZvC(-f$;`d z-8Nml2NUlfTdb`sKlT&Nh*1ok05TwEK*)>UWC92gfMdQg=m-~-1O-BVzyP2)COLjQ z1>c8m4Tt-qv2NFb;*%lKRmHpYwb{mikdOp| z+#%Y_(LB2Q+zuQ1yi4{hHkW9~VHWOs)rzYP5g`)RA7Fdo$-h11Mp9w*6*6phF~+EO z&Nz%${er1lM+KJ;LRB;WHEyT!tJuog4Iye1RVjbMdnQiMYXSF$TFU#z&+FZkiy?R| zw}VX9)Ovt;*t|M34+;6{%z$k^id83&N_FrQo*lS8Ee&mdRMT{i6_V{6o`kD-+#KB@ zZ1=Fi^?+Grh5f0VbPpt{h$;bKQ9?q#a@tblzPd!TpRkfZUjSa;Idrek0B%g}Jm?z@~F%pq`m_2jG36@@)=rk_V;?b7WI2sNSMm`Ck>56qf>5F zlo{ijR$re~VXpM*-K5h;Wa`Tg zBM|@GC56iGv*5F&VoVT&2ptC5p9hR5wsoZ$i?b265Vc0Z&$x3(m)D8@C@0?_^&9C3 z2hsJr`)F}-;1pe2f64LeNgA>N~!Z^X4;O3mlB_aFqn+?s5Q zXrYbZIN67paXssev&3((Uks;py_%AST?D?#UR0)CTaM(r$#o}4-bdT)<}N@Zz>T%!lN;&z73cl`@SMve}ZD2 zPVNJEwG#NQ=YBaLrcBw%7&4S8nF9c*2jT?_b4eCyUQE|>)aNdc&ZuTKI1xPI{y>x}1 zf|SBe^b4gv^e@(x=CGd(m)UG6g5m~9;xEwrPH^#M*3%;vNyHg>qdFOwc ze<=kI5T99Y_!R$2VNdbyY(#<+>@j^0~Z#tr3- zm}lN#J6Nze&4g~Bow6kv@i+*(cf7#9b?eY1obA(>R*A`2N?lu83{-Dw^3x7(%C+89|H*8v}>ookU zG_@*x`mX1w&K#$Oz*|IsNa!mqrN|P{8WEc#kZTKGlU&QeE-Z@c?*3Aq7XCV&&oa@V z1^_Sv1Q-B@9;&9L!7YA12DWSRNq`G_G^IFpv%yRN&yBVd%2qtNh1^Hay~KTHKJstb z6-pAuuL~h#fLUHJ>>ZaCnInr+IowwdBXEzeBWyW<+%y3oR)J5Bk|G65kFJz7YcOAm z7$+G&fcCp9dCki<(OvU^t{HVlYibdknv)+*aZ3qF^$09dt zv5H?|1KS7%}FZ< z_{w%+*{d*8p-%|)^iuroJefq8&j5?V&kae5ZN-7a;_q;ZRl=IUy8FJS`T!@D!3e=O zoJsyEI&5@^~F0O(6|L-c{64TC4rF79ZD^Z+G{VkHcHhwWUPg$Z{ zxlz3Rm9nmqje2Z3QCsenXej19;Xf!*7=QEj!-bAf$TpGNadsW>DGi8@5Vc-qRt9qD{5=adWl?|2%u4 zR}EA|>jZ7fR-Tv=n04tM2mkYk8T}i?RIcy?P-LFujKweQH}6p>CG|0A7tgfP!Le|9m-|6v@-!0e&*v^_fnJB}~5%oPA%@iG30p zG$JyCg^I{^u)U0E+hgF|fe~=%YA-gUV_mklaG2Bl6M~s2J^T*PpPh6`T|ee)dZfQ? zV+1U7TOk)-m_}ZI)itX=oE-C*oC)l09Oi5mB{Kh$@TyX|<=EUSk|K?RfahWadRDIc zG%KgCis|L$q7z&4ZsdoWGI%UXp6q`pq^HKjsI`1Lo}9qV))QT=$FLtp$E65KY%La& z;lir@$dF_*;vwiyYeX-YejF+tX>MU?4;Z-}c(398B++J=tliME##kQ)vS<*EV9?5O z{--&?H8*{rnH4?>&)w_L8{W5!lYiEB{wmE_xxmlqhse-FpvOEaGF`#?Q~gE1p>6)r zGT3dGVVkdTmRnMF@)oa#wer9vC<|O2F7uT{cxCS8Y3FENTloqbV=4FfIml1|B{nqh zr>yK>!Q+wK^m56rrUFw+*tiTM4>ZU4s&Mc?(ZWJiGpo@FZy|M1!>fDDPd98XU!iK8 zy0MhrMQ*>@ovRh$D63l2`l$@OY;W;k6R%5PF8PY!A)|XQ0q&2W84Dbiv!7`j`-0!) zSEN%YO@CDF`>y+^wEUw>e*QnX{oY{l66X7%6VK7iboSgJ;0$>f;$_gKVjKWk2-Z1Q zB%SS~;F)hR`;YftZX zK@+(|c5DYq)h3o^bKdj?s!uP5gFzey%~k)eIBr2tI+F*c@26ZCSvM0}{h2&w1`APXD8doI+9op;v6c-?p-lC?m?$^_jXNQ{6 z+fEfC(D=7IaU1UH9P{r0TnFTlsg9@bfDGz@;e!KO1M4KnZ0Jz%mcrn6z_x~RL!6b)Dt z=Wk-6{#$?Z(6_BYy^=wA(F{kJ>S9BJdEMw4^~xg?>I8@qZ4>z-$O9~s;c@=d2j`!& zvF&hO(MA~KF(dikd)q!l3sHUTDgwZ;{CKE{_Jcs>$&|p_irrd!A8Y)I3N;5fKvl}% zVPP6*Ro~3Ig7ZO0K%8YD`Vl34=gxEP-AYm*ZkS$O5$n(ow`oQGOol*vfW^bGy;VD) zb!}sZzoHbB>19c<%N@K*$TkQ?hxNchdXd2$uueh%SK4X#e@m@NVn)z{gi;I1I7AIM zQSzxxGY)P%U+!+6Bpp~nl3;*f%?-xSF%V*P9}|pjj}VmWtosTWw!*&24xsdE&YkGU zs&w=;lbTLz^-!qc0Yzz!9o&}FdNH{YuT7M9h>T3hOcHdZCz>Er>{^3`Nx+8SDl%s* z4Kn1;879cVx8&xqUE(Ni?;FTf~|D{m$yuFt$VB?m$#)m1tj1V zeBTa%v=jN_2x3{=gn~JiY))9)STpusVqU*n)GAD-5j*?TQ%7s z!p&7=jq>5E@}=!#m%~1|2Z2fEYGJ>#*E1PU*0Txmqrg((!+;k0?3XLz) zox29)uY}AN1nZ*eO0^oe;tsPF@f0i2x*+sS!0B08!sxGLG~$~f{g_T{`b<1-(b(6s ziF`YTxPs&jqjBr(?a|-svh6J{O)L%>|H_p}^Z@>mCq*nFaE&Ew`Ixu`mO^!wSw3oh z>{?Ff8Sk~gKYg_N4d*3Dz&$XOq@Q^nF?M}m)u^T)L!&Stf=QUv#aNYBmmT-p$?es$ zxtEVB4Krk;svouMIY>^*RQr|G_J1<|8T!NNJP6|5F}#@)*&DSb#WYw?p<|O81xWp? z{ko;M{dXT^2}M*`RM)jQ*!=zya(1wO$WTHLaKLFF3hg%~ns}kWybJUWm1pe=E9R(}Yx*uN_A*G6T|_ zV!4doSO_dYGArmksUJWkE;;Ek1(M9=q>hL13zQ7OmxI+S<@wLs?OK^CCt?tUm8t%? zCepIdp}nf7l-{AfR`w&j|K8lB8MWHsW6_^_qH21IJp`99{)Y2~0UxH|g$JE^y69cc zrlLYyz@m@`pqT1;*MX!Jtin82HAPD7B;9WFsRL*NwI{i5qcc8#*l_?b#Dc2i9XmR2 zc|meJifbeE^tdXfq%lCZrV|0V_uj2@({EcF_dbAK5=C4iM+5W@u8Flj6PnDT!3(E$t09G&x6UZA1$56heC6Pa}j&N%ORGTfPB=C z9e296OJ(^qxW?lZ|FV4M*=hD#(SZL_S3LPlkreZ(*Zd?j_}gwCv~zSSRyx@XOi=W% z5JeNIrZ{FndXs}MSV1Ph86Gv3ax?!SLA3nPi|b*f0_Z$zY|x&jK*+Hwi#+`unHYot zVGvP&$%3(R#mxys2|c?8@kDsZD5nDPM%a6{zJYWMcb)I0(Z=DDldPQ@_61D;<00oV z9>d7MZmCh=RwUoEjg_OBU85mr81U}y@sv26Vl|yPa-kH?j$d(}SHxPElao=IE}$rM z9#OY2&kVAX9sdzpe*|9(CI-DJ&J_ZJ6uUS`8u>;qS zM1zM#F6CrP)c0Zkr}d3+IDGjMd)&=jr&b5CTPpdgm$i)5_4&&s4>WULXTo~2()V3= zHu%wWB{R;B%`e{U#z_xEk8VQI{AWYj_GZ96c*5Pw7xm;=8QnLf3MZH`sF@Odjay?O zIZvNRKGXj69OBPWPt@MVhHbs1lFhHyeB9n*ZM~GxTfUIxJX+a_NiURwYf#udzzpD+ zXqp#zX%n@4)@KTVx5b6~}c5Q(r@Ewb!q_kQE0`EP*7N&k)eb4)?%q8D-XB4w@ zrVOn6Yh+6Yyyui&r8|oE4&Rh`bUip;}%@rnQ_43l$1(ca+z9E$Eb)+3M3FQzo;38?qUWelMG#$hV^V=)G0em1Y$sy}@4gI&p<|h?rvmT_KAhB(E z6%HDkNL}L9_VcgN^9%t^rsnXY2OYFF*%*1$-1vK$HL4i>-AU)5E_qTG01CWjM1mlI z5DG*HS+h_HT2EVhjiz-BB`Fu=6b=zZbFza?)wJb>df-b@@bhUmd{rhOoGkmQnaNK; z1yLJ5$=dB#tI1pnq`v=M`S8%u6Y^kM=>tRta48yuP!OuXPwjo2mv+bb2-tSky%R+m zNqQT+#U`RT94@vG01#|S$qzGcwJ*sh*@AJTRev6h{M7z4mw4$I<{Z;s){7^Y13c56bvdp-}!$ZrTsPHrl4Nfj{liy4fZV2vqwwr?{Li zl~8_Ma4A(M$NAOq;z5gzn28o)A!KfT?vOmx6Sr_aK*MMhIWmtpjZ$3@!}}Ifbk`Op zWB*mDDT+?~QHr_i!~=4P$ug$gUXC1@Pc-&ocG?jY6pEx`-0%nsS_UdySlJE}=q94p z=)BY|@!M#p!|ZokBv<|f04lXsI7~Q8dU5^kVe!=#@U|eDsN(+1JyPoPM=lzfRkqEZ z3vxK`}qP=KG5tz64d! z>{;vLfgJs>O#Y<)l=@C3c|8)nc|;)tOn1oS!ZXpubGu%}mL};E@@o0_4za!jzQZ%u zS|SN~)|<}_=FCl20(e3L=P5~pO07quzXp%4QKD4WqswK8D#?*m=kY|c@+1oZLFxiH zgM4hnXbPjoOQa?G&{L6sawrs|jhm$psxr&pdvdga6| zWb7$5*W?_sAD(JGs4JEn%vh-QQ{vOGxL3T}FqMe17deijmj$@>HKrajDv=C%D?i2+ zOc*SFY~o#fpf0b_eNI|gpv9+=SW9WdZ6PR9JVe7PtX=R9wP@UB7W>(ojJ9h=-uHjr=YHf zgp!jIwlb8qY)>&6s@0f_8>rBxA)Yxfd2<=SR|o<-aff<5IpC1FJ_5Ir&@>Gi(xouC zq_w6_CywAaylM;%k)gK64SPd?oMzhiIXNO&L{-)FO#@A5T-Yz3&=!SO^}qccG~gVF5DC%Pm_dCkn=U z$i++tX-4@empBcK&yo3I^NOkN1>)!TxiJ~*@y3(k++Mi%+Gfb&0_y*HBI-%X_8GbM z=u9uoz^GC1^$7vV8u(ViCj_d&8MJZPd$jC{ZhnV-=y6%WQByBYDeCqFFv8WFa_bE+ zC4Vj&j$k-Eq62~epSLz-ji8;nGb^hZzRVHPP_anZ{0;x0OfIY0QAHs9M3C8WuLIhQ z1~Gh7oXM;naFd38lnnX*2hF}f6r(=W!oA2wDc-b&Cora3L#xwsMi9846RRPq-|6;z z>PBo_qo3J;IBXC=RO`6I@z&qo-S>kcz86S#wL%sur9`EU4A$@HS?~qxPsU~eHL#`JGe!y&o zz^dm?=25zp9BKw6yJ^-5;Hz`K)%|@%sw09#?v58_e0zTzMMwM$8sa&N=1}RvYtrw` zr5>BUS%_fZtRX}=JlCBWhIsas&&JnL`q(Qrra09~)3BpD)>&%x!uQEH`*^Tth!fQ^ z`i3;nH?EDQTiIL5aSN%JGC{yA0u-r?CE^w`u^<}yvgi^I@8`WuQ49M3S9XTMea;rQ z)9*ZXj-Rj_T8_Sj_+1Wt?|F86$s9kznw+AIk@hEd+B@vM5u-SBT}eOE*!h9!=;mLL z9#XZ$XfMA@bun+JP+GBjZIyU`$X7lq#{G%9-vKej+K~M?tLF;nfD;B-b;pBNLFBPa z)WkG(aDM*wCQw}nr<57-=@%u-ExaT+eL)0hGYFpO^sTv>ZkUMjY7!;6!KVgD-05VR zi-xqz*R{t@e?#zS;}LuN0xlc|0{`{xy*b75jiLeE3!wpB6x8D7BIaFJ!97Rlf!E71 zyOQ5Thd!BAG?AE0{{GK?i!d;6AFisbFSfu-a5gBlGWT-X;}Kq29J$gwMaX|yApbcu zhTvNZssEXF$Em7J&a zBJ~p`{bOm63(ZLs4oB2#+)0U7p4i#<}Yc)*3r0@&TNI85E}N5%8HLlFtTa6%CPBekJw9;5~WhQ zM83R)U=|3PR=NG_Rdk02`o#&olzP{GfdzguVQX8p*2T#GYPBTD;sBE{TpXDqz_kPs z-Jy$H7=^n{O5|6AfwUFFq@-71DZK7#tibjj#!tY(!?rXIDi`ZHi5v}~k@;X~aQC`q z9w7y1p5u9Z7k+f{FLA4T^L%PGW+f&fWC zw!eVFI*T{DC0>;u8T3GC(82|%8%X2;iYkmvW!Wqln8&eQFUeRinn+ZXB?FK(2}5$M z)8OuYrJ=VqmRPQu0T6GYX(vH!bJAapzHyMENOUV07w}M~K;ZxqnUxLFdYaP5#~^X21cp`YC#~#B*Tw+(GnDCn}w1TNPr05B#3gjmRoZu z$TX$M_P;EfO>107T31lae5qF_>ijM0<9v?O?;kdo_egJ(^*}nh<`19gqF8XjQYOZ> z>6=^Wg=AIB(BHdGGBwsQCUc)B5hFEw>a8jXwe;N{Y^3%MBexzZK`OK^Rlu`=aEdC- zy$SPBb}r@PPJm_C%Wq2~%an@*RNRs5`BC+CTTUPA}c{iX<+<% z`7zV@D~dqC50VkWxEgjLitT+P3!0;cwZ8JYg`*u{fcP!~SLRoK2^+skD7f=9D9}`p z&Bz_lf_iNNKP6jL?h{6^-YNm7wCWzL#kLS4u>eW#w2 zyGa$TafX7Wba&e|$KazZp6y;*daO%7_>x@lp>acu08FS$50n7|(P@4;=3ACD=%M1t z1x)_(-FBVN27tM0`f1s`485hf-8>S`zruYkOofnMGIt^mh&ME{Z$a2~BIWT*E-s*y znq?QyKD(;139F$IBgN1c(B}peGH>H*3laU%E;Vn;+5r|of9hEB{|O~(R2D)J4dB4NA%o- z-=5+5lG-{$*X;sS(#X(A)$39E`a;e^AjA&=3-Yg^R9vr;63!R4s=67R-d}TqND#wg zeiiEe4tHLQmBX-j&Vm_sM^Xs62DXKp_8SJZj-M~rh19;9%YYa}+ImxN=`jy+iK;#- z^74$U@~!Y23k9eAr7Y9L#+t@c7d2&pjVY8gUjIf|Cc92v(x6S+fh=4cS_3}sR@L{` zTO4!0U5v}>m)@IuZFfq5@Ep~*XHqm!2ql(64B(8LX;wkGzAznT6CJ8%0Zpaue0wW~I78yDT!dByOlykR-KZH;n-l zSda{%E`;;qHcuH9ps}LI@JiKj9)d}dDU3?A@?F#HnHGVbA|MaL6YS9~oP(sACFJEd za+t{Zv~YYi853~NP7bw$J{#8J1Vh@iiNRZ;SRzaw*OvVxjo&c95R5$#2yJ0j0}e(1 z5!T}POr1oW*iL@MwX9??b*f;kC!riv9}keci;cQZavVC&TB&LqEDFckRA34cBqfKc zB?gYDB!1oTA-$L))<7h-!(6q(5n(h}ApGi?p)PQQgSHh4X2P*Jf!|OJfz&kVjwR{i zuFW}*7={f49Iqj6`FXOnDqtaH!7i7Xc>y1Ei%>>!?O~6QWv+h`&I9G*rg}*et8w|l z z879c(vG_$HW^&8@c^~wD0qXP0VedlSj>IC_N~&49svVphUX*{Dr6td9iu%;~r3JE$ zlHmE-{~P|8maO4Am1Km#Q9TL^Bw{MY9gKWzPVeoe^Pbipma;HCM{)Gry#a{;qW-j;@VKk7o)WD8?AZmNSl;Bn)qBC;HLd+fHig_I^WAYsJo?o>~b zf{#c*fHfKZQ4;0ov|4pW;mLQgCidD7>(SDCCa!!&j%=lAh(*!+Z|PP4FP3JeR%w_^ zx=~6x1N#`}ydbO`lvvlm)D&vc=T0U8aCsI`Ff&>9`L3ECqJ2q-iPUJFBtpsIgqyMc zR+AwGg3R_T9>43Ou{Q&{I67F#_yaFe(pR50OEwGzJ1>_6q>iqk&Nj zaP1=Co)nJf^QkP40GxbXyyq;0v1t9TRfyFRjeY|_zy)~F?TbJIpSLHKf^KyNZpzR^ z^;g!ljO?Y8hSLACfWVSN6@VEYF+8Lix82ELlHcN(O4y8X!F?JmFo#J8iWQ@XG*?8K zKL)}yCSfIVLl85>u;?g3*8tq(%&wHfo_P)SguYQ^~5*!9n*t5v&_HRSoj(5wT`n)r{caZH8iw{XzpT6I5TC{RS(Dx zw>Jda)jT=BW%41%S4&HyjHb)qM6d>L*hDeMxH-5z8m7;L;N4dShN1;CM$X?2;Ygz% zQz*`2k#MH2vED~hSvsKf<8~>XJ)7&YU@(0*OJj=B9nQCQf1tI!(!SF_;KICR*yAs+ z=><#qHcY(4&aV2bw2k^Vq^VqMba`>Tm(XIE4iK1fCZ-fBAQXU?AYhOyzo!^XYAmY6Q>pP^X@@-meEdt38X9jT)Cfu%O>EC@EdfD}ef>KU*MQt`#Cs`k68> zXV2V{nDO4-K5jyJn!oivyHK*3Am7gf(uFSr48PO`ElXwuQ48jaD7E5#knL*RJX|Tx zXVaCu0H2GugW@8jHLD_W_Pj|`EUdgS?qvLzE#Kx`qx@b}cD25x-ta|5y%NuLXpQAQb)3JE5*~Lm zfb|b(CI}Dq;L0tXA;3sagc2XpYmz9&ad%fW`Bhu zV)}g2)W5kR^CNv~;4@LJ!&7)hBnSp4v?wVDO?-f!h{XbU1W}~o;OKe^H!~sKl3|s* zADeND6CPETu3@@}OHGM}M?M%Z=kTEWRgQlSyK~=7%k5jLEg-wCTc=+PqXW_`A@Y|7 zuy>EM>X3io?m#94zR%9gk(LjMwv)g6GCb2|g<$GgBda&HA20qjEY6kK@(Vu*ydo@|>mJ<)krSK8(0PlN_Mz5EXQv0odDY;N{L1 zf{{(&gU}I>gCHTSd;9fD+s=X@r~%N#hsOLx!7dKK=bSM->0RNYbo#-%GxRA;Oq`4| zOZdy0CK*Gs&DML)zRJBVhW}LWsJCxl_*q`a>+BknHSl=>D`*@NibV9q(e!-T;~!5m z^xxsL)#IxkC^%k1N8Z#^52uI>+fGMB=-Qn$C(;zefrY_QbI>J(*uUbk0rzirZzVo2 zN8%pf_6Ib+gaDW4S<|ZQg4d4aw(y@aE7B&qG2ve~cuK?kvzeiR@SLny<0n1x)rLlr zX6V5y%g`Lbxp^l0vX>AhoF!L3uP{6<{Z5*NAX?-D3o?=RQ*!L9SYeA(gi<>xVDZR&G(4N2*-}I-vK-#>h8-<~hTD9_jTzQXf?S<~ID=#i9*R)1 zj$8=8VJ}FZf@@drp38hMJdRh-uj!#+#;b@HjNhjopY%mnE6XmGQYjXNSeNY^%TlCG zt|VA<1KzO3@mFdo)Xc?|f;W=84C9ruajuUBfaWUBrVwe`y5b}%l}vtx!zrN9Jli~O zzXugq#yZp*)ndYi@QdRdSCV6|68r&?n3vZ2Ti^M+hf9VYa_MdGwkGDhO_qv?^BX;E zi}TkSY2HPXsZ%9RA@iBRr_MWtfH#99L7EI_0#IgV0!+>-<+VOKp<@qU>4}87!3qi$ zr}E!!j*_1;>!;aO+3j3WVuMZ+O&kn<@zml%3xb97@|qBnw88&Jbh8y)P~P>trv%#` zPuowFp?&Siks9{f)2(j6JLmrXBhWEw30j7VBe{Luy~e{nz6`v^gpylGBN~h#b$y6r z$0aJ`n&2}}k#?^zc2_Dm^Q1aPOj=W01DrNqS53*s`g8DMA7=b(KR#DMgUm=`E8NH0 zQLBQWiO>I?ClnVmN-6&LA#g?A#>;BNqWH^WU}*@rjT~sqHR3oT$7#cSi%D=h3+j7? zu#8?>`2W5*^UD&Hvcu$H-#NGRdp)GFW?=JaVqJj%01)c4Z_1w$Yhlmz^DB+IeDU=# ztI5GW7Yc!S(X^L#s_WD62~I2N(YLx9NIXqDof-Ex8Cs8z?k~2ZYbYB;-X+Ex?)h?U zLC+O`wB(=!E=F8LrlJ+jPVh%@052xxO`QAOjPm+XlZA($0X5I9u z!UxW>%Bd9#m{2-OkxCqau-<}0Kv%bfBpzzD*>uqjWlWk(^R8DY zN6>0BRMWhc?6$#g71;rx}R@(4k$@$LVx?(P)$) z)I58c4vXP9{3vT}H0a|ldTwgWhGLgh1ezWPDVVWLR46E;89Ey>2rm15TCo)!9;%_KPfe`9j#&l0E)AFT0pCXLC2p_i}nu|BJi!whGT7 z*HhW*%P^2<1w-1>c66VWB2#nuM}kvv{%HHoV;-?q)7OX}tM}vQMbf#NPIXSPeJN@N zqyD#3wQ^E7wtj5D`|`)}N6|?o*W=VH23PRz=ms;QR8125K`7k2L=MoyCKv^l?6Pq@ z*iZu=L7c8tQP*2#s-Ml4Q(aVJOVr(81LN2EPV4lYE)zN&CW}d4X1q_g6xuNRoV4M{N%JXyr2YXzp zjh{qFnVYPaAv^tT>j~-hVp80v7aY=hWLf_Cu5h4d!a|p%B2NK|q+pBSj$Z3}KEm|O zQp$XfAhyJyIDuP60!sfa{m~bq=K8oaLWEIf1X~+ngl|0UX2WqXUKLglhS*=RS^m@PhYOoE#r35N zHJf;(??Bk;#ifHs=814J=G5so{X?nT5tMi+weYZ&(oI8&KuF|l-e}nZO*^gXe6Sqx zRb0*k;0uFbPV_VXViBBAEvxf~RH!_9z~Pvn2>i5oAyyZ$xM;PGgc==EgA$?1r{5Tt zA8ORw)#8Vd^HL-Z;3rkZk~V$>$)RB3`byNm;fsrQ##cjtJ%_t@S97sVR$iba=YiUbF z_iyQ*!|Qb-HG$-fl*N&2aS_0>jAaKu?GrI`POk1}=lXbBWodmmey&*LYCAF8KDsU(p}KLMs-o~6 z1OsNhaDtBw=GF4X-6j+&@IMW67LGDjnBFs3`WY~F!#WD_) zUqn7sikW|ucpn^g?HTzEd1O^|cK>2SLX8n86>vEMLQ*tY9+M(>Dva(#(9oECUqo$d zJlcr;oMpqF=;v3TC_5m}jq2u-IpaUdbn2?sPds)=L*Btka|nY@+pvt1mzY&P`Kf5< z4=omu_$X|CyH3A{l#tj(%4hWDZ%N{k!4iKCXS0t(_`Hi}d*cGJ3d^*|_;-seaIEyE zFbr2PrG?pZm+M4k@!bT1j18z1(^&&;8jjH9&#en8hydKaO~1&hKl+OAm9F8q90on3 zT5jRctk9J=T(~k~4?F{_D;{aywdN9ToU#?x?axC}wAk@=l!RXTOc$V+1 zp6ciLy8q3wg?hk~-HZ@ynYL&WXKn3M;M)|?6GmLF4)2ZD>>fI*dd-2cslufLwng}s zDxi1gXeEFfHQ(FB=WzCY(c`<3e)@iUbl@fbWB5Maz1BZ4tP=H|6W zVU^j0Gy*3{?2B%ty>hg|Q9=U%ddnMa#Rq}i?blKvNS`YzQ2z+X+3uHC+Vt41%IBZJk zsv7KGM&FTuNnuXKSL$kSkLet>orWy8|FMtl$riC^7)PEXVR4a$-pe&SP$&Cnh?-t775_1Xv4J3*h>nMYf;f|rpRjvdqB^6MC$2iw#A`O~vcKN?$ z#X$nbrFy!X`kbxb4rF7Lsz>4BMusc@aay8E!$9m{n?4#oz31FSy{!_&bi{{=hrj); zAC2?Prv6lT9<0@HzMXtl0Db`p`a$*6k(h+dad^gn589@@I(tiMt6WRUy|i^-b#N*~MrOy1 z6>d1Z2c)>w)q{X9D>5Xsgb&NyO7Askq*llaq?ehv&KO`bPKF*)ZZnqEOTf%Y;@3$y2%B;HC4JQR>2P3vp%eU0o61 zu&i>%x6eL4)|b9!h_>P0yenV9%DL@+hI&KuD;3Oigqk({tF%esT2S{Yd{@_X+HauU zzq_r2IJfR+55(`akjoUKJ9i`TaewD-{O^EPHfCT|=ZEca`R)R}rDeiT)#p8>r%d-H_z;%0shT zWM7WO9l5=UKQUH2vb_IGqe#<)1b`e1_LV}k$Y1~tgaA8o)oCYOc4TQnW~oo^{ts=$ z0aX-CgB3`?qpyx{hy(+aA%I931{Cxyiy<-U{rFF?Dr$!a@9iqk0S-h-RIrjE-OCG! z{B|=D_US(fvUo9LCse7NT!5vqmIUl_OL%z{s;>2+KCj&5_QyJvk7BgICpO9hTd;k} zAB8El8s{p5Vo~^swR=RGlm{^$%Vx=$6tT7KJ`In;{EP|k{CUJx{2rtGV)nFm$7S1% z?Qi%Q6=>OKF!T|gF;%6m%29sfOmoq@xcgQ5ptGIRzT6c|y>oiwn5BIaqaY#M;;?Vx z;)<6cR-fRAJSCxTHiS~b6P067+g1zRymLp+H7bZCDE%$aG_7Tn8H~I;Ai&)4^J(@C z?UyN{9i4DG8e6`P&W`v52D=J7oNZ!qrbKV}nJFA!7{T<~s(5!vd8PT!7m7drZtd~? zQ*SY{bnC~L(S4Q`3>Tduav_N0$IhlCeEJ$BnUt-O8@G1v_pHe+1>FMa0S;3xykz2e zR_^1WctV;sdxpz8g}D3!8}y2ll+|W(qnhwZmq1)KrP03iie>g&c$^VV&$elHTWnsV z*k=v?UHzIp{FvhwVm{Us?er3rayYF(Q|Tx^GX!QiDBPo}9b>`Zf#`{Btlr0MZ}F0V zz&QqbMU>rx)9ZzkYSi_QDiviE+h5DtHD3SE!##sb(RUH`g~Vevn;fK zQ(sB3Iq{tBYB5Duh^Hto_X{(2$6bV_TB`U55Now+xwn3xsjj9-Zy%!WSZsta_~NgX zIaX;6_;d4}OGxZS7IUtAKR1pBN+3P4GE1GG2n6;WnN-^2Ku6GJz70zMw z>ETpD{se$y1@ZqVuwR?keOe^TBnSv* zl|?SUSH8=O5kv-PLII%&7|BU~*5Myk`Lp6xHr;ndxj!3+yA{&UY5XTM!#N>s1Hnix z1lYmxzIO724^_zLw-!QX9e>Wawke8TtiC*YABpBnj=c?D)Bd(6127BcKCB_VSTR%n zaFgMf5vf@LWlb+`GyY!4wU^WU(Dw_iR=?Mr=90;6=z=izEf93~TE-#Vhd^fTL+jW5 z)O(!BXVfCn+D$6_+y3rW+Y^Z@q55AX_iFtK$fWcNfb~DV_pm;RA26!{H7nJvCY6wT3OS zYNSL{ef8THdDDUP`zfDC;pBC>A5S0{$ozAHxU5pRB&4(6QnIZo(s6jGq9(sdVQDN( z#rw0N$HSLg^!ogW8J!&DwqKp;;;@x_6CV`Pna8+ul9qQFAbj9p6c#@ zD)l*SyMY2AhX8;pz|6PkE$QA}kd;D&qJ+7>g#%L*%_;!}SQ-q6JjsEP06oCUu3#i- z?+{HW#AsI+-5RQz6U7E%PzDmo{TWx)K^YcdlKLGg!r+G-W(!D4M%DdhiQ5$>ezHO}+!@R_RhvNM|| zwYW>|`hHx*!wonM{SKL}9iQ~uuk@4F!p50lSJya^JGDdAIAN~x_n25VzZTp4M&*-@ z8m657*I9=?b_-{a@cAcW8aEm9X>hK7A=O;KWMRy~UQ|c^?OgOVMn9#bH>+R-Bp~2H zMHz$Zc6c=#;!wTFp~84Xq!fQzqs7M6xTgph&fgORR)P^t_n;CI4Yn1BPtSwd zG=SFNGNV%$j4=;c2kyrYwHig&+L=u|z9qR>^6ha+M{o2cMwY~(1S~2@9XGG(HLFwv z7Ez`pg81E~{M+uiU<=wyuTLMec!JlYX=!eknuL(&y;Gdef^;TfQ>`Yw+VkH#zU5tLX#l~gQL*vzl78&i zmfyi7v6=l(4Hnvq{kD%Jx4hROB42g+9oU7(uMggwK^jeIU{NsRQtqqsJsWs!$gKgO zTlU)}rkPaF!?nm)KJM0L3+Ln;n>J?iFOh%qCzcip1eMHFc6mN~OPH?7KIjfxZCdU! zE%N0_U}qZVf0qaPlmc)@U&WK^YiH6$oGB>Sm79$1wp%adm=WGraCSG5!>}_~U#s2z zI`=2tAH}P97y3nycuLZ9;vcq9ZvQVQO-b$=o4&S&HdLsSYnVDbUuyTA8c2%?^~m}u zy~Zr6ui4(Lx#{+^mBFaZicLHavCh4#_d#4oFd!g^q7o2^)4OZpnQlwy$4Ru z!(a+VkK)pIF7c{SM;$i>5V54!y9wm8LejLDYN-iQPtDRxg}j)Oubty%p4`gXp!vk! zq3yZX#Hq}tA^6(z1XJf7c@(XjCfULBs~OlzhSC3O5-ZG#$|5~^J0Tj2UibZ+X@ntal~;7a54976idYpkM*&k(ci8Lb|?R>ov!J zp?8Ec>7P66@R{hzjq*fbRX23N@)Vy~rwL=D+`j#vn85+6uBHq0 zYKyA?Zc9c)9Q|2hS2zO-(H-*4j^<_mwkF61s^P5LZe->-xNRDm}sjOK&W==#cv zk8g)RgZ+W*QU7T_#6ScjmzT3GO(o&nR+r_Abr7t=cB1{lSf@h#G%B_VHZjr2|G>gV{|E7;Q%4=7A9bUZvBXW}nI=c4aU{~Mv|LNWr&n4H1b)A7&RW0iKP!R}81kPmoR zG;6);4nW8@n)yG;lxx;SR(030*Jr-jGYd6Co)A+9OD?_Lf{lGTjfI)VA0U0>dX_GQ zpwnS1i!&eo<>ibQ<&!v;qzj6YM%QP&jr8s=1x7L>GB7`gAyYFlGVk`^+-p48ZEY%f zpUVXrz3sjL@At{t*Lvk-c?2pn6Ru4NVs|p_Kb+!EUdkp>aT@{l&OqRp)CKEtE zpjL-h$;oucj(QL8m}+OW>ge&4+B-NAGrr+O^}+yfu1dY0;e6!rj-7t#)ovJrHhb5= z{gMWhKp%Yl&SCpgCWn6u^tn=;Hh7+Np=_TNu{j@pQO5NT&!7Uuw5wiNcHa!{)p9lk za~*xFJ@$+5Y~(ItD$C0lU};0S(+N9qGPj)dy1!*wM;Kf2bY@v6neFNC0usIacdUL< zd(`8cto{89mqqfT=jrKd9Vjo((CZL*GG)EX^u4iJe)L_FS!rjoGA86MrULRW>eD$+ zAB&&T^xT%`OJeMFUf#=qhtYZuhK&?#Kg`Da7{hGvsd{Z>Q-uvG9Qk79fl~f(FTw`j z;B5FnAA}oD&nu=Ys%$->SJ*E2o6WnFgKMf2vvt#fQwyL8j11%h)d8gZjm{n1`??&@ zF$h9ry(cfOQ^(W17PH84Cn@kD9_$e@MNmo%Ei{@Ko34a|ozxHnsL;qDQ^Unf4B3*2 z_th_j?Puga6<^tEP*3_WZ0*l2+3WT-s8{2n%f}EvQKkNM`HLAmqASo6&seL7OB>(~ zD>)?oUix2>H0e+l?zNTXX|yl_T6uuey=V26C^^8bM}@82cNp9_IAm>r@2N2`{Wg@{ z(C*i7I_}iYmWZyISqZMxP-AM(WBhbc|E31Mif^};VV_}S0im`oBA9qQ8y)O@*m}CX zr}p=NUv*KkL@u?^lGFn5-?fTK_%j$l2YuIj#dCf+ISDei7~4!+Cu8!yiT6M%CshUs zBpfkV2?uq6x=+D&`P7daM}D9n&LDzeAE)C%K>)u0-SZWCby5vE`db1GnS;2%iF^Kn z+^m3Sc+Y5Fyh1TGq&}ZvykP=wNhX?F8G_K5amYW>6+(kIBb6=xMZHYl5(Yve*;YEr zDR5_OVpHNG7d$6vJY(OO_3+u>P2*9ohZwyyA)od3HngQM_8!p)g|?b;b?6RO4>)&vhPc#2?1Ht)V{N9LI$0J7Pt;evlk zqpQcy_(vAaf84`gg;7UEFo?(jO>d8+_Qnj@P@CWQ53Ndk+0VPbV)ZRbxRW5R{|=$Z zH9}+C%l#Ef9h%i3JHyQXmD$MOw21jjYyJ&+!I$B~$|Vvzm+s;>WE4IE*t$Wr)*VoM zSLUkAE69dyktDfj6#uGqDGHypbmN!XmCs^8#{E9{WQI9)YoiwJ(g}QJ_&wHk4*eA| z=Brr^Wkal0y0Ik%Omp&i2&?5lPg`ssg`QC&>ipXuqG!%H0WbwW7eZ80s+a0@ENrO~ zLOM!LV}EP8<7{Z#hn{&I!a!iku2SAjDKD99FPrL7>n5@A|J<^*xO=`>Fp(}#JFd-4 z&9)TuL_$I2TR=wAXN?~2vvXf@bg zUb{Q83}Xax7`$!ZcMXQ^4)KcjU85;a^3d7uapG1KBj~^}ySadW@c-K|_aev753X9apTN5D>Qa zqgyPM*=Dq`v!w)nk791oBq@dk@*1f?8*hzTP0Io>VYNTd;!yQtJRbo`a-f^t4y}y_ zU1T)>n`Rou)}eh3dJ;@bpE*YlKTX+xOqb>tyk_f4eUL_D1O<5vCqPWI;K{rUX;GjI z7X^lY6dQ%5`J_JI^&JVAmW3=E`9LKz7huGZ5I;scIHpS*h0DZ&qRN>y) zrLQFSng*uOOvT=KsB>L1V-}w7N8D2Mp}x|)H5WJ^gZEcxd!{U<4KS;7yqDOGCbml$ zHifi@q8PXa42^<(83iTRaGJVu@@0(`2O651%igcm;M9v8PM~) zstlR`MaZTYX)%0^Y;y1p*Q=BJevBT##aBCI3WC|goIBwD_&=BieDz@NHEB22sRt&v zrHy$g;kW!wS6r4#%@0yf6r%ibZJpuM1~^VdEM@eL1z;)I_vQ&4HRC-EA_SJ+-u1?? z-v+bJn+&UVRew0Mde&XKvn^-wJ#st@_7S;AHQ&!r-EZA{l8HW#O`U;p zL4+*h)vLYhF_QQh(Vl}8i9rLI2#0rG(2@^U*o(DT1bYE%RJJ|Z7BpRhu?qXkeSqVK z^kPg*m%Ql~-X9V0;q1=Bk7G+=t-%e&N1!doW6r{fF$OxurX22JU+>L48i6U9Sgrnl5R>oiqDasuu&BCN z+;%0DbQ?&SsnfHFnPj>Oi9U#Qe&BXc32lrJYS@enKh1d4NZbhbk0T_6j@Zz0qJt}=2P+alujB}7J6y(PP$2*> zWq)P9?HZ&*T$Qm6J4vxuCzBV9mIn;F=m8E40fN{dn)vRkcjpRbt4_5Wqy5Co)NL8Z8v|bTx0bPSNp4BwT$IxdC3ek zHcQH}A8)(Y6S45XcOp9{B7aHtkHK&eV^oA!2dE3g{c+eA!r*QONuU+N0%In(CVf19 z<^@)@j>yoL-2gBEU;at?VUJY_))uChwGn3{b5z<8I;Qdy%5LrLvnFK?5vd2bh&uzO z3iddYW4M?`mf3N9;WPC%+Mf{X5!{r=|3jQ1Y9}k${$x+CkqoZBc4qirpp|$2cSz4% z=F7_zq|FcvCou?G>xTB;+o9edjM*nfE!Iqadv6R%p^Q-v^b|Z zHN3sE^rzJ0H?#9%vV|X%&lZWFwN6ApWSzd(aG)hun^k28BS*J&z_Zb5wcpa6L;(P!h4l zhs?FOfuGf$l(^TIB>L8dty8NBmOYU*smO^c7*_z=3<71`Bfw(#V!{ZPV?a$hA^s-r zRL5t%ojb*U-L>1Zb4YjuFohpht$DG5$UU8?`TS=C%wD01Ap$e9S7lpN?Y`t9v^}zB z1Y#i+Ue&~Sei})4%g;_$=@`O1_|IFo)PX&gXfrLyLO~A7GK+4XYOE$M#|%R5}Z=im$#e`XUye#1VyBCBD|TE9O`)d zjCO+WftU2g=Kh3)iY;jO1CYRQG47YWqeP#Y8)n(`g3$ z&R>%H--*iRXR%YgHBvII(^lknlm%rlJKIYD8J|x+pK+#h`>_#M8R% zH!&uPYj9Qccl57{k%l0U$GW)9y(h-ZOyIJv#z*Z>{;UIX`C0UoXCl zd^5RhvJrFFcO?pN4hPV792@@rs5%WXlU0JSYv=9YG0qJ-mg5!xqk79S01y$p&(K0N z$uzV~$iO>2l7O)n3!x34y;-d?rpQ%#ed<;zYGc_Kv-XBaNZI9=xr=@1MBdmxBYHn1 zJyT#xwp-m4s52Pc&+dvO;cv`7iNJ_3N{&g+Dvd2K5Yvzx=SuW zEkBl={M-k!`Zg9X6uRgmT#!YaZV9q|@Z^_;3rEVY0B}D>I{5F$(?xdhe1wN`CtqNE zH)>lK0L4!Qza|hNI3e9>m4Dd31!w%gc6u^RB?qWw@|TLQ<$Vhn%XVlm#7&1x%{4oJ zR_UP`4}PZ$*5Ncz*VpCz-QHN=KI{)1#F;QSa{wZVls!5(szPo_W>@QDx*KvQzUyR= zduzTnVb2M^(O|IESy2o;EKJ7)c7I=>jwYXCHyzoXP?r*oR>sLH5=`(I3j`DVU^sjk zV%dE(#(W;roBg3mgy!mwUlM6yAM>nz&%UKd5;0&T>hyat*u@x11Rf`za$PG+omj!W zZmfA!k_Z=%kJA6%z6q|mDkIUjp+3HPPBl_th1FKO@66^51rRvW~A9Vz#-n#Bn#W2@vumh9(|#3I+PyZK=JWim(|Z^s!@3Eh z#*wB`dLty*V=3QxeCT=QX(aUcE2(*LYf#sAYA@T!sb3C5?~XN3tF2bi&D$mPANAO1RdRi} zJw-Z$D&1kDq218zMHEcU1%g0piXU}F`W$IeLYRPSEj`l~&Zf5a6nkpiB9EBN(HrOP zLo1=dm>2Mn#rIv`w^(L%w1|W)GJTI4|1L)`8|`tjTaNHy&G75~zd9>Sxb6>ot@ZN~ z9?tY!r`J<}XwRt6Uk#3b>o}MDJQ{W0GbyhC=o-p=Ww$BM}ntilPJUcj%)T%tsSfGwy8 z&t@BG*_%yRcHx%`iWr_rT;?J_uml3(K(q-Hf*82se`?j~S~I>l?M(j&h@P%5ZO7fE zUVx-VM>ty{Fq~#BQvPzl`Z(oiyWZHZQa8%SCj|>zqr)l>o28F=vU1Te)F=NV_(aJv>Z6o%Js%sFnPpA9NC)DuMVn zSsR@^F&6K8Bs`=IMcu%3LVo&L5={GYZ~Lz&=P^;*d$_G4-WVAQ*ZuD0l?KFvs-w>g zQK@G+hy5kZxY9_ixuv-Y2G3=ISa~&k6(>K?#pC~pZbuST5p*r%>28YP=d6PnKJ7fI zYtB8#8k)Q}fh5Q;*>SjLtUFg{c=5=54gJ_ zZ!u#6de5^QRAio#*tNCW_HwtD6|`5C%g8_V1G3F*NBZUnGChl1)j@F&G3$ceGX6OO5DGV9+p$T z)S?LzMA=*}$JUQS!}ZG!rKY;iT^+;c%xW*Pb!Y5Vt0ivvAspzlD=NC>kyH94xvOt* zLjyTspoXY4qgcD|INuL_TS{mhBh7AQg@x{gSzF$oKk=YiD=1=}<-+~$_)bQLp7MeCAdhww zg2kt6K|Cim`x+fs3}G8QN6UZBIV~zxo_q4?~ z^ASy?P99N~{5)2FRkJwwnW3a=fp?_9cA#k0khEJz%WhkNo>j0hC+9VfW-Ezt%k~9jJ zFSU-zDF&p6cOgEIdc)G0QnN2NeoNI$EJ_(z5YIKx)dc|Qj~qm)2zys%D->HpI?G>ysXBgOZ%gZdju4sGMJB~LVS zP$}+BY^oqCh60F3p6Nr+n1*ViD0N@we?#!TUy-e3dZ8&NilB4o-W-o&kYyj|u13tE z)9)FR_4yeZ0l&f~3c9=ynv!UT3B|1e{9rkqX7>xYGjf`}! z-@mff1m!xxk8X8+c-#)#Z57LjQRU!z<-V@{O|sE{ECTHZ2(5;=FMN8)db4)5J1fGs z=<((GV&B$Rbk8qD4825^gTVRbA$fhw)h*cwis2PmQM5g!q;8er+*!fvnSchc9(Wp0Q(_Rw$@-SgHSDAKy0_{;!zbPO=+L|?+h_Y(^DC*OR1$}HXD zXz+oZBkY&LKJe!MPLx#XuW#EAeg8pQ*Ufv*w0Eb5YiY6S5B#DkhB(HmZ!_5Bszz)A z;KT_4VXjjfaQH~PuV60A;;p_V7KXXsY? zHFDInSNE~=2o+vg|HLA>#WY$9zE`hYvW9yjFSBPhe)Q3J>|Gb>D0c=z3Lt_ag!!WN zpvXV~wRV6^*nE+g%^p=1I78aFiJQ|mxIls<&yL!4`dTehuM=r%X@JOV&V39@a{!)$qY>V?2QgYb(Ll@n=H z01&Gkk1;r*GcFc122bsVnFc<2Y5lX{NFfj7^a1YZ^n@!mFyFJ+?>j;{jhYW!t7*-C zq#RNliqa)hBHX+@`G(Aqy4UbAw5MNe!gyrmsG0pZNrUAvvdUP*-o?}G%<6P!0xpt? z*)4$~h`mofVq8iH-%jH^!SG}jielQL{sp}NKS030%1A231N*G`3T^j_HDqOAA#zv_ z3|xPW@ima6_c-;rEE2z*2E+4Q2S+HKa^~FR7wq;v>9LunE{;Vr?_J*a$&VY5T$Zi^ z>Fnv=`5-Xvn0JE@K{WnRv?`TH?%;F4Jxl5w6F@d|bM@%=HeJRl9h2#!iMJ_-KBbxU zw6%8}cgMsr0cyc|^eF%QpF7cbkn<+bUXdH`#?IFUqpww)4;zKA*kCc*c9Eu0rO0(} zEX+0qeJZwR{)aXHY8sMzefWqmX493Wg+7Z?34jCu{s_R^P6=yq!O}FM)`~BGZU#an zTn(b-TKZ4a`X)V4Xu}#ts(TMI4+AUhNnWAnONo496nZ2%m9vCCw&N#jzl82vUY4oTMuoU97fhPvpu89x=dGVB)Xx~z?1K}S zyUju`n{YDOy<4RQy(wc??2E0^vIHaP1de}|NV>1?P>?7|wf2nPTqq_vRV8KZkKw7# z2iQd>Y5;|yx^%VUQ`be>z4$=?O58mPs6@`ubb^(L83IP7EwM(bKrjY#ZjK4g*84g| zDF#%Ar=-pxz9}7k7@Wv-cyiqP_z2=`aA_ex1)taQX<_fNh>H64>nGeX=koc6U8j)U zdr3wnVHKb-y?urJ3w$$0?%aQBG0Oa|K5t@&*KrD5GRFS7V)2;F0*=3uxL0IZ#ZF;Z zvVo~3Ah)0z(z(G(al(0Cg3J6v>gkvYQBsvoGKZP?b3=XyJ|^5R0$xPBemcS=C$AU? zXQa@8N|*SjBC>d$vvBVCkW|O8T}+c;h`Lpz9n8OxP2(f=;{uaO_zm7tgL;!D`2!}Q!vFo{_H-kVDUgz7D6jpn!o+9jJoA#iOyH^F{hLmlR;O?DIBf(R74G@gO0^U0yxj9#-DPFC6z$*K-)@J(J&G6U678&#_;i;^}8yy@Y6#YRT zpqJh46xI~SdGVc7^S9Vb)N1cdtRyqWqi{L*#O0PGax$IX#8PVzy!x`Aw|1P9{N2yRx*Bp4d@Ub!>Sx)gsG!5!h^Gc?Kk*36pT}DKUE(SEAb~b)tOqh ze#6Vfu|i3Zv~)85vVUL`<(FTQyBpi!9|PHNWR1Eh8P3Mhi1+>B?0kNi@p2XrRidV1 zIV&z5;R~$Ry7kAa)}?!5x?0pn#jj^1CZ@ErR1|lQlvT_23Hg*2Y`3!aQRD1KRIFHR zoGBM)@JpUs_eVPU;oJzzharC4tYXQ!iji?fs(U7>qbaw`n>aw zOjD9t3ip?Ld5to%k#I5O5)H?qhjkU`*m{W>E=F-3J-Aom8&h5WcK9FL0ZMltws^o1 zmPIVWOpr2Zu5Ihz_iqd`FCODfvg5|>0SR8z$_gG*2H!=x?uX4v2rwXDO_j*deaeeA zUVB{5I}OL?49%wNniZG6qs%gIb>=Bk{&`_=CPGRHa1W8g*8svoELS*Os1zkW^&9ec z&AT@~Uiz;)NlPc;Tu zOtAG?%l%9*v4P*}UH`H;KYoX14^7O%KbsWB+9GOTW@XvyY3W_SzUBlJ>a27y)rZTT zPKTT1?Xa@-c}`xrvQkX zP%n^5fqJFksLAa;WL9<+8Z^q4Bo9#3Rti=P%E9hjCs@T{;Br{I&L<)pudh)H3&~Ns z-1)cAv(^q@azjt6k+|({|_>PH07bRCM%X@t`SrpY%jVsi3b($W812zcNVtbgiaBwAuT_ni(cx z_=7=jp~+ifB!)3!ZAwjjr_01Z4QT26B}8uKJsy|PJQ|5#k_bXQ@K6+7n;eh{2f#iW zU2H(5Qy))!TQPuA^e6BRfzS%8vDnr|SnKwOKeWEg;!MI=n1nd+xe(=WX}zOxdbH@+ zqo~X^6KH1_Jie5&$-)_(3rdmaefSwSK!k(#Tpdse#+xxyR`+K*_gtWkGniWn32`&-9vbb@oTgt z4JdjL3lF0;9%6_#w`+J@6Z|#z3!ENC|k`;Mff!BQCf;4+SxjD&_CD! zBTObq!2cFC;Ve5QMR zR&uN4L0~L1nl5eKDttn<68-)5*u z0+3Y##4IH9SMx>z_R6nJpxwMJaX^g4%ZbXtLb9e&is6I#U^+tb%8g-L>o$tX*nwI{ za-=GJTPAQzGDvMXpaH^4nzX>MTxsUI94tK@&6YecE;V za&}cu#f3VJVGy3Jk{A7r!3&S?GX<>rL~r45KFOjEVFtBZ^a3M?f}}!G2a*-izt)68H9#JyP10H$w5!bbdqG!|%ZtUh7%3we15NMX{u=5>U=TLGn&QsQ<2oSfC^>5CwWNAuU`$x;n{q?ds{g zdMEmxYH(S1yC08vtrw*o^!8@u?{M0SoX&mjp<;ra=IArrXu8 zyBplzvN(!X)2jJ5@_&ajZ8AJ8buKs8ipFxA`aGwKh;awz=;?j+v)g1Zm zE;E5(5mFC*@R3WN_ts)4d1-c}ix;Hs)~#y&$5P`qvk zd&ZwMcX!yTt!q5Y?86aA+R9MlT>ZVG;ys+MX+5l|)M4dU0-xx9C1N0y2ka*TtEA$` z#P99`f5X|H9d%2&s2kP@wL-(f)T{I|%<}qr>4z7Yq+jxIFSb-!o}hA)JoI1lrv|kBl01$QfB=HC+8 zG#91D4TrJ9ee;ebU~Qlk=ze5A`+_r5Z0`&bu{wOYDkf3&Uj+@}Jw}R$vZ`nbw&?%d zET!FEnS1F^P(mKBkOsvELZ_YLF`Nv!3B5Y=X)a6rvDTcIdO~}UsvnbN?O^Ul7HTc@ zYe;ui)z`iu;x&ifvHlt>9W5CQzGF{Sw2u$gG_j;2r$iUe#fmL`*>+P5X=kPd(q~}V z&0JgSBu#$v1Ngp;iU}hBe2y4(ZGEEuoe*c7X_xluZI^?SV_!ir`JYK#!}_b70A3z8v%G;-&-FwR^lJl0I}xTF7*p0M(@oW{7ZGqT|Z?HhulM z6cZ$t@**J(+w~%o9YgK*GjJz3A(?mFnPuH0$(+m_{xrGVk1zKcPd60u(N$ik2O#3v zK5@Z=1+(wq{{KtT*w^Bq@8oPjtBkv6i1)J6a3owZ4GB%>X@SADPzEtnPl-FPd1Q~4 zX}u6P_{o6`zPh7)5i51I^N?pSH*Vp6JOvb#!sy}cv5{F?5)eiBS<@vy{)b$SuwwVddX6><`@98_ueA zqu;^B;K}dg=$U|~DjqL}?#Tay%xAVhN7mTII+67G@*b@My-TR{T_MfkXlvWLGaIL0 z#+(P*3dyZzE!~6-9aGGg)YbMg4!c*X2);)R(J)o*|BU3h{HbokdT?1ZVs#G7pdcto zZAt0H6X@H)Rgaq+>*u|nTXQZjozoVX`;1*ad7)U4QddIJxtb?0VywdG#@DgSG2-$}-Y;7m< zY4-&DU@7%SYiokI%q`Tbh2cmB!S@^{CG*2zlyObcG5SsyqI&UqNRV`m#~9O{sPU@h z+bNcYlThvRHfj6wZ>Rb{1A{3gB=Sryi8YHT~YOrnm;*rS`BS^C5hy$EGoN5jv(sqq9vg&|Ve_Q=b%4xAJoivR#)lY~)Y^ z9FY1wlQAG0s@GsL{e%hiw0MzUVyjrN94eN_&8zh9^!G?b;*p1Cs z!1d{Pfa3wFHSHL3w1xVsT^71?upm>Z+~;7yBA4hQKTKhiw&mYDlh^CaeD8K*AVoIa zbRpSktGkz+NFS0@GcY%QvFG26V-jLYZ6rgmMrWEtevtuRTRY-dF~vKBEkkujir!Yi z&D}UUa^f^a%6+~HnKSDi-V(K98Jj0EIlO7#>R1#7_vBc@)=SP}V_(q;v+dxaY>?2o z9!6A!!UjX>V?u z7n*%^n`TcJ%u$nfdIjkSfI=hK0U^PF^!vzqEeTnHq+m%sh}14fPf;nty(_&P{(gNFG|cBc@Ba) zC8J9+jnRHAAo8a8VfKliY*pXpNm{ELZM1P(ErJs3#+=6HAdU3*O9nO&*fZ}}#QV{ja|y-3dRks~V9_#ks+Xdsc&~c&le(HkcvO^vA7)p5@?;j%8p^rTCjNXa``xM6|IZ72 zhtYRXN(3&JtoV+IS(n7TK}2Ltd`{$SA}KHJTo|6=LwevfzY6X36QGPt41{3f!0@$$ zto2#D&%q&deEHYMst+82n`(_h-fTWba#Qu-|zIr<`I3 zy%(_y-xb!p6xS8QQrT<~$5j{c9oiy*Uu)Tr>_#l(%j+<)gkzx--T7JMC*~#)^XnN4 zQea~1T8)yAB9Yi;$po>4N6Oy2LqDSG| z$9%N+Ai3%*l?8SX70Qa&6>68g0$8UGcRGB+xv}qq2Sh%ux+nb#R|8*V$F>*ufy+1| ziCl_i?Nu>g#`RO5*mxX-5@;?ztjW8A*!38iRLmYMqQ1JkK>t<1Ta5=Z+M%jFW-=%e z+2um=Vl!^m+n>z_4{0u$>0$Tjx${VGP0R|`AtBag%-;W!1(~|FP$CS4SZ2jsBim@^ ze9*`zJ|sK*c_ulPRAk1qeGoooDsZ4YTI4q$KOhhtotY)3t_g^0`^p5?WPOh01TZ<_ zY&0tx;ULBoK)8j9t8+@V;g+sKf1HZGI;%lb6?w!J%;9M&CD^ToLT7Q{heXyTXAV*X zNHSFK*V-?8th_zbBDve_aOH)6P83Tg`=Nri<%ySYRo)f5fEc`S@vf$a9RAufL&VQV z?U0nl*n8Bij3Uy{qtgpkOL(hcBu7zs28{vogOY#)#b_zu4(Ziets3uH;UNtI|F=eG zGmFa_JyBVi=|!q{cA>~Rn&-!D?~4rED_J_@hWAKPnymU*n=x!XN&4P88|?DV&J)9w zIO2Wx@HAChQW}vuH`M)Q1V|F#pSr-h|5fpaW^HXS&}hELkHI*pEC_UTfiE`)b+%W3 z>h-WDW$p%R#@F$Ay=kWDCM`8tN0Iyb6Ds!zMnAk`V8)sB;8gVsGO+)>%(*P-&)f>C zA(-G_@edFw`|+$R*y2VB1t4Bll3i!6s~nTU=ZW5A5<&op^qDM@RW+zWWeZei*vn9M z`MPZ|>UOp-{+=HTA zsq*bcG2+qF~Fn$FLfRku9#VTiYNsN6_Y@*nh?&rBW>}6FyKgwm?f;zHr-~~ zKJuvX(;4r$WC68Du~;x+Ue~Lb=5B7zUNW|M_Ft7(#7-0~ZB*&z#NPW5Wio=~-=LW$U{i%Eq9u-Go zeT4EpftnqkY`d+^74Pl&q<=Vi1VTs629=`p4^pxUiS~bN(gzZc(Y|0bjI-8ur)C%m zj=Q*vaprseGpzYNns2S_GW!45mU`E5GFr*`ON|MvpCR6DD14h(o=7I}!C27dJ(559uhTZ@@_ zl^u^x%~zVZ#w+O&^I|GF>?xxlMgI1X05O-|LZcV;>9tnCv*A~}1)==-02NtqX^x$< zosqN3jDcY`@&CtrLzUBeY0t<6Q}Qlv8JG?(p{iU^p%F_t()*Q>8Qdh~u5;HVK|)k5 zv)MiL*Kl+E0w*LqWM~&WPRhLvs8pd6uC(D`Luf5JE*N9Wn|1UpJMVG6RLr;DLVSAv zm196wXNE$aq8|VrY6l%>UMtCzX_bcLVvnHkzOb_w?vlu__oW#s5PL)m2n%Jp_TL2) zCQPI8KG2%sQ^NvMUMU9ZXUK8)8682HHP>fQu5_3lw_7E6SK#BicB`Kkk7~5Q|5g!y z-LA`TLG(sHpcj#Qiw4B04oixMz?QQ>zqvGY6n5qR<`a`;Bp-Yiy=(Wz0IUMtC9|kr!?XB&5lU zHhzoBnz<=Tc$@OEMEPil68$E%_ULL=`5Ho1P ziLrWo_>ByN5_W4pn;~rX+9WX zWtdiSkTFt1OlI0NH6A4$u9c&s{Wd|k zMGYsvTptRJ3fZ6e!xw(ZlPy<6tcI z4gc4?o4dBs)U6p3>e|wtYfG*j&Xx;iVXr!J@CQ59BQdvRS=&c^w4B-fn{m38U2~6) zah-covG3vsE0%{|1r7LW0|5DR4#-%faNr~?3b{YQ3j}o^`PYoVg^G!h*}88}(0(0d z<^C*Cv&%v9GQEuchv43W(!ytKtblDAp6n);_56@#oP#8$as45rq;4=Bf*-|B3oCtz z0D{a7pPJfq$J-bXP0Ah%^AM1@A|{rnIR!ch)c>K=L;UclqesOG!OIjUeXgi=@l>cs zOXcA{kk0GDXA}D2y9t~oU6y-4$l>_QtB70Sxegw5mN6jkX>=83>x`6t#OeiEy52yx zq~ktn5>HN;pp4O5wDpJ~>uBb>gNtqyJ*`ga-B8MA7lI(kJL*xe+;BWcm$W2-9LY7O*GQh8I+s<~F*LdN@aVwY zT}~pCnyIvGDa9=HJ?Q36rmjJ|_I35+wAf%O26l11oTJ~7!5ZmNdwlB}hVpbu0`@=_ zN?H&4guxz^uMh=sb--0A`9Ik{#B4ByeDI2W^fo&|KJ9xu5sn@z=)i2;M)%{vP<~14 zhRoY|&3}KFwi&rZVIlWDJzy(vu%D=&UFinyGzOk9@KP*imn7%k=b$bbn-Z_1Vi7&j z(j1t=(2-6qaz$3DO8ssllhy|Hoo&{M7tqX1rqy9Q-1D_%52tlk_R+B9Nm&*kD&%F; z5m2-QYMb#TfPf1UG?7Hj&`M*#TzqEw?jT>%96k)h)q_eKrTtXAwbEG$vP? zImK>)4~G3E4Kkb0D)8L?nS0yDGXhlSM7RBy@~a-8l?5mmt8V=Bg{X66Me}v@{q`rO z;#1h!Vp^fj_#BW*8AGc@c+%b+CSxlxkH54y+y5P91-a!MiWf$c(oNwi-Uzj|PSr(e zPM)?1Gbh93AIqvswC#j6au==Dmz4fPnHA47p6UFQ_20p!;K)=S_79mNb|8|wQ}u(7 zm-3Rn4f%AIXN~X1$8vV!G5^#efS?+a^G`gvL#^TGbQ+p~e&KbRhdj0Hk@j6cw*K1` zUW6iVLlTR4%{f!ArV@j9e2F9_&zF-*NnWMM%|waWA?Ur@EY{O>uxNAh6iju*-v^CM z2B~@kS%S9Y@?OVLoK@`QmF{BEgFj=O(EK3BcgR$?Dct~2n7!<>qB$K@I5j(Ri=!y1 zUt&K*jwZ4#jBNkj9M5#8e%VNI4iAW)m)bN+S#uf4H5s&(@IElpW)eOx<5*l0+*m@# zKc0yu^L67ey)y>ys97jzCx7%OyXG5x%kxX)<~4iR^}GQWBxPUrbO(ZlC0L99yq$Xx zw(4))3V}KqltunGEXcN8Q0XEY1dO*g zGy&B-k0de~=0kPFgU2)u#Id%i_548f8Vs=g2L&a zDMCdEA<6py)6-L2O9D0b706PFkA+l>Lu9vUsA+n|2XLR&;}w5KSUH53M0LUc-Lryg z)>mX&!%bUB#Z)*#I*2~=%^|Vlu91NXd#)nCi=mT?p>ls1R-!9)g{8N&$+pbb~?{CVL9 z4=U7?{9<#lKTawilxn9Js^4pm%sui1U`k>NWbgKDXJjA`*e(aIu>`>$uKEU-*2q^6 zspg6anbCGXj?~9?YGXu`!haN%b+Jg3Ou3zGn?{zPd7QHNB+SQLC31tkU7iPaK&?)? z5&IzfUyG01Xli&@skw#q?AKsE`DCz1u9BeEu?Kl;e+tj4MXp#vs1XC`L;yqxuG!SM znWkjvb|+nMp9?IVvHe`Jf9JAyze3NZ>GlzHfiNdnn20cO!VLnSw4g&AIOTqEDb0=i z;KeazxU33zyjsx7htTcC>QlYT$LJQY*2V)kO}iv9o_gycs`$O~F&-j(Xbh2q8U%bY zKd3K-e{jO`lo?@if>wWaldJo!oI}bLn(Ihy>VGx>5Xoz4Ru1}}DlNu>DD`x<e=sx}f4oz!`Dz~LS3A{2BGA8u z+1B3auF6Q~EkqdLz6ad4i>Fq%N^HBXB=WKpI>zMwzT~2bs6}hb=ls00^mcE(*|fhm zd_TM8MimS{$&~m5kb~2p%uDtEo{KzaNx43zu>ik(`v|?%p2$6i95#J(&{Nlj6v*%q zJRMZi9>>?geiX#tsZ(yvN&+-_9sv9t>s^A?R|IkWK%?tAhkV{QYgCKWeLetsqD28{ zm);fSA<9$fKDN>@Zp(+ievR@X;#_)0-xv<6^W7}GOG)uzAL`y1awHwVWf zqaCxI|Hm1WqMd2m-zd`y=OO9RyBv2J9w37%C|RS_7ny~4yXLDII9zH;=5Knm+WJ zCf}z}QjTM$k2nr=Jeg^X0M;uhDq@4PWusM6heY$>wG}q9^47jBnA?8KkcoI}P3A0n z@m};N)4d?biqzd827F1350pFr(Mba7c75-3)P>EReGU;hz$fev@h2ewM+<#=CocV) zaHRc&GY@+Pi4Rsaf`xyf9WzwBC5|o?2CF`zQKm1-lRfx)>1I_bWEw$* zG&7c=xu=B(<`Q$2zxc6A6rUKPjxVd4s-&%-2Sqz+m>=lepMA6f9BoNg`%chLe!B9; zdp;I_F@ZC4jRP1NXcbHF6bacBzI5pqOw}P@J|Vr)u5=MU=isfbQj4%oTA*%+)+A5Z zu6Xx()X&RN4SXSN$Kxg=3AIkR4o%~IB^9C__zvC?p5akTZg?$BuGpm|@6_$TAHmS4 z`bped59Zm<3x{W7LHsKZ2;vWI@wIn0YH_fpyMD7{epLW1 zmSAH_t$Q8v|I{AKH+jBpxG@F|#ltcA{r7F1+NH6(5(qthRyb;cem%BSK~WL^S3Y&B zC7cRm$y3$|HAFTF|Kx7=xo?r^$7zx}^C-W*o>CYMnN3{Dl5Mn>^%*`?Wee7}5l=7L z?%LgNC;r{~dzajqjJ4ivPY43i+WPVhIo@`ODMIE7hwIQ%_g*){Ec~Zv2U)J7KBB_* zDS%?}@c-v*-lDPLWkJ0O&%%~N`=abe1vb9`!U8Byh7Xl-HtwqS*;mAQ z3^K;mRndywtNY@~SWWchC@h$8AMB(}Yq#4eYpM$nDLu|4CdfP=xYZF!s~v6=v~KLy z5<P+?PT$4w?x;WAqH?^+T1qp6(ku7_B&3eu(cWG;gKkuWtDRDkN>(R~= zr0$T?GZot`hQ?!*q_(4{8Oj|UncaTG%fb2MjUXG^MkG-0X$TfIw;(PqnlaI&-G+-&?`CkO;1!^t<0cJPD@Odu&ca z1TquyKVgqSSwmYaBE4J3>B3!I^1&&o3{|T?XnpULKThBE^npEl<)x24e=XF8*XV5pvNvBNXkQIF|m4@9uMXpM81z%DP%@dPQPxhHH4u z8Uo1j3Po(W%u<7cenr!J7QY*$#mK%(SDHbRpQ;dYl&UMFqrn`-8)xOVPV+G8J&Ufb#P+nmip4E0ISVJ?kXna=(U`6N2@_s z#54TPF*8V8GKPQW%Gs^B8FOUcEV$nf;$hI~D`AD(x01?((4i|Y2a+{4S5NQz%MtP3 z6NtiRG|26pk2byeaAdtKy^$aRRB4}ajC}yGLUE=ji%(*mG3TQkV2G2yrH9MPqK08L zk-E&BOIPlK;*0B`w4;fn>qW(Y7T0f1=-QRW8M}8;EV4X~-28-^vr&aNyLs*Fps=OG zBVcoHal%{kytOTiF0}NgRSKlVGg^?n0gXKdu+yf7U(cIVt?q)f9ca7Ep{xD{^s>;o z+IQ`%KP=;sMsK&;7@*$k5Ix1JgAaND1P2RFKQGm<9{H!nUu?*=ft%X@Mu2xiJ!>CT zGVWrK7<}4mF)PrZ)15IoV|na;uW)c+-MEwUisW7{JW^0qG^nhV_DSB%x+>519U`=bas4Euju)T4%C^pB<8)w5^^0)=vO+ z{m$JnOWKfv_+5dMwTjz8R_b#7K|G(+m(gP*f zZ3Mh5k1siv;hp(S1e<(0V=eSq`x*hK?|~qpVQ2R8-Vd^+^cOZF|075wHvha^AgUU zU5NV1y(EPQeblVM0@a}A=VrrJmrxjKMl^uKY^>MT?&h8FR9UWLsXxTl9XU7xS^kT{ z={H$D0naaUUdA=Kw|!b9b$^=?gq3-vh}LlKFzuXD+}=j1#duE| z+e(6?ayq@K0GT};nj82yGNRdPO_!^5`J53QLFxulQfgoGigtYa@qRqH}2n%~9 zYK{7jQoLEDhW{h|PpU_}v*;1+PYsesidD7brcu9t$8}LEg|SRT%AXx){y$K6qyojW zQsz#p-%xT@$hS#*8ooD-;`?hqZ&y#5dna1G89b80zpsG*9gfvw{RB*Dj*9@<5W@L1 zJhwGu`7webN};wCShvRbgE8Ct>ypT$(+LpmGQj44wdNOSF!6R|f$h zl;bcFBWdG+rFg#NsFi`Mt!vP~c4?}p70T{Xea$&iP3kz9A7r_!tDh;*#7!)f0LToYk_{Qptik=HX2pr(g zJD?4JED$!~(=lZ|ZYq-6k8fFx-F8x&bN@9M?a@X8W>N588{B%7{cOiM9?jj##Xx+{ z()DIcEQ<$v6s>JaXq{Laav|MR<1!S6jZfWe(qCg~x?sZ@q2gHhC?s&OX>S>T0F+M{ zLKD~uBp?Q^3sqvD1h%(xIB)KA!OLS=<=i9*)vRQM1N8D1_CU7#vHkJ>X;9W=c*!wD z@?8#ExW^y(@mU*OQ5*MPykOFA4L-}WVwqAa$cKqOqoOu%&a2U$aA^HGs8~ts{tOuu zT26C;RVO3@H>q?E_HTn;ls5kzoL6O9xKNkX(J!pqC)KyldBk|bwRWt+0$n4AIfC~} zL(WCnHBJdsTWiOEFwd%X!-2^s-2=+~=?77O=SLYgWMGD`U34dy9GxYsDGyjI4*)z zFIT$u6+prBk38U{CFW_f@wC4eQgPI%33e!$x%l!10FVQ~gG$i$moS4EWH2^J?~jT* z7y|)sZN7ZOC1d&F{x$YB528aJwsnn=ql!PW`E4w{PFzuPN14*o{5OABiW|q-9HoIl~%NK0%F-+;7m(tJkI*g>pa*}yO zimlAoc=i$&f*eRK^l5vAt1Nf5p>P$>KF9(+OX_$?b=QS^uX+509b3ggByYG^dZ)9D zc3Eb}*ZTf+&W*#BGE=QN2nkSX3x*V2B%a%a51F1f=C;4wi;y*i%LVCFdL%HE4h&53 z^|Ft6vVgaTC~L+EYqZpiGH7a+$c%Y=cY6$(%dUB{nG!x!Htf!jAL^lF@a@AfF{35V zp++Yp*fIE)R2(1s3OO1Pe}B7A1a=|{u}qohBu*mC94jmg}W)Y!#!Jqj`%o zKYPx%$K}_P)+#14XYcg7W=F3xo2FKH$w{W%bF-TLlR?4X_2n`XP87~QkRx9ihfUo9 zZ&64-`y-#(j+%ig4(2p}en~LgQ+yA0)X}HMnm=^!v5jU-qERzNn(+!9dDknD=96;k zd_2@ezY@j~lA}W(aInKh_w%*)$#`-k8tZ7rc|ZlggT)ITQJd8Yke`8XD%5xMiF5lxY0P)7>(+*|kZOM$Q^p|3sfJ^K-WuLxW&mCTVP9bU^Dk|Fc*Y*#8v zy~NQ&)LMh;(j(q$Pg*5gh-&R3eV;s;L;tnZsO7N8tw-9)r*ciphlmxq}TB+IH_ z`Xy`>m!?J1alS)%TNiveDu8NIN2WN)IpEL#HTY#QVTYdWDK~TCpl^?8!Ta)w97PX$o3Q2qT4a!?w&wn4f z4ndOTX*NZ8rQ1+_PD*zG8HN{%gOWcu3w5_K{V&}0UsDj)yOFROCQy!8iyoH60U<9* z6Xa1Hcd>wOUK?QW-^Vq65nDIP+6o`xN@wR9{ypkFauL73tuVD6LMxe$HN}Q$N;mEi zS#*DA?s>Q3EQ*G_Ta?yK@4u(sD<_}e+(C0OVNHe36D00p;-3s91^Zu^FL|kQ|6OQN-2OMe1|#D^epbFkRk=_7 zA5|Hnkgt_6#Q(RYl=E$K>w*6sznf=z#C)P}0daZX_>+s12+t!uq)qsZ-g_tX6NAR| z3ot>j73eCbw-xElVL1&8tBjE36RrMT8ADNZuC@sSUzyLPBNjs#;%uqCikFoO-=s?roafIg-?l7s+$k_^ou3(9 zy`!7{C4uA6!GfByKay+!2ivV32_>+_dsMr$20F7;?2*C0r2DM4f^ks@3ZF9oJwU?0 z&*VMvo?)E7Y$kmn^Uc_+W#rwR?8YU9-1-#NTqpFQ>_cgL6=`Kx8(B;SFLk%1;ZgYB zkjVo|qd9WU&J_p|yn$ERTJBqXqw0%fbZ>!$N@vdh8$oEx>`~BRi-+ylcKs4OpHBFV zx6=X@*+dr6Ym1n#Tw(qfF@%r|lT~Z_Gy~c9I>Ylzo!^Y|5$EKKG*=WpkBUae`HwXm zu0WY{fBXKet9<#VqpGQzm49^kj@Qp&vpFJHRA2`3Cl9Ku-0=awZ6l#$pyA4fM7vSM z&-Ic5G28}AXEdA9KGxKKIU-XVNNSj=ge#+2KG&TZ(_9S z)%UE+-`DHtb(AH0K_Je@`H^B%LtK)Jf_k0fauxCO%IT{6)}ch;{rVT&P^Q}7j^+w} za#ziOg6wzA=TI0Aeqjq|t5PLsZo&`G&Cb3*A(hQqa@-z7`tz_DZy8lR6h=kE>dS^MBnp#+`-rMblXyhiNcan zSyWPV3(*Gvn|=8QioIdM8`U^&dA_LDF)xNP$Ub%cR?6b|EmlEnR0TDX9dq4bFY~Wc z#3jJA&z)!LGR&o65&5yg;1NX~V!luaUP&q;0KvC-fMg@)*0SY#J3dl7_bX}}v-@N9%bDY>Z z56jQ})mX|^`z0+@M_A6qrF}Z!Hxt$6vHn0T;(X0H+;u|NtBRK29EgEk2QbMlj^>cx z?rN*Tv7ITAdu)I;q@DI@iX>4zuwKSgHeA3!sm{?T_!@5d^#Q@Q-#AK=U$jT7K51HE z*?PY6!?s=K)8}jdS%Uwi3&UwNtLT^EU(r#Yy~o$KW%U&`4y;Xv+GuHsE!;cWKTmh= z7iuRXX{Bf$e|d)&|0(I(j3nJlBZ)75oA&kq=3HHe|3rdBy86O#CuQ9}zrN4Db}A4N z4~g)@Sj3EZn~7^asJb zzzH-T5)}#~hWWEH?g#N}AKDudyLoTv@%W$_lZh}huww!)ZxyLP8i|SlcEPK>-s z@nt#oxk5)7PFgRxyqt+cgb=ORiE?kEzbjAW{GY>?$U}K^5V%H>C~|Hl==&kGKN3T@ z=uLrm)n6OHXB%V7N&63Ev&5s3F%83=&%N1c$&LBG9XzUIm16#*g?woiZSa8z004ikZE}Ak zvd4D$CN_j|UIk>2;T6D2W}TOw{Dq?*lTi5$jGXFf7WdPc1WfM8$ZO~r^pj@JbSu~l zUN2aLUOJx$AmYeGvln&ctFUxUPVM70-=VTYhog`2Nz}+6oiBD_dhR6m_qgFlf(vN+ z6&QM`Z5cay=GZ3HV|horfMo~kuD*m;*SW>V{HM?md>9B&2{kq(6@3xdkJarin_)WN z%((W(!zvf(Z{!bkyVWzl_q30rO9Yh`OuKOKlk`LY1xCB39w=LBn4IEs^e77xG0HXE zg-s~6bgRv+ev1KEwe$uWl!VgQpsIf!S<+4TA@TYqwl5z)rEQ6JwO^OYN1gMBT+plg zBWw8SlD)5V-F1gPJ%&_iX=NW#nhC~jE&ctw=DuTMS6kUtOui?`hN6W*UbAEf-hzqC zbgz_meCs+=CHB9R;measjb{yWnd~kGPG=@?JZyv z2-37jT9&^vZ%DFotfAjVgw6l@$x7^(9NVj}{@3tbvrp!y3dS@B?Yyvy6e(13FR3;P z%Su|0Q(J2qmhfq@=X&o^KNI} zt~J@OJWD@A??!Uw4t59g%@gXiy)LBH7d#xH%32d#Zp*%KeZlD(A0I_5#`}_s+bro% zi~#pJ?MYS8{6X2*&4e+EC}0W|hOuI@9gwe*;`Bu8NJLJ~V&IXxbgkXxSD=>RNto3b z4lSwqp5U#ep30jedke?VYR^-w6&@?2SGfKiM;5ep+FEaG^4WcR0J6u@!w|INK;O3nXjJQ4C^m!%futXO(2e|NZ7~n@}vIr9LV|DlKG5hvPO6dlv!K>)>SsFBHes76tm-?eNx!XBKj!%dmNp@VGydotHyyY zXgMGkJlp3LB7-sa?dL6v4c$Gz{#-M>T}V4s3ip(KJV50KI!=fEY)Z9XH=8Xlx@s;! zv*lbeBBQ7;wm%#A92OKbnGpdqciTD9ln%BCPh4xaFqq!1geJ_Fe$4*wT~4P&vK_`9 zCG<8Qs{3Txb~-RcKRO+;lF*W>tFP|<4 z7aUXuB2WmnAwEIw`(G0u0arNM*G8Ey;PWF;bcvukC~gyR`h)}f4oP($x7G^rQ-pRM zGgb{o+`^)$RViCSXlew3)Su0b!zf5aK6dN~|9;A=9C$Bo$-|cJzXMIvtc1wHD^k)b z&w&F^)1yp}jJ_pCLt^$~LMt{FGaEgsVo2f_OEIs@Qk4HJ7Q|~jdo>yeF zLD^ivyE1owg2r}PnNpZwjj)t9one)hP>69e1$5t`SAS`bt6A-di79Hj|Lg(&H`2$8 ze^urss*1Sc=wG7O*>3k>t1u%;VSN~y!V7ckl9m!?0M+d;hu9WK=-H{?+~rBvzNChV zOfZo*B>IEf4`3!{yeHt>P&Zb8Z&{iMfxX1d>FZ~eyu@#@-6hg|8_}D@oPw#YJg^=i z=K7qxEHS>KBBK;>0eahgRu7?YGx~tFLo?HqaYF~GM~gfW&b{{buS0BV#Z{-FNpDO| zB-yC|xUgDO;Jc3cS^cp#TI|mG^+T^ES&b{`S{*xC0`CT`X5gZ@#0GydFp86H^v%D^ zzcJiGh$Uf0*yge!AX&7nn@T2BaC;5VVpZ97=1tK^l~T4~MQc;9v-(Eepgm4<5LC8< z^nHB#lgaXU!ij-{bw~UV?S3@nsUNc|1!wkTRgWHfaMa3V5l9u{Cgp}L z-qw*?HJQ(o)TPK;l|=&Q7?O+`he;t}wd5ξf?-@HO(m3NY|HQ8s{bYWwH^34(kk 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

e8V`5zbBk*sxsOL;wskOl_ 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 xps{3&Pd-QI4FCWD literal 234814 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 z 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

P6j@ZVR;o5Q#`F%_PQw=4 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

(T4ltLcT#4dIHR_IY>!tUc@$< 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�FVKPRoXKyCU!GHk4bS<5>?w+5UTi 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

Cw;Kb0>Uz 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 diff --git a/index.html b/index.html index 59010ef..3389fcd 100644 --- a/index.html +++ b/index.html @@ -14,7 +14,7 @@ - + diff --git a/search/index.html b/search/index.html index e5ea5dc..db2b1ce 100644 --- a/search/index.html +++ b/search/index.html @@ -14,7 +14,7 @@ - + diff --git a/talks/index.html b/talks/index.html index a1efb55..41d9581 100644 --- a/talks/index.html +++ b/talks/index.html @@ -14,7 +14,7 @@ - +

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�CyC&>N4qcco2@_898lHkt|J9RetQ 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 yBY~!#@gDHPq)x+8tQ7Z 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�uP+MC2$&L=z;%2wcvRXnOtrK- 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 literal 230122 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

BIY8sFwE8f$`rEcuO@Zle5lR^;#Ut{YH6kRiu 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