Checker

 avatar
unknown
c_cpp
a year ago
4.6 kB
11
Indexable
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <regex.h>
#include <stdexcept>
#include <string>
#include <vector>
#include <utility>

void errorHook();
void exitWA() {
  errorHook();
  std::exit(1);
}
void exitPE() {
  errorHook();
  std::exit(2);
}
void assertWA(bool condition) {
  if (!condition) {
    exitWA();
  }
}
void assertPE(bool condition) {
  if (!condition) {
    // Defined for `testlib` and `coci`.
    exitPE();
  }
}
void readSpace() { assertPE(getchar() == ' '); }
void readNewLine() { assertPE(getchar() == '\n'); }
void readEOF() { assertPE(getchar() == EOF); }
std::string readToken(char min_char = 0, char max_char = 127) {
  static constexpr size_t MAX_TOKEN_SIZE = 1e7;
  std::string token;
  int c = getchar();
  assertPE(!isspace(c));
  while (!isspace(c) && c != EOF && token.size() < MAX_TOKEN_SIZE) {
    assertWA(min_char <= c && c <= max_char);
    token.push_back(char(c));
    c = getchar();
  }
  ungetc(c, stdin);
  return token;
}
namespace regex_detail {
regex_t compile(const char *pattern) {
  regex_t re;
  if (regcomp(&re, pattern, REG_EXTENDED | REG_NOSUB) != 0) {
    throw std::runtime_error("Pattern failed to compile.");
  }
  return re;
}
bool match(regex_t re, const std::string &text) {
  return regexec(&re, text.c_str(), 0, NULL, 0) == 0;
}
} // namespace regex_detail
long long readInt(long long lo, long long hi) {
  // stoll is horribly insufficient, so we use a regex.
  static regex_t re = regex_detail::compile("^0|-?[1-9][0-9]*$");
  std::string token = readToken();
  assertWA(regex_detail::match(re, token));

  long long parsedInt;
  try {
    parsedInt = stoll(token);
  } catch (const std::invalid_argument &) {
    exitWA();
  } catch (const std::out_of_range &) {
    exitWA();
  }
  assertWA(lo <= parsedInt && parsedInt <= hi);
  return parsedInt;
}
double readDouble(long long lo, long long hi) {
  // stoll is horribly insufficient, so we use a regex.
  static regex_t re = regex_detail::compile("^0|-?(?:[1-9][0-9]*|0)?(?:\\.[0-9]+)?$"); //pasted from SO and hand tested, should be OK...
  std::string token = readToken();
  assertWA(regex_detail::match(re, token));

  double parsedDouble;
  try {
    parsedDouble = stod(token);
  } catch (const std::invalid_argument &) {
    exitWA();
  } catch (const std::out_of_range &) {
    exitWA();
  }
  assertWA(lo <= parsedDouble && parsedDouble <= hi);
  return parsedDouble;
}
template <typename T>
std::vector<T> readDoubleArray(size_t N, long long lo, long long hi) {
  std::vector<T> arr;
  arr.reserve(N);
  for (size_t i = 0; i < N; i++) {
    arr.push_back(readDouble(lo, hi));
    if (i != N - 1) {
      readSpace();
    }
  }
  readNewLine();
  return arr;
}

// This is a hook for when the reader functions error, including `assertWA`. Use
// it to do custom handling when an error happens, such as overriding WA with
// partials, or printing a flag like `-1` in interactors.
void errorHook() {}

// If this is a checker, use the following line in main(int argc, char** argv)
// to replace stdin with the user output. freopen(argv[2], "r", stdin);

double eval(int x, std::vector<double> coeffs) {
    double res = 0;
    std::reverse(coeffs.begin(), coeffs.end());

    for (int power = 0; power < coeffs.size(); power++) {
        res += coeffs[power] * std::pow(x, power);
    }
    return res;
}


int main(int argc, char** argv) {
  const int MAXCOORD = 100;
  const int MAXCOEFF = 1e4;
  const int MAXDEG = 1e4;
  const int MAXSTARS = 50;

  //store coordinates of test case 
  freopen(argv[1], "r", stdin);
  std::vector<std::pair<int, int>> stars;

  int n = readInt(0, MAXSTARS); readNewLine(); 
  for (int i = 0; i < n; i++) {
      int x = readInt(-MAXCOORD, MAXCOORD); readSpace(); 
      int y = readInt(-MAXCOORD, MAXCOORD); 
      (i == n-1 ? readEOF() : readNewLine());
      stars.push_back({x, y});
  }


  //read user polynomial
  freopen(argv[2], "r", stdin);

  int k = readInt(0, n); readNewLine();
  //will this catch and return WA if the given output arr is not of size k+1?
  std::vector<double> coeffs = readDoubleArray(k+1, -MAXCOEFF, MAXCOEFF); 
  readEOF();

  //actual polynomial evaluation and checking
  for (std::pair<int, int> pos : stars) {
    assertWA(abs(eval(pos.first, coeffs) - pos.second) < 0.00001);
  }

  std::exit(0); //return AC? guessing return code 0 here
  
  // argv[1] is process input
  // argv[2] is setup for you - it's process output
  // argv[3] is judge answer
}
Editor is loading...
Leave a Comment