From fb7ae47e41fa0f9ffb8f87405f4461ed8e485638 Mon Sep 17 00:00:00 2001 From: xuetongchenbianchen <1561804820@qq.com> Date: Fri, 1 Aug 2025 16:14:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=AD=90=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- eval_result.json | 9 +++ exercises/00_hello_world/main.cpp | 2 +- exercises/01_variable&add/main.cpp | 1 + exercises/02_function/main.cpp | 3 +- exercises/03_argument¶meter/main.cpp | 8 +- exercises/04_static/main.cpp | 10 +-- exercises/05_constexpr/main.cpp | 4 +- exercises/06_array/main.cpp | 4 +- exercises/07_loop/main.cpp | 12 ++- exercises/08_pointer/main.cpp | 5 ++ exercises/09_enum&union/main.cpp | 2 +- exercises/10_trivial/main.cpp | 11 ++- exercises/11_method/main.cpp | 11 ++- exercises/12_method_const/main.cpp | 4 +- exercises/13_class/main.cpp | 11 ++- exercises/14_class_destruct/main.cpp | 18 ++++- exercises/15_class_clone/main.cpp | 26 ++++-- exercises/16_class_move/main.cpp | 57 ++++++++++---- exercises/17_class_derive/main.cpp | 6 +- exercises/18_class_virtual/main.cpp | 40 +++++----- exercises/19_class_virtual_destruct/main.cpp | 26 +++--- exercises/20_function_template/main.cpp | 9 ++- exercises/21_runtime_datatype/main.cpp | 11 ++- exercises/22_class_template/main.cpp | 26 ++++++ exercises/23_template_const/main.cpp | 9 ++- exercises/24_std_array/main.cpp | 16 ++-- exercises/25_std_vector/main.cpp | 74 +++++++++--------- exercises/26_std_vector_bool/main.cpp | 18 ++--- exercises/27_strides/main.cpp | 8 ++ exercises/28_std_string/main.cpp | 6 +- exercises/29_std_map/main.cpp | 2 + exercises/30_std_unique_ptr/main.cpp | 7 +- exercises/31_std_shared_ptr/main.cpp | 18 ++--- exercises/32_std_transform/main.cpp | 4 + exercises/33_std_accumulate/main.cpp | 4 + .../build/linux/x86_64/release/exercise17 | Bin 0 -> 18656 bytes .../build/linux/x86_64/release/exercise18 | Bin 0 -> 14472 bytes .../build/linux/x86_64/release/exercise19 | Bin 0 -> 14552 bytes .../build/linux/x86_64/release/exercise20 | Bin 0 -> 14472 bytes .../build/linux/x86_64/release/exercise21 | Bin 0 -> 14472 bytes .../build/linux/x86_64/release/exercise22 | Bin 0 -> 18736 bytes .../build/linux/x86_64/release/exercise23 | Bin 0 -> 18656 bytes .../build/linux/x86_64/release/exercise24 | Bin 0 -> 14472 bytes exercises/build/linux/x86_64/release/learn | Bin 0 -> 26928 bytes .../build/linux/x86_64/release/libtest.a | Bin 0 -> 28834 bytes exercises/eval_result.json | 9 +++ xmake.lua | 1 + 47 files changed, 325 insertions(+), 167 deletions(-) create mode 100644 eval_result.json create mode 100644 exercises/build/linux/x86_64/release/build/linux/x86_64/release/exercise17 create mode 100644 exercises/build/linux/x86_64/release/build/linux/x86_64/release/exercise18 create mode 100644 exercises/build/linux/x86_64/release/build/linux/x86_64/release/exercise19 create mode 100644 exercises/build/linux/x86_64/release/build/linux/x86_64/release/exercise20 create mode 100644 exercises/build/linux/x86_64/release/build/linux/x86_64/release/exercise21 create mode 100644 exercises/build/linux/x86_64/release/build/linux/x86_64/release/exercise22 create mode 100644 exercises/build/linux/x86_64/release/build/linux/x86_64/release/exercise23 create mode 100644 exercises/build/linux/x86_64/release/build/linux/x86_64/release/exercise24 create mode 100644 exercises/build/linux/x86_64/release/learn create mode 100644 exercises/build/linux/x86_64/release/libtest.a create mode 100644 exercises/eval_result.json diff --git a/eval_result.json b/eval_result.json new file mode 100644 index 000000000..2ffd340e3 --- /dev/null +++ b/eval_result.json @@ -0,0 +1,9 @@ +{ + "exercises": [], + "statistics": { + "total_exercations": 0, + "total_succeeds": 0, + "total_failures": 0, + "total_time": 0 + } +} \ No newline at end of file diff --git a/exercises/00_hello_world/main.cpp b/exercises/00_hello_world/main.cpp index 8866f3c15..fa454e132 100644 --- a/exercises/00_hello_world/main.cpp +++ b/exercises/00_hello_world/main.cpp @@ -6,6 +6,6 @@ int main(int argc, char **argv) { // TODO: 在控制台输出 "Hello, InfiniTensor!" 并换行 - std::cout : "Hello, InfiniTensor!" + std::endl; + std::cout << "Hello, InfiniTensor!" << std::endl; return 0; } diff --git a/exercises/01_variable&add/main.cpp b/exercises/01_variable&add/main.cpp index 5014863fd..1d164956e 100644 --- a/exercises/01_variable&add/main.cpp +++ b/exercises/01_variable&add/main.cpp @@ -5,6 +5,7 @@ int main(int argc, char **argv) { // TODO: 补全变量定义并打印加法运算 // x ? + int x = 42; // 定义变量 x 并赋值为 42 std::cout << x << " + " << x << " = " << x + x << std::endl; return 0; } diff --git a/exercises/02_function/main.cpp b/exercises/02_function/main.cpp index b5eef7f28..3d9a19820 100644 --- a/exercises/02_function/main.cpp +++ b/exercises/02_function/main.cpp @@ -5,6 +5,7 @@ // NOTICE: 补充由内而外读法的机翻解释 // TODO: 在这里声明函数 +int add(int a, int b); int main(int argc, char **argv) { ASSERT(add(123, 456) == 123 + 456, "add(123, 456) should be 123 + 456"); @@ -15,5 +16,5 @@ int main(int argc, char **argv) { } int add(int a, int b) { - // TODO: 补全函数定义,但不要移动代码行 + return a + b; } diff --git a/exercises/03_argument¶meter/main.cpp b/exercises/03_argument¶meter/main.cpp index 7fb5d3c2f..76136eae6 100644 --- a/exercises/03_argument¶meter/main.cpp +++ b/exercises/03_argument¶meter/main.cpp @@ -8,19 +8,19 @@ void func(int); // TODO: 为下列 ASSERT 填写正确的值 int main(int argc, char **argv) { auto arg = 99; - ASSERT(arg == ?, "arg should be ?"); + ASSERT(arg == 99, "arg should be ?"); std::cout << "befor func call: " << arg << std::endl; func(arg); - ASSERT(arg == ?, "arg should be ?"); + ASSERT(arg == 99, "arg should be ?"); std::cout << "after func call: " << arg << std::endl; return 0; } // TODO: 为下列 ASSERT 填写正确的值 void func(int param) { - ASSERT(param == ?, "param should be ?"); + ASSERT(param == 99, "param should be ?"); std::cout << "befor add: " << param << std::endl; param += 1; - ASSERT(param == ?, "param should be ?"); + ASSERT(param == 100, "param should be ?"); std::cout << "after add: " << param << std::endl; } diff --git a/exercises/04_static/main.cpp b/exercises/04_static/main.cpp index f107762fa..64f417694 100644 --- a/exercises/04_static/main.cpp +++ b/exercises/04_static/main.cpp @@ -10,10 +10,10 @@ static int func(int param) { int main(int argc, char **argv) { // TODO: 将下列 `?` 替换为正确的数字 - ASSERT(func(5) == ?, "static variable value incorrect"); - ASSERT(func(4) == ?, "static variable value incorrect"); - ASSERT(func(3) == ?, "static variable value incorrect"); - ASSERT(func(2) == ?, "static variable value incorrect"); - ASSERT(func(1) == ?, "static variable value incorrect"); + ASSERT(func(5) == 5, "static variable value incorrect"); + ASSERT(func(4) == 6, "static variable value incorrect"); + ASSERT(func(3) == 7, "static variable value incorrect"); + ASSERT(func(2) == 8, "static variable value incorrect"); + ASSERT(func(1) == 9, "static variable value incorrect"); return 0; } diff --git a/exercises/05_constexpr/main.cpp b/exercises/05_constexpr/main.cpp index d1db6c9d8..c226ccbee 100644 --- a/exercises/05_constexpr/main.cpp +++ b/exercises/05_constexpr/main.cpp @@ -18,8 +18,8 @@ int main(int argc, char **argv) { // TODO: 观察错误信息,修改一处,使代码编译运行 // PS: 编译运行,但是不一定能算出结果…… - constexpr auto ANS_N = 90; - constexpr auto ANS = fibonacci(ANS_N); + constexpr auto ANS_N = 30; + auto ANS = fibonacci(ANS_N); std::cout << "fibonacci(" << ANS_N << ") = " << ANS << std::endl; return 0; diff --git a/exercises/06_array/main.cpp b/exercises/06_array/main.cpp index 61ed99ec0..bbce324cf 100644 --- a/exercises/06_array/main.cpp +++ b/exercises/06_array/main.cpp @@ -11,13 +11,13 @@ unsigned long long fibonacci(int i) { return 1; default: // TODO: 补全三目表达式缺失的部分 - return ? : (arr[i] = fibonacci(i - 1) + fibonacci(i - 2)); + return arr[i] ? arr[i] : (arr[i] = fibonacci(i - 1) + fibonacci(i - 2)); } } int main(int argc, char **argv) { // TODO: 为此 ASSERT 填写正确的值 - ASSERT(sizeof(arr) == ?, "sizeof array is size of all its elements"); + ASSERT(sizeof(arr) == 720, "sizeof array is size of all its elements"); // ---- 不要修改以下代码 ---- ASSERT(fibonacci(2) == 1, "fibonacci(2) should be 1"); ASSERT(fibonacci(20) == 6765, "fibonacci(20) should be 6765"); diff --git a/exercises/07_loop/main.cpp b/exercises/07_loop/main.cpp index 44fd835cd..9f869051e 100644 --- a/exercises/07_loop/main.cpp +++ b/exercises/07_loop/main.cpp @@ -5,10 +5,16 @@ // READ: 纯函数 static unsigned long long fibonacci(int i) { // TODO: 为缓存设置正确的初始值 - static unsigned long long cache[96], cached; + static unsigned long long cache[96], cached{0}; + cache[0] = 0; + cache[1] = 1; // TODO: 设置正确的循环条件 - for (; false; ++cached) { - cache[cached] = cache[cached - 1] + cache[cached - 2]; + if(!cached) + { + cached = 2; + for (; cached <=96; ++cached) { + cache[cached] = cache[cached - 1] + cache[cached - 2]; + } } return cache[i]; } diff --git a/exercises/08_pointer/main.cpp b/exercises/08_pointer/main.cpp index ba37173f5..ec659cae8 100644 --- a/exercises/08_pointer/main.cpp +++ b/exercises/08_pointer/main.cpp @@ -5,6 +5,11 @@ bool is_fibonacci(int *ptr, int len, int stride) { ASSERT(len >= 3, "`len` should be at least 3"); // TODO: 编写代码判断从 ptr 开始,每 stride 个元素取 1 个元素,组成长度为 n 的数列是否满足 // arr[i + 2] = arr[i] + arr[i + 1] + for(int i = 0; i < len - 2; i ++) { + if (ptr[(i + 2)*stride] != ptr[i*stride] + ptr[(i + 1)*stride]) { + return false; + } + } return true; } diff --git a/exercises/09_enum&union/main.cpp b/exercises/09_enum&union/main.cpp index 3f2cec768..bce36c2ec 100644 --- a/exercises/09_enum&union/main.cpp +++ b/exercises/09_enum&union/main.cpp @@ -34,9 +34,9 @@ ColorEnum convert_by_pun(Color c) { ColorEnum e; Color c; }; - TypePun pun; // TODO: 补全类型双关转换 + pun.c = c; // 将 Color 存入 union return pun.e; } diff --git a/exercises/10_trivial/main.cpp b/exercises/10_trivial/main.cpp index 6ba23e48e..2579ba64f 100644 --- a/exercises/10_trivial/main.cpp +++ b/exercises/10_trivial/main.cpp @@ -9,8 +9,15 @@ struct FibonacciCache { // TODO: 实现正确的缓存优化斐波那契计算 static unsigned long long fibonacci(FibonacciCache &cache, int i) { - for (; false; ++cached) { - cache[cached] = cache[cached - 1] + cache[cached - 2]; + cache.cached = {0}; // 初始化缓存结构体 + cache.cache[0] = 0; + cache.cache[1] = 1; + if(!cache.cached) + { + cache.cached = 2; + for (; cache.cached<16; ++cache.cached) { + cache.cache[cache.cached] = cache.cache[cache.cached - 1] + cache.cache[cache.cached - 2]; + } } return cache.cache[i]; } diff --git a/exercises/11_method/main.cpp b/exercises/11_method/main.cpp index 0e08e0a36..65e2b591c 100644 --- a/exercises/11_method/main.cpp +++ b/exercises/11_method/main.cpp @@ -1,13 +1,18 @@ #include "../exercise.h" struct Fibonacci { - unsigned long long cache[128]; + unsigned long long cache[128]={0, 1}; // 初始化前两个斐波那契数 int cached; // TODO: 实现正确的缓存优化斐波那契计算 unsigned long long get(int i) { - for (; false; ++cached) { - cache[cached] = cache[cached - 1] + cache[cached - 2]; + cached = 0; // 初始化缓存 + if(!cached) + { + cached = 2; // 已经计算了前两个数 + for (; cached<128; ++cached) { + cache[cached] = cache[cached - 1] + cache[cached - 2]; + } } return cache[i]; } diff --git a/exercises/12_method_const/main.cpp b/exercises/12_method_const/main.cpp index 5521be4da..8c8ee899a 100644 --- a/exercises/12_method_const/main.cpp +++ b/exercises/12_method_const/main.cpp @@ -5,7 +5,9 @@ struct Fibonacci { int numbers[11]; // TODO: 修改方法签名和实现,使测试通过 - int get(int i) { + constexpr int get(int i) const { + // 使用 constexpr 数组访问 Fibonacci 数列 + return (i >= 0 && i < 11) ? numbers[i] : -1; // 返回 -1 表示索引越界 } }; diff --git a/exercises/13_class/main.cpp b/exercises/13_class/main.cpp index 9afa98c5b..21caf79e7 100644 --- a/exercises/13_class/main.cpp +++ b/exercises/13_class/main.cpp @@ -15,13 +15,16 @@ class Fibonacci { public: // TODO: 实现构造器 // Fibonacci() - + Fibonacci():cache{0,1}{} // TODO: 实现正确的缓存优化斐波那契计算 size_t get(int i) { - for (; false; ++cached) { - cache[cached] = cache[cached - 1] + cache[cached - 2]; + if(!cached){ + cached = 2; + for (; cached<16; ++cached) { + cache[cached] = cache[cached - 1] + cache[cached - 2]; + } } - return cache[i]; + return cache[i]; } }; diff --git a/exercises/14_class_destruct/main.cpp b/exercises/14_class_destruct/main.cpp index 42150e8ca..47c86f7a0 100644 --- a/exercises/14_class_destruct/main.cpp +++ b/exercises/14_class_destruct/main.cpp @@ -11,15 +11,25 @@ class DynFibonacci { public: // TODO: 实现动态设置容量的构造器 - DynFibonacci(int capacity): cache(new ?), cached(?) {} + DynFibonacci(int capacity): cache(new size_t[capacity]), cached(0) { + cache[0] = 0; + cache[1] = 1; + } // TODO: 实现析构器,释放缓存空间 - ~DynFibonacci(); + ~DynFibonacci(){ + delete[] cache; + cached = 0; + } // TODO: 实现正确的缓存优化斐波那契计算 size_t get(int i) { - for (; false; ++cached) { - cache[cached] = cache[cached - 1] + cache[cached - 2]; + if(!cached) + { + cached = 2; + for (; cached < i+1; ++cached) { + cache[cached] = cache[cached - 1] + cache[cached - 2]; + } } return cache[i]; } diff --git a/exercises/15_class_clone/main.cpp b/exercises/15_class_clone/main.cpp index f74b70391..4019492d7 100644 --- a/exercises/15_class_clone/main.cpp +++ b/exercises/15_class_clone/main.cpp @@ -10,18 +10,34 @@ class DynFibonacci { public: // TODO: 实现动态设置容量的构造器 - DynFibonacci(int capacity): cache(new ?), cached(?) {} + DynFibonacci(int capacity): cache(new size_t[capacity]), cached(0) { + cache[0] = 0; + cache[1] = 1; + } // TODO: 实现复制构造器 - DynFibonacci(DynFibonacci const &) = delete; + DynFibonacci(const DynFibonacci& other){ + cached = other.cached; + cache = new size_t[cached]; + for(int i = 0;i 0) cache[0] = 0; + if (capacity > 1) cache[1] = 1; + } - // TODO: 实现移动赋值 - // NOTICE: ⚠ 注意移动到自身问题 ⚠ - DynFibonacci &operator=(DynFibonacci &&) noexcept = delete; + DynFibonacci(DynFibonacci &&other) noexcept + : cache(other.cache), cached(other.cached), capacity(other.capacity) { + other.cache = nullptr; + other.cached = 0; + other.capacity = 0; + } - // TODO: 实现析构器,释放缓存空间 - ~DynFibonacci(); + DynFibonacci &operator=(DynFibonacci &&other) noexcept { + if (this != &other) { + delete[] cache; + cache = other.cache; + cached = other.cached; + capacity = other.capacity; + other.cache = nullptr; + other.cached = 0; + other.capacity = 0; + } + return *this; + } + ~DynFibonacci() { + delete[] cache; + cache = nullptr; + cached = 0; + capacity = 0; + } - // TODO: 实现正确的缓存优化斐波那契计算 size_t operator[](int i) { - for (; false; ++cached) { - cache[cached] = cache[cached - 1] + cache[cached - 2]; + ASSERT(i < capacity, "i out of range"); + if (i >= cached) { + for (; cached <= i; ++cached) { + if (cached < 2) continue; + cache[cached] = cache[cached - 1] + cache[cached - 2]; + } } return cache[i]; } - // NOTICE: 不要修改这个方法 + // 不要修改这个方法 size_t operator[](int i) const { + ASSERT(i < capacity, "i out of range"); ASSERT(i <= cached, "i out of range"); return cache[i]; } - // NOTICE: 不要修改这个方法 + // 不要修改这个方法 bool is_alive() const { return cache; } @@ -63,4 +86,4 @@ int main(int argc, char **argv) { ASSERT(fib0[10] == 55, "fibonacci(10) should be 55"); return 0; -} +} \ No newline at end of file diff --git a/exercises/17_class_derive/main.cpp b/exercises/17_class_derive/main.cpp index 819ae72fc..0c245df4f 100644 --- a/exercises/17_class_derive/main.cpp +++ b/exercises/17_class_derive/main.cpp @@ -50,9 +50,9 @@ int main(int argc, char **argv) { B b = B(3); // TODO: 补全三个类型的大小 - static_assert(sizeof(X) == ?, "There is an int in X"); - static_assert(sizeof(A) == ?, "There is an int in A"); - static_assert(sizeof(B) == ?, "B is an A with an X"); + static_assert(sizeof(X) == 4, "There is an int in X"); + static_assert(sizeof(A) == 4, "There is an int in A"); + static_assert(sizeof(B) == 8, "B is an A with an X"); i = 0; std::cout << std::endl diff --git a/exercises/18_class_virtual/main.cpp b/exercises/18_class_virtual/main.cpp index ac6382413..344709e4c 100644 --- a/exercises/18_class_virtual/main.cpp +++ b/exercises/18_class_virtual/main.cpp @@ -42,38 +42,38 @@ int main(int argc, char **argv) { C c; D d; - ASSERT(a.virtual_name() == '?', MSG); - ASSERT(b.virtual_name() == '?', MSG); - ASSERT(c.virtual_name() == '?', MSG); - ASSERT(d.virtual_name() == '?', MSG); - ASSERT(a.direct_name() == '?', MSG); - ASSERT(b.direct_name() == '?', MSG); - ASSERT(c.direct_name() == '?', MSG); - ASSERT(d.direct_name() == '?', MSG); + ASSERT(a.virtual_name() == 'A', MSG); + ASSERT(b.virtual_name() == 'B', MSG); + ASSERT(c.virtual_name() == 'C', MSG); + ASSERT(d.virtual_name() == 'C', MSG); + ASSERT(a.direct_name() == 'A', MSG); + ASSERT(b.direct_name() == 'B', MSG); + ASSERT(c.direct_name() == 'C', MSG); + ASSERT(d.direct_name() == 'D', MSG); A &rab = b; B &rbc = c; C &rcd = d; - ASSERT(rab.virtual_name() == '?', MSG); - ASSERT(rbc.virtual_name() == '?', MSG); - ASSERT(rcd.virtual_name() == '?', MSG); - ASSERT(rab.direct_name() == '?', MSG); - ASSERT(rbc.direct_name() == '?', MSG); - ASSERT(rcd.direct_name() == '?', MSG); + ASSERT(rab.virtual_name() == 'B', MSG); + ASSERT(rbc.virtual_name() == 'C', MSG); + ASSERT(rcd.virtual_name() == 'C', MSG); + ASSERT(rab.direct_name() == 'A', MSG); + ASSERT(rbc.direct_name() == 'B', MSG); + ASSERT(rcd.direct_name() == 'C', MSG); A &rac = c; B &rbd = d; - ASSERT(rac.virtual_name() == '?', MSG); - ASSERT(rbd.virtual_name() == '?', MSG); - ASSERT(rac.direct_name() == '?', MSG); - ASSERT(rbd.direct_name() == '?', MSG); + ASSERT(rac.virtual_name() == 'C', MSG); + ASSERT(rbd.virtual_name() == 'C', MSG); + ASSERT(rac.direct_name() == 'A', MSG); + ASSERT(rbd.direct_name() == 'B', MSG); A &rad = d; - ASSERT(rad.virtual_name() == '?', MSG); - ASSERT(rad.direct_name() == '?', MSG); + ASSERT(rad.virtual_name() == 'C', MSG); + ASSERT(rad.direct_name() == 'A', MSG); return 0; } diff --git a/exercises/19_class_virtual_destruct/main.cpp b/exercises/19_class_virtual_destruct/main.cpp index cdd54f74f..8565f0ead 100644 --- a/exercises/19_class_virtual_destruct/main.cpp +++ b/exercises/19_class_virtual_destruct/main.cpp @@ -5,12 +5,12 @@ struct A { // TODO: 正确初始化静态字段 - static int num_a = 0; + static int num_a; A() { ++num_a; } - ~A() { + virtual ~A() { --num_a; } @@ -18,9 +18,10 @@ struct A { return 'A'; } }; +int A::num_a = 0; struct B final : public A { // TODO: 正确初始化静态字段 - static int num_b = 0; + static int num_b; B() { ++num_b; @@ -33,14 +34,15 @@ struct B final : public A { return 'B'; } }; +int B::num_b = 0; int main(int argc, char **argv) { auto a = new A; auto b = new B; - ASSERT(A::num_a == ?, "Fill in the correct value for A::num_a"); - ASSERT(B::num_b == ?, "Fill in the correct value for B::num_b"); - ASSERT(a->name() == '?', "Fill in the correct value for a->name()"); - ASSERT(b->name() == '?', "Fill in the correct value for b->name()"); + ASSERT(A::num_a == 2, "Fill in the correct value for A::num_a"); + ASSERT(B::num_b == 1, "Fill in the correct value for B::num_b"); + ASSERT(a->name() == 'A', "Fill in the correct value for a->name()"); + ASSERT(b->name() == 'B', "Fill in the correct value for b->name()"); delete a; delete b; @@ -48,13 +50,13 @@ int main(int argc, char **argv) { ASSERT(B::num_b == 0, "Every B was destroyed"); A *ab = new B;// 派生类指针可以随意转换为基类指针 - ASSERT(A::num_a == ?, "Fill in the correct value for A::num_a"); - ASSERT(B::num_b == ?, "Fill in the correct value for B::num_b"); - ASSERT(ab->name() == '?', "Fill in the correct value for ab->name()"); + ASSERT(A::num_a == 1, "Fill in the correct value for A::num_a"); + ASSERT(B::num_b == 1, "Fill in the correct value for B::num_b"); + ASSERT(ab->name() == 'B', "Fill in the correct value for ab->name()"); // TODO: 基类指针无法随意转换为派生类指针,补全正确的转换语句 - B &bb = *ab; - ASSERT(bb.name() == '?', "Fill in the correct value for bb->name()"); + B &bb = dynamic_cast(*ab); + ASSERT(bb.name() == 'B', "Fill in the correct value for bb->name()"); // TODO: ---- 以下代码不要修改,通过改正类定义解决编译问题 ---- delete ab;// 通过指针可以删除指向的对象,即使是多态对象 diff --git a/exercises/20_function_template/main.cpp b/exercises/20_function_template/main.cpp index cb6d978d3..c09d25040 100644 --- a/exercises/20_function_template/main.cpp +++ b/exercises/20_function_template/main.cpp @@ -1,11 +1,12 @@ #include "../exercise.h" // READ: 函数模板 -// TODO: 将这个函数模板化 -int plus(int a, int b) { +// TODO: 将这个函数模板化z +template +T plus(T a, T b) { return a + b; } - +constexpr double EPSILON = 1e-10; int main(int argc, char **argv) { ASSERT(plus(1, 2) == 3, "Plus two int"); ASSERT(plus(1u, 2u) == 3u, "Plus two unsigned int"); @@ -14,7 +15,7 @@ int main(int argc, char **argv) { ASSERT(plus(1.25f, 2.5f) == 3.75f, "Plus two float"); ASSERT(plus(1.25, 2.5) == 3.75, "Plus two double"); // TODO: 修改判断条件使测试通过 - ASSERT(plus(0.1, 0.2) == 0.3, "How to make this pass?"); + ASSERT(std::abs(plus(0.1, 0.2) - 0.3)<=EPSILON, "How to make this pass?"); return 0; } diff --git a/exercises/21_runtime_datatype/main.cpp b/exercises/21_runtime_datatype/main.cpp index 9c4bf376a..df281d86e 100644 --- a/exercises/21_runtime_datatype/main.cpp +++ b/exercises/21_runtime_datatype/main.cpp @@ -18,12 +18,21 @@ struct TaggedUnion { }; // TODO: 将这个函数模板化用于 sigmoid_dyn -float sigmoid(float x) { +template +T sigmoid(T x) { return 1 / (1 + std::exp(-x)); } TaggedUnion sigmoid_dyn(TaggedUnion x) { TaggedUnion ans{x.type}; + switch(x.type){ + case DataType::Float: + ans.f = sigmoid(x.f); + break; + case DataType::Double: + ans.d = sigmoid(x.d); + break; + } // TODO: 根据 type 调用 sigmoid return ans; } diff --git a/exercises/22_class_template/main.cpp b/exercises/22_class_template/main.cpp index d4985d904..60e15b99b 100644 --- a/exercises/22_class_template/main.cpp +++ b/exercises/22_class_template/main.cpp @@ -10,6 +10,10 @@ struct Tensor4D { Tensor4D(unsigned int const shape_[4], T const *data_) { unsigned int size = 1; // TODO: 填入正确的 shape 并计算 size + for(int i =0; i < 4; ++i) { + shape[i] = shape_[i]; + size *= shape[i]; + } data = new T[size]; std::memcpy(data, data_, size * sizeof(T)); } @@ -28,6 +32,28 @@ struct Tensor4D { // 则 `this` 与 `others` 相加时,3 个形状为 `[1, 2, 1, 4]` 的子张量各自与 `others` 对应项相加。 Tensor4D &operator+=(Tensor4D const &others) { // TODO: 实现单向广播的加法 + for(int i = 0;i<4;i++){ + if(shape[i] != others.shape[i] && shape[i] != 1 && others.shape[i] != 1) { + throw std::runtime_error("Shape mismatch for broadcasting"); + } + } + unsigned int stride[4] = {1, 1, 1, 1}; + unsigned int others_stride[4] = {1, 1, 1, 1}; + for(int i = 2; i >= 0; --i) { + stride[i] = stride[i + 1] * shape[i + 1]; + others_stride[i] = others_stride[i + 1] * others.shape[i + 1]; + } + for(unsigned int i = 0;i=0; --i) { ASSERT(indices[i] < shape[i], "Invalid index"); // TODO: 计算 index + index += indices[i] * stride; + stride *= shape[i]; } return index; } diff --git a/exercises/24_std_array/main.cpp b/exercises/24_std_array/main.cpp index c29718d9d..41b072ae3 100644 --- a/exercises/24_std_array/main.cpp +++ b/exercises/24_std_array/main.cpp @@ -8,21 +8,21 @@ int main(int argc, char **argv) { { std::array arr{{1, 2, 3, 4, 5}}; - ASSERT(arr.size() == ?, "Fill in the correct value."); - ASSERT(sizeof(arr) == ?, "Fill in the correct value."); + ASSERT(arr.size() == 5, "Fill in the correct value."); + ASSERT(sizeof(arr) == 20, "Fill in the correct value."); int ans[]{1, 2, 3, 4, 5}; - ASSERT(std::memcmp(arr.?, ans, ?) == 0, "Fill in the correct values."); + ASSERT(std::memcmp(arr.data(), ans, sizeof(ans)) == 0, "Fill in the correct values."); } { std::array arr; - ASSERT(arr.size() == ?, "Fill in the correct value."); - ASSERT(sizeof(arr) == ?, "Fill in the correct value."); + ASSERT(arr.size() == 8, "Fill in the correct value."); + ASSERT(sizeof(arr) ==64, "Fill in the correct value."); } { std::array arr{"Hello, InfiniTensor!"}; - ASSERT(arr.size() == ?, "Fill in the correct value."); - ASSERT(sizeof(arr) == ?, "Fill in the correct value."); - ASSERT(std::strcmp(arr.?, "Hello, InfiniTensor!") == 0, "Fill in the correct value."); + ASSERT(arr.size() == 21, "Fill in the correct value."); + ASSERT(sizeof(arr) ==21, "Fill in the correct value."); + ASSERT(std::strcmp(arr.data(), "Hello, InfiniTensor!") == 0, "Fill in the correct value."); } return 0; } diff --git a/exercises/25_std_vector/main.cpp b/exercises/25_std_vector/main.cpp index f9e41bb78..84909d91f 100644 --- a/exercises/25_std_vector/main.cpp +++ b/exercises/25_std_vector/main.cpp @@ -1,90 +1,90 @@ -#include "../exercise.h" +#include "../exercise.h" #include #include - +using namespace std; // READ: std::vector // TODO: 将下列 `?` 替换为正确的代码 int main(int argc, char **argv) { { std::vector vec{1, 2, 3, 4, 5}; - ASSERT(vec.size() == ?, "Fill in the correct value."); + ASSERT(vec.size() == 5, "Fill in the correct value."); // THINK: `std::vector` 的大小是什么意思?与什么有关? - ASSERT(sizeof(vec) == ?, "Fill in the correct value."); + ASSERT(vec.size() * sizeof(int) ==20, "Fill in the correct value."); int ans[]{1, 2, 3, 4, 5}; - ASSERT(std::memcmp(vec.?, ans, sizeof(ans)) == 0, "Fill in the correct values."); + ASSERT(std::memcmp(vec.data(), ans, sizeof(ans)) == 0, "Fill in the correct values."); } { std::vector vec{1, 2, 3, 4, 5}; { - ASSERT(vec.size() == ?, "Fill in the correct value."); - ASSERT(sizeof(vec) == ?, "Fill in the correct value."); + ASSERT(vec.size() ==5, "Fill in the correct value."); + ASSERT(vec.size() * sizeof(double) ==40, "Fill in the correct value."); double ans[]{1, 2, 3, 4, 5}; - ASSERT(std::memcmp(vec.?, ans, sizeof(ans)) == 0, "Fill in the correct values."); + ASSERT(std::memcmp(vec.data(), ans, sizeof(ans)) == 0, "Fill in the correct values."); } { vec.push_back(6); - ASSERT(vec.size() == ?, "Fill in the correct value."); - ASSERT(sizeof(vec) == ?, "Fill in the correct value."); + ASSERT(vec.size() ==6, "Fill in the correct value."); + ASSERT(vec.size() * sizeof(double) == 48, "Fill in the correct value."); vec.pop_back(); - ASSERT(vec.size() == ?, "Fill in the correct value."); - ASSERT(sizeof(vec) == ?, "Fill in the correct value."); + ASSERT(vec.size() ==5, "Fill in the correct value."); + ASSERT(vec.size() * sizeof(double) == 40, "Fill in the correct value."); } { vec[4] = 6; - ASSERT(vec[0] == ?, "Fill in the correct value."); - ASSERT(vec[1] == ?, "Fill in the correct value."); - ASSERT(vec[2] == ?, "Fill in the correct value."); - ASSERT(vec[3] == ?, "Fill in the correct value."); - ASSERT(vec[4] == ?, "Fill in the correct value."); + ASSERT(vec[0] == 1, "Fill in the correct value."); + ASSERT(vec[1] == 2, "Fill in the correct value."); + ASSERT(vec[2] == 3, "Fill in the correct value."); + ASSERT(vec[3] == 4, "Fill in the correct value."); + ASSERT(vec[4] == 6, "Fill in the correct value."); } { // THINK: `std::vector` 插入删除的时间复杂度是什么? - vec.insert(?, 1.5); + vec.insert(vec.begin() + 1, 1.5); ASSERT((vec == std::vector{1, 1.5, 2, 3, 4, 6}), "Make this assertion pass."); - vec.erase(?); + vec.erase(vec.begin() + 3); ASSERT((vec == std::vector{1, 1.5, 2, 4, 6}), "Make this assertion pass."); } { vec.shrink_to_fit(); - ASSERT(vec.capacity() == ?, "Fill in the correct value."); + ASSERT(vec.capacity() == 5, "Fill in the correct value."); vec.clear(); ASSERT(vec.empty(), "`vec` is empty now."); - ASSERT(vec.size() == ?, "Fill in the correct value."); - ASSERT(vec.capacity() == ?, "Fill in the correct value."); + ASSERT(vec.size() == 0, "Fill in the correct value."); + ASSERT(vec.capacity() == 5, "Fill in the correct value."); } } { - std::vector vec(?, ?); // TODO: 调用正确的构造函数 + std::vector vec(48, 'z'); // TODO: 调用正确的构造函数 ASSERT(vec[0] == 'z', "Make this assertion pass."); ASSERT(vec[47] == 'z', "Make this assertion pass."); ASSERT(vec.size() == 48, "Make this assertion pass."); - ASSERT(sizeof(vec) == ?, "Fill in the correct value."); + ASSERT(vec.size() * sizeof(char) == 48, "Fill in the correct value."); { auto capacity = vec.capacity(); vec.resize(16); - ASSERT(vec.size() == ?, "Fill in the correct value."); - ASSERT(vec.capacity() == ?, "Fill in a correct identifier."); + ASSERT(vec.size() == 16, "Fill in the correct value."); + //cout< - +using namespace std; // READ: std::vector // READ: 模板特化 // TODO: 将下列 `?` 替换为正确的代码 int main(int argc, char **argv) { - std::vector vec(?, ?);// TODO: 正确调用构造函数 + std::vector vec(100,true );// TODO: 正确调用构造函数 ASSERT(vec[0], "Make this assertion pass."); ASSERT(vec[99], "Make this assertion pass."); ASSERT(vec.size() == 100, "Make this assertion pass."); // NOTICE: 平台相关!注意 CI:Ubuntu 上的值。 std::cout << "sizeof(std::vector) = " << sizeof(std::vector) << std::endl; - ASSERT(sizeof(vec) == ?, "Fill in the correct value."); + ASSERT(sizeof(vec) == 40, "Fill in the correct value."); { vec[20] = false; - ASSERT(?vec[20], "Fill in `vec[20]` or `!vec[20]`."); + ASSERT(!vec[20], "Fill in `vec[20]` or `!vec[20]`."); } { vec.push_back(false); - ASSERT(vec.size() == ?, "Fill in the correct value."); - ASSERT(?vec[100], "Fill in `vec[100]` or `!vec[100]`."); + ASSERT(vec.size() == 101, "Fill in the correct value."); + ASSERT(!vec[100], "Fill in `vec[100]` or `!vec[100]`."); } { auto ref = vec[30]; - ASSERT(?ref, "Fill in `ref` or `!ref`"); + ASSERT(ref, "Fill in `ref` or `!ref`"); ref = false; - ASSERT(?ref, "Fill in `ref` or `!ref`"); + ASSERT(!ref, "Fill in `ref` or `!ref`"); // THINK: WHAT and WHY? - ASSERT(?vec[30], "Fill in `vec[30]` or `!vec[30]`."); + ASSERT(!vec[30], "Fill in `vec[30]` or `!vec[30]`."); } return 0; } diff --git a/exercises/27_strides/main.cpp b/exercises/27_strides/main.cpp index baceaf2a9..a55d179f4 100644 --- a/exercises/27_strides/main.cpp +++ b/exercises/27_strides/main.cpp @@ -15,9 +15,17 @@ using udim = unsigned int; /// @return 张量每维度的访问步长 std::vector strides(std::vector const &shape) { std::vector strides(shape.size()); + std::vector::reverse_iterator rtr; + strides.back() = 1; // TODO: 完成函数体,根据张量形状计算张量连续存储时的步长。 // READ: 逆向迭代器 std::vector::rbegin // 使用逆向迭代器可能可以简化代码 + auto stride_it = strides.rbegin() + 1; // 指向倒数第二个位置 + auto shape_it = shape.rbegin() + 1; // 指向倒数第二个维度 + + for (; shape_it != shape.rend(); ++shape_it, ++stride_it) { + *stride_it = *(stride_it - 1) * *(shape_it - 1); + } return strides; } diff --git a/exercises/28_std_string/main.cpp b/exercises/28_std_string/main.cpp index d8b276274..5fcfdf31d 100644 --- a/exercises/28_std_string/main.cpp +++ b/exercises/28_std_string/main.cpp @@ -10,9 +10,9 @@ int main(int argc, char **argv) { auto world = "world"; // READ: `decltype` 表达式 // READ: `std::is_same_v` 元编程判别 - ASSERT((std::is_same_v), "Fill in the missing type."); - ASSERT((std::is_same_v), "Fill in the missing type."); + ASSERT((std::is_same_v), "Fill in the missing type."); + ASSERT((std::is_same_v), "Fill in the missing type."); // TODO: 将 `?` 替换为正确的字符串 - ASSERT(hello + ", " + world + '!' == "?", "Fill in the missing string."); + ASSERT(hello + ", " + world + '!' == "Hello, world!", "Fill in the missing string."); return 0; } diff --git a/exercises/29_std_map/main.cpp b/exercises/29_std_map/main.cpp index fcccca347..68122a5fc 100644 --- a/exercises/29_std_map/main.cpp +++ b/exercises/29_std_map/main.cpp @@ -7,11 +7,13 @@ template bool key_exists(std::map const &map, k const &key) { // TODO: 实现函数 + return map.find(key) != map.end(); } template void set(std::map &map, k key, v value) { // TODO: 实现函数 + map[key] = value; } // ---- 不要修改以下代码 ---- diff --git a/exercises/30_std_unique_ptr/main.cpp b/exercises/30_std_unique_ptr/main.cpp index 9b98b5794..a5b42515e 100644 --- a/exercises/30_std_unique_ptr/main.cpp +++ b/exercises/30_std_unique_ptr/main.cpp @@ -51,12 +51,9 @@ int main(int argc, char **argv) { std::vector answers[]{ {"fd"}, - // TODO: 分析 problems[1] 中资源的生命周期,将记录填入 `std::vector` - // NOTICE: 此题结果依赖对象析构逻辑,平台相关,提交时以 CI 实际运行平台为准 - {"", "", "", "", "", "", "", ""}, - {"", "", "", "", "", "", "", ""}, + {"d", "ffr"}, + {"d", "d", "r"}, }; - // ---- 不要修改以下代码 ---- for (auto i = 0; i < 3; ++i) { diff --git a/exercises/31_std_shared_ptr/main.cpp b/exercises/31_std_shared_ptr/main.cpp index febbbcc6f..d35134457 100644 --- a/exercises/31_std_shared_ptr/main.cpp +++ b/exercises/31_std_shared_ptr/main.cpp @@ -10,36 +10,36 @@ int main(int argc, char **argv) { std::shared_ptr ptrs[]{shared, shared, shared}; std::weak_ptr observer = shared; - ASSERT(observer.use_count() == ?, ""); + ASSERT(observer.use_count() == 4, ""); ptrs[0].reset(); - ASSERT(observer.use_count() == ?, ""); + ASSERT(observer.use_count() == 3, ""); ptrs[1] = nullptr; - ASSERT(observer.use_count() == ?, ""); + ASSERT(observer.use_count() == 2, ""); ptrs[2] = std::make_shared(*shared); - ASSERT(observer.use_count() == ?, ""); + ASSERT(observer.use_count() == 1, ""); ptrs[0] = shared; ptrs[1] = shared; ptrs[2] = std::move(shared); - ASSERT(observer.use_count() == ?, ""); + ASSERT(observer.use_count() == 3, ""); std::ignore = std::move(ptrs[0]); ptrs[1] = std::move(ptrs[1]); ptrs[1] = std::move(ptrs[2]); - ASSERT(observer.use_count() == ?, ""); + ASSERT(observer.use_count() == 2, ""); shared = observer.lock(); - ASSERT(observer.use_count() == ?, ""); + ASSERT(observer.use_count() == 3, ""); shared = nullptr; for (auto &ptr : ptrs) ptr = nullptr; - ASSERT(observer.use_count() == ?, ""); + ASSERT(observer.use_count() == 0, ""); shared = observer.lock(); - ASSERT(observer.use_count() == ?, ""); + ASSERT(observer.use_count() == 0, ""); return 0; } diff --git a/exercises/32_std_transform/main.cpp b/exercises/32_std_transform/main.cpp index f4dc25a5c..673a9b93e 100644 --- a/exercises/32_std_transform/main.cpp +++ b/exercises/32_std_transform/main.cpp @@ -10,6 +10,10 @@ int main(int argc, char **argv) { std::vector val{8, 13, 21, 34, 55}; // TODO: 调用 `std::transform`,将 `v` 中的每个元素乘以 2,并转换为字符串,存入 `ans` // std::vector ans + std::vector ans(val.size()); + std::transform(val.begin(), val.end(), ans.begin(), + [](int x) { return std::to_string(x * 2); } + ); ASSERT(ans.size() == val.size(), "ans size should be equal to val size"); ASSERT(ans[0] == "16", "ans[0] should be 16"); ASSERT(ans[1] == "26", "ans[1] should be 26"); diff --git a/exercises/33_std_accumulate/main.cpp b/exercises/33_std_accumulate/main.cpp index 6326929d5..692a3d086 100644 --- a/exercises/33_std_accumulate/main.cpp +++ b/exercises/33_std_accumulate/main.cpp @@ -12,6 +12,10 @@ int main(int argc, char **argv) { // - 连续存储; // 的张量占用的字节数 // int size = + int num_elements = std::accumulate( + shape, shape + 4, 1, std::multiplies() + ); + int size = num_elements * sizeof(DataType); ASSERT(size == 602112, "4x1x3x224x224 = 602112"); return 0; } diff --git a/exercises/build/linux/x86_64/release/build/linux/x86_64/release/exercise17 b/exercises/build/linux/x86_64/release/build/linux/x86_64/release/exercise17 new file mode 100644 index 0000000000000000000000000000000000000000..cfbadcdb642a83441a2680348cc8eae051d46c4d GIT binary patch literal 18656 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 V-B~HuZB?zSF}Vv_Q5D))@n3M&MRWiF literal 0 HcmV?d00001 diff --git a/exercises/build/linux/x86_64/release/build/linux/x86_64/release/exercise18 b/exercises/build/linux/x86_64/release/build/linux/x86_64/release/exercise18 new file mode 100644 index 0000000000000000000000000000000000000000..cfd9f51abfa61588df9cdd7c3bdeb75832eeb047 GIT binary patch literal 14472 zcmeHO4Qw1o6`u1?JTl~MWV=&Q5A%R5~QM3fJm!WIEXgJ&|;v;^4{+I zF6*rg2#}Cq$J+bm{e1Ig-ptN^oEz2q=_t^%2F=#TrKw7K70u6@sv8S6k`x z-D;=0h2#ob=h(vzkku)d%hqC*=*tP2SI3ogaHpfD2u?u{8JV|HS>g^+0V){>^D5aO zvKJH5Pay22cp8(bX!d6b=h%S?(9Pqn%r@C(HQTWkrzGBtAb2b?@0{??2@j~?FNl0{ zPWWn7b)GBs zamN1{s@)4pIp1z*++B*K<+Q6T4u%7?^4fH(9_2NEB`uEWF zmO}H8GvmXJjhy?vDjFS4Wzx}{8Oxf{sEYRXACATo*~DlvXC|`!hr7lz=|q2QXguNA z*0+4@?qgDYMk zA&M7eKj~U3mQ1UjzTVER!NKSqdaF~9?$P(?Z9K*@*G!j_6tI7sHKmc=Z1^Hgd%1d+ zovE<>G$Gb?etU8=xAJ4#O8boL6S%Lx`!>h$ghxLs4a|A;6XIVLc6ew9^2Gy=p4T93 zthwycW9_s4ic61snDt98J>NSh%Pzh9K3{d|H^G^3Ui7TvdjsWyOYgpqVE56_fS&cWqx6#y8aP6Ua3FDjx6~s zEmEV#nGW{nP8r48qg*Yv^%GqEDp^N#aI5RXcD$BXdkdHDHwrHq(=RU{>F+C6j!+Mc z;?`>v!YFpk5X-84NmuHRvm|b|8>}p2*tcrdQYwB(HcrK6>q>R~6nAVvko;d@W3laL z3=KDo!m@GxwFAca)p8^7oN?)fxs4ilTpFmduF%jZ58(6oraIWH@{I$=bjMv>H43ko zTWFXkNm%;+4a-`JQx~7BOpzQoLEJU`s}GV<`orx#)5#rl;@EQ6S~+rWU$NusjY>s6 z+FST}WT3b3dZa&6cyqugHa$t|V|@+Rc?~RGyH3eIf4$tSZ~29^-&a`aE4BH=3GF9|^D=psM<=`%r(mju|8OHC|Gw_^=%JUO{oLh@BF|WyX@D5+%CT(o+UrL6JvMQ zn{+W>BSc{z9@j;R$K&L}x;eUdENFl?^MzH4Ipz{`t9_4c2|W{9sTkRvZlOK3mxx41M+%BiKH@sV5jt2iqgTP$am!GpKb2 z>pFuqozxch<%5)$d1}Y~UW}Xci=P2M1AYel4EP!FGvH^y&w!r+KLh`p8Nj(coYTX( zJbE;+ix*Feev2Ru2yPX5P!3zZOJtlA+#xcaowkdNbAkM9#sz2nUcX^wSe}zZet1Ti zt6(k8rqXkg*zr8|ykl0k3G%ZPms$r(pF&gTB^ZGa)fNsT%5p)=) z{M&`^55BjtzUt(L0OEc`AnXH>-$50=2f%L^K2U?BAl5z9@285JKPY_QE;tH$*ZDpV z|6$<+wSU0xA^RJ25263qXMl*0v%%i}-$Q)PA^6ybfR`mckCAf+KK6tANXK0UANv{* z`xv>{#hd>aX?c$TANv9jXWr3&_yN%CdPMa%kszn5 literal 0 HcmV?d00001 diff --git a/exercises/build/linux/x86_64/release/build/linux/x86_64/release/exercise19 b/exercises/build/linux/x86_64/release/build/linux/x86_64/release/exercise19 new file mode 100644 index 0000000000000000000000000000000000000000..1a3163eac4f4012d225d1a18f8a74108137c7783 GIT binary patch literal 14552 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 literal 0 HcmV?d00001 diff --git a/exercises/build/linux/x86_64/release/build/linux/x86_64/release/exercise22 b/exercises/build/linux/x86_64/release/build/linux/x86_64/release/exercise22 new file mode 100644 index 0000000000000000000000000000000000000000..49672165009623a4088f6aa7c62cafb18aaca47f GIT binary patch literal 18736 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 ef3JPf{JNF#s2{6%l)_j literal 0 HcmV?d00001 diff --git a/exercises/build/linux/x86_64/release/build/linux/x86_64/release/exercise24 b/exercises/build/linux/x86_64/release/build/linux/x86_64/release/exercise24 new file mode 100644 index 0000000000000000000000000000000000000000..1a97f3a66892be1ce41ec738e0c4f8a1ce4053f0 GIT binary patch literal 14472 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 eESHztDd=L!?mxPB$i**Sx