diff --git a/tps/gabaritos/tp02/TP02Q07 - Fila circular em Java/Game.java b/tps/gabaritos/tp02/TP02Q07 - Fila circular em Java/Game.java new file mode 100644 index 0000000..f98a763 --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q07 - Fila circular em Java/Game.java @@ -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 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(); + this.genres = new ArrayList(); + 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 languages, ArrayList 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 languages) { this.languages = languages; } + public void setGenres(ArrayList 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 getLanguages() { return this.languages; } + public ArrayList 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 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 gamesFull = new ArrayList(); + 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(); + } + + // ------------------------------------------------------------------------------ // +} \ No newline at end of file diff --git a/tps/gabaritos/tp02/TP02Q07 - Fila circular em Java/pub.in b/tps/gabaritos/tp02/TP02Q07 - Fila circular em Java/pub.in new file mode 100644 index 0000000..cdedafd --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q07 - Fila circular em Java/pub.in @@ -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 \ No newline at end of file diff --git a/tps/gabaritos/tp02/TP02Q07 - Fila circular em Java/pub.out b/tps/gabaritos/tp02/TP02Q07 - Fila circular em Java/pub.out new file mode 100644 index 0000000..83abd24 --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q07 - Fila circular em Java/pub.out @@ -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] \ No newline at end of file diff --git a/tps/gabaritos/tp02/TP02Q07 - Fila circular em Java/saida.out b/tps/gabaritos/tp02/TP02Q07 - Fila circular em Java/saida.out new file mode 100644 index 0000000..406e14f --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q07 - Fila circular em Java/saida.out @@ -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]