Task: | Fraktaali |
Sender: | eliaskosunen |
Submission time: | 2017-10-03 00:33:07 +0300 |
Language: | C++ |
Status: | READY |
Result: | 100 |
group | verdict | score |
---|---|---|
#1 | ACCEPTED | 10 |
#2 | ACCEPTED | 10 |
#3 | ACCEPTED | 10 |
#4 | ACCEPTED | 10 |
#5 | ACCEPTED | 10 |
#6 | ACCEPTED | 10 |
#7 | ACCEPTED | 10 |
#8 | ACCEPTED | 10 |
#9 | ACCEPTED | 10 |
#10 | ACCEPTED | 10 |
test | verdict | time | group | |
---|---|---|---|---|
#1 | ACCEPTED | 0.05 s | 1 | details |
#2 | ACCEPTED | 0.04 s | 2 | details |
#3 | ACCEPTED | 0.04 s | 3 | details |
#4 | ACCEPTED | 0.04 s | 4 | details |
#5 | ACCEPTED | 0.04 s | 5 | details |
#6 | ACCEPTED | 0.05 s | 6 | details |
#7 | ACCEPTED | 0.04 s | 7 | details |
#8 | ACCEPTED | 0.05 s | 8 | details |
#9 | ACCEPTED | 0.06 s | 9 | details |
#10 | ACCEPTED | 0.12 s | 10 | details |
Code
#include <array>#include <cassert>#include <iostream>#include <iterator>#include <memory>#include <string>#include <vector>template <typename T, typename... Args>std::unique_ptr<T> make_unique(Args&&... args){return std::unique_ptr<T>(new T(std::forward<Args>(args)...));}constexpr int pow2(int n){return 1 << n;}template <typename T>class basic_square {public:using value_type = T;basic_square() = default;basic_square(value_type value) : m_value{value} {}basic_square(int n);value_type& at(std::ptrdiff_t row, std::ptrdiff_t col);int size() const{if (has_subs()) {return m_subsquares[0].size() * 2;}return 1;}basic_square<value_type>& get(int i){return m_subsquares[i];}void set(int i, basic_square<value_type> sq){assert(has_subs());m_subsquares[i] = std::move(sq);}void set(value_type v){assert(!has_subs());m_value = v;}void set(int i, value_type v){m_subsquares[i] = v;}basic_square<value_type>& flip(){if (has_subs()) {for (auto& sub : m_subsquares) {sub.flip();}return *this;}m_value = !m_value;return *this;}static basic_square<value_type> flip(basic_square<value_type> s){s.flip();return s;}void set_parent(basic_square<value_type>* p){m_parent = p;}basic_square<value_type>* get_parent() const{return m_parent;}void set_parents(basic_square<value_type>* p = nullptr){set_parent(p);for (auto& sub : m_subsquares) {sub.set_parents(this);}}basic_square& get_topleft();private:bool has_subs() const{return m_subsquares.size() == 4;}std::vector<basic_square<value_type>> m_subsquares{};basic_square<value_type>* m_parent{nullptr};bool m_value{};};template <typename T>inline basic_square<T>::basic_square(int n){if (n == 1) {m_value = {};return;}m_subsquares.resize(4, {});for (auto& sub : m_subsquares) {sub = basic_square<value_type>(n / 2);}}template <typename T>inline typename basic_square<T>::value_type& basic_square<T>::at(std::ptrdiff_t row,std::ptrdiff_t col){if (!has_subs()) {return m_value;}const auto subsize = m_subsquares[0].size();if (row < subsize) {if (col < subsize) {return m_subsquares[0].at(row, col);}return m_subsquares[1].at(row, col - subsize);}if (col < subsize) {return m_subsquares[2].at(row - subsize, col);}return m_subsquares[3].at(row - subsize, col - subsize);}template <typename T>inline basic_square<T>& basic_square<T>::get_topleft(){if (!has_subs()) {return *this;}return m_subsquares[0].get_topleft();}using square = basic_square<bool>;class fractal {public:fractal(int n){if (n == 1) {m_sq = square{1};}else {m_sq = square{pow2(n - 1)};}m_sq.at(0, 0) = true;if (n == 1) {return;}m_sq.set_parents();auto topleft = &m_sq.get_topleft();for (auto i = 0; i < n; ++i) {if (!topleft->get_parent()) {break;}else {topleft->get_parent()->set(1, *topleft);topleft->get_parent()->set(2, *topleft);topleft->get_parent()->set(3, square::flip(*topleft));topleft = topleft->get_parent();}}}friend std::ostream& operator<<(std::ostream& os, fractal& f){const auto size = f.m_sq.size();for (auto row = 0; row < size; ++row) {for (auto col = 0; col < size; ++col) {os << (f.m_sq.at(row, col) ? '#' : '.');}os << '\n';}return os;}private:square m_sq{};};int main(){int n;std::cin >> n;fractal f(n);std::cout << f;}
Test details
Test 1
Group: 1
Verdict: ACCEPTED
input |
---|
1 |
correct output |
---|
# |
user output |
---|
# |
Test 2
Group: 2
Verdict: ACCEPTED
input |
---|
2 |
correct output |
---|
## #. |
user output |
---|
## #. |
Test 3
Group: 3
Verdict: ACCEPTED
input |
---|
3 |
correct output |
---|
#### #.#. ##.. #..# |
user output |
---|
#### #.#. ##.. #..# |
Test 4
Group: 4
Verdict: ACCEPTED
input |
---|
4 |
correct output |
---|
######## #.#.#.#. ##..##.. #..##..# ####.... ... |
user output |
---|
######## #.#.#.#. ##..##.. #..##..# ####.... ... |
Test 5
Group: 5
Verdict: ACCEPTED
input |
---|
5 |
correct output |
---|
################ #.#.#.#.#.#.#.#. ##..##..##..##.. #..##..##..##..# ####....####.... ... |
user output |
---|
################ #.#.#.#.#.#.#.#. ##..##..##..##.. #..##..##..##..# ####....####.... ... |
Test 6
Group: 6
Verdict: ACCEPTED
input |
---|
6 |
correct output |
---|
##############################... |
user output |
---|
##############################... |
Test 7
Group: 7
Verdict: ACCEPTED
input |
---|
7 |
correct output |
---|
##############################... |
user output |
---|
##############################... |
Test 8
Group: 8
Verdict: ACCEPTED
input |
---|
8 |
correct output |
---|
##############################... |
user output |
---|
##############################... |
Test 9
Group: 9
Verdict: ACCEPTED
input |
---|
9 |
correct output |
---|
##############################... |
user output |
---|
##############################... |
Test 10
Group: 10
Verdict: ACCEPTED
input |
---|
10 |
correct output |
---|
##############################... |
user output |
---|
##############################... |