Adiciona gabarito - TP02Q07

This commit is contained in:
Pedro Lopes 2022-10-17 22:09:27 -03:00
parent 0cf3b30b14
commit e84a042c96
No known key found for this signature in database
GPG Key ID: 5A82A7241FEC3A2E
4 changed files with 931 additions and 0 deletions

View File

@ -0,0 +1,702 @@
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;
import java.util.Scanner;
// ----------------------------------------------------------------------------------------------------------------- //
class GameQueue {
private Game[] array;
private int first;
private int last;
public GameQueue() {}
public GameQueue(int size) {
array = new Game[size + 1];
first = last = 0;
}
public void insert(Game movie) throws Exception {
if(((last + 1) % array.length) == first) throw new Exception("x Insert error: Full queue");
array[last] = movie;
last = (last + 1) % array.length;
}
public Game remove() throws Exception {
if(first == last) throw new Exception("x Remove error: Empty queue");
Game resp = array[first];
first = (first + 1) % array.length;
return resp;
}
public void print() {
int c = 0;
for(int i = first; i != last; i = ((i + 1) % array.length), c++) {
System.out.print("[" + ((last - first) == 1 ? "0" : c) + "] ");
array[i].print();
}
}
public int length() { return last - first; }
}
// ----------------------------------------------------------------------------------------------------------------- //
class Game {
static SimpleDateFormat default_dateFormat = new SimpleDateFormat("MMM/yyyy", Locale.ENGLISH);
private String name, owners, website, developers;
private ArrayList<String> languages, genres;
private Date release_date;
private int app_id, age, dlcs, avg_playtime;
private float price, upvotes;
private boolean windows, mac, linux;
public Game() {
this.name = this.owners = this.website = this.developers = null;
this.languages = new ArrayList<String>();
this.genres = new ArrayList<String>();
this.release_date = null;
this.app_id = this.age = this.dlcs = this.avg_playtime = -1;
this.price = this.upvotes = -1;
this.windows = this.mac = this.linux = false;
}
public Game(String name, String owners, String website, String developers, ArrayList<String> languages, ArrayList<String> genres, Date release_date, int app_id, int age, int dlcs, int upvotes, int avg_playtime, float price, boolean windows, boolean mac, boolean linux) {
this.name = name;
this.owners = owners;
this.website = website;
this.developers = developers;
this.languages = languages;
this.genres = genres;
this.release_date = release_date;
this.app_id = app_id;
this.age = age;
this.dlcs = dlcs;
this.upvotes = upvotes;
this.avg_playtime = avg_playtime;
this.price = price;
this.windows = windows;
this.mac = mac;
this.linux = linux;
}
public void setName(String name) { this.name = name; }
public void setOwners(String owners) { this.owners = owners; }
public void setWebsite(String website) { this.website = website; }
public void setDevelopers(String developers) { this.developers = developers; }
public void setLanguages(ArrayList<String> languages) { this.languages = languages; }
public void setGenres(ArrayList<String> genres) { this.genres = genres; }
public void setReleaseDate(Date release_date) { this.release_date = release_date; }
public void setAppId(int app_id) { this.app_id = app_id; }
public void setAge(int age) { this.age = age; }
public void setDlcs(int dlcs) { this.dlcs = dlcs; }
public void setAvgPlaytime(int avg_playtime) { this.avg_playtime = avg_playtime; }
public void setPrice(float price) { this.price = price; }
public void setUpvotes(float upvotes) { this.upvotes = upvotes; }
public void setWindows(boolean windows) { this.windows = windows; }
public void setMac(boolean mac) { this.mac = mac; }
public void setLinux(boolean linux) { this.linux = linux; }
public String getName() { return this.name; }
public String getOwners() { return this.owners; }
public String getWebsite() { return this.website; }
public String getDevelopers() { return this.developers; }
public ArrayList<String> getLanguages() { return this.languages; }
public ArrayList<String> getGenres() { return this.genres; }
public Date getReleaseDate() { return this.release_date; }
public int getAppId() { return this.app_id; }
public int getAge() { return this.age; }
public int getDlcs() { return this.dlcs; }
public int getAvgPlaytime() { return this.avg_playtime; }
public float getPrice() { return this.price; }
public float getUpvotes() { return this.upvotes; }
public boolean getWindows() { return this.windows; }
public boolean getMac() { return this.mac; }
public boolean getLinux() { return this.linux; }
public Game clone() {
Game cloned = new Game();
cloned.name = this.name;
cloned.owners = this.owners;
cloned.website = this.website;
cloned.developers = this.developers;
cloned.languages = this.languages;
cloned.genres = this.genres;
cloned.release_date = this.release_date;
cloned.app_id = this.app_id;
cloned.age = this.age;
cloned.dlcs = this.dlcs;
cloned.avg_playtime = this.avg_playtime;
cloned.price = this.price;
cloned.upvotes = this.upvotes;
cloned.windows = this.windows;
cloned.mac = this.mac;
cloned.linux = this.linux;
return cloned;
}
public static Game gameSearch(ArrayList<Game> games, int app_id) {
for(Game game : games) if(game.getAppId() == app_id) return game;
return null;
}
public void read(String line) {
char c_search;
int index = 0, atr_index = 0;
// ---------------------------------- //
// Find "AppID"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.app_id = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Name"
if(line.charAt(atr_index) != ',') {
if(line.charAt(atr_index) == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line.charAt(index) == c_search) {
this.name = line.substring(atr_index, index);
if(c_search == ',') index++;
else if(c_search == '\"') index += 2;
atr_index = index;
break;
}
}
}
else atr_index = ++index;
// ---------------------------------- //
// Find release date
if(line.charAt(atr_index) != ',') {
SimpleDateFormat df;
if(line.charAt(atr_index) == '\"') {
df = new SimpleDateFormat("MMM dd, yyyy", Locale.ENGLISH);
atr_index++;
c_search = '\"';
}
else {
df = new SimpleDateFormat("MMM yyyy", Locale.ENGLISH);
c_search = ',';
}
while(true) {
index++;
if(line.charAt(index) == c_search) {
try { this.release_date = df.parse(line.substring(atr_index, index)); }
catch (java.text.ParseException e) { e.printStackTrace(); }
if(c_search == ',') index++;
else if(c_search == '\"') index += 2;
atr_index = index;
break;
}
}
}
else atr_index = ++index;
// ---------------------------------- //
// Find "Owners"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.owners = line.substring(atr_index, index);
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Age"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.age = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Price"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.price = Float.parseFloat(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "DLCs"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.dlcs = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Languages"
while(true) {
index++;
if(line.charAt(index) == ']') {
index++;
if(line.charAt(index) == ',') index++;
else if(line.charAt(index) == '\"') index += 2;
atr_index = index;
break;
}
else if(line.charAt(index) == '\'') {
int wordStart = index + 1;
while(true) {
index++;
if(line.charAt(index) == '\'') {
this.languages.add(line.substring(wordStart, index));
break;
}
}
}
}
// ---------------------------------- //
// Find "Website"
if(line.charAt(atr_index) != ',') {
if(line.charAt(atr_index) == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line.charAt(index) == c_search) {
this.website = line.substring(atr_index, index);
atr_index = ++index;
break;
}
}
}
else atr_index = ++index;
// ---------------------------------- //
// Find "Windows"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.windows = Boolean.parseBoolean(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// Find "Mac"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.mac = Boolean.parseBoolean(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// Find "Linux"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.linux = Boolean.parseBoolean(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Upvotes"
int positives, negatives;
while(true) {
index++;
if(line.charAt(index) == ',') {
positives = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
while(true) {
index++;
if(line.charAt(index) == ',') {
negatives = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
this.upvotes = (float)(positives * 100) / (float)(positives + negatives);
// ---------------------------------- //
// Find "AVG Playtime"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.avg_playtime = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Developers"
if(line.charAt(atr_index) != ',') {
if(line.charAt(atr_index) == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line.charAt(index) == c_search) {
this.developers = line.substring(atr_index, index);
atr_index = ++index;
break;
}
}
}
else atr_index = ++index;
// ---------------------------------- //
// Find "Genres"
if(index < line.length() - 1) {
if(line.charAt(index) == ',') atr_index = ++index;
if(line.charAt(atr_index) == '\"') {
atr_index++;
while(true) {
index++;
if(line.charAt(index) == ',') {
this.genres.add(line.substring(atr_index, index));
atr_index = ++index;
}
else if(line.charAt(index) == '\"') {
this.genres.add(line.substring(atr_index, line.length() - 1));
break;
}
}
}
else this.genres.add(line.substring(atr_index, line.length()));
}
// -------------------------------------------------------------------------------- //
}
public void print() {
String avg_pt = null;
if(this.avg_playtime == 0) avg_pt = "null ";
else if(this.avg_playtime < 60) avg_pt = this.avg_playtime + "m ";
else {
if(this.avg_playtime % 60 == 0) avg_pt = this.avg_playtime / 60 + "h ";
else avg_pt = (this.avg_playtime / 60) + "h " + (this.avg_playtime % 60) + "m ";
}
DecimalFormat df = new DecimalFormat("##");
System.out.println(this.app_id + " " + this.name + " " + default_dateFormat.format(this.release_date) + " " + this.owners + " " + this.age + " " + String.format(Locale.ENGLISH, "%.2f", this.price) + " " + this.dlcs + " " + this.languages + " " + this.website + " " + this.windows + " " + this.mac + " " + this.linux + " " + (Float.isNaN(this.upvotes) ? "0% " : df.format(this.upvotes) + "% ") + avg_pt + this.developers + " " + this.genres);
}
// -------------------------------------------------------------------------------- //
public static String getGameData(String csvFile, int app_id) throws Exception {
try {
// Read CSV file
FileInputStream fstream = new FileInputStream(csvFile);
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
// ------------------------------------ //
// Start to explode CSV file
String line;
while((line = br.readLine()) != null) {
String id_s = Integer.toString(app_id);
if(line.substring(0, line.indexOf(',')).equals(id_s)) {
fstream.close();
br.close();
return line;
}
}
// Close CSV file
fstream.close();
}
catch(IOException e) { e.printStackTrace(); }
return null;
}
// -------------------------------------------------------------------------------------- //
public static void main(String[] args) throws Exception {
Scanner scr = new Scanner(System.in);
ArrayList<Game> gamesFull = new ArrayList<Game>();
String line;
// ------------------------------------------------------------------------------ //
// Fill full games list
try {
// Read CSV file
FileInputStream fstream = new FileInputStream("/tmp/games.csv");
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
// ------------------------------------ //
// Start to explode CSV file
while((line = br.readLine()) != null) {
Game game = new Game();
game.read(line);
gamesFull.add(game);
}
// Close CSV file
fstream.close();
}
catch(IOException e) { e.printStackTrace(); }
// ---------------------------------------------------------------------------------------------- //
// Fill production games list
GameQueue games = new GameQueue(5);
float total_avgPt = 0, c = 0;
line = scr.nextLine();
while(true) {
if(line.compareTo("FIM") == 0) break;
// ------------------------------------ //
Game found = gameSearch(gamesFull, Integer.parseInt(line));
if(found != null) {
try { games.insert(found); }
catch(java.lang.Exception e) {
total_avgPt -= games.remove().getAvgPlaytime();
c--;
games.insert(found);
}
// Print playtime avg
total_avgPt += found.getAvgPlaytime();
System.out.println(Math.round(total_avgPt / ++c));
}
// ------------------------------------ //
line = scr.nextLine();
}
// ---------------------------------------------------------------------------------------------- //
// Execute operations
int n_ops = Integer.parseInt(scr.nextLine());
for(int x = 0; x < n_ops; x++) {
line = scr.nextLine();
// -------------------------------- //
System.out.println(line);
// Identify operation
if(line.charAt(0) == 'I') {
Game found = gameSearch(gamesFull, Integer.parseInt(line.substring(2, line.length())));
try { games.insert(found); }
catch(java.lang.Exception e) {
total_avgPt -= games.remove().getAvgPlaytime();
c--;
games.insert(found);
}
// Print playtime avg
total_avgPt += found.getAvgPlaytime();
System.out.println(Math.round(total_avgPt / ++c));
}
else if(line.charAt(0) == 'R') System.out.println("(R) " + games.remove().getName());
}
games.print();
// ---------------------------------------------------------------------------------------------- //
scr.close();
}
// ------------------------------------------------------------------------------ //
}

View File

@ -0,0 +1,67 @@
1189490
300550
49800
1851280
1112930
275570
1276550
1096530
690510
1504570
1369470
270130
336150
573210
886470
1368820
951530
247370
1879330
1634290
259570
941650
768450
1347140
722670
711540
450170
730
598550
614090
809440
1923860
559010
1547380
554310
1124090
292120
691930
325420
663670
503820
49600
49300
1631930
1038740
336760
64000
487580
410890
363110
FIM
15
I 1487390
I 258520
I 1165270
I 298140
I 213610
I 50510
I 998660
I 1740720
I 24720
I 439550
I 1507410
R
R
R
R

View File

@ -0,0 +1,81 @@
2019
1460
978
809
647
284
104
556
833
1165
1125
1132
677
388
55
70
63
103
55
55
94
133
93
93
114
75
90
6187
6324
6358
6346
6292
196
59
57
54
401
407
476
450
503
246
381
312
323
271
300
199
261
223
I 1487390
341
I 258520
259
I 1165270
219
I 298140
160
I 213610
272
I 50510
158
I 998660
120
I 1740720
188
I 24720
371
I 439550
287
I 1507410
282
R
(R) Sopwith VR
R
(R) Have a Nice Death
R
(R) SPORE™ Galactic Adventures
R
(R) 'n Verlore Verstand
[0] 1507410 Coloring Book for Kids Mar/2021 50000 - 100000 0 0.00 1 [English, French, Italian, German, Arabic, Czech, Danish, Dutch, Hungarian, Japanese, Korean, Norwegian, Polish, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Spanish - Latin America, Swedish, Thai, Turkish, Vietnamese] null true true false 89% null Peaksel [Casual, Free to Play, Indie]

View File

@ -0,0 +1,81 @@
2019
1460
978
809
647
284
104
556
833
1165
1125
1132
677
388
55
70
63
103
55
55
94
133
93
93
114
75
90
6187
6324
6358
6346
6292
196
59
57
54
401
407
476
450
503
246
381
312
323
271
300
199
261
223
I 1487390
341
I 258520
259
I 1165270
219
I 298140
160
I 213610
272
I 50510
158
I 998660
120
I 1740720
188
I 24720
371
I 439550
287
I 1507410
282
R
(R) Sopwith VR
R
(R) Have a Nice Death
R
(R) SPORE™ Galactic Adventures
R
(R) 'n Verlore Verstand
[0] 1507410 Coloring Book for Kids Mar/2021 50000 - 100000 0 0.00 1 [English, French, Italian, German, Arabic, Czech, Danish, Dutch, Hungarian, Japanese, Korean, Norwegian, Polish, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Spanish - Latin America, Swedish, Thai, Turkish, Vietnamese] null true true false 89% null Peaksel [Casual, Free to Play, Indie]