fork download
  1. #include <iostream>
  2. #include <array>
  3.  
  4. struct BrainFuck {
  5. std::array<uint8_t, 65536> mem;
  6. uint16_t pos = 0;
  7. };
  8.  
  9. struct Plus {
  10. static int run(BrainFuck& bf) {
  11. bf.mem[bf.pos]++;
  12. return 0;
  13. }
  14. };
  15.  
  16. struct Minus {
  17. static int run(BrainFuck& bf) {
  18. bf.mem[bf.pos]--;
  19. return 0;
  20. }
  21. };
  22.  
  23. struct Left {
  24. static int run(BrainFuck& bf) {
  25. bf.pos--;
  26. return 0;
  27. }
  28. };
  29.  
  30. struct Right {
  31. static int run(BrainFuck& bf) {
  32. bf.pos++;
  33. return 0;
  34. }
  35. };
  36.  
  37. struct In {
  38. static int run(BrainFuck& bf) {
  39. std::cin >> bf.mem[bf.pos];
  40. return 0;
  41. }
  42. };
  43.  
  44. struct Out {
  45. static int run(BrainFuck& bf) {
  46. std::cout << bf.mem[bf.pos];
  47. return 0;
  48. }
  49. };
  50.  
  51. template <typename T>
  52. struct Loop {
  53. static int run(BrainFuck& bf) {
  54. while (bf.mem[bf.pos])
  55. T::run(bf);
  56. return 0;
  57. }
  58. };
  59.  
  60. template <typename... T>
  61. void dummy(T... args) {
  62. }
  63.  
  64. template <typename... T>
  65. struct Seq {
  66. static int run(BrainFuck& bf) {
  67. int tmp[] = { T::run(bf)... };
  68. return 0;
  69. }
  70. };
  71.  
  72. template <typename... R>
  73. auto operator+(Seq<R...> r) {
  74. return Seq<Plus, R...>();
  75. }
  76.  
  77. template <typename... R>
  78. auto operator-(Seq<R...> r) {
  79. return Seq<Minus, R...>();
  80. }
  81.  
  82. template <typename... R>
  83. auto operator++(Seq<R...> r) {
  84. return Seq<Right, R...>();
  85. }
  86.  
  87. template <typename... R>
  88. auto operator--(Seq<R...> r) {
  89. return Seq<Left, R...>();
  90. }
  91.  
  92. template <typename... R>
  93. auto operator*(Seq<R...> r) {
  94. return Seq<Out, R...>();
  95. }
  96.  
  97. template <typename... R>
  98. auto operator&(Seq<R...> r) {
  99. return Seq<In, R...>();
  100. }
  101.  
  102. int main()
  103. {
  104. auto test = & + + + * Seq<>();
  105.  
  106. BrainFuck bf;
  107. test.run(bf);
  108.  
  109. return 0;
  110. }
Success #stdin #stdout 0s 4384KB
stdin
Standard input is empty
stdout
3