| 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 |
|---|
| ##############################... |
