Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.math.BigInteger;
- import java.net.URL;
- import java.security.MessageDigest;
- import java.security.NoSuchAlgorithmException;
- import java.util.Arrays;
- import java.util.Scanner;
- import com.google.gson.Gson;
- import com.google.gson.GsonBuilder;
- import com.google.gson.JsonObject;
- public class codeforcesAPI {
- public static void main(String[] args) throws IOException, NoSuchAlgorithmException {
- Scanner scan = new Scanner(System.in);
- String handle = scan.nextLine();
- listContest(handle);
- }
- public static void listContest(String user) throws IOException {
- UserContestRatingHistory hist = getUserContestRatingHistory(user);
- for(contest g : hist.result){
- System.out.print("Finding Personal Seed: ");
- int[] f = seed(user, g.contestId);
- int mean = (int)Math.sqrt(f[0] * f[2]);
- System.out.println("[Done]");
- System.out.print("Finding All Seeds: ");
- UserContestRatingChange a = getUserContestRatingChange(g.contestId);
- seedRankRating[] seeds = new seedRankRating[a.result.length];
- int myRate = 0;
- int myNew = 0;
- for(int i = 0;i<a.result.length;i++){
- String handle = a.result[i].handle;
- if(handle.equalsIgnoreCase(user)) {
- myRate = a.result[i].oldRating;
- myNew = a.result[i].newRating;
- }
- int[] q = seed2(handle, g.contestId, a);
- int curSeed = q[0];
- seeds[i] = new seedRankRating(curSeed, a.result[i].rank, a.result[i].oldRating);
- if(i != 0) System.out.print("\b".repeat(((i) +"/"+a.result.length).length() + 2));
- System.out.print("[" + (i+1) +"/"+a.result.length + "]");
- }
- System.out.print("\b".repeat((a.result.length + "").length()*2 + 3));
- Arrays.sort(seeds);
- int index = Arrays.binarySearch(seeds, new seedRankRating(mean, 1, 1));
- if(index< 0) index = -(index+1);
- int rating = seeds[index].rating;
- int average = (rating + myRate)/2;
- System.out.println("[Done]");
- System.out.print("[" + g.contestName + " " + g.contestId + "]:" + " ".repeat(Math.max(65 - g.contestName.length(), 10)));
- System.out.println("Total: " + f[1] + " Expected: " + f[0] + " Got: " + f[2] + " RateGuess: " + average + " Actual: " + myNew);
- }
- }
- public static int[] seed(String name, int id) throws IOException {
- UserContestRatingChange a = getUserContestRatingChange(id);
- int myRate = 0;
- int myRank = 0;
- for(contest g : a.result){
- if(g.handle.equalsIgnoreCase(name)){
- myRate = g.oldRating;
- myRank = g.rank;
- break;
- }
- }
- double curSeed = 0;
- for(contest g : a.result){
- if(g.oldRating > myRate){
- curSeed += elo(g.oldRating, myRate);
- }
- }
- return new int[] {(int)curSeed, a.result.length, myRank};
- }
- public static int[] seed2(String name, int id, UserContestRatingChange a) throws IOException {
- int myRate = 0;
- int myRank = 0;
- for(contest g : a.result){
- if(g.handle.equalsIgnoreCase(name)){
- myRate = g.oldRating;
- myRank = g.rank;
- break;
- }
- }
- double curSeed = 0;
- for(contest g : a.result){
- if(g.oldRating > myRate){
- curSeed += elo(g.oldRating, myRate);
- }
- }
- return new int[] {(int)curSeed, a.result.length, myRank};
- }
- public static UserContestRatingChange getUserContestRatingChange(int id) throws IOException {
- URL oracle = new URL("https://codeforces.com/api/contest.ratingChanges?contestId=" + id);
- BufferedReader in = new BufferedReader(new InputStreamReader(oracle.openStream()));
- String inputLine;
- String tot = "";
- while ((inputLine = in.readLine()) != null) tot += inputLine;
- JsonObject s = new Gson().fromJson(tot, JsonObject.class);
- Gson gson = new GsonBuilder().setPrettyPrinting().create();
- String prettyJson = gson.toJson(s);
- UserContestRatingChange o = gson.fromJson(prettyJson, UserContestRatingChange.class);
- return o;
- }
- public static UserContestRatingHistory getUserContestRatingHistory(String user) throws IOException {
- URL oracle = new URL("https://codeforces.com/api/user.rating?handle=" + user);
- BufferedReader in = new BufferedReader(new InputStreamReader(oracle.openStream()));
- String inputLine;
- String tot = "";
- while ((inputLine = in.readLine()) != null) tot += inputLine;
- JsonObject s = new Gson().fromJson(tot, JsonObject.class);
- Gson gson = new GsonBuilder().setPrettyPrinting().create();
- String prettyJson = gson.toJson(s);
- UserContestRatingHistory o = gson.fromJson(prettyJson, UserContestRatingHistory.class);
- return o;
- }
- public static int getUserRating(String user) throws IOException {
- UserContestRatingHistory f = getUserContestRatingHistory(user);
- return f.result[f.result.length-1].newRating;
- }
- public static double elo(int a, int b) {
- double elo = 1/(1 + 10*(((double)a - (double)b)/400));
- if(elo < 0) return -1;
- return (1 - elo);
- }
- public class UserContestRatingHistory {
- String status;
- contest[] result;
- public UserContestRatingHistory(String status, contest[] result) {
- this.status = status;
- this.result = result;
- }
- @Override
- public String toString() {
- return "out{" +
- "status='" + status + '\'' +
- ", result=" + Arrays.toString(result) +
- '}';
- }
- }
- public class UserContestRatingChange {
- String status;
- contest[] result;
- public UserContestRatingChange(String status, contest[] result) {
- this.status = status;
- this.result = result;
- }
- @Override
- public String toString() {
- return "out{" +
- "status='" + status + '\'' +
- ", result=" + Arrays.toString(result) +
- '}';
- }
- }
- public class contest{
- int contestId;
- String contestName;
- String handle;
- int rank;
- long ratingUpdateTimeSeconds;
- int oldRating;
- int newRating;
- public contest(int contestId, String contestName, String handle, int rank, long ratingUpdateTimeSeconds, int oldRating, int newRating) {
- this.contestId = contestId;
- this.contestName = contestName;
- this.handle = handle;
- this.rank = rank;
- this.ratingUpdateTimeSeconds = ratingUpdateTimeSeconds;
- this.oldRating = oldRating;
- this.newRating = newRating;
- }
- @Override
- public String toString() {
- return "obj{" +
- "contestId=" + contestId +
- ", contestName='" + contestName + '\'' +
- ", handle='" + handle + '\'' +
- ", rank=" + rank +
- ", ratingUpdateTimeSeconds=" + ratingUpdateTimeSeconds +
- ", oldRating=" + oldRating +
- ", newRating=" + newRating +
- '}';
- }
- }
- public static class seedRankRating implements Comparable<seedRankRating>{
- int seed;
- int rank;
- int rating;
- public seedRankRating(int seed, int rank, int rating) {
- this.seed = seed;
- this.rank = rank;
- this.rating = rating;
- }
- @Override
- public int compareTo(seedRankRating o) {
- return this.seed - o.seed;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement