kyopro-lib

This documentation is automatically generated by online-judge-tools/verification-helper

View on GitHub

:heavy_check_mark: test/aoj/1102/main.test.cpp

Depends on

Code

#define PROBLEM "http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1102"

#include <iostream>
#include <string>
#include "Mylib/Parser/parser.cpp"

namespace hl = haar_lib;

struct complex {
  int real, imag;
  bool overflow;

  complex() : real(0), imag(0), overflow(false) {}
  complex(int real, int imag = 0) : real(real), imag(imag), overflow(false) {
    if (abs(real) > 10000 or abs(imag) > 10000) overflow = true;
  }
  complex(bool overflow) : real(0), imag(0), overflow(true) {}

  friend complex operator+(const complex &a, const complex &b) {
    if (a.overflow or b.overflow) return complex(true);
    return complex(a.real + b.real, a.imag + b.imag);
  }

  friend complex operator-(const complex &a, const complex &b) {
    if (a.overflow or b.overflow) return complex(true);
    return complex(a.real - b.real, a.imag - b.imag);
  }

  friend complex operator-(const complex &a) {
    if (a.overflow) return complex(true);
    return complex(-a.real, -a.imag);
  }

  friend complex operator*(const complex &a, const complex &b) {
    if (a.overflow or b.overflow) return complex(true);
    return complex(a.real * b.real - a.imag * b.imag, a.real * b.imag + a.imag * b.real);
  }

  complex &operator=(const complex &a) {
    this->real     = a.real;
    this->imag     = a.imag;
    this->overflow = a.overflow;
    return *this;
  }

  complex &operator+=(const complex &a) {
    *this = *this + a;
    return *this;
  }

  complex &operator-=(const complex &a) {
    *this = *this - a;
    return *this;
  }

  complex &operator*=(const complex &a) {
    *this = *this * a;
    return *this;
  }
};

std::ostream &operator<<(std::ostream &os, const complex &a) {
  if (a.overflow)
    os << "overflow";
  else {
    if (a.real == 0 and a.imag == 0)
      os << 0;
    else {
      if (a.real) {
        os << a.real;
      }
      if (a.imag) {
        if (a.imag > 0 and a.real) os << "+";
        os << a.imag;
        os << "i";
      }
    }
  }
  return os;
}

struct parser : hl::parser {
  parser(const std::string &s) : hl::parser(s) {}

  complex number() {
    bool neg = false;
    if (check_and_ignore('-')) neg = true;

    complex ret;

    if (digit()) {
      ret = get_number<complex>();

      if (check_and_ignore('i')) {
        ret *= complex(0, 1);
      }
    } else {
      if (check_and_ignore('i')) {
        ret = complex(0, 1);
      }
    }

    if (neg) ret = -ret;

    return ret;
  }

  complex factor() {
    complex ret;

    if (check_and_ignore('(')) {
      ret = expression();
      ignore(')');
    } else {
      ret = number();
    }

    return ret;
  }

  complex term() {
    complex ret = factor();

    while (1) {
      if (check_and_ignore('*')) {
        ret *= factor();
      } else {
        break;
      }
    }

    return ret;
  }

  complex expression() {
    complex ret = term();

    while (1) {
      if (check_and_ignore('+')) {
        ret += term();
      } else if (check_and_ignore('-')) {
        ret -= term();
      } else {
        break;
      }
    }

    return ret;
  }

  complex run() {
    return expression();
  }
};

int main() {
  std::cin.tie(0);
  std::ios::sync_with_stdio(false);

  std::string s;
  while (std::cin >> s) {
    std::cout << parser(s).run() << "\n";
  }

  return 0;
}
#line 1 "test/aoj/1102/main.test.cpp"
#define PROBLEM "http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1102"

#include <iostream>
#include <string>
#line 2 "Mylib/Parser/parser.cpp"
#include <cassert>
#line 4 "Mylib/Parser/parser.cpp"

namespace haar_lib {
  struct parser {
    using state = std::string::const_iterator;

    state cur, first, last;

    parser() {}
    parser(const std::string &s) : cur(s.cbegin()), first(s.cbegin()), last(s.cend()) {}

    char peek() const { return *cur; }

    bool check(char c) const {
      return *cur == c;
    }

    bool check(const std::string &s) const {
      state temp = cur;
      for (auto c : s) {
        if (c != *temp) return false;
        ++temp;
      }
      return true;
    }

    void ignore(char c) {
      assert(*cur == c);
      ++cur;
    }

    void ignore() {
      ++cur;
    }

    void ignore(const std::string &s) {
      for (auto c : s) {
        assert(*cur == c);
        ++cur;
      }
    }

