fork download
  1. #include <stdio.h>
  2. #include <algorithm>
  3.  
  4. namespace algo
  5. {
  6. template <typename it_t, typename d_it_t>
  7. constexpr auto copy(it_t first, it_t last, d_it_t dfirst)
  8. {
  9. while(first != last)
  10. {
  11. *dfirst++ = *first++;
  12. }
  13. }
  14.  
  15. template <typename it_t, typename value_t>
  16. constexpr auto fill(it_t first, it_t last, const value_t& value)
  17. {
  18. while(first != last)
  19. {
  20. *first++ = value;
  21. }
  22. }
  23. }
  24.  
  25. template <typename ty, size_t n>
  26. class array
  27. {
  28. public:
  29. constexpr auto begin()
  30. {
  31. return m_arr;
  32. }
  33.  
  34. constexpr auto end()
  35. {
  36. return m_arr + n;
  37. }
  38.  
  39. constexpr auto begin() const
  40. {
  41. return m_arr;
  42. }
  43.  
  44. constexpr auto end() const
  45. {
  46. return m_arr + n;
  47. }
  48.  
  49. constexpr auto& operator[](size_t i)
  50. {
  51. return m_arr[i];
  52. }
  53.  
  54. constexpr const auto& operator[](size_t i) const
  55. {
  56. return m_arr[i];
  57. }
  58.  
  59. constexpr auto& operator=(const array& rhs)
  60. {
  61. algo::copy(rhs.begin(), rhs.end(), begin());
  62. return *this;
  63. }
  64.  
  65. private:
  66. ty m_arr[n]{};
  67. };
  68.  
  69.  
  70. template <size_t a, size_t b>
  71. class trapeze
  72. {
  73. public:
  74. constexpr trapeze()
  75. {
  76. algo::fill(m_data.begin(), m_data.end(), ' ');
  77. m_data[a*b] = '\0';
  78. }
  79.  
  80. constexpr auto& operator()(size_t i, size_t j)
  81. {
  82. return m_data[i*b + j];
  83. }
  84.  
  85. constexpr auto data() const
  86. {
  87. return m_data.begin();
  88. }
  89.  
  90. private:
  91. array<char, a * b + 1u> m_data; //+1 for '\0'
  92. };
  93.  
  94.  
  95. template <size_t max_a, size_t max_b>
  96. using trapeze_t = trapeze<std::max(max_a, max_b), std::max(max_a, max_b) + 1u>; //+1 for '\n'
  97.  
  98. template <size_t max_a, size_t max_b>
  99. constexpr auto generate_trapeze(size_t a, size_t b)
  100. {
  101. trapeze_t<max_a, max_b> trapeze;
  102.  
  103. if(a <= b)
  104. {
  105. for(size_t i = a; i <= b; i++) {
  106. for(size_t j = 0; j < i ;j++) {
  107. trapeze(i - a, j) = '*';
  108. }
  109. trapeze(i - a, max_b) = '\n';
  110. }
  111. }
  112. else
  113. {
  114. for(size_t i = a; static_cast<int>(i) >= static_cast<int>(b); --i) {
  115. for(size_t j = 0; j < i; j++) {
  116. trapeze(a - i, j) = '*';
  117. }
  118. trapeze(a - i, max_b) = '\n';
  119. }
  120. }
  121.  
  122. return trapeze;
  123. }
  124.  
  125. template <size_t a, size_t b>
  126. constexpr auto generate()
  127. {
  128. constexpr auto max_a = a + 1u;
  129. constexpr auto max_b = b + 1u;
  130. using generated_trapezes_row_t = array<trapeze_t<max_a, max_b>, max_b>;
  131. using generated_trapezes_t = array<generated_trapezes_row_t, max_a>;
  132.  
  133. generated_trapezes_t generated_trapezes;
  134.  
  135. for(size_t i = 0u; i < max_a; ++i)
  136. {
  137. for(size_t j = 0u; j < max_b; ++j)
  138. {
  139. generated_trapezes[i][j] = generate_trapeze<max_a, max_b>(i, j);
  140. }
  141. }
  142.  
  143. return generated_trapezes;
  144. }
  145.  
  146. int main()
  147. {
  148. constexpr auto max_a{ 10u };
  149. constexpr auto max_b{ 10u };
  150. constexpr auto trapezes = generate<max_a, max_b>();
  151.  
  152. size_t a, b;
  153.  
  154. scanf("%lu %lu", &a, &b);
  155.  
  156. printf("%s", trapezes[a][b].data());
  157. }
  158.  
Success #stdin #stdout 0s 16080KB
stdin
10 3
stdout
********** 
*********  
********   
*******    
******     
*****      
****       
***