fork(2) download
  1. #include <iostream>
  2. #include <vector>
  3. //////////////////////////////////////////////////
  4. class abacus_type
  5. {
  6. friend void operator>>(std::istream& in, abacus_type& obj);
  7.  
  8. std::vector<std::string> abacus;
  9. public:
  10. abacus_type()
  11. : abacus(15) {}
  12.  
  13. void number() const;
  14. void of(std::string &number);
  15. };
  16. //=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
  17. inline void operator>>(std::istream& in, abacus_type& obj)
  18. {
  19. in.get();
  20. for (int i{}; i < 15; i++) getline(in, obj.abacus[i]);
  21. in.clear(in.rdstate() & ~(std::ios::failbit | std::ios::eofbit));
  22. }
  23. //=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
  24. void abacus_type::number() const
  25. {
  26. int row_size (abacus[0].size() - 1);
  27. char helper;
  28. std::string as_number;
  29. as_number.resize(row_size);
  30.  
  31. for (int i{1}; i < row_size; i++) {
  32. helper = (abacus[3][i] == '*')? '5' : '0';
  33.  
  34. for (int r{5}; abacus[r][i] != ' '; r++, helper++);
  35.  
  36. as_number[i - 1] = helper;
  37. }
  38.  
  39. for (int a = 0; as_number[a] == '0'; a++)
  40. as_number.erase(as_number.begin() + a);
  41.  
  42. if (as_number.empty()) as_number = "0";
  43.  
  44. std::cout << as_number << '\n';
  45. }
  46. //=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
  47. void abacus_type::of(std::string &number)
  48. {
  49. {
  50. int i {};
  51. for (; number[i] == '0'; i++);
  52. number.erase(0, i);
  53. }
  54.  
  55. if (number.empty()) number = "0";
  56.  
  57. int row_size (number.size());
  58.  
  59. std::string frame (row_size + 2, '-'),
  60. interor {'|' + std::string(row_size, ' ') + '|'},
  61. interor2 {'|' + std::string(row_size, '*') + '|'};
  62.  
  63. abacus[0] = frame;
  64. abacus[1] = interor2;
  65. abacus[2] = interor2;
  66.  
  67. for (int i{3}; i < 14; i++) {
  68. if (i == 4) abacus[i] = '|' + std::string(row_size, '-') + '|';
  69. else abacus[i] = interor;
  70. }
  71.  
  72. abacus[14] = frame;
  73.  
  74. for (int j, i{1}; i <= row_size; i++) {
  75. if (number[i - 1] >= '5') std::swap(abacus[2][i], abacus[3][i]);
  76.  
  77. for (j = 0; j < (number[i - 1] - '0') % 5; j++)
  78. abacus[j + 5][i] = '*';
  79.  
  80. for (; j < 5; j++, abacus[8 + j][i] = '*');
  81. }
  82.  
  83. for (auto &z : abacus)
  84. std::cout << z << '\n';
  85. }
  86. //////////////////////////////////////////////////
  87. int main()
  88. {
  89. bool x;
  90. std::string number;
  91. abacus_type abacus;
  92.  
  93. while (std::cin >> x) {
  94. if (x) {
  95. std::cin >> number;
  96. abacus.of(number);
  97. } else {
  98. std::cin >> abacus;
  99. abacus.number();
  100. }
  101. }
  102. }
Success #stdin #stdout 0s 5540KB
stdin
1
000
stdout
---
|*|
|*|
| |
|-|
| |
| |
| |
| |
|*|
|*|
|*|
|*|
|*|
---