    template <class Checker>
    void ignore_if(const Checker &f) {
      assert(f(*cur));
      ++cur;
    }

    bool check_and_ignore(char c) {
      if (*cur != c) return false;
      ++cur;
      return true;
    }

    bool end() const { return cur == last; }
    bool digit() const { return isdigit(*cur); }
    bool alpha() const { return isalpha(*cur); }
    bool lower() const { return islower(*cur); }
    bool upper() const { return isupper(*cur); }

    char get_char() {
      return *(cur++);
    }

    int get_digit() {
      return (int) (*(cur++) - '0');
    }

    template <typename Checker>
    auto get_string(const Checker &f) {
      std::string ret;
      while (f(peek())) {
        ret += peek();
        ignore();
      }
      return ret;
    }

    auto get_string_alpha() {
      std::string ret;
      while (isalpha(*cur)) {
        ret += *cur;
        ++cur;
      }
      return ret;
    }

    auto get_string_alnum() {
      std::string ret;
      while (isalnum(*cur)) {
        ret += *cur;
        ++cur;
      }
      return ret;
    }

    template <typename T>
    T get_number() {
      T ret = get_digit();
      while (digit()) {
        (ret *= 10) += (T)(get_digit());
      }
      return ret;
    }
  };
}  // namespace haar_lib
#line 6 "test/aoj/1102/main.test.cpp"

namespace hl = haar_lib;

struct complex {
  int real, imag;
  bool overflow;

  complex() : real(0), imag(0), overflow(false) {}
  complex(int real, int imag = 0) : real(real), imag(imag), overflow(false) {
    if (abs(real) > 10000 or abs(imag) > 10000) overflow = true;
  }
  complex(bool overflow) : real(0), imag(0), overflow(true) {}

  friend complex operator+(const complex &a, const complex &b) {
    if (a.overflow or b.overflow) return complex(true);
    return complex(a.real + b.real, a.imag + b.imag);
  }

  friend complex operator-(const complex &a, const complex &b) {
    if (a.overflow or b.overflow) return complex(true);
    return complex(a.real - b.real, a.imag - b.imag);
  }

  friend complex operator-(const complex &a) {
    if (a.overflow) return complex(true);
    return complex(-a.real, -a.imag);
  }

  friend complex operator*(const complex &a, const complex &b) {
    if (a.overflow or b.overflow) return complex(true);
    return complex(a.real * b.real - a.imag * b.imag, a.real * b.imag + a.imag * b.real);
  }

  complex &operator=(const complex &a) {
    this->real     = a.real;
    this->imag     = a.imag;
    this->overflow = a.overflow;
    return *this;
  }

  complex &operator+=(const complex &a) {
    *this = *this + a;
    return *this;
  }

  complex &operator-=(const complex &a) {
    *this = *this - a;
    return *this;
  }

  complex &operator*=(const complex &a) {
    *this = *this * a;
    return *this;
  }
};

std::ostream &operator<<(std::ostream &os, const complex &a) {
  if (a.overflow)
    os << "overflow";
  else {
    if (a.real == 0 and a.imag == 0)
      os << 0;
    else {
      if (a.real) {
        os << a.real;
      }
      if (a.imag) {
        if (a.imag > 0 and a.real) os << "+";
        os << a.imag;
        os << "i";
      }
    }
  }
  return os;
}

struct parser : hl::parser {
  parser(const std::string &s) : hl::parser(s) {}

  complex number() {
    bool neg = false;
    if (check_and_ignore('-')) neg = true;

    complex ret;

    if (digit()) {
      ret = get_number<complex>();

      if (check_and_ignore('i')) {
        ret *= complex(0, 1);
      }
    } else {
      if (check_and_ignore('i')) {
        ret = complex(0, 1);
      }
    }

    if (neg) ret = -ret;

    return ret;
  }

  complex factor() {
    complex ret;

    if (check_and_ignore('(')) {
      ret = expression();
      ignore(')');
    } else {
      ret = number();
    }

    return ret;
  }

  complex term() {
    complex ret = factor();

    while (1) {
      if (check_and_ignore('*')) {
        ret *= factor();
      } else {
        break;
      }
    }

    return ret;
  }

  complex expression() {
    complex ret = term();

    while (1) {
      if (check_and_ignore('+')) {
        ret += term();
      } else if (check_and_ignore('-')) {
        ret -= term();
      } else {
        break;
      }
    }

    return ret;
  }

  complex run() {
    return expression();
  }
};

int main() {
  std::cin.tie(0);
  std::ios::sync_with_stdio(false);

  std::string s;
  while (std::cin >> s) {
    std::cout << parser(s).run() << "\n";
  }

  return 0;
}
Back to top page