diff --git a/README.md b/README.md index 4f7a869..66cb1ee 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,18 @@ -# AEDII +# 💻 AEDS II Repositório de códigos da disciplina de Algoritmos e Estrutura de Dados II -## Ajuda +## ❓ Ajuda +[Guia com os principais comandos](fonte/ajuda/README.md) -[Readme.md com os principais comandos.](fonte/ajuda/README.md) - -## fonte - -## labs -Ativdades dos laboratórios. +## 📁 Fonte +[Pasta com as bibliotecas usadas na disciplina](fonte/ajuda/java) -## tps +## ⚙️ Labs +[Pasta com os exercícios de treinamento do laboratório](labs) + + +## 🔥 TPS +[Pasta com os trabalhos práticos do laboratório](tps) diff --git a/tps/fonte/Game.java b/tps/gabaritos/tp02/TP02Q01 - Classe Filme em Java/Game.java similarity index 99% rename from tps/fonte/Game.java rename to tps/gabaritos/tp02/TP02Q01 - Classe Filme em Java/Game.java index be149f5..321ccc8 100644 --- a/tps/fonte/Game.java +++ b/tps/gabaritos/tp02/TP02Q01 - Classe Filme em Java/Game.java @@ -2,8 +2,8 @@ * @file Game.java * @author Pedro Lopes - * @version 0.2 - * @date 2022-10-02 + * @version 1.0 + * @date 2022-10-17 * @copyright Copyright (c) 2022 **/ diff --git a/tps/gabaritos/tp02/TP02Q01 - Classe Filme em Java/pedro.out b/tps/gabaritos/tp02/TP02Q01 - Classe Filme em Java/pedro.out new file mode 100644 index 0000000..929980c --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q01 - Classe Filme em Java/pedro.out @@ -0,0 +1,50 @@ +840010 Garden Paws Dec/2018 50000 - 100000 0 19.99 2 [English] http://www.gardenpawsgame.com true true false 92% 5h 46m Bitten Toast Games Inc. [Adventure, Indie, RPG, Simulation] +866510 !AnyWay! Jun/2018 50000 - 100000 0 1.79 37 [English, Russian, French, Italian, German, Polish, Ukrainian, Swedish, Simplified Chinese] null true false false 69% 5h 53m EYEFRONT [Adventure, Casual, Indie] +1970560 Bobbi Adventure May/2022 50000 - 100000 0 24.99 0 [English] null true false false 67% null Felio Stung ROG [Indie] +411740 Yet Another World Nov/2015 50000 - 100000 0 5.99 0 [English] null true true true 78% 6h 24m Energy Milk [Action, Adventure, Indie] +1509590 Fujiwara Bittersweet Jan/2021 50000 - 100000 0 0.00 0 [English] null true true true 91% null MagicBenchVN [Free to Play, Indie] +458520 Wrath of Anna Apr/2018 50000 - 100000 0 19.99 1 [English, Spanish - Spain, Hungarian, German, Norwegian, Polish, Swedish, Russian] http://LorenzoEnt.com true false false 35% 2h 50m Lorenzo Ent.,Michael L. Fiorentino Gutierrez [Action, Adventure, Indie] +920210 LEGO® Star Wars™: The Skywalker Saga Apr/2022 500000 - 1000000 0 49.99 8 [English, French, Italian, German, Spanish - Spain, Arabic, Danish, Dutch, Korean, Polish, Portuguese - Brazil, Russian, Spanish - Latin America, Traditional Chinese, Japanese] null true false false 92% 22h 42m TT Games [Action, Adventure] +1444020 Reactor Tech² Aug/2021 50000 - 100000 0 14.99 0 [English, Russian] null true false false 68% null 4Co [Indie, Simulation, Strategy] +1232460 Onee Chanbara ORIGIN Oct/2020 50000 - 100000 18 59.99 96 [English, Simplified Chinese, Traditional Chinese, Japanese, Korean] null true false false 72% 2h 25m Tamsoft [Action] +2026070 Tank Commander: Battlefield Jul/2022 50000 - 100000 0 2.99 0 [English] null true false false 100% null SP GAMES [Action, Indie, Simulation] +258880 Professional Farmer 2014 Nov/2013 50000 - 100000 0 2.99 2 [English, French, Italian, German, Spanish - Spain, Polish, Russian, Dutch, Swedish, Norwegian] http://www.professional-farmer.com/ true false false 46% 32h 9m PlayWay S.A. [Simulation] +295250 Stranded May/2014 50000 - 100000 0 0.49 0 [English] null true true true 35% 3h 56m Peter Moorhead [Adventure, Indie] +299500 International Snooker May/2014 50000 - 100000 0 5.99 0 [English] http://www.bigheadgames.co.uk/ true false false 62% 1h 11m Big Head Games Ltd [Casual, Sports] +574080 Fog of War Jun/2018 50000 - 100000 0 4.99 1 [English, Russian] null true false false 48% 6h 14m Monkeys Lab. [Action, Indie, Massively Multiplayer, RPG, Simulation, Strategy] +598780 Boreal Blade Nov/2020 50000 - 100000 0 3.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean, Portuguese - Brazil, Russian, Simplified Chinese] https://www.borealblade.com true false false 66% null Frozenbyte [Action, Early Access] +1217190 浮世万千之前世今生 Jan/2020 50000 - 100000 0 5.49 1 [Simplified Chinese] null true false false 78% null 飞天大胖喵 [Adventure, Casual, Indie, RPG, Strategy] +257730 Infinity Wars: Animated Trading Card Game Sep/2014 500000 - 1000000 0 0.00 0 [English, Simplified Chinese] http://www.infinitywarsgame.com true false false 77% 6h 24m Lightmare Studios [Indie, Massively Multiplayer, Strategy] +1807730 Lab Bio-Terror Dec/2021 50000 - 100000 0 12.99 0 [English] null true false false 82% null VOLTECH [Action, Indie] +773670 Delete Jan/2018 50000 - 100000 0 1.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Ukrainian, Russian, Bulgarian, Hungarian, Turkish, Greek, Norwegian, Czech, Japanese, Polish, Thai, Swedish, Simplified Chinese, Traditional Chinese, Romanian, Finnish, Dutch, Portuguese, Portuguese - Brazil, Arabic, Korean] null true true false 96% 1h 24m PONY [Casual, Indie] +1803150 Void Slayer Jan/2022 50000 - 100000 0 4.99 0 [English] null true false false 79% null Madmind Studio: After hours [Action, Indie] +1573070 Endless Furry Blackjack Mar/2021 50000 - 100000 0 0.99 0 [English] https://m.youtube.com/ericyoungvfx/ true false false 20% null Tegridy Made Games [Casual, Indie, Sports, Strategy] +513930 J.U.R : Japan Underground Racing Aug/2016 50000 - 100000 0 0.49 0 [English] null true false false 32% null JDM4iK [Casual, Indie, Racing, Simulation] +385250 Paint it Back Oct/2015 50000 - 100000 0 7.99 0 [English] http://casuallabs.com/wp/?page_id=24 true true true 98% null Casual Labs [Casual] +261880 Corporate Lifestyle Simulator Mar/2014 50000 - 100000 0 4.99 1 [English] http://www.dolphinbarn.com true false false 83% 4h 7m DolphinBarn [Action, Casual, Indie] +533300 Zup! Oct/2016 500000 - 1000000 0 0.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Bulgarian, Portuguese - Brazil, Hungarian, Greek, Danish, Traditional Chinese, Simplified Chinese, Korean, Dutch, Norwegian, Polish, Portuguese, Romanian, Russian, Thai, Turkish, Ukrainian, Finnish, Czech, Swedish, Japanese] http://quietriver.info/ true false false 94% 1h 42m Quiet River [Casual, Indie] +542340 Slingshot people Oct/2016 500000 - 1000000 0 0.99 0 [English] http://www.vsemagy.ru/index.php true false false 47% 3h 50m StalkerAlex [Action, Casual, Indie, Simulation] +1209040 Cyber Hunter Jun/2020 500000 - 1000000 0 0.00 0 [English, French, German, Spanish - Spain, Russian, Japanese, Simplified Chinese, Traditional Chinese, Portuguese - Brazil, Korean, Thai, Vietnamese] https://www.cyberhunter.game/ true false false 73% 5h 41m NetEase Games [Action, Free to Play, Massively Multiplayer] +8790 GTR 2 FIA GT Racing Game Dec/2012 50000 - 100000 0 7.99 0 [English] http://www.simbin.com/games/gtr2/ true false false 93% 11m SimBin Studios AB [Racing, Simulation, Sports] +8000 Tomb Raider: Anniversary Jun/2007 500000 - 1000000 13 8.99 0 [English, French, German, Italian, Spanish - Spain] http://www.tombraider.com/anniversary/ true false false 82% 6h Crystal Dynamics [Action, Adventure] +415150 Pang Adventures Apr/2016 50000 - 100000 0 9.99 0 [English, French, Italian, German, Spanish - Spain, Portuguese - Brazil, Russian] https://www.facebook.com/Pang.Adventures/ true false false 80% 3h 29m Dotemu [Action, Casual, Strategy] +2012500 The Katydids Incident Jun/2022 50000 - 100000 0 4.99 0 [English] https://punxstudios.co true false false 100% null Punx Studios [Indie, Simulation] +691150 Saku Saku: Love Blooms with the Cherry Blossoms Oct/2017 50000 - 100000 0 19.99 0 [English] null true false false 92% 5h 16m PALETTE [Sexual Content, Nudity, Casual] +283370 Marine Sharpshooter II: Jungle Warfare Apr/2014 50000 - 100000 0 2.99 0 [English] http://www.funboxmedia.co.uk/ true false false 32% 2h 3m Jarhead Games [Action] +249650 Blackguards Jan/2014 500000 - 1000000 0 0.99 2 [English, German, French, Spanish - Spain, Portuguese - Brazil, Russian, Italian, Japanese, Korean, Czech, Turkish, Polish, Simplified Chinese] http://www.blackguards-game.com true false false 62% 8h 58m Daedalic Entertainment [Indie, RPG, Strategy] +268870 Satellite Reign Aug/2015 500000 - 1000000 0 29.99 3 [English, French, Italian, German, Spanish - Spain, Czech, Russian] http://www.satellitereign.com/ true true true 71% 5h 18m 5 Lives Studios [Action, Indie, Strategy] +1172510 Unlock The King Nov/2019 50000 - 100000 0 0.99 0 [English] null true true false 96% null Minimol Games [Casual, Strategy] +927890 Hentai Girl Linda Dec/2018 50000 - 100000 0 0.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Ukrainian, Russian, Bulgarian, Hungarian, Turkish, Greek, Norwegian, Czech, Japanese, Polish, Thai, Swedish, Simplified Chinese, Traditional Chinese, Romanian, Finnish, Dutch, Portuguese, Portuguese - Brazil, Arabic, Korean, Spanish - Latin America, Vietnamese] null true true false 94% 1h 13m GirlGames [Casual, Indie, RPG, Simulation] +25700 Madballs in Babo:Invasion Sep/2009 50000 - 100000 0 4.99 7 [English, German, Korean, Portuguese, Spanish - Spain, French, Italian, Russian] http://www.baboinvasion.com true true false 84% 4h 15m Playbrains [Action, Casual, Indie] +281610 Homeworld: Deserts of Kharak Jan/2016 500000 - 1000000 0 49.99 4 [English, French, Italian, German, Spanish - Spain, Russian, Polish] http://www.desertsofkharak.com true true false 83% 8h 32m Blackbird Interactive [Strategy] +485610 Ball 3D: Soccer Online Mar/2017 500000 - 1000000 0 9.99 0 [English] http://www.ball3d.com true true false 83% 2h 49m Unusualsoft [Sports] +1276850 Kane's Shadow Apr/2020 50000 - 100000 0 0.00 0 [English] null true true false 67% null Plush Productions LLC [Casual, Indie] +722340 Captain vs Sky Pirates Oct/2017 50000 - 100000 0 2.99 5 [English] https://store.steampowered.com/publisher/boogygames/ true false false 25% null Boogygames Studios [Action, Adventure, Indie, Strategy] +1499640 Y.E.T.I Jan/2021 50000 - 100000 0 0.49 0 [English] https://anpa.us true false false 80% null Racing Bros [Action, Indie] +1848450 Nightmare of Decay May/2022 50000 - 100000 0 3.99 0 [English, French, Polish, Russian, Simplified Chinese, Traditional Chinese, Spanish - Latin America, Portuguese - Brazil, Italian, German, Czech, Hungarian, Turkish, Norwegian, Swedish] null true false false 98% 5h 56m Checkmaty [Action, Adventure, Indie] +615700 A Plunge into Darkness Mar/2020 50000 - 100000 0 5.99 1 [English] https://www.aldorlea.org/ true false false 73% null Aldorlea [Adventure, Indie, RPG, Simulation, Strategy] +744980 Super Club Soccer Oct/2019 50000 - 100000 0 0.00 0 [English] http://www.superclubsoccer.com/ true false true 69% null Trick27 Studios Limited [Free to Play, Massively Multiplayer, Sports, Early Access] +10180 Call of Duty®: Modern Warfare® 2 (2009) Nov/2009 5000000 - 10000000 0 19.99 2 [English, French, German, Italian, Spanish - Spain] https://www.callofduty.com/ true true false 93% 12h 56m Infinity Ward [Action] +234390 Teleglitch: Die More Edition Jul/2013 500000 - 1000000 0 3.24 1 [English] http://www.teleglitch.com true true true 85% 2h 20m Test3 Projects [Action, Indie] +1641670 EdgeOfTheAbyssAwaken Jun/2022 50000 - 100000 0 18.99 3 [English, Simplified Chinese] null true false false 74% null TrinityBJ [Action, Indie, RPG, Strategy] +427520 Factorio Aug/2020 5000000 - 10000000 0 30.00 1 [English, French, Italian, German, Spanish - Spain, Hungarian, Dutch, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Finnish, Swedish, Czech, Russian, Ukrainian, Japanese, Simplified Chinese, Traditional Chinese, Korean, Turkish] https://www.factorio.com true true true 97% 89h 43m Wube Software LTD. [Casual, Indie, Simulation, Strategy] diff --git a/tps/gabaritos/tp02/TP02Q01 - Classe Filme em Java/pub.in b/tps/gabaritos/tp02/TP02Q01 - Classe Filme em Java/pub.in new file mode 100644 index 0000000..cf004e0 --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q01 - Classe Filme em Java/pub.in @@ -0,0 +1,51 @@ +840010 +866510 +1970560 +411740 +1509590 +458520 +920210 +1444020 +1232460 +2026070 +258880 +295250 +299500 +574080 +598780 +1217190 +257730 +1807730 +773670 +1803150 +1573070 +513930 +385250 +261880 +533300 +542340 +1209040 +8790 +8000 +415150 +2012500 +691150 +283370 +249650 +268870 +1172510 +927890 +25700 +281610 +485610 +1276850 +722340 +1499640 +1848450 +615700 +744980 +10180 +234390 +1641670 +427520 +FIM diff --git a/tps/gabaritos/tp02/TP02Q01 - Classe Filme em Java/pub.out b/tps/gabaritos/tp02/TP02Q01 - Classe Filme em Java/pub.out new file mode 100644 index 0000000..929980c --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q01 - Classe Filme em Java/pub.out @@ -0,0 +1,50 @@ +840010 Garden Paws Dec/2018 50000 - 100000 0 19.99 2 [English] http://www.gardenpawsgame.com true true false 92% 5h 46m Bitten Toast Games Inc. [Adventure, Indie, RPG, Simulation] +866510 !AnyWay! Jun/2018 50000 - 100000 0 1.79 37 [English, Russian, French, Italian, German, Polish, Ukrainian, Swedish, Simplified Chinese] null true false false 69% 5h 53m EYEFRONT [Adventure, Casual, Indie] +1970560 Bobbi Adventure May/2022 50000 - 100000 0 24.99 0 [English] null true false false 67% null Felio Stung ROG [Indie] +411740 Yet Another World Nov/2015 50000 - 100000 0 5.99 0 [English] null true true true 78% 6h 24m Energy Milk [Action, Adventure, Indie] +1509590 Fujiwara Bittersweet Jan/2021 50000 - 100000 0 0.00 0 [English] null true true true 91% null MagicBenchVN [Free to Play, Indie] +458520 Wrath of Anna Apr/2018 50000 - 100000 0 19.99 1 [English, Spanish - Spain, Hungarian, German, Norwegian, Polish, Swedish, Russian] http://LorenzoEnt.com true false false 35% 2h 50m Lorenzo Ent.,Michael L. Fiorentino Gutierrez [Action, Adventure, Indie] +920210 LEGO® Star Wars™: The Skywalker Saga Apr/2022 500000 - 1000000 0 49.99 8 [English, French, Italian, German, Spanish - Spain, Arabic, Danish, Dutch, Korean, Polish, Portuguese - Brazil, Russian, Spanish - Latin America, Traditional Chinese, Japanese] null true false false 92% 22h 42m TT Games [Action, Adventure] +1444020 Reactor Tech² Aug/2021 50000 - 100000 0 14.99 0 [English, Russian] null true false false 68% null 4Co [Indie, Simulation, Strategy] +1232460 Onee Chanbara ORIGIN Oct/2020 50000 - 100000 18 59.99 96 [English, Simplified Chinese, Traditional Chinese, Japanese, Korean] null true false false 72% 2h 25m Tamsoft [Action] +2026070 Tank Commander: Battlefield Jul/2022 50000 - 100000 0 2.99 0 [English] null true false false 100% null SP GAMES [Action, Indie, Simulation] +258880 Professional Farmer 2014 Nov/2013 50000 - 100000 0 2.99 2 [English, French, Italian, German, Spanish - Spain, Polish, Russian, Dutch, Swedish, Norwegian] http://www.professional-farmer.com/ true false false 46% 32h 9m PlayWay S.A. [Simulation] +295250 Stranded May/2014 50000 - 100000 0 0.49 0 [English] null true true true 35% 3h 56m Peter Moorhead [Adventure, Indie] +299500 International Snooker May/2014 50000 - 100000 0 5.99 0 [English] http://www.bigheadgames.co.uk/ true false false 62% 1h 11m Big Head Games Ltd [Casual, Sports] +574080 Fog of War Jun/2018 50000 - 100000 0 4.99 1 [English, Russian] null true false false 48% 6h 14m Monkeys Lab. [Action, Indie, Massively Multiplayer, RPG, Simulation, Strategy] +598780 Boreal Blade Nov/2020 50000 - 100000 0 3.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean, Portuguese - Brazil, Russian, Simplified Chinese] https://www.borealblade.com true false false 66% null Frozenbyte [Action, Early Access] +1217190 浮世万千之前世今生 Jan/2020 50000 - 100000 0 5.49 1 [Simplified Chinese] null true false false 78% null 飞天大胖喵 [Adventure, Casual, Indie, RPG, Strategy] +257730 Infinity Wars: Animated Trading Card Game Sep/2014 500000 - 1000000 0 0.00 0 [English, Simplified Chinese] http://www.infinitywarsgame.com true false false 77% 6h 24m Lightmare Studios [Indie, Massively Multiplayer, Strategy] +1807730 Lab Bio-Terror Dec/2021 50000 - 100000 0 12.99 0 [English] null true false false 82% null VOLTECH [Action, Indie] +773670 Delete Jan/2018 50000 - 100000 0 1.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Ukrainian, Russian, Bulgarian, Hungarian, Turkish, Greek, Norwegian, Czech, Japanese, Polish, Thai, Swedish, Simplified Chinese, Traditional Chinese, Romanian, Finnish, Dutch, Portuguese, Portuguese - Brazil, Arabic, Korean] null true true false 96% 1h 24m PONY [Casual, Indie] +1803150 Void Slayer Jan/2022 50000 - 100000 0 4.99 0 [English] null true false false 79% null Madmind Studio: After hours [Action, Indie] +1573070 Endless Furry Blackjack Mar/2021 50000 - 100000 0 0.99 0 [English] https://m.youtube.com/ericyoungvfx/ true false false 20% null Tegridy Made Games [Casual, Indie, Sports, Strategy] +513930 J.U.R : Japan Underground Racing Aug/2016 50000 - 100000 0 0.49 0 [English] null true false false 32% null JDM4iK [Casual, Indie, Racing, Simulation] +385250 Paint it Back Oct/2015 50000 - 100000 0 7.99 0 [English] http://casuallabs.com/wp/?page_id=24 true true true 98% null Casual Labs [Casual] +261880 Corporate Lifestyle Simulator Mar/2014 50000 - 100000 0 4.99 1 [English] http://www.dolphinbarn.com true false false 83% 4h 7m DolphinBarn [Action, Casual, Indie] +533300 Zup! Oct/2016 500000 - 1000000 0 0.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Bulgarian, Portuguese - Brazil, Hungarian, Greek, Danish, Traditional Chinese, Simplified Chinese, Korean, Dutch, Norwegian, Polish, Portuguese, Romanian, Russian, Thai, Turkish, Ukrainian, Finnish, Czech, Swedish, Japanese] http://quietriver.info/ true false false 94% 1h 42m Quiet River [Casual, Indie] +542340 Slingshot people Oct/2016 500000 - 1000000 0 0.99 0 [English] http://www.vsemagy.ru/index.php true false false 47% 3h 50m StalkerAlex [Action, Casual, Indie, Simulation] +1209040 Cyber Hunter Jun/2020 500000 - 1000000 0 0.00 0 [English, French, German, Spanish - Spain, Russian, Japanese, Simplified Chinese, Traditional Chinese, Portuguese - Brazil, Korean, Thai, Vietnamese] https://www.cyberhunter.game/ true false false 73% 5h 41m NetEase Games [Action, Free to Play, Massively Multiplayer] +8790 GTR 2 FIA GT Racing Game Dec/2012 50000 - 100000 0 7.99 0 [English] http://www.simbin.com/games/gtr2/ true false false 93% 11m SimBin Studios AB [Racing, Simulation, Sports] +8000 Tomb Raider: Anniversary Jun/2007 500000 - 1000000 13 8.99 0 [English, French, German, Italian, Spanish - Spain] http://www.tombraider.com/anniversary/ true false false 82% 6h Crystal Dynamics [Action, Adventure] +415150 Pang Adventures Apr/2016 50000 - 100000 0 9.99 0 [English, French, Italian, German, Spanish - Spain, Portuguese - Brazil, Russian] https://www.facebook.com/Pang.Adventures/ true false false 80% 3h 29m Dotemu [Action, Casual, Strategy] +2012500 The Katydids Incident Jun/2022 50000 - 100000 0 4.99 0 [English] https://punxstudios.co true false false 100% null Punx Studios [Indie, Simulation] +691150 Saku Saku: Love Blooms with the Cherry Blossoms Oct/2017 50000 - 100000 0 19.99 0 [English] null true false false 92% 5h 16m PALETTE [Sexual Content, Nudity, Casual] +283370 Marine Sharpshooter II: Jungle Warfare Apr/2014 50000 - 100000 0 2.99 0 [English] http://www.funboxmedia.co.uk/ true false false 32% 2h 3m Jarhead Games [Action] +249650 Blackguards Jan/2014 500000 - 1000000 0 0.99 2 [English, German, French, Spanish - Spain, Portuguese - Brazil, Russian, Italian, Japanese, Korean, Czech, Turkish, Polish, Simplified Chinese] http://www.blackguards-game.com true false false 62% 8h 58m Daedalic Entertainment [Indie, RPG, Strategy] +268870 Satellite Reign Aug/2015 500000 - 1000000 0 29.99 3 [English, French, Italian, German, Spanish - Spain, Czech, Russian] http://www.satellitereign.com/ true true true 71% 5h 18m 5 Lives Studios [Action, Indie, Strategy] +1172510 Unlock The King Nov/2019 50000 - 100000 0 0.99 0 [English] null true true false 96% null Minimol Games [Casual, Strategy] +927890 Hentai Girl Linda Dec/2018 50000 - 100000 0 0.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Ukrainian, Russian, Bulgarian, Hungarian, Turkish, Greek, Norwegian, Czech, Japanese, Polish, Thai, Swedish, Simplified Chinese, Traditional Chinese, Romanian, Finnish, Dutch, Portuguese, Portuguese - Brazil, Arabic, Korean, Spanish - Latin America, Vietnamese] null true true false 94% 1h 13m GirlGames [Casual, Indie, RPG, Simulation] +25700 Madballs in Babo:Invasion Sep/2009 50000 - 100000 0 4.99 7 [English, German, Korean, Portuguese, Spanish - Spain, French, Italian, Russian] http://www.baboinvasion.com true true false 84% 4h 15m Playbrains [Action, Casual, Indie] +281610 Homeworld: Deserts of Kharak Jan/2016 500000 - 1000000 0 49.99 4 [English, French, Italian, German, Spanish - Spain, Russian, Polish] http://www.desertsofkharak.com true true false 83% 8h 32m Blackbird Interactive [Strategy] +485610 Ball 3D: Soccer Online Mar/2017 500000 - 1000000 0 9.99 0 [English] http://www.ball3d.com true true false 83% 2h 49m Unusualsoft [Sports] +1276850 Kane's Shadow Apr/2020 50000 - 100000 0 0.00 0 [English] null true true false 67% null Plush Productions LLC [Casual, Indie] +722340 Captain vs Sky Pirates Oct/2017 50000 - 100000 0 2.99 5 [English] https://store.steampowered.com/publisher/boogygames/ true false false 25% null Boogygames Studios [Action, Adventure, Indie, Strategy] +1499640 Y.E.T.I Jan/2021 50000 - 100000 0 0.49 0 [English] https://anpa.us true false false 80% null Racing Bros [Action, Indie] +1848450 Nightmare of Decay May/2022 50000 - 100000 0 3.99 0 [English, French, Polish, Russian, Simplified Chinese, Traditional Chinese, Spanish - Latin America, Portuguese - Brazil, Italian, German, Czech, Hungarian, Turkish, Norwegian, Swedish] null true false false 98% 5h 56m Checkmaty [Action, Adventure, Indie] +615700 A Plunge into Darkness Mar/2020 50000 - 100000 0 5.99 1 [English] https://www.aldorlea.org/ true false false 73% null Aldorlea [Adventure, Indie, RPG, Simulation, Strategy] +744980 Super Club Soccer Oct/2019 50000 - 100000 0 0.00 0 [English] http://www.superclubsoccer.com/ true false true 69% null Trick27 Studios Limited [Free to Play, Massively Multiplayer, Sports, Early Access] +10180 Call of Duty®: Modern Warfare® 2 (2009) Nov/2009 5000000 - 10000000 0 19.99 2 [English, French, German, Italian, Spanish - Spain] https://www.callofduty.com/ true true false 93% 12h 56m Infinity Ward [Action] +234390 Teleglitch: Die More Edition Jul/2013 500000 - 1000000 0 3.24 1 [English] http://www.teleglitch.com true true true 85% 2h 20m Test3 Projects [Action, Indie] +1641670 EdgeOfTheAbyssAwaken Jun/2022 50000 - 100000 0 18.99 3 [English, Simplified Chinese] null true false false 74% null TrinityBJ [Action, Indie, RPG, Strategy] +427520 Factorio Aug/2020 5000000 - 10000000 0 30.00 1 [English, French, Italian, German, Spanish - Spain, Hungarian, Dutch, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Finnish, Swedish, Czech, Russian, Ukrainian, Japanese, Simplified Chinese, Traditional Chinese, Korean, Turkish] https://www.factorio.com true true true 97% 89h 43m Wube Software LTD. [Casual, Indie, Simulation, Strategy] diff --git a/tps/fonte/game01.c b/tps/gabaritos/tp02/TP02Q02 - Registro em C/Game_alt.c similarity index 96% rename from tps/fonte/game01.c rename to tps/gabaritos/tp02/TP02Q02 - Registro em C/Game_alt.c index 39becc0..5c96434 100644 --- a/tps/fonte/game01.c +++ b/tps/gabaritos/tp02/TP02Q02 - Registro em C/Game_alt.c @@ -1,721 +1,721 @@ -// ------------------------------------------------------------------------------ // -// Author: Vinicius Gabriel dos Santos - https://github.com/ravixr -// Sep/2022 -// -// DESCRIPTION: -// In addition to the game data structure and -// the solution to the second question of the assignment, -// this file contains a basic implementation of a string type -// which was extensively used in the game data structure -// as well as in the solution algorithm. -// ------------------------------------------------------------------------------ // - -#include -#include -#include -#include -#include -#include - -#define GAME_FIELDS_SIZE 17 -#define MAX_FIELD_SIZE 500 -#define MAX_LINE_SIZE 1000 -#define MAX_GAMES 100 - -// If on windows remove first slash -> 'tmp/games.csv' -#define FILE_PATH "/tmp/games.csv" - -// Assert macro to print custom message when assertion fails -#define assert__(x) for (; !(x); assert(x)) - -// --------------------------- my_very_basic_string.h --------------------------- // - -typedef struct string_t string; - -typedef struct strarr_t strarr; - -struct string_t { - char *buf; - char (*char_at)(const string *, size_t); - int (*compare)(const string *, const string *); - void (*delete)(string *); - size_t (*find)(const string *, const char *); - size_t (*length)(const string *); - void (*replace)(string *, const char *, const char *); - strarr (*split)(const string *, const char *); - string (*substr)(const string *, size_t, size_t); - float (*to_float)(const string *); - int (*to_int)(const string *); - void (*trim)(string *); -}; - -struct strarr_t { - string *src; - size_t length; - void (*delete)(strarr *); -}; - -// string functions declaration -char str_char_at(const string *, size_t); -int str_compare(const string *, const string *); -void str_delete(string *); -size_t str_find(const string *, const char *); -size_t str_length(const string *); -void str_replace(string *, const char*, const char *); -string new_string(char *); -strarr str_split(const string *, const char *); -string str_substr(const string *, size_t, size_t); -float str_to_float(const string *); -int str_to_int(const string *); -void str_trim(string *); - -// strarr functions declaration -strarr new_strarr(string *, size_t); -void strarr_delete(strarr *); - -// --------------------------- my_very_basic_string.c --------------------------- // - -// Fuction to initialize string type -string new_string(char *src) -{ - string str; - if (src != NULL) { - if (strcmp(src, "") != 0) { - str.buf = malloc(sizeof(char) * (strlen(src) + 1)); - strcpy(str.buf, src); - } else { - str.buf = malloc(sizeof(char) * 5); - strcpy(str.buf, "null"); - } - } else str.buf = NULL; - str.char_at = &str_char_at; - str.compare = &str_compare; - str.delete = &str_delete; - str.find = &str_find; - str.replace = &str_replace; - str.length = &str_length; - str.split = &str_split; - str.substr = &str_substr; - str.to_float = &str_to_float; - str.to_int = &str_to_int; - str.trim = &str_trim; - return str; -} - -// Fuction to deallocate string type -void str_delete(string *self) -{ - free(self->buf); -} - -// Returns character present in the specified index of the string -// e.g: "foo" idx: 0 -> 'f' -char str_char_at(const string *self, size_t idx) -{ - // Macro to assert index is in bounds - assert__(idx < strlen(self->buf)) { - fprintf(stderr, "String index %ld is out of bounds\n", idx); - } - return self->buf[idx]; -} - -// Allows comparison between string type variables using strcmp in the raw data -int str_compare(const string *self, const string *another_str) -{ - return strcmp(self->buf, another_str->buf); -} - -// Searches the string for the first occurrence of the pattern specified. -// Returns the index position of the first character of the pattern -// or the length of the string if the pattern is not found -// e.g.: "foo bar", "bar" -> 4 | "foo bar", "baz" -> 7 -size_t str_find(const string *self, const char *lkf) -{ - size_t i = 0, - self_len = strlen(self->buf), - lkf_len = strlen(lkf); - - // Macro to assert pattern string is valid - assert__((strcmp(lkf, "") != 0) && (lkf_len <= self_len)) { - fprintf(stderr, "Pattern '%s' is invalid for the specified string\n", lkf); - } - - // Find algorithm - for (size_t j = 0; i < self_len; i++) { - if (self->buf[i] == lkf[j]) { - j++; - } else { - i-= j; j = 0; - } - if (j == lkf_len) { - i -= (j - 1); - break; - } - } - return i; -} - -// Returns the length of the string using strlen in the raw data -size_t str_length(const string *self) -{ - return strlen(self->buf); -} - -// Replaces all occurrences of specified pattern in the string with the new specified pattern -// if the string doesn't contains the pattern to be replaced the string is not changed -// e.g.: "foobar", "bar", "" -> "foo" | "foobar", "baz", "" -> "foobar" -void str_replace(string *self, const char *old_val, const char *new_val) -{ - // Saving useful lengths in variables - size_t old_len = strlen(self->buf), - nv_len = strlen(new_val), - ov_len = strlen(old_val); - - // Macro to assert given pattern is valid - assert__((strcmp(old_val, "") != 0) && (old_len >= ov_len)) { - fprintf(stderr, "Invalid pattern for argument 'old_val'\n"); - } - - // Calculating the max possible amount of patterns in the string - // then allocating an array to store their indexes - size_t idx_sz = (old_len / ov_len), - *idx = malloc(sizeof(size_t) * (idx_sz + 1)), - idx_i = 0, last_idx = 0, skip = 0; - - // Getting all starting indexes of where the pattern is found - string aux = new_string(NULL); - aux.buf = (self->buf); - while ((idx_i <= idx_sz) && (last_idx < old_len)) { - idx[idx_i] = str_find(&aux, old_val) + skip; - skip = idx[idx_i++] + ov_len; - aux.buf = (self->buf + skip); - last_idx = idx[idx_i - 1]; - } - - // Checking if the pattern is actually on the string - if (idx[0] != old_len) { - // Assuring 'idx_i' will not be 0 - idx_i > 1 ? (idx_i -= 1) : (idx_i = 1); - - // Calculating new length of the string then allocating - size_t new_len = (old_len + ((nv_len - ov_len) * idx_i)); - char *tmp = malloc(sizeof(char) * (new_len + 1)); - - // Main Replacement algorithm: copies old string char by char, - // when the index is equal to the range of the next found pattern - // starts copying the new pattern char by chat into the string - if (nv_len == 0) nv_len = 1; - for (size_t i = 0, j = 0, k = 0, l = 0; i < new_len;) { - if (k >= idx[l] && k < (idx[l] + ov_len)) { - if (strcmp(new_val, "") != 0) - tmp[i++] = new_val[j]; - j++; - if (j == nv_len) { - k += ov_len; - j = 0; l++; - } - } else tmp[i++] = self->buf[k++]; - } - tmp[new_len] = '\0'; // Adding null terminator in the new string - free(self->buf); // freeing old string - self->buf = tmp; // Pointing to new string - } - free(idx); // freeing array of indexes of the old string -} - -// Uses strtok to split the raw char array -// then build new strings with the splitted char arrays -// and bundle all of them in the strarr type -// e.g.: 'foo,bar' ',' -> ['foo', 'bar'] -strarr str_split(const string *self, const char *delim) -{ - char *str = malloc(sizeof(char) * (strlen(self->buf) + 1)); - strcpy(str, self->buf); - char *token = strtok(str, delim); - size_t count = 0; - strarr str_arr = new_strarr(NULL, 0); - string *tmp; - while(token != NULL) { - tmp = realloc(str_arr.src, sizeof(string) * (count + 1)); - if (tmp != NULL) { - tmp[count++] = new_string(token); - str_arr.src = tmp; - } - token = strtok(NULL, delim); - } - free(str); - free(token); - str_arr.length = count; - return str_arr; -} - -// Returns a new string that is a copy of the portion of the original string -// that starts at character position 'pos' and spans 'len' characters -// e.g.: "foo bar" pos: 4, len: 3 -> "bar" -string str_substr(const string *self, size_t pos, size_t len) -{ - // Macro to assert pos and len are in bounds - assert__((pos + len) <= strlen(self->buf)) { - fprintf(stderr, "String index %ld is out of bounds for '%s'\n", (pos + len), self->buf); - } - string substr = new_string(NULL); - substr.buf = malloc(sizeof(char) * (len + 1)); - for (size_t i = 0, j = 0; i < len; i++, j++) { - substr.buf[j] = self->buf[pos + i]; - } - substr.buf[len] = '\0'; - return substr; -} - -// Uses atof to convert string to float -float str_to_float(const string *self) -{ - return atof(self->buf); -} - -// Uses atoi to convert string to int -int str_to_int(const string *self) -{ - return atoi(self->buf); -} - -// Removes all spaces only from the beginning and ending of the string -// e.g.: " foo " -> "foo" | "foo bar" -> "foo bar" -void str_trim(string *self) -{ - size_t i = 0, j = (strlen(self->buf) - 1); - while (self->buf[i] == ' ' || self->buf[j] == ' ') { - if (self->buf[i] == ' ') i++; - if (self->buf[j] == ' ') j--; - } - string tmp = self->substr(self, i, (j - i) + 1); - free(self->buf); - self->buf = tmp.buf; -} - -// Fuction to initialize string array type -strarr new_strarr(string *src, size_t src_length) -{ - strarr str_arr; - if (src != NULL) - str_arr.src = src; - else { - src_length = (src_length > 0 ? src_length : 1); - str_arr.src = malloc(sizeof(string *)); - } - str_arr.length = src_length; - str_arr.delete = &strarr_delete; - return str_arr; -} - -// Fuction to deallocate string array type -void strarr_delete(strarr *self) -{ - for (size_t i = 0; i < self->length; i++) { - free(self->src[i].buf); - } - free(self->src); -} - -// ----------------------------------- game.h ----------------------------------- // - -typedef struct date_t date; - -struct date_t { - uint8_t day; - char month[4]; - unsigned year; - size_t value; -}; - -date new_date(string *); -unsigned strmon_to_int(const char *); - -typedef struct game_t game; - -struct game_t { - unsigned app_id; - string name; - date release_date; - string owners; - unsigned age; - float price; - unsigned dlcs; - strarr languages; - string website; - bool windows; - bool mac; - bool linux_; - float upvotes; - unsigned avg_pt; - string developers; - strarr genres; -}; - -game empty_game(void); -game new_game(string *); -game str_to_game(string *); -game chararr_to_game(char *); -void game_print(game *); -void game_read_csv(game *, size_t *, size_t); -char *avgpt_to_chararr (unsigned); - -// ----------------------------------- game.c ----------------------------------- // - -// Converts month abbreviated char array in format 'Mmm' -// to unsigned int, if unsuccessful returns 0 -// e.g.: "Aug" -> 8 | "aug" -> 0 -unsigned strmon_to_int(const char *mon) -{ - unsigned i = 0; - if (strcmp(mon, "Jan") == 0) { i = 1; } - else if (strcmp(mon, "Feb") == 0) { i = 2; } - else if (strcmp(mon, "Mar") == 0) { i = 3; } - else if (strcmp(mon, "Apr") == 0) { i = 4; } - else if (strcmp(mon, "May") == 0) { i = 5; } - else if (strcmp(mon, "Jun") == 0) { i = 6; } - else if (strcmp(mon, "Jul") == 0) { i = 7; } - else if (strcmp(mon, "Aug") == 0) { i = 8; } - else if (strcmp(mon, "Sep") == 0) { i = 9; } - else if (strcmp(mon, "Oct") == 0) { i = 10; } - else if (strcmp(mon, "Nov") == 0) { i = 11; } - else if (strcmp(mon, "Dec") == 0) { i = 12; } - return i; -} - -// Fuction to initialize date type -// Assumes that argument is a string -// in the format 'mmm dd, yyyy' or 'mmm yyyy' -// or NULL for empty initialization -date new_date(string *fmt) -{ - date d; - if (fmt != NULL) { - uint8_t i = 0; - string aux; - // If the format is 'mmm dd, yyyy' - if (strlen(fmt->buf) > 10) { - // parsing day - i = fmt->find(fmt, ",") - 4; - aux = fmt->substr(fmt, 4, i); - d.day = aux.to_int(&aux); - aux.delete(&aux); - - // parsing month - aux = fmt->substr(fmt, 0, 3); - strcpy(d.month, aux.buf); - aux.delete(&aux); - - // parsing year - i = fmt->find(fmt, ",") + 2; - aux = fmt->substr(fmt, i, (fmt->length(fmt) - i)); - d.year = aux.to_int(&aux); - aux.delete(&aux); - } else { // Assuming format is 'mmm yyyy' - // no day provided in this format - d.day = 0; - - // parsing month - i = fmt->find(fmt, " "); - aux = fmt->substr(fmt, 0, i); - strcpy(d.month, aux.buf); - aux.delete(&aux); - - // parsing year - aux = fmt->substr(fmt, (i + 1), fmt->length(fmt) - (i + 1)); - d.year = aux.to_int(&aux); - aux.delete(&aux); - } - // parsing value - unsigned mon = strmon_to_int(d.month); - d.value = ((d.year * 10000) + (mon * 100) + d.day); - } else { - d.day = 0; - strcpy(d.month, "mmm"); - d.year = 0; - d.value = 0; - } - return d; -} - -// Function to initialize -// an 'empty' game struct -game empty_game(void) -{ - game g; - g.app_id = 0; - g.name = new_string(""); - g.release_date = new_date(NULL); - g.owners = new_string(""); - g.age = 0; - g.price = 0.0f; - g.dlcs = 0; - g.languages = new_strarr(NULL, 0); - g.website = new_string(""); - g.windows = false; - g.mac = false; - g.linux_ = false; - g.upvotes = 0.0f; - g.avg_pt = 0; - g.developers = new_string(""); - g.genres = new_strarr(NULL, 0); - return g; -} - -// Function to initialize a new game with -// the retrievd data in the string array -game new_game(string *s_arr) -{ - game g; - if (s_arr != NULL) { - // App id - g.app_id = atoi(s_arr[0].buf); - // Name - g.name = new_string(s_arr[1].buf); - // Release date - g.release_date = new_date(s_arr + 2); - // Owners - g.owners = new_string(s_arr[3].buf); - // Age, Price, DLCs - g.age = atoi(s_arr[4].buf); - g.price = atof(s_arr[5].buf); - g.dlcs = atoi(s_arr[6].buf); - // Languages - // If string is not empty then splits it into a string array - if (strcmp(s_arr[7].buf, "[]") != 0) { - string tmp = s_arr[7].substr(s_arr + 7, 2, strlen(s_arr[7].buf) - 4); - tmp.replace(&tmp, "', '", "|"); - g.languages = tmp.split(&tmp, "|"); - tmp.delete(&tmp); - } else { - g.languages = new_strarr(NULL, 0); - string *tmp = realloc(g.languages.src, sizeof(string)); - if (tmp != NULL) { - tmp[0] = new_string(""); - g.languages.src = tmp; - g.languages.length = 1; - } - } - // Website - g.website = new_string(s_arr[8].buf); - // Windows, Mac, Linux - g.windows = (strcmp(s_arr[9].buf, "True") == 0) ? true : false; - g.mac = (strcmp(s_arr[10].buf, "True") == 0) ? true : false; - g.linux_ = (strcmp(s_arr[11].buf, "True") == 0) ? true : false; - // Upvotes - float up_votes = atof(s_arr[12].buf); - float down_votes = atof(s_arr[13].buf); - g.upvotes = (up_votes / ((up_votes + down_votes) / 100)); - // Avg pt - g.avg_pt = atoi(s_arr[14].buf); - // Developers - g.developers = new_string(s_arr[15].buf); - // Genres - // If string is not empty and has a ',' then splits it into a string array - if ((strcmp(s_arr[16].buf, "") != 0) && - (s_arr[16].find(s_arr + 16, ",") != strlen(s_arr[16].buf))) { - g.genres = s_arr[16].split(s_arr + 16, ","); - } else { - g.genres = new_strarr(NULL, 0); - string *tmp = realloc(g.genres.src, sizeof(string)); - if (tmp != NULL) { - tmp[0] = new_string(s_arr[16].buf); - g.genres.src = tmp; - g.genres.length = 1; - } - } - } else g = empty_game(); - return g; -} - -// function to deallocates all -// the heap variables inside the game struct -void game_delete(game *g) -{ - if (g != NULL) { - g->name.delete(&g->name); - g->owners.delete(&g->owners); - g->languages.delete(&g->languages); - g->website.delete(&g->website); - g->developers.delete(&g->developers); - g->genres.delete(&g->genres); - } -} - -// Receives a char array that contains -// the data of the game strut in a csv format -// parses it and returns a game data structure -game chararr_to_game(char *ch_arr) -{ - game g; - if (ch_arr != NULL) { - // Initializing static array of strings - // where each index will be a field of the game data struct - string s_arr[GAME_FIELDS_SIZE]; - for (int i = 0; i < GAME_FIELDS_SIZE; i++) { - s_arr[i] = new_string(NULL); - } - - // Initializing variables for the split algorithm - string aux = new_string(NULL); - aux.buf = malloc(sizeof(char) * MAX_LINE_SIZE); - size_t ch_arr_len = strlen(ch_arr), s_arr_i = 0, aux_i = 0; - bool is_str_lit = false; - - // Loop to split each csv cell into a string - // and adds it to the array of strings - for (size_t i = 0; i < ch_arr_len; i++) { - if (ch_arr[i] == '"') { - is_str_lit = (is_str_lit ? false : true); - } else if (ch_arr[i] == ',' && !is_str_lit) { - aux.buf[aux_i] = '\0'; - s_arr[s_arr_i].buf = malloc(sizeof(char) * (strlen(aux.buf) + 1)); - strcpy(s_arr[s_arr_i].buf, aux.buf); - s_arr_i++; aux_i = 0; - } else { - aux.buf[aux_i++] = ch_arr[i]; - } - } - // Adding last string cell to the array - aux.buf[aux_i] = '\0'; - s_arr[s_arr_i].buf = malloc(sizeof(char) * (strlen(aux.buf) + 1)); - strcpy(s_arr[s_arr_i].buf, aux.buf); - aux.delete(&aux); - // Creating game with parsed data - g = new_game(s_arr); - - // Deallocating the string array - for (size_t i = 0; i < GAME_FIELDS_SIZE; i++) { - free(s_arr[i].buf); - } - } else g = empty_game(); - return g; -} - -// Converts avg_pt (int with amount of minutes) -// to a string in format '[x]h [y]m' returns -// a string with 'null' if avg_pt equals zero -char *avgpt_to_chararr (unsigned avg_pt) -{ - char *c_arr = calloc(16, sizeof(char)); - if (avg_pt != 0) { - unsigned h = avg_pt / 60; - unsigned m = avg_pt % 60; - - if (h != 0 && m != 0) { - snprintf(c_arr, 16, "%dh %dm", h, m); - } else if (h != 0) { - snprintf(c_arr, 16, "%dh", h); - } else if (m != 0) { - snprintf(c_arr, 16, "%dm", m); - } - } else { - strcpy(c_arr, "null"); - } - return c_arr; -} - -// prints the game structure in the format -// as is specified in the assignment -void game_print(game *g) -{ - printf("%u %s %s/%d %s %u %.2f %u [", - g->app_id, g->name.buf, - g->release_date.month, - g->release_date.year, - g->owners.buf, g->age, - g->price, g->dlcs); - // languages - for (size_t i = 0; i < g->languages.length - 1; i++) - printf("%s, ", g->languages.src[i].buf); - char *aux = avgpt_to_chararr(g->avg_pt); - printf("%s] %s %s %s %s %.0f%% %s %s [", - g->languages.src[g->languages.length - 1].buf, g->website.buf, - (g->windows ? "true" : "false"), (g->mac ? "true" : "false"), - (g->linux_ ? "true" : "false"), g->upvotes, aux, g->developers.buf); - free(aux); - // genres - for (size_t i = 0; i < g->genres.length - 1; i++) - printf("%s, ", g->genres.src[i].buf); - printf("%s]\n", g->genres.src[g->genres.length - 1].buf); -} - -// Search for the matching 'app_id' and read the game data -// from the file 'games.csv' then adds the game to the games array -void game_read_csv(game *games, size_t *ids, size_t ids_len) -{ - // Handling file opening - FILE *f = fopen(FILE_PATH, "r"); - assert__(f != NULL) { - fprintf(stderr, "Failed to open '%s'\n%s", FILE_PATH, - "Hint: Try adding or removing a '/' in front (OS Dependent)\n"); - } - - char line[MAX_LINE_SIZE + 1]; - size_t cur_id = 0; - // Searching the desired id then calling the parser function - for (size_t i = 0; i < ids_len; i++) { - while (cur_id != ids[i]) { - // reads line from file - fgets(line, MAX_LINE_SIZE, f); - // checking if is a reserved char to then trim it - if (line[strlen(line) - 2] < ' ') line[strlen(line) - 2] = '\0'; - else if (line[strlen(line) - 1] < ' ') line[strlen(line) - 1] = '\0'; - // atoi will only parse the beginning of the string ;) - cur_id = atoi(line); - } - rewind(f); // Resets file pointer to the beginning of the file - games[i] = chararr_to_game(line); // calling parser function - } - fclose(f); // closing the file -} - -// ------------------------------------ main ------------------------------------ // - -// Uses strcmp to check if -// input string equals 'FIM' -// meaning end of input -bool is_fim(char *c_arr) -{ - return (strcmp(c_arr, "FIM") == 0); -} - -// The main function contains the solution to -// the second question of the assignment, which is -// to read 'n' lines of strings containing the -// desired IDs of games to be read from the file 'games.csv', -// parse the data, store it in a game struct already defined, -// and print all of them in a specified format. -int main(void) -{ - // game array - game games[MAX_GAMES]; - size_t games_sz = 0; - // input variables - char input[MAX_FIELD_SIZE ]; - size_t ids[MAX_GAMES]; - - // Reading input and converting to integer - // then adding it to the array of ids to be searched - fgets(input, MAX_LINE_SIZE, stdin); - input[strlen(input) - 1] = '\0'; - while (!is_fim(input)) { - ids[games_sz++] = atoi(input); - fgets(input, MAX_LINE_SIZE, stdin); - // checking if is a reserved char to then trim it - if (input[strlen(input) - 2] < ' ') input[strlen(input) - 2] = '\0'; - else if (input[strlen(input) - 1] < ' ') input[strlen(input) - 1] = '\0'; - } - // If the array of ids is not empty - if (games_sz > 0) { - // Calls function to read from file and populate array of games - game_read_csv(games, ids, games_sz); - - // Prints the games read and frees the heap allocated memory - for (size_t i = 0; i < games_sz; i++) { - game_print(games + i); - game_delete(games + i); - } - } - return 0; -} +// ------------------------------------------------------------------------------ // +// Author: Vinicius Gabriel dos Santos - https://github.com/ravixr +// Sep/2022 +// +// DESCRIPTION: +// In addition to the game data structure and +// the solution to the second question of the assignment, +// this file contains a basic implementation of a string type +// which was extensively used in the game data structure +// as well as in the solution algorithm. +// ------------------------------------------------------------------------------ // + +#include +#include +#include +#include +#include +#include + +#define GAME_FIELDS_SIZE 17 +#define MAX_FIELD_SIZE 500 +#define MAX_LINE_SIZE 1000 +#define MAX_GAMES 100 + +// If on windows remove first slash -> 'tmp/games.csv' +#define FILE_PATH "/tmp/games.csv" + +// Assert macro to print custom message when assertion fails +#define assert__(x) for (; !(x); assert(x)) + +// --------------------------- my_very_basic_string.h --------------------------- // + +typedef struct string_t string; + +typedef struct strarr_t strarr; + +struct string_t { + char *buf; + char (*char_at)(const string *, size_t); + int (*compare)(const string *, const string *); + void (*delete)(string *); + size_t (*find)(const string *, const char *); + size_t (*length)(const string *); + void (*replace)(string *, const char *, const char *); + strarr (*split)(const string *, const char *); + string (*substr)(const string *, size_t, size_t); + float (*to_float)(const string *); + int (*to_int)(const string *); + void (*trim)(string *); +}; + +struct strarr_t { + string *src; + size_t length; + void (*delete)(strarr *); +}; + +// string functions declaration +char str_char_at(const string *, size_t); +int str_compare(const string *, const string *); +void str_delete(string *); +size_t str_find(const string *, const char *); +size_t str_length(const string *); +void str_replace(string *, const char*, const char *); +string new_string(char *); +strarr str_split(const string *, const char *); +string str_substr(const string *, size_t, size_t); +float str_to_float(const string *); +int str_to_int(const string *); +void str_trim(string *); + +// strarr functions declaration +strarr new_strarr(string *, size_t); +void strarr_delete(strarr *); + +// --------------------------- my_very_basic_string.c --------------------------- // + +// Fuction to initialize string type +string new_string(char *src) +{ + string str; + if (src != NULL) { + if (strcmp(src, "") != 0) { + str.buf = malloc(sizeof(char) * (strlen(src) + 1)); + strcpy(str.buf, src); + } else { + str.buf = malloc(sizeof(char) * 5); + strcpy(str.buf, "null"); + } + } else str.buf = NULL; + str.char_at = &str_char_at; + str.compare = &str_compare; + str.delete = &str_delete; + str.find = &str_find; + str.replace = &str_replace; + str.length = &str_length; + str.split = &str_split; + str.substr = &str_substr; + str.to_float = &str_to_float; + str.to_int = &str_to_int; + str.trim = &str_trim; + return str; +} + +// Fuction to deallocate string type +void str_delete(string *self) +{ + free(self->buf); +} + +// Returns character present in the specified index of the string +// e.g: "foo" idx: 0 -> 'f' +char str_char_at(const string *self, size_t idx) +{ + // Macro to assert index is in bounds + assert__(idx < strlen(self->buf)) { + fprintf(stderr, "String index %ld is out of bounds\n", idx); + } + return self->buf[idx]; +} + +// Allows comparison between string type variables using strcmp in the raw data +int str_compare(const string *self, const string *another_str) +{ + return strcmp(self->buf, another_str->buf); +} + +// Searches the string for the first occurrence of the pattern specified. +// Returns the index position of the first character of the pattern +// or the length of the string if the pattern is not found +// e.g.: "foo bar", "bar" -> 4 | "foo bar", "baz" -> 7 +size_t str_find(const string *self, const char *lkf) +{ + size_t i = 0, + self_len = strlen(self->buf), + lkf_len = strlen(lkf); + + // Macro to assert pattern string is valid + assert__((strcmp(lkf, "") != 0) && (lkf_len <= self_len)) { + fprintf(stderr, "Pattern '%s' is invalid for the specified string\n", lkf); + } + + // Find algorithm + for (size_t j = 0; i < self_len; i++) { + if (self->buf[i] == lkf[j]) { + j++; + } else { + i-= j; j = 0; + } + if (j == lkf_len) { + i -= (j - 1); + break; + } + } + return i; +} + +// Returns the length of the string using strlen in the raw data +size_t str_length(const string *self) +{ + return strlen(self->buf); +} + +// Replaces all occurrences of specified pattern in the string with the new specified pattern +// if the string doesn't contains the pattern to be replaced the string is not changed +// e.g.: "foobar", "bar", "" -> "foo" | "foobar", "baz", "" -> "foobar" +void str_replace(string *self, const char *old_val, const char *new_val) +{ + // Saving useful lengths in variables + size_t old_len = strlen(self->buf), + nv_len = strlen(new_val), + ov_len = strlen(old_val); + + // Macro to assert given pattern is valid + assert__((strcmp(old_val, "") != 0) && (old_len >= ov_len)) { + fprintf(stderr, "Invalid pattern for argument 'old_val'\n"); + } + + // Calculating the max possible amount of patterns in the string + // then allocating an array to store their indexes + size_t idx_sz = (old_len / ov_len), + *idx = malloc(sizeof(size_t) * (idx_sz + 1)), + idx_i = 0, last_idx = 0, skip = 0; + + // Getting all starting indexes of where the pattern is found + string aux = new_string(NULL); + aux.buf = (self->buf); + while ((idx_i <= idx_sz) && (last_idx < old_len)) { + idx[idx_i] = str_find(&aux, old_val) + skip; + skip = idx[idx_i++] + ov_len; + aux.buf = (self->buf + skip); + last_idx = idx[idx_i - 1]; + } + + // Checking if the pattern is actually on the string + if (idx[0] != old_len) { + // Assuring 'idx_i' will not be 0 + idx_i > 1 ? (idx_i -= 1) : (idx_i = 1); + + // Calculating new length of the string then allocating + size_t new_len = (old_len + ((nv_len - ov_len) * idx_i)); + char *tmp = malloc(sizeof(char) * (new_len + 1)); + + // Main Replacement algorithm: copies old string char by char, + // when the index is equal to the range of the next found pattern + // starts copying the new pattern char by chat into the string + if (nv_len == 0) nv_len = 1; + for (size_t i = 0, j = 0, k = 0, l = 0; i < new_len;) { + if (k >= idx[l] && k < (idx[l] + ov_len)) { + if (strcmp(new_val, "") != 0) + tmp[i++] = new_val[j]; + j++; + if (j == nv_len) { + k += ov_len; + j = 0; l++; + } + } else tmp[i++] = self->buf[k++]; + } + tmp[new_len] = '\0'; // Adding null terminator in the new string + free(self->buf); // freeing old string + self->buf = tmp; // Pointing to new string + } + free(idx); // freeing array of indexes of the old string +} + +// Uses strtok to split the raw char array +// then build new strings with the splitted char arrays +// and bundle all of them in the strarr type +// e.g.: 'foo,bar' ',' -> ['foo', 'bar'] +strarr str_split(const string *self, const char *delim) +{ + char *str = malloc(sizeof(char) * (strlen(self->buf) + 1)); + strcpy(str, self->buf); + char *token = strtok(str, delim); + size_t count = 0; + strarr str_arr = new_strarr(NULL, 0); + string *tmp; + while(token != NULL) { + tmp = realloc(str_arr.src, sizeof(string) * (count + 1)); + if (tmp != NULL) { + tmp[count++] = new_string(token); + str_arr.src = tmp; + } + token = strtok(NULL, delim); + } + free(str); + free(token); + str_arr.length = count; + return str_arr; +} + +// Returns a new string that is a copy of the portion of the original string +// that starts at character position 'pos' and spans 'len' characters +// e.g.: "foo bar" pos: 4, len: 3 -> "bar" +string str_substr(const string *self, size_t pos, size_t len) +{ + // Macro to assert pos and len are in bounds + assert__((pos + len) <= strlen(self->buf)) { + fprintf(stderr, "String index %ld is out of bounds for '%s'\n", (pos + len), self->buf); + } + string substr = new_string(NULL); + substr.buf = malloc(sizeof(char) * (len + 1)); + for (size_t i = 0, j = 0; i < len; i++, j++) { + substr.buf[j] = self->buf[pos + i]; + } + substr.buf[len] = '\0'; + return substr; +} + +// Uses atof to convert string to float +float str_to_float(const string *self) +{ + return atof(self->buf); +} + +// Uses atoi to convert string to int +int str_to_int(const string *self) +{ + return atoi(self->buf); +} + +// Removes all spaces only from the beginning and ending of the string +// e.g.: " foo " -> "foo" | "foo bar" -> "foo bar" +void str_trim(string *self) +{ + size_t i = 0, j = (strlen(self->buf) - 1); + while (self->buf[i] == ' ' || self->buf[j] == ' ') { + if (self->buf[i] == ' ') i++; + if (self->buf[j] == ' ') j--; + } + string tmp = self->substr(self, i, (j - i) + 1); + free(self->buf); + self->buf = tmp.buf; +} + +// Fuction to initialize string array type +strarr new_strarr(string *src, size_t src_length) +{ + strarr str_arr; + if (src != NULL) + str_arr.src = src; + else { + src_length = (src_length > 0 ? src_length : 1); + str_arr.src = malloc(sizeof(string *)); + } + str_arr.length = src_length; + str_arr.delete = &strarr_delete; + return str_arr; +} + +// Fuction to deallocate string array type +void strarr_delete(strarr *self) +{ + for (size_t i = 0; i < self->length; i++) { + free(self->src[i].buf); + } + free(self->src); +} + +// ----------------------------------- game.h ----------------------------------- // + +typedef struct date_t date; + +struct date_t { + uint8_t day; + char month[4]; + unsigned year; + size_t value; +}; + +date new_date(string *); +unsigned strmon_to_int(const char *); + +typedef struct game_t game; + +struct game_t { + unsigned app_id; + string name; + date release_date; + string owners; + unsigned age; + float price; + unsigned dlcs; + strarr languages; + string website; + bool windows; + bool mac; + bool linux_; + float upvotes; + unsigned avg_pt; + string developers; + strarr genres; +}; + +game empty_game(void); +game new_game(string *); +game str_to_game(string *); +game chararr_to_game(char *); +void game_print(game *); +void game_read_csv(game *, size_t *, size_t); +char *avgpt_to_chararr (unsigned); + +// ----------------------------------- game.c ----------------------------------- // + +// Converts month abbreviated char array in format 'Mmm' +// to unsigned int, if unsuccessful returns 0 +// e.g.: "Aug" -> 8 | "aug" -> 0 +unsigned strmon_to_int(const char *mon) +{ + unsigned i = 0; + if (strcmp(mon, "Jan") == 0) { i = 1; } + else if (strcmp(mon, "Feb") == 0) { i = 2; } + else if (strcmp(mon, "Mar") == 0) { i = 3; } + else if (strcmp(mon, "Apr") == 0) { i = 4; } + else if (strcmp(mon, "May") == 0) { i = 5; } + else if (strcmp(mon, "Jun") == 0) { i = 6; } + else if (strcmp(mon, "Jul") == 0) { i = 7; } + else if (strcmp(mon, "Aug") == 0) { i = 8; } + else if (strcmp(mon, "Sep") == 0) { i = 9; } + else if (strcmp(mon, "Oct") == 0) { i = 10; } + else if (strcmp(mon, "Nov") == 0) { i = 11; } + else if (strcmp(mon, "Dec") == 0) { i = 12; } + return i; +} + +// Fuction to initialize date type +// Assumes that argument is a string +// in the format 'mmm dd, yyyy' or 'mmm yyyy' +// or NULL for empty initialization +date new_date(string *fmt) +{ + date d; + if (fmt != NULL) { + uint8_t i = 0; + string aux; + // If the format is 'mmm dd, yyyy' + if (strlen(fmt->buf) > 10) { + // parsing day + i = fmt->find(fmt, ",") - 4; + aux = fmt->substr(fmt, 4, i); + d.day = aux.to_int(&aux); + aux.delete(&aux); + + // parsing month + aux = fmt->substr(fmt, 0, 3); + strcpy(d.month, aux.buf); + aux.delete(&aux); + + // parsing year + i = fmt->find(fmt, ",") + 2; + aux = fmt->substr(fmt, i, (fmt->length(fmt) - i)); + d.year = aux.to_int(&aux); + aux.delete(&aux); + } else { // Assuming format is 'mmm yyyy' + // no day provided in this format + d.day = 0; + + // parsing month + i = fmt->find(fmt, " "); + aux = fmt->substr(fmt, 0, i); + strcpy(d.month, aux.buf); + aux.delete(&aux); + + // parsing year + aux = fmt->substr(fmt, (i + 1), fmt->length(fmt) - (i + 1)); + d.year = aux.to_int(&aux); + aux.delete(&aux); + } + // parsing value + unsigned mon = strmon_to_int(d.month); + d.value = ((d.year * 10000) + (mon * 100) + d.day); + } else { + d.day = 0; + strcpy(d.month, "mmm"); + d.year = 0; + d.value = 0; + } + return d; +} + +// Function to initialize +// an 'empty' game struct +game empty_game(void) +{ + game g; + g.app_id = 0; + g.name = new_string(""); + g.release_date = new_date(NULL); + g.owners = new_string(""); + g.age = 0; + g.price = 0.0f; + g.dlcs = 0; + g.languages = new_strarr(NULL, 0); + g.website = new_string(""); + g.windows = false; + g.mac = false; + g.linux_ = false; + g.upvotes = 0.0f; + g.avg_pt = 0; + g.developers = new_string(""); + g.genres = new_strarr(NULL, 0); + return g; +} + +// Function to initialize a new game with +// the retrievd data in the string array +game new_game(string *s_arr) +{ + game g; + if (s_arr != NULL) { + // App id + g.app_id = atoi(s_arr[0].buf); + // Name + g.name = new_string(s_arr[1].buf); + // Release date + g.release_date = new_date(s_arr + 2); + // Owners + g.owners = new_string(s_arr[3].buf); + // Age, Price, DLCs + g.age = atoi(s_arr[4].buf); + g.price = atof(s_arr[5].buf); + g.dlcs = atoi(s_arr[6].buf); + // Languages + // If string is not empty then splits it into a string array + if (strcmp(s_arr[7].buf, "[]") != 0) { + string tmp = s_arr[7].substr(s_arr + 7, 2, strlen(s_arr[7].buf) - 4); + tmp.replace(&tmp, "', '", "|"); + g.languages = tmp.split(&tmp, "|"); + tmp.delete(&tmp); + } else { + g.languages = new_strarr(NULL, 0); + string *tmp = realloc(g.languages.src, sizeof(string)); + if (tmp != NULL) { + tmp[0] = new_string(""); + g.languages.src = tmp; + g.languages.length = 1; + } + } + // Website + g.website = new_string(s_arr[8].buf); + // Windows, Mac, Linux + g.windows = (strcmp(s_arr[9].buf, "True") == 0) ? true : false; + g.mac = (strcmp(s_arr[10].buf, "True") == 0) ? true : false; + g.linux_ = (strcmp(s_arr[11].buf, "True") == 0) ? true : false; + // Upvotes + float up_votes = atof(s_arr[12].buf); + float down_votes = atof(s_arr[13].buf); + g.upvotes = (up_votes / ((up_votes + down_votes) / 100)); + // Avg pt + g.avg_pt = atoi(s_arr[14].buf); + // Developers + g.developers = new_string(s_arr[15].buf); + // Genres + // If string is not empty and has a ',' then splits it into a string array + if ((strcmp(s_arr[16].buf, "") != 0) && + (s_arr[16].find(s_arr + 16, ",") != strlen(s_arr[16].buf))) { + g.genres = s_arr[16].split(s_arr + 16, ","); + } else { + g.genres = new_strarr(NULL, 0); + string *tmp = realloc(g.genres.src, sizeof(string)); + if (tmp != NULL) { + tmp[0] = new_string(s_arr[16].buf); + g.genres.src = tmp; + g.genres.length = 1; + } + } + } else g = empty_game(); + return g; +} + +// function to deallocates all +// the heap variables inside the game struct +void game_delete(game *g) +{ + if (g != NULL) { + g->name.delete(&g->name); + g->owners.delete(&g->owners); + g->languages.delete(&g->languages); + g->website.delete(&g->website); + g->developers.delete(&g->developers); + g->genres.delete(&g->genres); + } +} + +// Receives a char array that contains +// the data of the game strut in a csv format +// parses it and returns a game data structure +game chararr_to_game(char *ch_arr) +{ + game g; + if (ch_arr != NULL) { + // Initializing static array of strings + // where each index will be a field of the game data struct + string s_arr[GAME_FIELDS_SIZE]; + for (int i = 0; i < GAME_FIELDS_SIZE; i++) { + s_arr[i] = new_string(NULL); + } + + // Initializing variables for the split algorithm + string aux = new_string(NULL); + aux.buf = malloc(sizeof(char) * MAX_LINE_SIZE); + size_t ch_arr_len = strlen(ch_arr), s_arr_i = 0, aux_i = 0; + bool is_str_lit = false; + + // Loop to split each csv cell into a string + // and adds it to the array of strings + for (size_t i = 0; i < ch_arr_len; i++) { + if (ch_arr[i] == '"') { + is_str_lit = (is_str_lit ? false : true); + } else if (ch_arr[i] == ',' && !is_str_lit) { + aux.buf[aux_i] = '\0'; + s_arr[s_arr_i].buf = malloc(sizeof(char) * (strlen(aux.buf) + 1)); + strcpy(s_arr[s_arr_i].buf, aux.buf); + s_arr_i++; aux_i = 0; + } else { + aux.buf[aux_i++] = ch_arr[i]; + } + } + // Adding last string cell to the array + aux.buf[aux_i] = '\0'; + s_arr[s_arr_i].buf = malloc(sizeof(char) * (strlen(aux.buf) + 1)); + strcpy(s_arr[s_arr_i].buf, aux.buf); + aux.delete(&aux); + // Creating game with parsed data + g = new_game(s_arr); + + // Deallocating the string array + for (size_t i = 0; i < GAME_FIELDS_SIZE; i++) { + free(s_arr[i].buf); + } + } else g = empty_game(); + return g; +} + +// Converts avg_pt (int with amount of minutes) +// to a string in format '[x]h [y]m' returns +// a string with 'null' if avg_pt equals zero +char *avgpt_to_chararr (unsigned avg_pt) +{ + char *c_arr = calloc(16, sizeof(char)); + if (avg_pt != 0) { + unsigned h = avg_pt / 60; + unsigned m = avg_pt % 60; + + if (h != 0 && m != 0) { + snprintf(c_arr, 16, "%dh %dm", h, m); + } else if (h != 0) { + snprintf(c_arr, 16, "%dh", h); + } else if (m != 0) { + snprintf(c_arr, 16, "%dm", m); + } + } else { + strcpy(c_arr, "null"); + } + return c_arr; +} + +// prints the game structure in the format +// as is specified in the assignment +void game_print(game *g) +{ + printf("%u %s %s/%d %s %u %.2f %u [", + g->app_id, g->name.buf, + g->release_date.month, + g->release_date.year, + g->owners.buf, g->age, + g->price, g->dlcs); + // languages + for (size_t i = 0; i < g->languages.length - 1; i++) + printf("%s, ", g->languages.src[i].buf); + char *aux = avgpt_to_chararr(g->avg_pt); + printf("%s] %s %s %s %s %.0f%% %s %s [", + g->languages.src[g->languages.length - 1].buf, g->website.buf, + (g->windows ? "true" : "false"), (g->mac ? "true" : "false"), + (g->linux_ ? "true" : "false"), g->upvotes, aux, g->developers.buf); + free(aux); + // genres + for (size_t i = 0; i < g->genres.length - 1; i++) + printf("%s, ", g->genres.src[i].buf); + printf("%s]\n", g->genres.src[g->genres.length - 1].buf); +} + +// Search for the matching 'app_id' and read the game data +// from the file 'games.csv' then adds the game to the games array +void game_read_csv(game *games, size_t *ids, size_t ids_len) +{ + // Handling file opening + FILE *f = fopen(FILE_PATH, "r"); + assert__(f != NULL) { + fprintf(stderr, "Failed to open '%s'\n%s", FILE_PATH, + "Hint: Try adding or removing a '/' in front (OS Dependent)\n"); + } + + char line[MAX_LINE_SIZE + 1]; + size_t cur_id = 0; + // Searching the desired id then calling the parser function + for (size_t i = 0; i < ids_len; i++) { + while (cur_id != ids[i]) { + // reads line from file + fgets(line, MAX_LINE_SIZE, f); + // checking if is a reserved char to then trim it + if (line[strlen(line) - 2] < ' ') line[strlen(line) - 2] = '\0'; + else if (line[strlen(line) - 1] < ' ') line[strlen(line) - 1] = '\0'; + // atoi will only parse the beginning of the string ;) + cur_id = atoi(line); + } + rewind(f); // Resets file pointer to the beginning of the file + games[i] = chararr_to_game(line); // calling parser function + } + fclose(f); // closing the file +} + +// ------------------------------------ main ------------------------------------ // + +// Uses strcmp to check if +// input string equals 'FIM' +// meaning end of input +bool is_fim(char *c_arr) +{ + return (strcmp(c_arr, "FIM") == 0); +} + +// The main function contains the solution to +// the second question of the assignment, which is +// to read 'n' lines of strings containing the +// desired IDs of games to be read from the file 'games.csv', +// parse the data, store it in a game struct already defined, +// and print all of them in a specified format. +int main(void) +{ + // game array + game games[MAX_GAMES]; + size_t games_sz = 0; + // input variables + char input[MAX_FIELD_SIZE ]; + size_t ids[MAX_GAMES]; + + // Reading input and converting to integer + // then adding it to the array of ids to be searched + fgets(input, MAX_LINE_SIZE, stdin); + input[strlen(input) - 1] = '\0'; + while (!is_fim(input)) { + ids[games_sz++] = atoi(input); + fgets(input, MAX_LINE_SIZE, stdin); + // checking if is a reserved char to then trim it + if (input[strlen(input) - 2] < ' ') input[strlen(input) - 2] = '\0'; + else if (input[strlen(input) - 1] < ' ') input[strlen(input) - 1] = '\0'; + } + // If the array of ids is not empty + if (games_sz > 0) { + // Calls function to read from file and populate array of games + game_read_csv(games, ids, games_sz); + + // Prints the games read and frees the heap allocated memory + for (size_t i = 0; i < games_sz; i++) { + game_print(games + i); + game_delete(games + i); + } + } + return 0; +} diff --git a/tps/gabaritos/tp02/TP02Q02 - Registro em C/Linux_Game b/tps/gabaritos/tp02/TP02Q02 - Registro em C/Linux_Game new file mode 100644 index 0000000..2170b62 Binary files /dev/null and b/tps/gabaritos/tp02/TP02Q02 - Registro em C/Linux_Game differ diff --git a/tps/fonte/Game.c b/tps/gabaritos/tp02/TP02Q02 - Registro em C/Linux_Game.c similarity index 99% rename from tps/fonte/Game.c rename to tps/gabaritos/tp02/TP02Q02 - Registro em C/Linux_Game.c index 4abec4d..14622e3 100644 --- a/tps/fonte/Game.c +++ b/tps/gabaritos/tp02/TP02Q02 - Registro em C/Linux_Game.c @@ -1,9 +1,9 @@ /** - * @file Game.c + * @file Linux_Game.c * @author Pedro Lopes - * @version 0.2 - * @date 2022-10-02 + * @version 1.0 + * @date 2022-10-17 * @copyright Copyright (c) 2022 **/ diff --git a/tps/gabaritos/tp02/TP02Q02 - Registro em C/WSL_Game b/tps/gabaritos/tp02/TP02Q02 - Registro em C/WSL_Game new file mode 100644 index 0000000..1186c69 Binary files /dev/null and b/tps/gabaritos/tp02/TP02Q02 - Registro em C/WSL_Game differ diff --git a/tps/gabaritos/tp02/TP02Q02 - Registro em C/WSL_Game.c b/tps/gabaritos/tp02/TP02Q02 - Registro em C/WSL_Game.c new file mode 100644 index 0000000..939563f --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q02 - Registro em C/WSL_Game.c @@ -0,0 +1,728 @@ +/** + + * @file WSL_Game.c + * @author Pedro Lopes + * @version 1.0 + * @date 2022-10-17 + * @copyright Copyright (c) 2022 + +**/ + +// -------------------------------------------------------------------------------- // + +// Includes +#include +#include +#include +#include +#include + +// -------------------------------------------------------------------------------- // + +// Definitions +#define MAX_GAMES 9000 +#define MAX_FIELD_SIZE 250 +#define MAX_STRING_ARRAY_SIZE 100 + +// -------------------------------------------------------------------------------- // + +// Structs +typedef struct { + + int year, + month; +} Date; + +typedef struct { + + char name[MAX_FIELD_SIZE], + owners[MAX_FIELD_SIZE], + website[MAX_FIELD_SIZE], + developers[MAX_FIELD_SIZE], + languages[MAX_STRING_ARRAY_SIZE][30], + genres[MAX_STRING_ARRAY_SIZE][30]; + + Date release_date; + int app_id, age, dlcs, avg_playtime, count_languages, count_genres; + float price, upvotes; + bool windows_os, mac_os, linux_os; + +} Game; + +// -------------------------------------------------------------------------------- // + +// Global variables +Game games[MAX_GAMES]; +int n = 0; + +// -------------------------------------------------------------------------------- // + +// Functions +bool isFim(char* line) { return line[0] == 'F' && line[1] == 'I' && line[2] == 'M'; } + +void substring(char *string, char *string_start, int length) { + + strncpy(string, string_start, length); + string[length] = '\0'; +} + +char *getMonthName(int month) { + + switch(month) { + + case 1: return "Jan"; break; + case 2: return "Feb"; break; + case 3: return "Mar"; break; + case 4: return "Apr"; break; + case 5: return "May"; break; + case 6: return "Jun"; break; + case 7: return "Jul"; break; + case 8: return "Aug"; break; + case 9: return "Sep"; break; + case 10: return "Oct"; break; + case 11: return "Nov"; break; + case 12: return "Dec"; break; + + default: return "N/A"; break; + } +} + +int getMonthNumber(char* month) { + + if(!strcmp(month, "Jan")) return 1; + else if(!strcmp(month, "Feb")) return 2; + else if(!strcmp(month, "Mar")) return 3; + else if(!strcmp(month, "Apr")) return 4; + else if(!strcmp(month, "May")) return 5; + else if(!strcmp(month, "Jun")) return 6; + else if(!strcmp(month, "Jul")) return 7; + else if(!strcmp(month, "Aug")) return 8; + else if(!strcmp(month, "Sep")) return 9; + else if(!strcmp(month, "Oct")) return 10; + else if(!strcmp(month, "Nov")) return 11; + else if(!strcmp(month, "Dec")) return 12; +} + +// -------------------------------------------------------------------------------- // + +// Class game functions +void game_start(Game *game) { + + strcpy(game -> name, ""); + strcpy(game -> owners, ""); + strcpy(game -> website, ""); + strcpy(game -> developers, ""); + + for(int i = 0; i < MAX_STRING_ARRAY_SIZE; i++) { + + strcpy(game -> languages[i], ""); + strcpy(game -> genres[i], ""); + } + + game -> release_date.month = -1; + game -> release_date.year = -1; + game -> app_id = -1; + game -> age = -1; + game -> dlcs = -1; + game -> avg_playtime = -1; + game -> price = -1; + game -> upvotes = -1; + game -> windows_os = false; + game -> mac_os = false; + game -> linux_os = false; + + game -> count_languages = 0; + game -> count_genres = 0; +} + +void game_print(Game *game) { + + int hours = game -> avg_playtime / 60, + minutes = game -> avg_playtime % 60; + + printf("%i %s %s/%04i %s %i %.2f %i [", game -> app_id, game -> name, getMonthName(game -> release_date.month), game -> release_date.year, game -> owners, game -> age, game -> price, game -> dlcs); + + for(int i = 0; i < game -> count_languages; i++) { + + printf("%s%s", game -> languages[i], i < game -> count_languages - 1 ? ", " : ""); + } + + printf("] %s %s %s %s ", game -> website, game -> windows_os ? "true" : "false", game -> mac_os ? "true" : "false", game -> linux_os ? "true" : "false"); + + if(isnan(game -> upvotes)) printf("0.0%% "); + else printf("%.0f%% ", game -> upvotes); + + if(hours > 0) + { + printf("%ih ", hours); + + if(minutes > 0) printf("%im ", minutes); + } + else { + + if(minutes > 0) printf("%im ", minutes); + else printf("null "); + } + + printf("%s [", game -> developers); + + for(int i = 0; i < game -> count_genres; i++) { + + printf("%s%s", game -> genres[i], i < game -> count_genres - 1 ? ", " : ""); + } + + printf("]\n"); +} + +Game game_clone(Game *game) { + + Game cloned; + + strcpy(cloned.name, game -> name); + strcpy(cloned.owners, game -> owners); + strcpy(cloned.website, game -> website); + strcpy(cloned.developers, game -> developers); + + for(int i = 0; i < game -> count_languages; i++) strcpy(cloned.languages[i], game -> languages[i]); + for(int i = 0; i < game -> count_genres; i++) strcpy(cloned.genres[i], game -> genres[i]); + + cloned.release_date.month = game -> release_date.month; + cloned.release_date.year = game -> release_date.year; + cloned.app_id = game -> app_id; + cloned.age = game -> age; + cloned.dlcs = game -> dlcs; + cloned.avg_playtime = game -> avg_playtime; + cloned.price = game -> price; + cloned.upvotes = game -> upvotes; + cloned.windows_os = game -> windows_os; + cloned.mac_os = game -> mac_os; + cloned.linux_os = game -> linux_os; + return cloned; +} + +void game_read(Game *game, char *line) { + + char c_search, sub[MAX_FIELD_SIZE]; + int index = 0, atr_index = 0; + + // ------------------------------------------------------------ // + + // Find "AppID" + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + + game -> app_id = atoi(sub); + + atr_index = ++index; + break; + } + } + + // ------------------------------------------------------------ // + + // Find "Name" + if(line[atr_index] != ',') { + + if(line[atr_index] == '\"') { + + atr_index++; + c_search = '\"'; + } + else c_search = ','; + + while(true) { + + index++; + + if(line[index] == c_search) { + + substring(sub, &line[atr_index], index - atr_index); + strcpy(game -> name, sub); + + if(c_search == ',') index++; + else if(c_search == '\"') index += 2; + + atr_index = index; + break; + } + } + } + else { + + strcpy(game -> name, "null"); + + atr_index = ++index; + } + + // ------------------------------------------------------------ // + + // Find release date + if(line[atr_index] != ',') { + + if(line[atr_index] == '\"') { + + atr_index++; + c_search = '\"'; + } + else c_search = ','; + + while(true) { + + index++; + + if(line[index] == c_search) { + + substring(sub, &line[atr_index], index - atr_index); + + char subDate[10]; + + substring(subDate, &sub[0], 3); + + game -> release_date.month = getMonthNumber(subDate); + + if(c_search == ',') { + + substring(subDate, &sub[4], 4); + + game -> release_date.year = atoi(subDate); + + index++; + } + else if(c_search == '\"') { + + int nmbSpace = 0; + + for(int i = 0; ; i++) { + + if(sub[i] == ' ') nmbSpace++; + + if(nmbSpace == 2) { + + i++; + + substring(subDate, &sub[i], 4); + + game -> release_date.year = atoi(subDate); + break; + } + } + + index += 2; + } + + atr_index = index; + break; + } + } + } + else { + + game -> release_date.month = 0; + game -> release_date.year = 0; + + atr_index = ++index; + } + + // ------------------------------------------------------------ // + + // Find "Owners" + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + strcpy(game -> owners, sub); + + atr_index = ++index; + break; + } + } + + // ------------------------------------------------------------ // + + // Find "Age" + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + + game -> age = atoi(sub); + + atr_index = ++index; + break; + } + } + + // ------------------------------------------------------------ // + + // Find "Price" + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + + game -> price = atof(sub); + + atr_index = ++index; + break; + } + } + + // ------------------------------------------------------------ // + + // Find "DLCs" + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + + game -> dlcs = atoi(sub); + + atr_index = ++index; + break; + } + } + + // ------------------------------------------------------------ // + + // Find "Languages" + while(true) { + + index++; + + if(line[index] == ']') { + + index++; + + if(line[index] == ',') index++; + else if(line[index] == '\"') index += 2; + + atr_index = index; + break; + } + else if(line[index] == '\'') { + + int wordStart = index + 1; + + while(true) { + + index++; + + if(line[index] == '\'') { + + substring(sub, &line[wordStart], index - wordStart); + strcpy(game -> languages[game -> count_languages++], sub); + break; + } + } + } + } + + // ------------------------------------------------------------ // + + // Find "Website" + if(line[atr_index] != ',') { + + if(line[atr_index] == '\"') { + + atr_index++; + c_search = '\"'; + } + else c_search = ','; + + while(true) { + + index++; + + if(line[index] == c_search) { + + substring(sub, &line[atr_index], index - atr_index); + strcpy(game -> website, sub); + + atr_index = ++index; + break; + } + } + } + else { + + strcpy(game -> website, "null"); + + atr_index = ++index; + } + + // ------------------------------------------------------------ // + + // Find "Windows" + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + + if(!strcmp(sub, "True")) game -> windows_os = true; + + atr_index = ++index; + break; + } + } + + // Find "Mac" + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + + if(!strcmp(sub, "True")) game -> mac_os = true; + + atr_index = ++index; + break; + } + } + + // Find "Linux" + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + + if(!strcmp(sub, "True")) game -> linux_os = true; + + atr_index = ++index; + break; + } + } + + // ------------------------------------------------------------ // + + // Find "Upvotes" + int positives, negatives; + + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + + positives = atoi(sub); + atr_index = ++index; + break; + } + } + + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + + negatives = atoi(sub); + atr_index = ++index; + break; + } + } + + game -> upvotes = (float)(positives * 100) / (float)(positives + negatives); + + // ------------------------------------------------------------ // + + // Find "AVG Playtime" + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + + game -> avg_playtime = atoi(sub); + + atr_index = ++index; + break; + } + } + + // ------------------------------------------------------------ // + + // Find "Developers" + if(line[atr_index] != ',') { + + if(line[atr_index] == '\"') { + + atr_index++; + c_search = '\"'; + } + else c_search = ','; + + while(true) { + + index++; + + if(line[index] == c_search) { + + substring(sub, &line[atr_index], index - atr_index); + strcpy(game -> developers, sub); + + atr_index = ++index; + break; + } + } + } + else { + + strcpy(game -> developers, "null"); + + atr_index = ++index; + } + + // ------------------------------------------------------------ // + + // Find "Genres" + if(index < strlen(line) - 1) { + + if(line[index] == ',') atr_index = ++index; + + if(line[atr_index] == '\"') { + + atr_index++; + + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + strcpy(game -> genres[game -> count_genres++], sub); + + atr_index = ++index; + } + else if(line[index] == '\"') { + + substring(sub, &line[atr_index], strlen(line) - 1 - atr_index); + + if(sub[strlen(sub) - 1] == '\"') sub[strlen(sub) - 1] = '\0'; + else if(sub[strlen(sub) - 2] == '\"') sub[strlen(sub) - 2] = '\0'; + + strcpy(game -> genres[game -> count_genres++], sub); + break; + } + } + } + else { + + substring(sub, &line[atr_index], strlen(line) - 1 - atr_index); + + strcpy(game -> genres[game -> count_genres++], sub); + } + } +} + +// -------------------------------------------------------------------------------- // + +// Functions - List +void list_insert(Game x) { + + if(n >= MAX_GAMES) { + + printf("Insert error: MAX_GAMES reached"); + exit(1); + } + + games[n++] = x; +} + +// ---------------------------------------------------------------------------------------------------------- // + +int main() { + + // ------------------------------------------------------------ // + + // First part - Read all games + + // Open CSV file + FILE *fp; + char *line = NULL; + size_t len = 0; + size_t read; + + fp = fopen("/tmp/games.csv", "r"); + + if(fp == NULL) exit(EXIT_FAILURE); + + // ------------------------- // + + // Fill games list + while((read = getline(&line, &len, fp)) != -1) { + + Game game; + + game_start(&game); + game_read(&game, line); + list_insert(game); + } + + // ------------------------- // + + fclose(fp); + + if(line) free(line); + + // ------------------------------------------------------------ // + + // Second part - Print .in games + + char in[15]; + scanf(" %[^\n]s", in); + + while(true) { + + if(isFim(in)) break; + else { + + int app_id = atoi(in); + + for(int i = 0; i < n; i++) { + + if(games[i].app_id == app_id) { + + game_print(&games[i]); + break; + } + } + + // ------------------------- // + + scanf(" %[^\n]s", in); + } + } + return EXIT_SUCCESS; +} \ No newline at end of file diff --git a/tps/gabaritos/tp02/TP02Q02 - Registro em C/pedro.out b/tps/gabaritos/tp02/TP02Q02 - Registro em C/pedro.out new file mode 100644 index 0000000..929980c --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q02 - Registro em C/pedro.out @@ -0,0 +1,50 @@ +840010 Garden Paws Dec/2018 50000 - 100000 0 19.99 2 [English] http://www.gardenpawsgame.com true true false 92% 5h 46m Bitten Toast Games Inc. [Adventure, Indie, RPG, Simulation] +866510 !AnyWay! Jun/2018 50000 - 100000 0 1.79 37 [English, Russian, French, Italian, German, Polish, Ukrainian, Swedish, Simplified Chinese] null true false false 69% 5h 53m EYEFRONT [Adventure, Casual, Indie] +1970560 Bobbi Adventure May/2022 50000 - 100000 0 24.99 0 [English] null true false false 67% null Felio Stung ROG [Indie] +411740 Yet Another World Nov/2015 50000 - 100000 0 5.99 0 [English] null true true true 78% 6h 24m Energy Milk [Action, Adventure, Indie] +1509590 Fujiwara Bittersweet Jan/2021 50000 - 100000 0 0.00 0 [English] null true true true 91% null MagicBenchVN [Free to Play, Indie] +458520 Wrath of Anna Apr/2018 50000 - 100000 0 19.99 1 [English, Spanish - Spain, Hungarian, German, Norwegian, Polish, Swedish, Russian] http://LorenzoEnt.com true false false 35% 2h 50m Lorenzo Ent.,Michael L. Fiorentino Gutierrez [Action, Adventure, Indie] +920210 LEGO® Star Wars™: The Skywalker Saga Apr/2022 500000 - 1000000 0 49.99 8 [English, French, Italian, German, Spanish - Spain, Arabic, Danish, Dutch, Korean, Polish, Portuguese - Brazil, Russian, Spanish - Latin America, Traditional Chinese, Japanese] null true false false 92% 22h 42m TT Games [Action, Adventure] +1444020 Reactor Tech² Aug/2021 50000 - 100000 0 14.99 0 [English, Russian] null true false false 68% null 4Co [Indie, Simulation, Strategy] +1232460 Onee Chanbara ORIGIN Oct/2020 50000 - 100000 18 59.99 96 [English, Simplified Chinese, Traditional Chinese, Japanese, Korean] null true false false 72% 2h 25m Tamsoft [Action] +2026070 Tank Commander: Battlefield Jul/2022 50000 - 100000 0 2.99 0 [English] null true false false 100% null SP GAMES [Action, Indie, Simulation] +258880 Professional Farmer 2014 Nov/2013 50000 - 100000 0 2.99 2 [English, French, Italian, German, Spanish - Spain, Polish, Russian, Dutch, Swedish, Norwegian] http://www.professional-farmer.com/ true false false 46% 32h 9m PlayWay S.A. [Simulation] +295250 Stranded May/2014 50000 - 100000 0 0.49 0 [English] null true true true 35% 3h 56m Peter Moorhead [Adventure, Indie] +299500 International Snooker May/2014 50000 - 100000 0 5.99 0 [English] http://www.bigheadgames.co.uk/ true false false 62% 1h 11m Big Head Games Ltd [Casual, Sports] +574080 Fog of War Jun/2018 50000 - 100000 0 4.99 1 [English, Russian] null true false false 48% 6h 14m Monkeys Lab. [Action, Indie, Massively Multiplayer, RPG, Simulation, Strategy] +598780 Boreal Blade Nov/2020 50000 - 100000 0 3.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean, Portuguese - Brazil, Russian, Simplified Chinese] https://www.borealblade.com true false false 66% null Frozenbyte [Action, Early Access] +1217190 浮世万千之前世今生 Jan/2020 50000 - 100000 0 5.49 1 [Simplified Chinese] null true false false 78% null 飞天大胖喵 [Adventure, Casual, Indie, RPG, Strategy] +257730 Infinity Wars: Animated Trading Card Game Sep/2014 500000 - 1000000 0 0.00 0 [English, Simplified Chinese] http://www.infinitywarsgame.com true false false 77% 6h 24m Lightmare Studios [Indie, Massively Multiplayer, Strategy] +1807730 Lab Bio-Terror Dec/2021 50000 - 100000 0 12.99 0 [English] null true false false 82% null VOLTECH [Action, Indie] +773670 Delete Jan/2018 50000 - 100000 0 1.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Ukrainian, Russian, Bulgarian, Hungarian, Turkish, Greek, Norwegian, Czech, Japanese, Polish, Thai, Swedish, Simplified Chinese, Traditional Chinese, Romanian, Finnish, Dutch, Portuguese, Portuguese - Brazil, Arabic, Korean] null true true false 96% 1h 24m PONY [Casual, Indie] +1803150 Void Slayer Jan/2022 50000 - 100000 0 4.99 0 [English] null true false false 79% null Madmind Studio: After hours [Action, Indie] +1573070 Endless Furry Blackjack Mar/2021 50000 - 100000 0 0.99 0 [English] https://m.youtube.com/ericyoungvfx/ true false false 20% null Tegridy Made Games [Casual, Indie, Sports, Strategy] +513930 J.U.R : Japan Underground Racing Aug/2016 50000 - 100000 0 0.49 0 [English] null true false false 32% null JDM4iK [Casual, Indie, Racing, Simulation] +385250 Paint it Back Oct/2015 50000 - 100000 0 7.99 0 [English] http://casuallabs.com/wp/?page_id=24 true true true 98% null Casual Labs [Casual] +261880 Corporate Lifestyle Simulator Mar/2014 50000 - 100000 0 4.99 1 [English] http://www.dolphinbarn.com true false false 83% 4h 7m DolphinBarn [Action, Casual, Indie] +533300 Zup! Oct/2016 500000 - 1000000 0 0.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Bulgarian, Portuguese - Brazil, Hungarian, Greek, Danish, Traditional Chinese, Simplified Chinese, Korean, Dutch, Norwegian, Polish, Portuguese, Romanian, Russian, Thai, Turkish, Ukrainian, Finnish, Czech, Swedish, Japanese] http://quietriver.info/ true false false 94% 1h 42m Quiet River [Casual, Indie] +542340 Slingshot people Oct/2016 500000 - 1000000 0 0.99 0 [English] http://www.vsemagy.ru/index.php true false false 47% 3h 50m StalkerAlex [Action, Casual, Indie, Simulation] +1209040 Cyber Hunter Jun/2020 500000 - 1000000 0 0.00 0 [English, French, German, Spanish - Spain, Russian, Japanese, Simplified Chinese, Traditional Chinese, Portuguese - Brazil, Korean, Thai, Vietnamese] https://www.cyberhunter.game/ true false false 73% 5h 41m NetEase Games [Action, Free to Play, Massively Multiplayer] +8790 GTR 2 FIA GT Racing Game Dec/2012 50000 - 100000 0 7.99 0 [English] http://www.simbin.com/games/gtr2/ true false false 93% 11m SimBin Studios AB [Racing, Simulation, Sports] +8000 Tomb Raider: Anniversary Jun/2007 500000 - 1000000 13 8.99 0 [English, French, German, Italian, Spanish - Spain] http://www.tombraider.com/anniversary/ true false false 82% 6h Crystal Dynamics [Action, Adventure] +415150 Pang Adventures Apr/2016 50000 - 100000 0 9.99 0 [English, French, Italian, German, Spanish - Spain, Portuguese - Brazil, Russian] https://www.facebook.com/Pang.Adventures/ true false false 80% 3h 29m Dotemu [Action, Casual, Strategy] +2012500 The Katydids Incident Jun/2022 50000 - 100000 0 4.99 0 [English] https://punxstudios.co true false false 100% null Punx Studios [Indie, Simulation] +691150 Saku Saku: Love Blooms with the Cherry Blossoms Oct/2017 50000 - 100000 0 19.99 0 [English] null true false false 92% 5h 16m PALETTE [Sexual Content, Nudity, Casual] +283370 Marine Sharpshooter II: Jungle Warfare Apr/2014 50000 - 100000 0 2.99 0 [English] http://www.funboxmedia.co.uk/ true false false 32% 2h 3m Jarhead Games [Action] +249650 Blackguards Jan/2014 500000 - 1000000 0 0.99 2 [English, German, French, Spanish - Spain, Portuguese - Brazil, Russian, Italian, Japanese, Korean, Czech, Turkish, Polish, Simplified Chinese] http://www.blackguards-game.com true false false 62% 8h 58m Daedalic Entertainment [Indie, RPG, Strategy] +268870 Satellite Reign Aug/2015 500000 - 1000000 0 29.99 3 [English, French, Italian, German, Spanish - Spain, Czech, Russian] http://www.satellitereign.com/ true true true 71% 5h 18m 5 Lives Studios [Action, Indie, Strategy] +1172510 Unlock The King Nov/2019 50000 - 100000 0 0.99 0 [English] null true true false 96% null Minimol Games [Casual, Strategy] +927890 Hentai Girl Linda Dec/2018 50000 - 100000 0 0.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Ukrainian, Russian, Bulgarian, Hungarian, Turkish, Greek, Norwegian, Czech, Japanese, Polish, Thai, Swedish, Simplified Chinese, Traditional Chinese, Romanian, Finnish, Dutch, Portuguese, Portuguese - Brazil, Arabic, Korean, Spanish - Latin America, Vietnamese] null true true false 94% 1h 13m GirlGames [Casual, Indie, RPG, Simulation] +25700 Madballs in Babo:Invasion Sep/2009 50000 - 100000 0 4.99 7 [English, German, Korean, Portuguese, Spanish - Spain, French, Italian, Russian] http://www.baboinvasion.com true true false 84% 4h 15m Playbrains [Action, Casual, Indie] +281610 Homeworld: Deserts of Kharak Jan/2016 500000 - 1000000 0 49.99 4 [English, French, Italian, German, Spanish - Spain, Russian, Polish] http://www.desertsofkharak.com true true false 83% 8h 32m Blackbird Interactive [Strategy] +485610 Ball 3D: Soccer Online Mar/2017 500000 - 1000000 0 9.99 0 [English] http://www.ball3d.com true true false 83% 2h 49m Unusualsoft [Sports] +1276850 Kane's Shadow Apr/2020 50000 - 100000 0 0.00 0 [English] null true true false 67% null Plush Productions LLC [Casual, Indie] +722340 Captain vs Sky Pirates Oct/2017 50000 - 100000 0 2.99 5 [English] https://store.steampowered.com/publisher/boogygames/ true false false 25% null Boogygames Studios [Action, Adventure, Indie, Strategy] +1499640 Y.E.T.I Jan/2021 50000 - 100000 0 0.49 0 [English] https://anpa.us true false false 80% null Racing Bros [Action, Indie] +1848450 Nightmare of Decay May/2022 50000 - 100000 0 3.99 0 [English, French, Polish, Russian, Simplified Chinese, Traditional Chinese, Spanish - Latin America, Portuguese - Brazil, Italian, German, Czech, Hungarian, Turkish, Norwegian, Swedish] null true false false 98% 5h 56m Checkmaty [Action, Adventure, Indie] +615700 A Plunge into Darkness Mar/2020 50000 - 100000 0 5.99 1 [English] https://www.aldorlea.org/ true false false 73% null Aldorlea [Adventure, Indie, RPG, Simulation, Strategy] +744980 Super Club Soccer Oct/2019 50000 - 100000 0 0.00 0 [English] http://www.superclubsoccer.com/ true false true 69% null Trick27 Studios Limited [Free to Play, Massively Multiplayer, Sports, Early Access] +10180 Call of Duty®: Modern Warfare® 2 (2009) Nov/2009 5000000 - 10000000 0 19.99 2 [English, French, German, Italian, Spanish - Spain] https://www.callofduty.com/ true true false 93% 12h 56m Infinity Ward [Action] +234390 Teleglitch: Die More Edition Jul/2013 500000 - 1000000 0 3.24 1 [English] http://www.teleglitch.com true true true 85% 2h 20m Test3 Projects [Action, Indie] +1641670 EdgeOfTheAbyssAwaken Jun/2022 50000 - 100000 0 18.99 3 [English, Simplified Chinese] null true false false 74% null TrinityBJ [Action, Indie, RPG, Strategy] +427520 Factorio Aug/2020 5000000 - 10000000 0 30.00 1 [English, French, Italian, German, Spanish - Spain, Hungarian, Dutch, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Finnish, Swedish, Czech, Russian, Ukrainian, Japanese, Simplified Chinese, Traditional Chinese, Korean, Turkish] https://www.factorio.com true true true 97% 89h 43m Wube Software LTD. [Casual, Indie, Simulation, Strategy] diff --git a/tps/gabaritos/tp02/TP02Q02 - Registro em C/pub.in b/tps/gabaritos/tp02/TP02Q02 - Registro em C/pub.in new file mode 100644 index 0000000..cf004e0 --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q02 - Registro em C/pub.in @@ -0,0 +1,51 @@ +840010 +866510 +1970560 +411740 +1509590 +458520 +920210 +1444020 +1232460 +2026070 +258880 +295250 +299500 +574080 +598780 +1217190 +257730 +1807730 +773670 +1803150 +1573070 +513930 +385250 +261880 +533300 +542340 +1209040 +8790 +8000 +415150 +2012500 +691150 +283370 +249650 +268870 +1172510 +927890 +25700 +281610 +485610 +1276850 +722340 +1499640 +1848450 +615700 +744980 +10180 +234390 +1641670 +427520 +FIM diff --git a/tps/gabaritos/tp02/TP02Q02 - Registro em C/pub.out b/tps/gabaritos/tp02/TP02Q02 - Registro em C/pub.out new file mode 100644 index 0000000..929980c --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q02 - Registro em C/pub.out @@ -0,0 +1,50 @@ +840010 Garden Paws Dec/2018 50000 - 100000 0 19.99 2 [English] http://www.gardenpawsgame.com true true false 92% 5h 46m Bitten Toast Games Inc. [Adventure, Indie, RPG, Simulation] +866510 !AnyWay! Jun/2018 50000 - 100000 0 1.79 37 [English, Russian, French, Italian, German, Polish, Ukrainian, Swedish, Simplified Chinese] null true false false 69% 5h 53m EYEFRONT [Adventure, Casual, Indie] +1970560 Bobbi Adventure May/2022 50000 - 100000 0 24.99 0 [English] null true false false 67% null Felio Stung ROG [Indie] +411740 Yet Another World Nov/2015 50000 - 100000 0 5.99 0 [English] null true true true 78% 6h 24m Energy Milk [Action, Adventure, Indie] +1509590 Fujiwara Bittersweet Jan/2021 50000 - 100000 0 0.00 0 [English] null true true true 91% null MagicBenchVN [Free to Play, Indie] +458520 Wrath of Anna Apr/2018 50000 - 100000 0 19.99 1 [English, Spanish - Spain, Hungarian, German, Norwegian, Polish, Swedish, Russian] http://LorenzoEnt.com true false false 35% 2h 50m Lorenzo Ent.,Michael L. Fiorentino Gutierrez [Action, Adventure, Indie] +920210 LEGO® Star Wars™: The Skywalker Saga Apr/2022 500000 - 1000000 0 49.99 8 [English, French, Italian, German, Spanish - Spain, Arabic, Danish, Dutch, Korean, Polish, Portuguese - Brazil, Russian, Spanish - Latin America, Traditional Chinese, Japanese] null true false false 92% 22h 42m TT Games [Action, Adventure] +1444020 Reactor Tech² Aug/2021 50000 - 100000 0 14.99 0 [English, Russian] null true false false 68% null 4Co [Indie, Simulation, Strategy] +1232460 Onee Chanbara ORIGIN Oct/2020 50000 - 100000 18 59.99 96 [English, Simplified Chinese, Traditional Chinese, Japanese, Korean] null true false false 72% 2h 25m Tamsoft [Action] +2026070 Tank Commander: Battlefield Jul/2022 50000 - 100000 0 2.99 0 [English] null true false false 100% null SP GAMES [Action, Indie, Simulation] +258880 Professional Farmer 2014 Nov/2013 50000 - 100000 0 2.99 2 [English, French, Italian, German, Spanish - Spain, Polish, Russian, Dutch, Swedish, Norwegian] http://www.professional-farmer.com/ true false false 46% 32h 9m PlayWay S.A. [Simulation] +295250 Stranded May/2014 50000 - 100000 0 0.49 0 [English] null true true true 35% 3h 56m Peter Moorhead [Adventure, Indie] +299500 International Snooker May/2014 50000 - 100000 0 5.99 0 [English] http://www.bigheadgames.co.uk/ true false false 62% 1h 11m Big Head Games Ltd [Casual, Sports] +574080 Fog of War Jun/2018 50000 - 100000 0 4.99 1 [English, Russian] null true false false 48% 6h 14m Monkeys Lab. [Action, Indie, Massively Multiplayer, RPG, Simulation, Strategy] +598780 Boreal Blade Nov/2020 50000 - 100000 0 3.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean, Portuguese - Brazil, Russian, Simplified Chinese] https://www.borealblade.com true false false 66% null Frozenbyte [Action, Early Access] +1217190 浮世万千之前世今生 Jan/2020 50000 - 100000 0 5.49 1 [Simplified Chinese] null true false false 78% null 飞天大胖喵 [Adventure, Casual, Indie, RPG, Strategy] +257730 Infinity Wars: Animated Trading Card Game Sep/2014 500000 - 1000000 0 0.00 0 [English, Simplified Chinese] http://www.infinitywarsgame.com true false false 77% 6h 24m Lightmare Studios [Indie, Massively Multiplayer, Strategy] +1807730 Lab Bio-Terror Dec/2021 50000 - 100000 0 12.99 0 [English] null true false false 82% null VOLTECH [Action, Indie] +773670 Delete Jan/2018 50000 - 100000 0 1.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Ukrainian, Russian, Bulgarian, Hungarian, Turkish, Greek, Norwegian, Czech, Japanese, Polish, Thai, Swedish, Simplified Chinese, Traditional Chinese, Romanian, Finnish, Dutch, Portuguese, Portuguese - Brazil, Arabic, Korean] null true true false 96% 1h 24m PONY [Casual, Indie] +1803150 Void Slayer Jan/2022 50000 - 100000 0 4.99 0 [English] null true false false 79% null Madmind Studio: After hours [Action, Indie] +1573070 Endless Furry Blackjack Mar/2021 50000 - 100000 0 0.99 0 [English] https://m.youtube.com/ericyoungvfx/ true false false 20% null Tegridy Made Games [Casual, Indie, Sports, Strategy] +513930 J.U.R : Japan Underground Racing Aug/2016 50000 - 100000 0 0.49 0 [English] null true false false 32% null JDM4iK [Casual, Indie, Racing, Simulation] +385250 Paint it Back Oct/2015 50000 - 100000 0 7.99 0 [English] http://casuallabs.com/wp/?page_id=24 true true true 98% null Casual Labs [Casual] +261880 Corporate Lifestyle Simulator Mar/2014 50000 - 100000 0 4.99 1 [English] http://www.dolphinbarn.com true false false 83% 4h 7m DolphinBarn [Action, Casual, Indie] +533300 Zup! Oct/2016 500000 - 1000000 0 0.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Bulgarian, Portuguese - Brazil, Hungarian, Greek, Danish, Traditional Chinese, Simplified Chinese, Korean, Dutch, Norwegian, Polish, Portuguese, Romanian, Russian, Thai, Turkish, Ukrainian, Finnish, Czech, Swedish, Japanese] http://quietriver.info/ true false false 94% 1h 42m Quiet River [Casual, Indie] +542340 Slingshot people Oct/2016 500000 - 1000000 0 0.99 0 [English] http://www.vsemagy.ru/index.php true false false 47% 3h 50m StalkerAlex [Action, Casual, Indie, Simulation] +1209040 Cyber Hunter Jun/2020 500000 - 1000000 0 0.00 0 [English, French, German, Spanish - Spain, Russian, Japanese, Simplified Chinese, Traditional Chinese, Portuguese - Brazil, Korean, Thai, Vietnamese] https://www.cyberhunter.game/ true false false 73% 5h 41m NetEase Games [Action, Free to Play, Massively Multiplayer] +8790 GTR 2 FIA GT Racing Game Dec/2012 50000 - 100000 0 7.99 0 [English] http://www.simbin.com/games/gtr2/ true false false 93% 11m SimBin Studios AB [Racing, Simulation, Sports] +8000 Tomb Raider: Anniversary Jun/2007 500000 - 1000000 13 8.99 0 [English, French, German, Italian, Spanish - Spain] http://www.tombraider.com/anniversary/ true false false 82% 6h Crystal Dynamics [Action, Adventure] +415150 Pang Adventures Apr/2016 50000 - 100000 0 9.99 0 [English, French, Italian, German, Spanish - Spain, Portuguese - Brazil, Russian] https://www.facebook.com/Pang.Adventures/ true false false 80% 3h 29m Dotemu [Action, Casual, Strategy] +2012500 The Katydids Incident Jun/2022 50000 - 100000 0 4.99 0 [English] https://punxstudios.co true false false 100% null Punx Studios [Indie, Simulation] +691150 Saku Saku: Love Blooms with the Cherry Blossoms Oct/2017 50000 - 100000 0 19.99 0 [English] null true false false 92% 5h 16m PALETTE [Sexual Content, Nudity, Casual] +283370 Marine Sharpshooter II: Jungle Warfare Apr/2014 50000 - 100000 0 2.99 0 [English] http://www.funboxmedia.co.uk/ true false false 32% 2h 3m Jarhead Games [Action] +249650 Blackguards Jan/2014 500000 - 1000000 0 0.99 2 [English, German, French, Spanish - Spain, Portuguese - Brazil, Russian, Italian, Japanese, Korean, Czech, Turkish, Polish, Simplified Chinese] http://www.blackguards-game.com true false false 62% 8h 58m Daedalic Entertainment [Indie, RPG, Strategy] +268870 Satellite Reign Aug/2015 500000 - 1000000 0 29.99 3 [English, French, Italian, German, Spanish - Spain, Czech, Russian] http://www.satellitereign.com/ true true true 71% 5h 18m 5 Lives Studios [Action, Indie, Strategy] +1172510 Unlock The King Nov/2019 50000 - 100000 0 0.99 0 [English] null true true false 96% null Minimol Games [Casual, Strategy] +927890 Hentai Girl Linda Dec/2018 50000 - 100000 0 0.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Ukrainian, Russian, Bulgarian, Hungarian, Turkish, Greek, Norwegian, Czech, Japanese, Polish, Thai, Swedish, Simplified Chinese, Traditional Chinese, Romanian, Finnish, Dutch, Portuguese, Portuguese - Brazil, Arabic, Korean, Spanish - Latin America, Vietnamese] null true true false 94% 1h 13m GirlGames [Casual, Indie, RPG, Simulation] +25700 Madballs in Babo:Invasion Sep/2009 50000 - 100000 0 4.99 7 [English, German, Korean, Portuguese, Spanish - Spain, French, Italian, Russian] http://www.baboinvasion.com true true false 84% 4h 15m Playbrains [Action, Casual, Indie] +281610 Homeworld: Deserts of Kharak Jan/2016 500000 - 1000000 0 49.99 4 [English, French, Italian, German, Spanish - Spain, Russian, Polish] http://www.desertsofkharak.com true true false 83% 8h 32m Blackbird Interactive [Strategy] +485610 Ball 3D: Soccer Online Mar/2017 500000 - 1000000 0 9.99 0 [English] http://www.ball3d.com true true false 83% 2h 49m Unusualsoft [Sports] +1276850 Kane's Shadow Apr/2020 50000 - 100000 0 0.00 0 [English] null true true false 67% null Plush Productions LLC [Casual, Indie] +722340 Captain vs Sky Pirates Oct/2017 50000 - 100000 0 2.99 5 [English] https://store.steampowered.com/publisher/boogygames/ true false false 25% null Boogygames Studios [Action, Adventure, Indie, Strategy] +1499640 Y.E.T.I Jan/2021 50000 - 100000 0 0.49 0 [English] https://anpa.us true false false 80% null Racing Bros [Action, Indie] +1848450 Nightmare of Decay May/2022 50000 - 100000 0 3.99 0 [English, French, Polish, Russian, Simplified Chinese, Traditional Chinese, Spanish - Latin America, Portuguese - Brazil, Italian, German, Czech, Hungarian, Turkish, Norwegian, Swedish] null true false false 98% 5h 56m Checkmaty [Action, Adventure, Indie] +615700 A Plunge into Darkness Mar/2020 50000 - 100000 0 5.99 1 [English] https://www.aldorlea.org/ true false false 73% null Aldorlea [Adventure, Indie, RPG, Simulation, Strategy] +744980 Super Club Soccer Oct/2019 50000 - 100000 0 0.00 0 [English] http://www.superclubsoccer.com/ true false true 69% null Trick27 Studios Limited [Free to Play, Massively Multiplayer, Sports, Early Access] +10180 Call of Duty®: Modern Warfare® 2 (2009) Nov/2009 5000000 - 10000000 0 19.99 2 [English, French, German, Italian, Spanish - Spain] https://www.callofduty.com/ true true false 93% 12h 56m Infinity Ward [Action] +234390 Teleglitch: Die More Edition Jul/2013 500000 - 1000000 0 3.24 1 [English] http://www.teleglitch.com true true true 85% 2h 20m Test3 Projects [Action, Indie] +1641670 EdgeOfTheAbyssAwaken Jun/2022 50000 - 100000 0 18.99 3 [English, Simplified Chinese] null true false false 74% null TrinityBJ [Action, Indie, RPG, Strategy] +427520 Factorio Aug/2020 5000000 - 10000000 0 30.00 1 [English, French, Italian, German, Spanish - Spain, Hungarian, Dutch, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Finnish, Swedish, Czech, Russian, Ukrainian, Japanese, Simplified Chinese, Traditional Chinese, Korean, Turkish] https://www.factorio.com true true true 97% 89h 43m Wube Software LTD. [Casual, Indie, Simulation, Strategy] diff --git a/tps/gabaritos/tp02/TP02Q03 - Pesquisa sequencial em Java/Arq.java b/tps/gabaritos/tp02/TP02Q03 - Pesquisa sequencial em Java/Arq.java new file mode 100644 index 0000000..01f3146 --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q03 - Pesquisa sequencial em Java/Arq.java @@ -0,0 +1,204 @@ +import java.util.Formatter; +import java.util.Scanner; +import java.io.File; + +public class Arq +{ + private static String nomeArquivo = ""; + private static String charsetArquivo = "ISO-8859-1"; + private static boolean write = false, read = false; + private static Formatter saida = null; + private static Scanner entrada = null; + + public static boolean openWrite(String nomeArq, String charset) { + boolean resp = false; + close(); + try{ + saida = new Formatter(nomeArq, charset); + nomeArquivo = nomeArq; + resp = write = true; + } catch (Exception e) {} + return resp; + } + + public static boolean openWrite(String nomeArq) { + return openWrite(nomeArq, charsetArquivo); + } + + public static boolean openWriteClose(String nomeArq, String charset, String conteudo) { + boolean resp = openWrite(nomeArq, charset); + if(resp == true){ + println(conteudo); + close(); + } + return resp; + } + + public static boolean openWriteClose(String nomeArq, String conteudo) { + return openWriteClose(nomeArq, charsetArquivo, conteudo); + } + + public static boolean openRead(String nomeArq) { + return openRead(nomeArq, charsetArquivo); + } + + public static boolean openRead(String nomeArq, String charset) { + boolean resp = false; + close(); + try{ + entrada = new Scanner(new File(nomeArq), charset); + nomeArquivo = nomeArq; + resp = read = true; + } catch (Exception e) {} + return resp; + } + + public static String openReadClose(String nomeArq){ + openRead(nomeArq); + String resp = readAll(); + close(); + return resp; + } + + public static void close() { + if(write == true){ + saida.close(); + } + if(read == true){ + entrada.close(); + } + write = read = false; + nomeArquivo = ""; + charsetArquivo = "ISO-8859-1"; + } + + public static long length(){ + long resp = -1; + if(read != write){ + File file = new File(nomeArquivo); + resp = file.length(); + } + return resp; + } + + public static void print(int x){ + if(write == true){ + saida.format( "%d", x); + } + } + + public static void print(double x){ + if(write == true){ + saida.format( "%f", x); + } + } + + public static void print(String x){ + if(write == true){ + saida.format( "%s", x); + } + } + + public static void print(boolean x){ + if(write == true){ + saida.format( "%s", ((x) ? "true" : "false")); + } + } + + public static void print(char x){ + if(write == true){ + saida.format( "%c", x); + } + } + + public static void println(int x){ + if(write == true){ + saida.format( "%d\n", x); + } + } + + public static void println(double x){ + if(write == true){ + saida.format( "%f\n", x); + } + } + + public static void println(String x){ + if(write == true){ + saida.format( "%s\n", x); + } + } + + public static void println(boolean x){ + if(write == true){ + saida.format( "%s\n", ((x) ? "true" : "false")); + } + } + + public static void println(char x){ + if(write == true){ + saida.format( "%c\n", x); + } + } + + public static int readInt(){ + int resp = -1; + try{ + resp = entrada.nextInt(); + } catch (Exception e) {} + return resp; + } + + public static char readChar(){ + char resp = ' '; + try{ + resp = (char)entrada.nextByte(); + } catch (Exception e) {} + return resp; + } + + public static double readDouble(){ + double resp = -1; + try{ + resp = Double.parseDouble(readString().replace(",",".")); + } catch (Exception e) {} + return resp; + } + + public static String readString(){ + String resp = ""; + try{ + resp = entrada.next(); + } catch (Exception e) { System.out.println(e.getMessage()); } + return resp; + } + + public static boolean readBoolean(){ + boolean resp = false; + try{ + resp = (entrada.next().equals("true")) ? true : false; + } catch (Exception e) {} + return resp; + } + + public static String readLine(){ + String resp = ""; + try{ + resp = entrada.nextLine(); + } catch (Exception e) { System.out.println(e.getMessage()); } + return resp; + } + + + public static boolean hasNext(){ + return entrada.hasNext(); + } + + public static String readAll(){ + String resp = ""; + while(hasNext()){ + resp += (readLine() + "\n"); + } + return resp; + } +} diff --git a/tps/gabaritos/tp02/TP02Q03 - Pesquisa sequencial em Java/Game.java b/tps/gabaritos/tp02/TP02Q03 - Pesquisa sequencial em Java/Game.java new file mode 100644 index 0000000..cc42f1b --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q03 - Pesquisa sequencial em Java/Game.java @@ -0,0 +1,607 @@ +/** + + * @file Game.java + * @author Pedro Lopes + * @version 1.0 + * @date 2022-10-17 + * @copyright Copyright (c) 2022 + +**/ + +// ----------------------------------------------------------------------------------------------------------------- // + +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 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 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 void main(String[] args) throws Exception { + + Scanner scr = new Scanner(System.in); + ArrayList gamesToAdd = new ArrayList(); + ArrayList games = new ArrayList(); + String line = scr.nextLine(); + + // ------------------------------------------------------------------------------ // + + // Fill list with requested ids + while(true) { + + if(line.equals("FIM")) break; + + gamesToAdd.add(Integer.parseInt(line)); + + line = scr.nextLine(); + } + + // ------------------------------------------------------------------------------ // + + // Add requested ids to 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) { + + if(gamesToAdd.contains(Integer.parseInt(line.substring(0, line.indexOf(','))))) { + + Game game = new Game(); + + game.read(line); + games.add(game); + } + } + + // Close CSV file + fstream.close(); + } + catch(IOException e) { e.printStackTrace(); } + + // ---------------------------------------------------------------------------------------------- // + + // Initialize bench log + int c_compares = 0; + long t_begin = System.currentTimeMillis(); + + // Search in games list by name + line = scr.nextLine(); + + while(true) { + + if(line.equals("FIM")) break; + + // ------------------------------------ // + + boolean found = false; + + for(int i = 0; i < games.size(); i++) { + + c_compares++; + + if(games.get(i).name.compareTo(line) == 0) { + + found = true; + break; + } + } + + // ------------------------------------ // + + System.out.println(found ? "SIM" : "NAO"); + + line = scr.nextLine(); + } + + Arq.openWrite("753045_sequencial.txt"); + Arq.print("753045\t" + (System.currentTimeMillis() - t_begin) + "ms\t" + c_compares); + Arq.close(); + + scr.close(); + + // ---------------------------------------------------------------------------------------------- // + + } + + // ---------------------------------------------------------------------------------------------- // +} \ No newline at end of file diff --git a/tps/gabaritos/tp02/TP02Q03 - Pesquisa sequencial em Java/pedro.out b/tps/gabaritos/tp02/TP02Q03 - Pesquisa sequencial em Java/pedro.out new file mode 100644 index 0000000..ed66dd8 --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q03 - Pesquisa sequencial em Java/pedro.out @@ -0,0 +1,39 @@ +SIM +NAO +NAO +NAO +NAO +NAO +NAO +SIM +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +SIM +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO diff --git a/tps/gabaritos/tp02/TP02Q03 - Pesquisa sequencial em Java/pub.in b/tps/gabaritos/tp02/TP02Q03 - Pesquisa sequencial em Java/pub.in new file mode 100644 index 0000000..6e08b8d --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q03 - Pesquisa sequencial em Java/pub.in @@ -0,0 +1,91 @@ +840010 +866510 +1970560 +411740 +1509590 +458520 +920210 +1444020 +1232460 +2026070 +258880 +295250 +299500 +574080 +598780 +1217190 +257730 +1807730 +773670 +1803150 +1573070 +513930 +385250 +261880 +533300 +542340 +1209040 +8790 +8000 +415150 +2012500 +691150 +283370 +249650 +268870 +1172510 +927890 +25700 +281610 +485610 +1276850 +722340 +1499640 +1848450 +615700 +744980 +10180 +234390 +1641670 +427520 +FIM +Bobbi Adventure +The Test: Hypothesis Rising +Epic Cards Battle 2 (TCG) +Omensight: Definitive Edition +Gray Matter +The Legend of Bean +Armored Warfare +Void Slayer +RacetronicVR +The Amazing American Circus +Your Quest +HistoryMaker VR +WE ARE FOOTBALL +Rise of Insanity +Aragami +BONEWORKS +CAGE +Saku Saku: Love Blooms with the Cherry Blossoms +Kill The Bad Guy +Deisim +Redactem +Xuan-Yuan Sword: The Gate of Firmament +Subspace Continuum +DRAGON BALL XENOVERSE +RiotZ +Stephen's Sausage Roll +Tavern Tycoon - Dragon's Hangover +Child of Light +Heart and Seoul +Tank Destroyer +Claire +MONOLISK +Cinderella Escape 2 Revenge +Flat Heroes +The Political Machine 2016 +AFFECTED: The Manor - The Complete Edition +QUAKE III: Team Arena +Woodcutter Simulator 2013 +Dawn of Man +FIM \ No newline at end of file diff --git a/tps/gabaritos/tp02/TP02Q03 - Pesquisa sequencial em Java/pub.out b/tps/gabaritos/tp02/TP02Q03 - Pesquisa sequencial em Java/pub.out new file mode 100644 index 0000000..ed66dd8 --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q03 - Pesquisa sequencial em Java/pub.out @@ -0,0 +1,39 @@ +SIM +NAO +NAO +NAO +NAO +NAO +NAO +SIM +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +SIM +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO diff --git a/tps/gabaritos/tp02/TP02Q04 - Pesquisa binária em Java/Arq.java b/tps/gabaritos/tp02/TP02Q04 - Pesquisa binária em Java/Arq.java new file mode 100644 index 0000000..01f3146 --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q04 - Pesquisa binária em Java/Arq.java @@ -0,0 +1,204 @@ +import java.util.Formatter; +import java.util.Scanner; +import java.io.File; + +public class Arq +{ + private static String nomeArquivo = ""; + private static String charsetArquivo = "ISO-8859-1"; + private static boolean write = false, read = false; + private static Formatter saida = null; + private static Scanner entrada = null; + + public static boolean openWrite(String nomeArq, String charset) { + boolean resp = false; + close(); + try{ + saida = new Formatter(nomeArq, charset); + nomeArquivo = nomeArq; + resp = write = true; + } catch (Exception e) {} + return resp; + } + + public static boolean openWrite(String nomeArq) { + return openWrite(nomeArq, charsetArquivo); + } + + public static boolean openWriteClose(String nomeArq, String charset, String conteudo) { + boolean resp = openWrite(nomeArq, charset); + if(resp == true){ + println(conteudo); + close(); + } + return resp; + } + + public static boolean openWriteClose(String nomeArq, String conteudo) { + return openWriteClose(nomeArq, charsetArquivo, conteudo); + } + + public static boolean openRead(String nomeArq) { + return openRead(nomeArq, charsetArquivo); + } + + public static boolean openRead(String nomeArq, String charset) { + boolean resp = false; + close(); + try{ + entrada = new Scanner(new File(nomeArq), charset); + nomeArquivo = nomeArq; + resp = read = true; + } catch (Exception e) {} + return resp; + } + + public static String openReadClose(String nomeArq){ + openRead(nomeArq); + String resp = readAll(); + close(); + return resp; + } + + public static void close() { + if(write == true){ + saida.close(); + } + if(read == true){ + entrada.close(); + } + write = read = false; + nomeArquivo = ""; + charsetArquivo = "ISO-8859-1"; + } + + public static long length(){ + long resp = -1; + if(read != write){ + File file = new File(nomeArquivo); + resp = file.length(); + } + return resp; + } + + public static void print(int x){ + if(write == true){ + saida.format( "%d", x); + } + } + + public static void print(double x){ + if(write == true){ + saida.format( "%f", x); + } + } + + public static void print(String x){ + if(write == true){ + saida.format( "%s", x); + } + } + + public static void print(boolean x){ + if(write == true){ + saida.format( "%s", ((x) ? "true" : "false")); + } + } + + public static void print(char x){ + if(write == true){ + saida.format( "%c", x); + } + } + + public static void println(int x){ + if(write == true){ + saida.format( "%d\n", x); + } + } + + public static void println(double x){ + if(write == true){ + saida.format( "%f\n", x); + } + } + + public static void println(String x){ + if(write == true){ + saida.format( "%s\n", x); + } + } + + public static void println(boolean x){ + if(write == true){ + saida.format( "%s\n", ((x) ? "true" : "false")); + } + } + + public static void println(char x){ + if(write == true){ + saida.format( "%c\n", x); + } + } + + public static int readInt(){ + int resp = -1; + try{ + resp = entrada.nextInt(); + } catch (Exception e) {} + return resp; + } + + public static char readChar(){ + char resp = ' '; + try{ + resp = (char)entrada.nextByte(); + } catch (Exception e) {} + return resp; + } + + public static double readDouble(){ + double resp = -1; + try{ + resp = Double.parseDouble(readString().replace(",",".")); + } catch (Exception e) {} + return resp; + } + + public static String readString(){ + String resp = ""; + try{ + resp = entrada.next(); + } catch (Exception e) { System.out.println(e.getMessage()); } + return resp; + } + + public static boolean readBoolean(){ + boolean resp = false; + try{ + resp = (entrada.next().equals("true")) ? true : false; + } catch (Exception e) {} + return resp; + } + + public static String readLine(){ + String resp = ""; + try{ + resp = entrada.nextLine(); + } catch (Exception e) { System.out.println(e.getMessage()); } + return resp; + } + + + public static boolean hasNext(){ + return entrada.hasNext(); + } + + public static String readAll(){ + String resp = ""; + while(hasNext()){ + resp += (readLine() + "\n"); + } + return resp; + } +} diff --git a/tps/gabaritos/tp02/TP02Q04 - Pesquisa binária em Java/Game.java b/tps/gabaritos/tp02/TP02Q04 - Pesquisa binária em Java/Game.java new file mode 100644 index 0000000..5912909 --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q04 - Pesquisa binária em Java/Game.java @@ -0,0 +1,627 @@ +/** + + * @file Game.java + * @author Pedro Lopes + * @version 1.0 + * @date 2022-10-17 + * @copyright Copyright (c) 2022 + +**/ + +// ----------------------------------------------------------------------------------------------------------------- // + +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.Collections; +import java.util.Date; +import java.util.Locale; +import java.util.Scanner; + +// ----------------------------------------------------------------------------------------------------------------- // + +class Game implements Comparable { + + 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 int compareTo(Game other) { return this.name.compareTo(other.name); } + + 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 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 void main(String[] args) throws Exception { + + Scanner scr = new Scanner(System.in); + ArrayList gamesToAdd = new ArrayList(); + ArrayList games = new ArrayList(); + String line = scr.nextLine(); + + // ------------------------------------------------------------------------------ // + + // Fill list with requested ids + while(true) { + + if(line.equals("FIM")) break; + + gamesToAdd.add(Integer.parseInt(line)); + + line = scr.nextLine(); + } + + // ------------------------------------------------------------------------------ // + + // Add requested ids to 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) { + + if(gamesToAdd.contains(Integer.parseInt(line.substring(0, line.indexOf(','))))) { + + Game game = new Game(); + + game.read(line); + games.add(game); + } + } + + // Close CSV file + fstream.close(); + } + catch(IOException e) { e.printStackTrace(); } + + // ---------------------------------------------------------------------------------------------- // + + // Initialize bench log + int c_compares = 0; + long t_begin = System.currentTimeMillis(); + + Collections.sort(games); + + // Search in games list by name + line = scr.nextLine(); + + while(true) { + + if(line.equals("FIM")) break; + + // ------------------------------------ // + + boolean found = false; + + int low = 0; + int high = games.size() - 1; + + while(low <= high) { + + int mid = low + (high - low) / 2; + + c_compares++; + + if(games.get(mid).name.compareTo(line) == 0) { + + found = true; + break; + } + else if(games.get(mid).name.compareTo(line) < 0) { + + c_compares++; + low = mid + 1; + } + else { + + c_compares++; + high = mid - 1; + } + } + + // ------------------------------------ // + + System.out.println(found ? "SIM" : "NAO"); + + line = scr.nextLine(); + } + + Arq.openWrite("753045_sequencial.txt"); + Arq.print("753045\t" + (System.currentTimeMillis() - t_begin) + "ms\t" + c_compares); + Arq.close(); + + scr.close(); + + // ---------------------------------------------------------------------------------------------- // + + } + + // ---------------------------------------------------------------------------------------------- // +} \ No newline at end of file diff --git a/tps/gabaritos/tp02/TP02Q04 - Pesquisa binária em Java/pedro.out b/tps/gabaritos/tp02/TP02Q04 - Pesquisa binária em Java/pedro.out new file mode 100644 index 0000000..ed66dd8 --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q04 - Pesquisa binária em Java/pedro.out @@ -0,0 +1,39 @@ +SIM +NAO +NAO +NAO +NAO +NAO +NAO +SIM +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +SIM +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO diff --git a/tps/gabaritos/tp02/TP02Q04 - Pesquisa binária em Java/pub.in b/tps/gabaritos/tp02/TP02Q04 - Pesquisa binária em Java/pub.in new file mode 100644 index 0000000..6e08b8d --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q04 - Pesquisa binária em Java/pub.in @@ -0,0 +1,91 @@ +840010 +866510 +1970560 +411740 +1509590 +458520 +920210 +1444020 +1232460 +2026070 +258880 +295250 +299500 +574080 +598780 +1217190 +257730 +1807730 +773670 +1803150 +1573070 +513930 +385250 +261880 +533300 +542340 +1209040 +8790 +8000 +415150 +2012500 +691150 +283370 +249650 +268870 +1172510 +927890 +25700 +281610 +485610 +1276850 +722340 +1499640 +1848450 +615700 +744980 +10180 +234390 +1641670 +427520 +FIM +Bobbi Adventure +The Test: Hypothesis Rising +Epic Cards Battle 2 (TCG) +Omensight: Definitive Edition +Gray Matter +The Legend of Bean +Armored Warfare +Void Slayer +RacetronicVR +The Amazing American Circus +Your Quest +HistoryMaker VR +WE ARE FOOTBALL +Rise of Insanity +Aragami +BONEWORKS +CAGE +Saku Saku: Love Blooms with the Cherry Blossoms +Kill The Bad Guy +Deisim +Redactem +Xuan-Yuan Sword: The Gate of Firmament +Subspace Continuum +DRAGON BALL XENOVERSE +RiotZ +Stephen's Sausage Roll +Tavern Tycoon - Dragon's Hangover +Child of Light +Heart and Seoul +Tank Destroyer +Claire +MONOLISK +Cinderella Escape 2 Revenge +Flat Heroes +The Political Machine 2016 +AFFECTED: The Manor - The Complete Edition +QUAKE III: Team Arena +Woodcutter Simulator 2013 +Dawn of Man +FIM \ No newline at end of file diff --git a/tps/gabaritos/tp02/TP02Q04 - Pesquisa binária em Java/pub.out b/tps/gabaritos/tp02/TP02Q04 - Pesquisa binária em Java/pub.out new file mode 100644 index 0000000..ed66dd8 --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q04 - Pesquisa binária em Java/pub.out @@ -0,0 +1,39 @@ +SIM +NAO +NAO +NAO +NAO +NAO +NAO +SIM +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +SIM +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO diff --git a/tps/gabaritos/tp02/TP02Q05 - Lista sequencial em Java/Game.java b/tps/gabaritos/tp02/TP02Q05 - Lista sequencial em Java/Game.java new file mode 100644 index 0000000..831e0ee --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q05 - Lista sequencial em Java/Game.java @@ -0,0 +1,739 @@ +/** + + * @file Game.java + * @author Pedro Lopes + * @version 1.0 + * @date 2022-10-17 + * @copyright Copyright (c) 2022 + +**/ + +// ----------------------------------------------------------------------------------------------------------------- // + +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 GameList { + + private Game[] array; + private int n; + + public GameList() {} + + public GameList(int size) { + + array = new Game[size]; + n = 0; + } + + public void print() { + + for(int i = 0; i < n; i++) { + + System.out.print("[" + i + "] "); + + array[i].print(); + } + } + + public void insertBegin(Game game) throws Exception { + + if(n >= array.length) throw new Exception("x Insert error: Full list!"); + + for(int i = n; i > 0; i--) array[i] = array[i - 1]; + + array[0] = game; + n++; + } + + public void insertEnd(Game game) throws Exception { + + if(n >= array.length) throw new Exception("x Insert error: Full list"); + + array[n] = game; + n++; + } + + public void insert(Game game, int pos) throws Exception { + + if(n >= array.length || pos < 0 || pos > n) throw new Exception("x Insert error: Full list / Invalid pos"); + + for(int i = n; i > pos; i--) array[i] = array[i - 1]; + + array[pos] = game; + n++; + } + + public Game removeBegin() throws Exception { + + if(n == 0) throw new Exception("x Remove error: Empty list"); + + Game resp = array[0]; + n--; + + for(int i = 0; i < n; i++) array[i] = array[i + 1]; + return resp; + } + + public Game removeEnd() throws Exception { + + if(n == 0) throw new Exception("x Remove error: Empty list"); + return array[--n]; + } + + public Game remove(int pos) throws Exception { + + if(n == 0 || pos < 0 || pos >= n) throw new Exception("x Remove error: Empty list / Invalid pos"); + + Game resp = array[pos]; + n--; + + for(int i = pos; i < n; i++) array[i] = array[i + 1]; + return resp; + } +} + +// ----------------------------------------------------------------------------------------------------------------- // + +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 + GameList games = new GameList(500); + + line = scr.nextLine(); + + while(true) { + + if(line.compareTo("FIM") == 0) break; + + // ------------------------------------ // + + Game found = gameSearch(gamesFull, Integer.parseInt(line)); + + if(found != null) games.insertEnd(found); + + // ------------------------------------ // + + line = scr.nextLine(); + } + + // ---------------------------------------------------------------------------------------------- // + + // Execute operations + int n_ops = Integer.parseInt(scr.nextLine()); + + for(int x = 0; x < n_ops; x++) { + + line = scr.nextLine(); + + String op = line.substring(0, 2); + int app_id; + + // -------------------------------- // + + // Identify operation + if(op.equals("II")) { + + app_id = Integer.parseInt(line.substring(3, line.length())); + + games.insertBegin(gameSearch(gamesFull, app_id)); + } + else if(op.equals("IF")) { + + app_id = Integer.parseInt(line.substring(3, line.length())); + + games.insertEnd(gameSearch(gamesFull, app_id)); + } + else if(op.equals("I*")) { + + int pos = Integer.parseInt(line.substring(3, line.indexOf(" ", 3))); + app_id = Integer.parseInt(line.substring(line.indexOf(" ", 3) + 1, line.length())); + + games.insert(gameSearch(gamesFull, app_id), pos); + } + else if(op.equals("RI")) System.out.println("(R) " + games.removeBegin().getName()); + else if(op.equals("RF")) System.out.println("(R) " + games.removeEnd().getName()); + else if(op.equals("R*")) { + + int pos = Integer.parseInt(line.substring(3, line.length())); + + System.out.println("(R) " + games.remove(pos).getName()); + } + } + + games.print(); + + // ---------------------------------------------------------------------------------------------- // + + scr.close(); + } + + // ------------------------------------------------------------------------------ // +} \ No newline at end of file diff --git a/tps/gabaritos/tp02/TP02Q05 - Lista sequencial em Java/pub.in b/tps/gabaritos/tp02/TP02Q05 - Lista sequencial em Java/pub.in new file mode 100644 index 0000000..90b8669 --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q05 - Lista sequencial em Java/pub.in @@ -0,0 +1,72 @@ +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 +20 +II 1487390 +II 258520 +II 1165270 +II 298140 +II 213610 +IF 50510 +IF 998660 +IF 1740720 +I* 10 24720 +I* 15 439550 +I* 20 1507410 +RF +RF +RF +RI +RI +R* 10 +RF +RF +RI \ No newline at end of file diff --git a/tps/gabaritos/tp02/TP02Q05 - Lista sequencial em Java/pub.out b/tps/gabaritos/tp02/TP02Q05 - Lista sequencial em Java/pub.out new file mode 100644 index 0000000..e8bb1a6 --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q05 - Lista sequencial em Java/pub.out @@ -0,0 +1,61 @@ +(R) Have a Nice Death +(R) Sopwith VR +(R) Burn Zombie Burn! +(R) Sonic Adventure 2 +(R) Rhiannon: Curse of the Four Branches +(R) Faefever +(R) NOBUNAGA'S AMBITION: Tendou with Power Up Kit +(R) Higurashi When They Cry Hou - Ch.2 Watanagashi +(R) Synthesis Universe -Episode 00- +[0] 258520 The Vanishing of Ethan Carter Sep/2014 500000 - 1000000 0 19.99 2 [English, French, Italian, German, Spanish - Spain, Polish, Czech] http://EthanCarterGame.com true false false 89% 3h 13m The Astronauts [Adventure, Indie] +[1] 1487390 ANVIL Dec/2021 50000 - 100000 0 24.99 0 [English, Korean, German, Russian, Japanese, Simplified Chinese, Traditional Chinese, French, Polish, Portuguese - Brazil, Spanish - Latin America, Italian, Thai, Vietnamese] https://www.anvil.world/ true false false 63% 9h 51m Action Square [Action, Early Access] +[2] 1189490 觅长生 Nov/2019 500000 - 1000000 0 11.99 0 [Simplified Chinese] null true false false 91% 33h 39m Chalcedony Network [Indie, RPG, Strategy, Early Access] +[3] 300550 Shadowrun: Dragonfall - Director's Cut Sep/2014 500000 - 1000000 0 14.99 0 [English] http://harebrained-schemes.com/shadowrun/dragonfall/ true true true 89% 15h 1m Harebrained Schemes [Adventure, Indie, RPG, Strategy] +[4] 49800 Flight of the Icarus May/2010 50000 - 100000 0 4.99 0 [English] http://musegames.com/games/flight-of-the-icarus/ true true false 39% 15m Muse Games [Action, Indie] +[5] 1851280 Samurai Bringer Apr/2022 50000 - 100000 0 9.99 0 [English, Japanese, Simplified Chinese, Traditional Chinese] https://playism.com/game/samurai-bringer/ true false false 88% 5h 2m ALPHAWING Inc. [Action, Indie] +[6] 1112930 Dredgers Oct/2019 50000 - 100000 0 11.99 0 [English, Simplified Chinese] null true false false 92% null Pirate-Rob [Indie, RPG] +[7] 24720 SPORE™ Galactic Adventures Jun/2009 500000 - 1000000 0 19.99 0 [English, French, German, Italian, Spanish - Spain, Dutch, Russian, Polish, Czech, Hungarian, Finnish, Norwegian, Swedish, Danish] http://www.spore.com/what/ga true false false 88% 15h 32m EA - Maxis [Action, Simulation] +[8] 275570 Summoner Mar/2014 50000 - 100000 0 4.99 0 [English, German] null true false false 83% 3h 24m Volition [Action, RPG] +[9] 1096530 Solasta: Crown of the Magister May/2021 500000 - 1000000 0 15.99 4 [English, French, German, Simplified Chinese, Portuguese - Brazil, Russian] https://www.solasta-game.com/ true true false 89% 37h 56m Tactical Adventures [Adventure, RPG, Strategy] +[10] 690510 Immortal Soul: Black Survival Mar/2019 500000 - 1000000 0 0.00 0 [English, Japanese, Korean, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Traditional Chinese, Thai, Portuguese, Portuguese - Brazil] null true false false 79% 28h 5m Nimble Neuron [Free to Play, Indie, Strategy] +[11] 439550 'n Verlore Verstand Apr/2016 50000 - 100000 0 14.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Bulgarian, Czech, Danish, Dutch, Finnish, Greek, Hungarian, Japanese, Korean, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Swedish, Thai, Traditional Chinese, Turkish, Ukrainian] http://www.skobbejakgames.com true true true 39% 2h 20m Skobbejak Games,Skermunkel [Adventure, Casual, Indie] +[12] 1504570 Cultivation Tales Apr/2022 500000 - 1000000 0 19.99 0 [English, Simplified Chinese] null true false false 38% 27h 42m Ac Games [Action, Adventure, Indie, RPG, Strategy, Early Access] +[13] 1369470 Pincremental Aug/2020 50000 - 100000 0 0.00 0 [English] null true true false 80% null Makopaz [Casual, Free to Play, Indie, Simulation, Strategy] +[14] 270130 The Gallery - Episode 1: Call of the Starseed Apr/2016 50000 - 100000 0 14.99 1 [English] http://www.cloudheadgames.com true false false 84% 36m Cloudhead Games ltd. [Adventure, Casual, Indie] +[15] 336150 Virtual Pool 4 May/2015 50000 - 100000 0 24.99 0 [English] http://vponline.celeris.com true false false 83% null Celeris [Sports] +[16] 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] +[17] 573210 Mistwood Heroes Dec/2016 50000 - 100000 0 3.99 0 [English] null true false false 56% 4h Meepower [Action, Adventure, Casual, Indie, RPG] +[18] 886470 Another Otter Jul/2018 50000 - 100000 0 0.99 0 [English] null true false false 63% null PepoLab [Casual, Indie] +[19] 1368820 RollerCoaster Tycoon® 3: Complete Edition Sep/2020 50000 - 100000 0 7.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Dutch, Finnish, Norwegian, Swedish] null true true false 83% 1h 15m Frontier Developments,Aspyr (Mac) [Simulation, Strategy] +[20] 951530 Alien Shooter - Last Hope Nov/2020 50000 - 100000 0 4.99 0 [English, Russian] http://www.sigma-team.net true false false 81% null Sigma Team Inc. [Action, Indie, RPG] +[21] 247370 Mutant Mudds Deluxe Nov/2013 50000 - 100000 0 9.99 0 [English] http://www.mutantmuddsdeluxe.com true false false 74% 3h 21m Renegade Kid [Action, Indie] +[22] 1879330 WARRIORS OROCHI 3 Ultimate Definitive Edition Jul/2022 50000 - 100000 0 39.99 0 [English, Simplified Chinese, Traditional Chinese, Japanese] https://www.gamecity.ne.jp/orochi2/ultimate/index.html true false false 88% null KOEI TECMO GAMES CO., LTD. [Action, Strategy] +[23] 1634290 Chuhou Joutai 2: Paraided! Jul/2021 50000 - 100000 0 4.99 0 [English, Japanese] https://drillimation.com/chuhou-joutai-2-paraided/ true false false 100% null Drillimation Systems [Action, Indie] +[24] 259570 EDEN STAR Jan/2015 50000 - 100000 0 19.99 0 [English] http://www.edenstargame.com true false false 61% 4h 31m Flix Interactive [Action, Adventure, Indie, Strategy, Early Access] +[25] 941650 The Island: Into The Mist Jan/2019 50000 - 100000 0 9.99 0 [Korean, English] https://imbada.itch.io/the-island true false false 69% 3h 14m SUPER WAVE Studio [Adventure, Indie] +[26] 768450 NUTS Feb/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Dutch, Japanese, Korean, Portuguese - Brazil, Russian, Simplified Chinese, Traditional Chinese] http://nuts.game true true false 88% null Joon, Pol, Muutsch, Char & Torfi [Adventure, Simulation] +[27] 1347140 NEAR DEADline Aug/2020 50000 - 100000 0 0.00 1 [English] https://www.newgrounds.com/portal/view/736443 true true true 90% null Dumb ****ing Horse [Action, Casual, Free to Play, Indie] +[28] 722670 Chinese Chess/ Elephant Game: 象棋/ 中国象棋/ 中國象棋 Oct/2017 50000 - 100000 0 9.99 0 [Simplified Chinese, Traditional Chinese, English, Russian] null true false false 78% 1h 45m Wang Wenxi [Indie, Simulation, Strategy, Early Access] +[29] 711540 Lonely Mountains: Downhill Oct/2019 50000 - 100000 0 9.99 4 [English, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Japanese, Korean, Portuguese - Brazil, Polish, Turkish] http://lonelymountains.com true true false 92% 1h 15m Megagon Industries [Action, Indie, Racing, Simulation, Sports] +[30] 450170 BOOR Feb/2017 50000 - 100000 0 0.99 0 [English, Spanish - Spain, French, German] http://www.dazlog.com/boor true true true 83% 4h 30m DazlogStudio [Adventure, Casual, Indie] +[31] 730 Counter-Strike: Global Offensive Aug/2012 50000000 - 100000000 0 0.00 1 [Czech, Danish, Dutch, English, Finnish, French, German, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Spanish - Spain, Swedish, Thai, Traditional Chinese, Turkish, Bulgarian, Ukrainian, Greek, Spanish - Latin America, Vietnamese] http://blog.counter-strike.net/ true true true 88% 508h 4m Valve,Hidden Path Entertainment [Action, Free to Play] +[32] 598550 HUNTDOWN May/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Japanese, Simplified Chinese] http://huntdown.com/ true true true 95% 11h 26m Easy Trigger Games [Action, Indie] +[33] 614090 Deadbeat Heroes Oct/2017 50000 - 100000 0 14.99 0 [English] https://www.upstreamarcade.com/deadbeat-heroes/ true false false 66% 4h 36m Deadbeat Productions [Action] +[34] 809440 Protolife Jun/2018 50000 - 100000 0 11.99 0 [English, Russian] null true true false 87% 15m Volcanic Giraffe [Indie, Strategy] +[35] 1923860 Neon Outlast Mar/2022 50000 - 100000 0 4.99 0 [English] null true false false 0% null Keep Spinning [Action, Indie] +[36] 559010 Cosmic Sugar VR Nov/2016 50000 - 100000 0 0.00 1 [English] http://cosmicsugarvr.com true false false 95% 5m David Lobser [Free to Play, Simulation] +[37] 1547380 KINGDOM of the DEAD Feb/2022 50000 - 100000 0 14.99 0 [English, French, Italian, German, Spanish - Spain, Simplified Chinese, Traditional Chinese, Korean, Japanese, Polish, Portuguese - Brazil, Russian] null true false false 83% null DIRIGO GAMES [Action, Adventure, Indie] +[38] 554310 Rage Wars Nov/2016 50000 - 100000 0 0.99 0 [English] http://www.lemondo.com/ true true true 89% 4h 24m Lemondo Games [Violent, Gore, Adventure, Casual, Indie] +[39] 1124090 告死天使之言-Death angel Aug/2019 50000 - 100000 0 0.99 1 [Simplified Chinese] https://space.bilibili.com/11591868/article true false false 81% null 我妻寒十 [Adventure, Indie] +[40] 292120 FINAL FANTASY® XIII Oct/2014 500000 - 1000000 13 15.99 0 [English, French, Italian, German, Spanish - Spain] http://www.square-enix.com/ true false false 74% 28h 58m Square Enix [RPG] +[41] 691930 MSI Electric City: Core Assault Sep/2017 50000 - 100000 0 0.00 0 [English] http://msi.com/to/e-city true false false 90% 32m HyperBot Studio [Action, Adventure, Casual, Free to Play, Indie] +[42] 325420 Homebrew - Patent Unknown Nov/2014 50000 - 100000 0 14.99 0 [English] http://www.homebrewgame.com true false false 76% 5h 48m Copybugpaste [Action, Indie, Racing, Simulation, Early Access] +[43] 663670 Killer Queen Black Oct/2019 50000 - 100000 0 9.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean] http://www.killerqueenblack.com true true false 93% 2h 11m Liquid Bit, LLC,BumbleBear Games, LLC [Action, Casual, Sports, Strategy] +[44] 503820 A Detective's Novel Jul/2016 500000 - 1000000 0 0.99 0 [English] http://amaterasusoftware.blogspot.hr/ true false false 68% 4h 24m Amaterasu Software [Adventure, Indie] +[45] 49600 Beat Hazard Apr/2010 500000 - 1000000 0 9.99 2 [English, French, German, Italian, Spanish - Spain, Dutch] http://www.coldbeamgames.com true true true 95% 7h 36m Cold Beam Games [Action, Casual, Indie] +[46] 49300 Commander: Conquest of the Americas Jul/2010 50000 - 100000 0 9.99 2 [English, French, German, Spanish - Spain] http://www.cota-game.com/ true false false 48% 11h 48m Nitro Games [Strategy] +[47] 1631930 The Insignia Project Jul/2021 50000 - 100000 0 1.99 0 [English] https://darkendstu.com/ true false false 75% null Dark End Studios [Indie, Early Access] +[48] 1038740 Fluffy Store Aug/2019 50000 - 100000 0 1.99 1 [English, Simplified Chinese, Traditional Chinese, Japanese] null true true false 97% 3h 9m AsicxArt [Adventure, Casual, Indie, RPG] +[49] 336760 Pilot Brothers Dec/2014 50000 - 100000 0 4.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean, Portuguese - Brazil, Russian, Traditional Chinese, Portuguese] null true false false 87% null 1C Wireless [Adventure, Casual] +[50] 64000 Men of War: Assault Squad Feb/2011 500000 - 1000000 0 9.99 5 [English, Russian, Italian, Spanish - Spain, French, German, Polish] http://www.menofwargame.com/assault/ true false false 88% 10h 5m Digitalmindsoft [Strategy] +[51] 487580 Ludo Supremo Jun/2016 50000 - 100000 0 1.99 0 [English] http://www.ensenasoft.com true false false 57% 3h 19m EnsenaSoft [Casual] \ No newline at end of file diff --git a/tps/gabaritos/tp02/TP02Q05 - Lista sequencial em Java/saida.out b/tps/gabaritos/tp02/TP02Q05 - Lista sequencial em Java/saida.out new file mode 100644 index 0000000..6a85875 --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q05 - Lista sequencial em Java/saida.out @@ -0,0 +1,61 @@ +(R) Have a Nice Death +(R) Sopwith VR +(R) Burn Zombie Burn! +(R) Sonic Adventure 2 +(R) Rhiannon: Curse of the Four Branches +(R) Faefever +(R) NOBUNAGA'S AMBITION: Tendou with Power Up Kit +(R) Higurashi When They Cry Hou - Ch.2 Watanagashi +(R) Synthesis Universe -Episode 00- +[0] 258520 The Vanishing of Ethan Carter Sep/2014 500000 - 1000000 0 19.99 2 [English, French, Italian, German, Spanish - Spain, Polish, Czech] http://EthanCarterGame.com true false false 89% 3h 13m The Astronauts [Adventure, Indie] +[1] 1487390 ANVIL Dec/2021 50000 - 100000 0 24.99 0 [English, Korean, German, Russian, Japanese, Simplified Chinese, Traditional Chinese, French, Polish, Portuguese - Brazil, Spanish - Latin America, Italian, Thai, Vietnamese] https://www.anvil.world/ true false false 63% 9h 51m Action Square [Action, Early Access] +[2] 1189490 觅长生 Nov/2019 500000 - 1000000 0 11.99 0 [Simplified Chinese] null true false false 91% 33h 39m Chalcedony Network [Indie, RPG, Strategy, Early Access] +[3] 300550 Shadowrun: Dragonfall - Director's Cut Sep/2014 500000 - 1000000 0 14.99 0 [English] http://harebrained-schemes.com/shadowrun/dragonfall/ true true true 89% 15h 1m Harebrained Schemes [Adventure, Indie, RPG, Strategy] +[4] 49800 Flight of the Icarus May/2010 50000 - 100000 0 4.99 0 [English] http://musegames.com/games/flight-of-the-icarus/ true true false 39% 15m Muse Games [Action, Indie] +[5] 1851280 Samurai Bringer Apr/2022 50000 - 100000 0 9.99 0 [English, Japanese, Simplified Chinese, Traditional Chinese] https://playism.com/game/samurai-bringer/ true false false 88% 5h 2m ALPHAWING Inc. [Action, Indie] +[6] 1112930 Dredgers Oct/2019 50000 - 100000 0 11.99 0 [English, Simplified Chinese] null true false false 92% null Pirate-Rob [Indie, RPG] +[7] 24720 SPORE™ Galactic Adventures Jun/2009 500000 - 1000000 0 19.99 0 [English, French, German, Italian, Spanish - Spain, Dutch, Russian, Polish, Czech, Hungarian, Finnish, Norwegian, Swedish, Danish] http://www.spore.com/what/ga true false false 88% 15h 32m EA - Maxis [Action, Simulation] +[8] 275570 Summoner Mar/2014 50000 - 100000 0 4.99 0 [English, German] null true false false 83% 3h 24m Volition [Action, RPG] +[9] 1096530 Solasta: Crown of the Magister May/2021 500000 - 1000000 0 15.99 4 [English, French, German, Simplified Chinese, Portuguese - Brazil, Russian] https://www.solasta-game.com/ true true false 89% 37h 56m Tactical Adventures [Adventure, RPG, Strategy] +[10] 690510 Immortal Soul: Black Survival Mar/2019 500000 - 1000000 0 0.00 0 [English, Japanese, Korean, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Traditional Chinese, Thai, Portuguese, Portuguese - Brazil] null true false false 79% 28h 5m Nimble Neuron [Free to Play, Indie, Strategy] +[11] 439550 'n Verlore Verstand Apr/2016 50000 - 100000 0 14.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Bulgarian, Czech, Danish, Dutch, Finnish, Greek, Hungarian, Japanese, Korean, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Swedish, Thai, Traditional Chinese, Turkish, Ukrainian] http://www.skobbejakgames.com true true true 39% 2h 20m Skobbejak Games,Skermunkel [Adventure, Casual, Indie] +[12] 1504570 Cultivation Tales Apr/2022 500000 - 1000000 0 19.99 0 [English, Simplified Chinese] null true false false 38% 27h 42m Ac Games [Action, Adventure, Indie, RPG, Strategy, Early Access] +[13] 1369470 Pincremental Aug/2020 50000 - 100000 0 0.00 0 [English] null true true false 80% null Makopaz [Casual, Free to Play, Indie, Simulation, Strategy] +[14] 270130 The Gallery - Episode 1: Call of the Starseed Apr/2016 50000 - 100000 0 14.99 1 [English] http://www.cloudheadgames.com true false false 84% 36m Cloudhead Games ltd. [Adventure, Casual, Indie] +[15] 336150 Virtual Pool 4 May/2015 50000 - 100000 0 24.99 0 [English] http://vponline.celeris.com true false false 83% null Celeris [Sports] +[16] 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] +[17] 573210 Mistwood Heroes Dec/2016 50000 - 100000 0 3.99 0 [English] null true false false 56% 4h Meepower [Action, Adventure, Casual, Indie, RPG] +[18] 886470 Another Otter Jul/2018 50000 - 100000 0 0.99 0 [English] null true false false 63% null PepoLab [Casual, Indie] +[19] 1368820 RollerCoaster Tycoon® 3: Complete Edition Sep/2020 50000 - 100000 0 7.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Dutch, Finnish, Norwegian, Swedish] null true true false 83% 1h 15m Frontier Developments,Aspyr (Mac) [Simulation, Strategy] +[20] 951530 Alien Shooter - Last Hope Nov/2020 50000 - 100000 0 4.99 0 [English, Russian] http://www.sigma-team.net true false false 81% null Sigma Team Inc. [Action, Indie, RPG] +[21] 247370 Mutant Mudds Deluxe Nov/2013 50000 - 100000 0 9.99 0 [English] http://www.mutantmuddsdeluxe.com true false false 74% 3h 21m Renegade Kid [Action, Indie] +[22] 1879330 WARRIORS OROCHI 3 Ultimate Definitive Edition Jul/2022 50000 - 100000 0 39.99 0 [English, Simplified Chinese, Traditional Chinese, Japanese] https://www.gamecity.ne.jp/orochi2/ultimate/index.html true false false 88% null KOEI TECMO GAMES CO., LTD. [Action, Strategy] +[23] 1634290 Chuhou Joutai 2: Paraided! Jul/2021 50000 - 100000 0 4.99 0 [English, Japanese] https://drillimation.com/chuhou-joutai-2-paraided/ true false false 100% null Drillimation Systems [Action, Indie] +[24] 259570 EDEN STAR Jan/2015 50000 - 100000 0 19.99 0 [English] http://www.edenstargame.com true false false 61% 4h 31m Flix Interactive [Action, Adventure, Indie, Strategy, Early Access] +[25] 941650 The Island: Into The Mist Jan/2019 50000 - 100000 0 9.99 0 [Korean, English] https://imbada.itch.io/the-island true false false 69% 3h 14m SUPER WAVE Studio [Adventure, Indie] +[26] 768450 NUTS Feb/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Dutch, Japanese, Korean, Portuguese - Brazil, Russian, Simplified Chinese, Traditional Chinese] http://nuts.game true true false 88% null Joon, Pol, Muutsch, Char & Torfi [Adventure, Simulation] +[27] 1347140 NEAR DEADline Aug/2020 50000 - 100000 0 0.00 1 [English] https://www.newgrounds.com/portal/view/736443 true true true 90% null Dumb ****ing Horse [Action, Casual, Free to Play, Indie] +[28] 722670 Chinese Chess/ Elephant Game: 象棋/ 中国象棋/ 中國象棋 Oct/2017 50000 - 100000 0 9.99 0 [Simplified Chinese, Traditional Chinese, English, Russian] null true false false 78% 1h 45m Wang Wenxi [Indie, Simulation, Strategy, Early Access] +[29] 711540 Lonely Mountains: Downhill Oct/2019 50000 - 100000 0 9.99 4 [English, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Japanese, Korean, Portuguese - Brazil, Polish, Turkish] http://lonelymountains.com true true false 92% 1h 15m Megagon Industries [Action, Indie, Racing, Simulation, Sports] +[30] 450170 BOOR Feb/2017 50000 - 100000 0 0.99 0 [English, Spanish - Spain, French, German] http://www.dazlog.com/boor true true true 83% 4h 30m DazlogStudio [Adventure, Casual, Indie] +[31] 730 Counter-Strike: Global Offensive Aug/2012 50000000 - 100000000 0 0.00 1 [Czech, Danish, Dutch, English, Finnish, French, German, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Spanish - Spain, Swedish, Thai, Traditional Chinese, Turkish, Bulgarian, Ukrainian, Greek, Spanish - Latin America, Vietnamese] http://blog.counter-strike.net/ true true true 88% 508h 4m Valve,Hidden Path Entertainment [Action, Free to Play] +[32] 598550 HUNTDOWN May/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Japanese, Simplified Chinese] http://huntdown.com/ true true true 95% 11h 26m Easy Trigger Games [Action, Indie] +[33] 614090 Deadbeat Heroes Oct/2017 50000 - 100000 0 14.99 0 [English] https://www.upstreamarcade.com/deadbeat-heroes/ true false false 66% 4h 36m Deadbeat Productions [Action] +[34] 809440 Protolife Jun/2018 50000 - 100000 0 11.99 0 [English, Russian] null true true false 87% 15m Volcanic Giraffe [Indie, Strategy] +[35] 1923860 Neon Outlast Mar/2022 50000 - 100000 0 4.99 0 [English] null true false false 0% null Keep Spinning [Action, Indie] +[36] 559010 Cosmic Sugar VR Nov/2016 50000 - 100000 0 0.00 1 [English] http://cosmicsugarvr.com true false false 95% 5m David Lobser [Free to Play, Simulation] +[37] 1547380 KINGDOM of the DEAD Feb/2022 50000 - 100000 0 14.99 0 [English, French, Italian, German, Spanish - Spain, Simplified Chinese, Traditional Chinese, Korean, Japanese, Polish, Portuguese - Brazil, Russian] null true false false 83% null DIRIGO GAMES [Action, Adventure, Indie] +[38] 554310 Rage Wars Nov/2016 50000 - 100000 0 0.99 0 [English] http://www.lemondo.com/ true true true 89% 4h 24m Lemondo Games [Violent, Gore, Adventure, Casual, Indie] +[39] 1124090 告死天使之言-Death angel Aug/2019 50000 - 100000 0 0.99 1 [Simplified Chinese] https://space.bilibili.com/11591868/article true false false 81% null 我妻寒十 [Adventure, Indie] +[40] 292120 FINAL FANTASY® XIII Oct/2014 500000 - 1000000 13 15.99 0 [English, French, Italian, German, Spanish - Spain] http://www.square-enix.com/ true false false 74% 28h 58m Square Enix [RPG] +[41] 691930 MSI Electric City: Core Assault Sep/2017 50000 - 100000 0 0.00 0 [English] http://msi.com/to/e-city true false false 90% 32m HyperBot Studio [Action, Adventure, Casual, Free to Play, Indie] +[42] 325420 Homebrew - Patent Unknown Nov/2014 50000 - 100000 0 14.99 0 [English] http://www.homebrewgame.com true false false 76% 5h 48m Copybugpaste [Action, Indie, Racing, Simulation, Early Access] +[43] 663670 Killer Queen Black Oct/2019 50000 - 100000 0 9.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean] http://www.killerqueenblack.com true true false 93% 2h 11m Liquid Bit, LLC,BumbleBear Games, LLC [Action, Casual, Sports, Strategy] +[44] 503820 A Detective's Novel Jul/2016 500000 - 1000000 0 0.99 0 [English] http://amaterasusoftware.blogspot.hr/ true false false 68% 4h 24m Amaterasu Software [Adventure, Indie] +[45] 49600 Beat Hazard Apr/2010 500000 - 1000000 0 9.99 2 [English, French, German, Italian, Spanish - Spain, Dutch] http://www.coldbeamgames.com true true true 95% 7h 36m Cold Beam Games [Action, Casual, Indie] +[46] 49300 Commander: Conquest of the Americas Jul/2010 50000 - 100000 0 9.99 2 [English, French, German, Spanish - Spain] http://www.cota-game.com/ true false false 48% 11h 48m Nitro Games [Strategy] +[47] 1631930 The Insignia Project Jul/2021 50000 - 100000 0 1.99 0 [English] https://darkendstu.com/ true false false 75% null Dark End Studios [Indie, Early Access] +[48] 1038740 Fluffy Store Aug/2019 50000 - 100000 0 1.99 1 [English, Simplified Chinese, Traditional Chinese, Japanese] null true true false 97% 3h 9m AsicxArt [Adventure, Casual, Indie, RPG] +[49] 336760 Pilot Brothers Dec/2014 50000 - 100000 0 4.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean, Portuguese - Brazil, Russian, Traditional Chinese, Portuguese] null true false false 87% null 1C Wireless [Adventure, Casual] +[50] 64000 Men of War: Assault Squad Feb/2011 500000 - 1000000 0 9.99 5 [English, Russian, Italian, Spanish - Spain, French, German, Polish] http://www.menofwargame.com/assault/ true false false 88% 10h 5m Digitalmindsoft [Strategy] +[51] 487580 Ludo Supremo Jun/2016 50000 - 100000 0 1.99 0 [English] http://www.ensenasoft.com true false false 57% 3h 19m EnsenaSoft [Casual] diff --git a/tps/gabaritos/tp02/TP02Q06 - Pilha sequencial em Java/Game.java b/tps/gabaritos/tp02/TP02Q06 - Pilha sequencial em Java/Game.java new file mode 100644 index 0000000..b098d6e --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q06 - Pilha sequencial em Java/Game.java @@ -0,0 +1,669 @@ +/** + + * @file Game.java + * @author Pedro Lopes + * @version 1.0 + * @date 2022-10-17 + * @copyright Copyright (c) 2022 + +**/ + +// ----------------------------------------------------------------------------------------------------------------- // + +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 GameStack { + + private Game[] array; + private int last; + + public GameStack() {} + + public GameStack(int size) { + + array = new Game[size]; + last = 0; + } + + public void insert(Game x) throws Exception { + + if(last + 1 == array.length) throw new Exception("x Insert error: Full stack"); + + array[last++] = x; + } + + public Game remove() throws Exception { + + if(last == 0) throw new Exception("x Remove error: Empty stack"); + return array[--last]; + } + + public void print() { + + for(int i = 0; i < last; i++) { + + System.out.print("[" + i + "] "); + array[i].print(); + } + } +} + +// ----------------------------------------------------------------------------------------------------------------- // + +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 + GameStack games = new GameStack(500); + + line = scr.nextLine(); + + while(true) { + + if(line.compareTo("FIM") == 0) break; + + // ------------------------------------ // + + Game found = gameSearch(gamesFull, Integer.parseInt(line)); + + if(found != null) games.insert(found); + + // ------------------------------------ // + + line = scr.nextLine(); + } + + // ---------------------------------------------------------------------------------------------- // + + // Execute operations + int n_ops = Integer.parseInt(scr.nextLine()); + + for(int x = 0; x < n_ops; x++) { + + line = scr.nextLine(); + + // -------------------------------- // + + // Identify operation + if(line.charAt(0) == 'I') games.insert(gameSearch(gamesFull, Integer.parseInt(line.substring(2, line.length())))); + 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/TP02Q06 - Pilha sequencial em Java/pub.in b/tps/gabaritos/tp02/TP02Q06 - Pilha sequencial em Java/pub.in new file mode 100644 index 0000000..c8dcd11 --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q06 - Pilha sequencial em Java/pub.in @@ -0,0 +1,72 @@ +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 +20 +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 +R +R +R +R +R \ No newline at end of file diff --git a/tps/gabaritos/tp02/TP02Q06 - Pilha sequencial em Java/pub.out b/tps/gabaritos/tp02/TP02Q06 - Pilha sequencial em Java/pub.out new file mode 100644 index 0000000..65ddec1 --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q06 - Pilha sequencial em Java/pub.out @@ -0,0 +1,61 @@ +(R) Coloring Book for Kids +(R) 'n Verlore Verstand +(R) SPORE™ Galactic Adventures +(R) Have a Nice Death +(R) Sopwith VR +(R) Burn Zombie Burn! +(R) Sonic Adventure 2 +(R) Rhiannon: Curse of the Four Branches +(R) Synthesis Universe -Episode 00- +[0] 1189490 觅长生 Nov/2019 500000 - 1000000 0 11.99 0 [Simplified Chinese] null true false false 91% 33h 39m Chalcedony Network [Indie, RPG, Strategy, Early Access] +[1] 300550 Shadowrun: Dragonfall - Director's Cut Sep/2014 500000 - 1000000 0 14.99 0 [English] http://harebrained-schemes.com/shadowrun/dragonfall/ true true true 89% 15h 1m Harebrained Schemes [Adventure, Indie, RPG, Strategy] +[2] 49800 Flight of the Icarus May/2010 50000 - 100000 0 4.99 0 [English] http://musegames.com/games/flight-of-the-icarus/ true true false 39% 15m Muse Games [Action, Indie] +[3] 1851280 Samurai Bringer Apr/2022 50000 - 100000 0 9.99 0 [English, Japanese, Simplified Chinese, Traditional Chinese] https://playism.com/game/samurai-bringer/ true false false 88% 5h 2m ALPHAWING Inc. [Action, Indie] +[4] 1112930 Dredgers Oct/2019 50000 - 100000 0 11.99 0 [English, Simplified Chinese] null true false false 92% null Pirate-Rob [Indie, RPG] +[5] 275570 Summoner Mar/2014 50000 - 100000 0 4.99 0 [English, German] null true false false 83% 3h 24m Volition [Action, RPG] +[6] 1276550 Faefever Jul/2020 50000 - 100000 0 0.00 0 [English] null true false false 88% null Monkey Wizard Entertainment [Adventure, Casual, Free to Play, Indie] +[7] 1096530 Solasta: Crown of the Magister May/2021 500000 - 1000000 0 15.99 4 [English, French, German, Simplified Chinese, Portuguese - Brazil, Russian] https://www.solasta-game.com/ true true false 89% 37h 56m Tactical Adventures [Adventure, RPG, Strategy] +[8] 690510 Immortal Soul: Black Survival Mar/2019 500000 - 1000000 0 0.00 0 [English, Japanese, Korean, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Traditional Chinese, Thai, Portuguese, Portuguese - Brazil] null true false false 79% 28h 5m Nimble Neuron [Free to Play, Indie, Strategy] +[9] 1504570 Cultivation Tales Apr/2022 500000 - 1000000 0 19.99 0 [English, Simplified Chinese] null true false false 38% 27h 42m Ac Games [Action, Adventure, Indie, RPG, Strategy, Early Access] +[10] 1369470 Pincremental Aug/2020 50000 - 100000 0 0.00 0 [English] null true true false 80% null Makopaz [Casual, Free to Play, Indie, Simulation, Strategy] +[11] 270130 The Gallery - Episode 1: Call of the Starseed Apr/2016 50000 - 100000 0 14.99 1 [English] http://www.cloudheadgames.com true false false 84% 36m Cloudhead Games ltd. [Adventure, Casual, Indie] +[12] 336150 Virtual Pool 4 May/2015 50000 - 100000 0 24.99 0 [English] http://vponline.celeris.com true false false 83% null Celeris [Sports] +[13] 573210 Mistwood Heroes Dec/2016 50000 - 100000 0 3.99 0 [English] null true false false 56% 4h Meepower [Action, Adventure, Casual, Indie, RPG] +[14] 886470 Another Otter Jul/2018 50000 - 100000 0 0.99 0 [English] null true false false 63% null PepoLab [Casual, Indie] +[15] 1368820 RollerCoaster Tycoon® 3: Complete Edition Sep/2020 50000 - 100000 0 7.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Dutch, Finnish, Norwegian, Swedish] null true true false 83% 1h 15m Frontier Developments,Aspyr (Mac) [Simulation, Strategy] +[16] 951530 Alien Shooter - Last Hope Nov/2020 50000 - 100000 0 4.99 0 [English, Russian] http://www.sigma-team.net true false false 81% null Sigma Team Inc. [Action, Indie, RPG] +[17] 247370 Mutant Mudds Deluxe Nov/2013 50000 - 100000 0 9.99 0 [English] http://www.mutantmuddsdeluxe.com true false false 74% 3h 21m Renegade Kid [Action, Indie] +[18] 1879330 WARRIORS OROCHI 3 Ultimate Definitive Edition Jul/2022 50000 - 100000 0 39.99 0 [English, Simplified Chinese, Traditional Chinese, Japanese] https://www.gamecity.ne.jp/orochi2/ultimate/index.html true false false 88% null KOEI TECMO GAMES CO., LTD. [Action, Strategy] +[19] 1634290 Chuhou Joutai 2: Paraided! Jul/2021 50000 - 100000 0 4.99 0 [English, Japanese] https://drillimation.com/chuhou-joutai-2-paraided/ true false false 100% null Drillimation Systems [Action, Indie] +[20] 259570 EDEN STAR Jan/2015 50000 - 100000 0 19.99 0 [English] http://www.edenstargame.com true false false 61% 4h 31m Flix Interactive [Action, Adventure, Indie, Strategy, Early Access] +[21] 941650 The Island: Into The Mist Jan/2019 50000 - 100000 0 9.99 0 [Korean, English] https://imbada.itch.io/the-island true false false 69% 3h 14m SUPER WAVE Studio [Adventure, Indie] +[22] 768450 NUTS Feb/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Dutch, Japanese, Korean, Portuguese - Brazil, Russian, Simplified Chinese, Traditional Chinese] http://nuts.game true true false 88% null Joon, Pol, Muutsch, Char & Torfi [Adventure, Simulation] +[23] 1347140 NEAR DEADline Aug/2020 50000 - 100000 0 0.00 1 [English] https://www.newgrounds.com/portal/view/736443 true true true 90% null Dumb ****ing Horse [Action, Casual, Free to Play, Indie] +[24] 722670 Chinese Chess/ Elephant Game: 象棋/ 中国象棋/ 中國象棋 Oct/2017 50000 - 100000 0 9.99 0 [Simplified Chinese, Traditional Chinese, English, Russian] null true false false 78% 1h 45m Wang Wenxi [Indie, Simulation, Strategy, Early Access] +[25] 711540 Lonely Mountains: Downhill Oct/2019 50000 - 100000 0 9.99 4 [English, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Japanese, Korean, Portuguese - Brazil, Polish, Turkish] http://lonelymountains.com true true false 92% 1h 15m Megagon Industries [Action, Indie, Racing, Simulation, Sports] +[26] 450170 BOOR Feb/2017 50000 - 100000 0 0.99 0 [English, Spanish - Spain, French, German] http://www.dazlog.com/boor true true true 83% 4h 30m DazlogStudio [Adventure, Casual, Indie] +[27] 730 Counter-Strike: Global Offensive Aug/2012 50000000 - 100000000 0 0.00 1 [Czech, Danish, Dutch, English, Finnish, French, German, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Spanish - Spain, Swedish, Thai, Traditional Chinese, Turkish, Bulgarian, Ukrainian, Greek, Spanish - Latin America, Vietnamese] http://blog.counter-strike.net/ true true true 88% 508h 4m Valve,Hidden Path Entertainment [Action, Free to Play] +[28] 598550 HUNTDOWN May/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Japanese, Simplified Chinese] http://huntdown.com/ true true true 95% 11h 26m Easy Trigger Games [Action, Indie] +[29] 614090 Deadbeat Heroes Oct/2017 50000 - 100000 0 14.99 0 [English] https://www.upstreamarcade.com/deadbeat-heroes/ true false false 66% 4h 36m Deadbeat Productions [Action] +[30] 809440 Protolife Jun/2018 50000 - 100000 0 11.99 0 [English, Russian] null true true false 87% 15m Volcanic Giraffe [Indie, Strategy] +[31] 1923860 Neon Outlast Mar/2022 50000 - 100000 0 4.99 0 [English] null true false false 0% null Keep Spinning [Action, Indie] +[32] 559010 Cosmic Sugar VR Nov/2016 50000 - 100000 0 0.00 1 [English] http://cosmicsugarvr.com true false false 95% 5m David Lobser [Free to Play, Simulation] +[33] 1547380 KINGDOM of the DEAD Feb/2022 50000 - 100000 0 14.99 0 [English, French, Italian, German, Spanish - Spain, Simplified Chinese, Traditional Chinese, Korean, Japanese, Polish, Portuguese - Brazil, Russian] null true false false 83% null DIRIGO GAMES [Action, Adventure, Indie] +[34] 554310 Rage Wars Nov/2016 50000 - 100000 0 0.99 0 [English] http://www.lemondo.com/ true true true 89% 4h 24m Lemondo Games [Violent, Gore, Adventure, Casual, Indie] +[35] 1124090 告死天使之言-Death angel Aug/2019 50000 - 100000 0 0.99 1 [Simplified Chinese] https://space.bilibili.com/11591868/article true false false 81% null 我妻寒十 [Adventure, Indie] +[36] 292120 FINAL FANTASY® XIII Oct/2014 500000 - 1000000 13 15.99 0 [English, French, Italian, German, Spanish - Spain] http://www.square-enix.com/ true false false 74% 28h 58m Square Enix [RPG] +[37] 691930 MSI Electric City: Core Assault Sep/2017 50000 - 100000 0 0.00 0 [English] http://msi.com/to/e-city true false false 90% 32m HyperBot Studio [Action, Adventure, Casual, Free to Play, Indie] +[38] 325420 Homebrew - Patent Unknown Nov/2014 50000 - 100000 0 14.99 0 [English] http://www.homebrewgame.com true false false 76% 5h 48m Copybugpaste [Action, Indie, Racing, Simulation, Early Access] +[39] 663670 Killer Queen Black Oct/2019 50000 - 100000 0 9.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean] http://www.killerqueenblack.com true true false 93% 2h 11m Liquid Bit, LLC,BumbleBear Games, LLC [Action, Casual, Sports, Strategy] +[40] 503820 A Detective's Novel Jul/2016 500000 - 1000000 0 0.99 0 [English] http://amaterasusoftware.blogspot.hr/ true false false 68% 4h 24m Amaterasu Software [Adventure, Indie] +[41] 49600 Beat Hazard Apr/2010 500000 - 1000000 0 9.99 2 [English, French, German, Italian, Spanish - Spain, Dutch] http://www.coldbeamgames.com true true true 95% 7h 36m Cold Beam Games [Action, Casual, Indie] +[42] 49300 Commander: Conquest of the Americas Jul/2010 50000 - 100000 0 9.99 2 [English, French, German, Spanish - Spain] http://www.cota-game.com/ true false false 48% 11h 48m Nitro Games [Strategy] +[43] 1631930 The Insignia Project Jul/2021 50000 - 100000 0 1.99 0 [English] https://darkendstu.com/ true false false 75% null Dark End Studios [Indie, Early Access] +[44] 1038740 Fluffy Store Aug/2019 50000 - 100000 0 1.99 1 [English, Simplified Chinese, Traditional Chinese, Japanese] null true true false 97% 3h 9m AsicxArt [Adventure, Casual, Indie, RPG] +[45] 336760 Pilot Brothers Dec/2014 50000 - 100000 0 4.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean, Portuguese - Brazil, Russian, Traditional Chinese, Portuguese] null true false false 87% null 1C Wireless [Adventure, Casual] +[46] 64000 Men of War: Assault Squad Feb/2011 500000 - 1000000 0 9.99 5 [English, Russian, Italian, Spanish - Spain, French, German, Polish] http://www.menofwargame.com/assault/ true false false 88% 10h 5m Digitalmindsoft [Strategy] +[47] 487580 Ludo Supremo Jun/2016 50000 - 100000 0 1.99 0 [English] http://www.ensenasoft.com true false false 57% 3h 19m EnsenaSoft [Casual] +[48] 410890 Higurashi When They Cry Hou - Ch.2 Watanagashi Nov/2015 50000 - 100000 0 3.99 0 [English, Japanese] http://www.mangagamer.org/07thExpansion/ true true true 97% 5h 11m 07th Expansion [Adventure] +[49] 363110 NOBUNAGA'S AMBITION: Tendou with Power Up Kit Jun/2015 50000 - 100000 0 54.99 0 [Japanese] http://www.gamecity.ne.jp/steam/tendo.html true false false 77% null KOEI TECMO GAMES CO., LTD. [Strategy] +[50] 1487390 ANVIL Dec/2021 50000 - 100000 0 24.99 0 [English, Korean, German, Russian, Japanese, Simplified ChiWnese, Traditional Chinese, French, Polish, Portuguese - Brazil, Spanish - Latin America, Italian, Thai, Vietnamese] https://www.anvil.world/ true false false 63% 9h 51m Action Square [Action, Early Access] +[51] 258520 The Vanishing of Ethan Carter Sep/2014 500000 - 1000000 0 19.99 2 [English, French, Italian, German, Spanish - Spain, Polish, Czech] http://EthanCarterGame.com true false false 89% 3h 13m The Astronauts [Adventure, Indie] \ No newline at end of file diff --git a/tps/gabaritos/tp02/TP02Q06 - Pilha sequencial em Java/saida.out b/tps/gabaritos/tp02/TP02Q06 - Pilha sequencial em Java/saida.out new file mode 100644 index 0000000..0a1006b --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q06 - Pilha sequencial em Java/saida.out @@ -0,0 +1,61 @@ +(R) Coloring Book for Kids +(R) 'n Verlore Verstand +(R) SPORE™ Galactic Adventures +(R) Have a Nice Death +(R) Sopwith VR +(R) Burn Zombie Burn! +(R) Sonic Adventure 2 +(R) Rhiannon: Curse of the Four Branches +(R) Synthesis Universe -Episode 00- +[0] 1189490 觅长生 Nov/2019 500000 - 1000000 0 11.99 0 [Simplified Chinese] null true false false 91% 33h 39m Chalcedony Network [Indie, RPG, Strategy, Early Access] +[1] 300550 Shadowrun: Dragonfall - Director's Cut Sep/2014 500000 - 1000000 0 14.99 0 [English] http://harebrained-schemes.com/shadowrun/dragonfall/ true true true 89% 15h 1m Harebrained Schemes [Adventure, Indie, RPG, Strategy] +[2] 49800 Flight of the Icarus May/2010 50000 - 100000 0 4.99 0 [English] http://musegames.com/games/flight-of-the-icarus/ true true false 39% 15m Muse Games [Action, Indie] +[3] 1851280 Samurai Bringer Apr/2022 50000 - 100000 0 9.99 0 [English, Japanese, Simplified Chinese, Traditional Chinese] https://playism.com/game/samurai-bringer/ true false false 88% 5h 2m ALPHAWING Inc. [Action, Indie] +[4] 1112930 Dredgers Oct/2019 50000 - 100000 0 11.99 0 [English, Simplified Chinese] null true false false 92% null Pirate-Rob [Indie, RPG] +[5] 275570 Summoner Mar/2014 50000 - 100000 0 4.99 0 [English, German] null true false false 83% 3h 24m Volition [Action, RPG] +[6] 1276550 Faefever Jul/2020 50000 - 100000 0 0.00 0 [English] null true false false 88% null Monkey Wizard Entertainment [Adventure, Casual, Free to Play, Indie] +[7] 1096530 Solasta: Crown of the Magister May/2021 500000 - 1000000 0 15.99 4 [English, French, German, Simplified Chinese, Portuguese - Brazil, Russian] https://www.solasta-game.com/ true true false 89% 37h 56m Tactical Adventures [Adventure, RPG, Strategy] +[8] 690510 Immortal Soul: Black Survival Mar/2019 500000 - 1000000 0 0.00 0 [English, Japanese, Korean, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Traditional Chinese, Thai, Portuguese, Portuguese - Brazil] null true false false 79% 28h 5m Nimble Neuron [Free to Play, Indie, Strategy] +[9] 1504570 Cultivation Tales Apr/2022 500000 - 1000000 0 19.99 0 [English, Simplified Chinese] null true false false 38% 27h 42m Ac Games [Action, Adventure, Indie, RPG, Strategy, Early Access] +[10] 1369470 Pincremental Aug/2020 50000 - 100000 0 0.00 0 [English] null true true false 80% null Makopaz [Casual, Free to Play, Indie, Simulation, Strategy] +[11] 270130 The Gallery - Episode 1: Call of the Starseed Apr/2016 50000 - 100000 0 14.99 1 [English] http://www.cloudheadgames.com true false false 84% 36m Cloudhead Games ltd. [Adventure, Casual, Indie] +[12] 336150 Virtual Pool 4 May/2015 50000 - 100000 0 24.99 0 [English] http://vponline.celeris.com true false false 83% null Celeris [Sports] +[13] 573210 Mistwood Heroes Dec/2016 50000 - 100000 0 3.99 0 [English] null true false false 56% 4h Meepower [Action, Adventure, Casual, Indie, RPG] +[14] 886470 Another Otter Jul/2018 50000 - 100000 0 0.99 0 [English] null true false false 63% null PepoLab [Casual, Indie] +[15] 1368820 RollerCoaster Tycoon® 3: Complete Edition Sep/2020 50000 - 100000 0 7.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Dutch, Finnish, Norwegian, Swedish] null true true false 83% 1h 15m Frontier Developments,Aspyr (Mac) [Simulation, Strategy] +[16] 951530 Alien Shooter - Last Hope Nov/2020 50000 - 100000 0 4.99 0 [English, Russian] http://www.sigma-team.net true false false 81% null Sigma Team Inc. [Action, Indie, RPG] +[17] 247370 Mutant Mudds Deluxe Nov/2013 50000 - 100000 0 9.99 0 [English] http://www.mutantmuddsdeluxe.com true false false 74% 3h 21m Renegade Kid [Action, Indie] +[18] 1879330 WARRIORS OROCHI 3 Ultimate Definitive Edition Jul/2022 50000 - 100000 0 39.99 0 [English, Simplified Chinese, Traditional Chinese, Japanese] https://www.gamecity.ne.jp/orochi2/ultimate/index.html true false false 88% null KOEI TECMO GAMES CO., LTD. [Action, Strategy] +[19] 1634290 Chuhou Joutai 2: Paraided! Jul/2021 50000 - 100000 0 4.99 0 [English, Japanese] https://drillimation.com/chuhou-joutai-2-paraided/ true false false 100% null Drillimation Systems [Action, Indie] +[20] 259570 EDEN STAR Jan/2015 50000 - 100000 0 19.99 0 [English] http://www.edenstargame.com true false false 61% 4h 31m Flix Interactive [Action, Adventure, Indie, Strategy, Early Access] +[21] 941650 The Island: Into The Mist Jan/2019 50000 - 100000 0 9.99 0 [Korean, English] https://imbada.itch.io/the-island true false false 69% 3h 14m SUPER WAVE Studio [Adventure, Indie] +[22] 768450 NUTS Feb/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Dutch, Japanese, Korean, Portuguese - Brazil, Russian, Simplified Chinese, Traditional Chinese] http://nuts.game true true false 88% null Joon, Pol, Muutsch, Char & Torfi [Adventure, Simulation] +[23] 1347140 NEAR DEADline Aug/2020 50000 - 100000 0 0.00 1 [English] https://www.newgrounds.com/portal/view/736443 true true true 90% null Dumb ****ing Horse [Action, Casual, Free to Play, Indie] +[24] 722670 Chinese Chess/ Elephant Game: 象棋/ 中国象棋/ 中國象棋 Oct/2017 50000 - 100000 0 9.99 0 [Simplified Chinese, Traditional Chinese, English, Russian] null true false false 78% 1h 45m Wang Wenxi [Indie, Simulation, Strategy, Early Access] +[25] 711540 Lonely Mountains: Downhill Oct/2019 50000 - 100000 0 9.99 4 [English, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Japanese, Korean, Portuguese - Brazil, Polish, Turkish] http://lonelymountains.com true true false 92% 1h 15m Megagon Industries [Action, Indie, Racing, Simulation, Sports] +[26] 450170 BOOR Feb/2017 50000 - 100000 0 0.99 0 [English, Spanish - Spain, French, German] http://www.dazlog.com/boor true true true 83% 4h 30m DazlogStudio [Adventure, Casual, Indie] +[27] 730 Counter-Strike: Global Offensive Aug/2012 50000000 - 100000000 0 0.00 1 [Czech, Danish, Dutch, English, Finnish, French, German, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Spanish - Spain, Swedish, Thai, Traditional Chinese, Turkish, Bulgarian, Ukrainian, Greek, Spanish - Latin America, Vietnamese] http://blog.counter-strike.net/ true true true 88% 508h 4m Valve,Hidden Path Entertainment [Action, Free to Play] +[28] 598550 HUNTDOWN May/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Japanese, Simplified Chinese] http://huntdown.com/ true true true 95% 11h 26m Easy Trigger Games [Action, Indie] +[29] 614090 Deadbeat Heroes Oct/2017 50000 - 100000 0 14.99 0 [English] https://www.upstreamarcade.com/deadbeat-heroes/ true false false 66% 4h 36m Deadbeat Productions [Action] +[30] 809440 Protolife Jun/2018 50000 - 100000 0 11.99 0 [English, Russian] null true true false 87% 15m Volcanic Giraffe [Indie, Strategy] +[31] 1923860 Neon Outlast Mar/2022 50000 - 100000 0 4.99 0 [English] null true false false 0% null Keep Spinning [Action, Indie] +[32] 559010 Cosmic Sugar VR Nov/2016 50000 - 100000 0 0.00 1 [English] http://cosmicsugarvr.com true false false 95% 5m David Lobser [Free to Play, Simulation] +[33] 1547380 KINGDOM of the DEAD Feb/2022 50000 - 100000 0 14.99 0 [English, French, Italian, German, Spanish - Spain, Simplified Chinese, Traditional Chinese, Korean, Japanese, Polish, Portuguese - Brazil, Russian] null true false false 83% null DIRIGO GAMES [Action, Adventure, Indie] +[34] 554310 Rage Wars Nov/2016 50000 - 100000 0 0.99 0 [English] http://www.lemondo.com/ true true true 89% 4h 24m Lemondo Games [Violent, Gore, Adventure, Casual, Indie] +[35] 1124090 告死天使之言-Death angel Aug/2019 50000 - 100000 0 0.99 1 [Simplified Chinese] https://space.bilibili.com/11591868/article true false false 81% null 我妻寒十 [Adventure, Indie] +[36] 292120 FINAL FANTASY® XIII Oct/2014 500000 - 1000000 13 15.99 0 [English, French, Italian, German, Spanish - Spain] http://www.square-enix.com/ true false false 74% 28h 58m Square Enix [RPG] +[37] 691930 MSI Electric City: Core Assault Sep/2017 50000 - 100000 0 0.00 0 [English] http://msi.com/to/e-city true false false 90% 32m HyperBot Studio [Action, Adventure, Casual, Free to Play, Indie] +[38] 325420 Homebrew - Patent Unknown Nov/2014 50000 - 100000 0 14.99 0 [English] http://www.homebrewgame.com true false false 76% 5h 48m Copybugpaste [Action, Indie, Racing, Simulation, Early Access] +[39] 663670 Killer Queen Black Oct/2019 50000 - 100000 0 9.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean] http://www.killerqueenblack.com true true false 93% 2h 11m Liquid Bit, LLC,BumbleBear Games, LLC [Action, Casual, Sports, Strategy] +[40] 503820 A Detective's Novel Jul/2016 500000 - 1000000 0 0.99 0 [English] http://amaterasusoftware.blogspot.hr/ true false false 68% 4h 24m Amaterasu Software [Adventure, Indie] +[41] 49600 Beat Hazard Apr/2010 500000 - 1000000 0 9.99 2 [English, French, German, Italian, Spanish - Spain, Dutch] http://www.coldbeamgames.com true true true 95% 7h 36m Cold Beam Games [Action, Casual, Indie] +[42] 49300 Commander: Conquest of the Americas Jul/2010 50000 - 100000 0 9.99 2 [English, French, German, Spanish - Spain] http://www.cota-game.com/ true false false 48% 11h 48m Nitro Games [Strategy] +[43] 1631930 The Insignia Project Jul/2021 50000 - 100000 0 1.99 0 [English] https://darkendstu.com/ true false false 75% null Dark End Studios [Indie, Early Access] +[44] 1038740 Fluffy Store Aug/2019 50000 - 100000 0 1.99 1 [English, Simplified Chinese, Traditional Chinese, Japanese] null true true false 97% 3h 9m AsicxArt [Adventure, Casual, Indie, RPG] +[45] 336760 Pilot Brothers Dec/2014 50000 - 100000 0 4.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean, Portuguese - Brazil, Russian, Traditional Chinese, Portuguese] null true false false 87% null 1C Wireless [Adventure, Casual] +[46] 64000 Men of War: Assault Squad Feb/2011 500000 - 1000000 0 9.99 5 [English, Russian, Italian, Spanish - Spain, French, German, Polish] http://www.menofwargame.com/assault/ true false false 88% 10h 5m Digitalmindsoft [Strategy] +[47] 487580 Ludo Supremo Jun/2016 50000 - 100000 0 1.99 0 [English] http://www.ensenasoft.com true false false 57% 3h 19m EnsenaSoft [Casual] +[48] 410890 Higurashi When They Cry Hou - Ch.2 Watanagashi Nov/2015 50000 - 100000 0 3.99 0 [English, Japanese] http://www.mangagamer.org/07thExpansion/ true true true 97% 5h 11m 07th Expansion [Adventure] +[49] 363110 NOBUNAGA'S AMBITION: Tendou with Power Up Kit Jun/2015 50000 - 100000 0 54.99 0 [Japanese] http://www.gamecity.ne.jp/steam/tendo.html true false false 77% null KOEI TECMO GAMES CO., LTD. [Strategy] +[50] 1487390 ANVIL Dec/2021 50000 - 100000 0 24.99 0 [English, Korean, German, Russian, Japanese, Simplified Chinese, Traditional Chinese, French, Polish, Portuguese - Brazil, Spanish - Latin America, Italian, Thai, Vietnamese] https://www.anvil.world/ true false false 63% 9h 51m Action Square [Action, Early Access] +[51] 258520 The Vanishing of Ethan Carter Sep/2014 500000 - 1000000 0 19.99 2 [English, French, Italian, German, Spanish - Spain, Polish, Czech] http://EthanCarterGame.com true false false 89% 3h 13m The Astronauts [Adventure, Indie] 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..120694b --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q07 - Fila circular em Java/Game.java @@ -0,0 +1,714 @@ +/** + + * @file Game.java + * @author Pedro Lopes + * @version 1.0 + * @date 2022-10-17 + * @copyright Copyright (c) 2022 + +**/ + +// ----------------------------------------------------------------------------------------------------------------- // + +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] diff --git a/tps/gabaritos/tp02/TP02Q08 - Lista sequencial em C/Linux_Game.c b/tps/gabaritos/tp02/TP02Q08 - Lista sequencial em C/Linux_Game.c new file mode 100644 index 0000000..0a234d2 --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q08 - Lista sequencial em C/Linux_Game.c @@ -0,0 +1,869 @@ +/** + + * @file Linux_Game.c + * @author Pedro Lopes + * @version 1.0 + * @date 2022-10-17 + * @copyright Copyright (c) 2022 + +**/ + +// -------------------------------------------------------------------------------- // + +// Includes +#include +#include +#include +#include +#include + +// -------------------------------------------------------------------------------- // + +// Definitions +#define MAX_GAMES 500 +#define MAX_FIELD_SIZE 250 +#define MAX_STRING_ARRAY_SIZE 100 + +// -------------------------------------------------------------------------------- // + +// Structs +typedef struct { + + int year, + month; +} Date; + +typedef struct { + + char name[MAX_FIELD_SIZE], + owners[MAX_FIELD_SIZE], + website[MAX_FIELD_SIZE], + developers[MAX_FIELD_SIZE], + languages[MAX_STRING_ARRAY_SIZE][30], + genres[MAX_STRING_ARRAY_SIZE][30]; + + Date release_date; + int app_id, age, dlcs, avg_playtime, count_languages, count_genres; + float price, upvotes; + bool windows_os, mac_os, linux_os; + +} Game; + +// -------------------------------------------------------------------------------- // + +// Global variables +Game games[MAX_GAMES]; +int n = 0; + +Game gamesFull[5000]; +int x = 0; + +// -------------------------------------------------------------------------------- // + +// Functions +bool isFim(char* s) { return s[0] == 'F' && s[1] == 'I' && s[2] == 'M'; } + +void substring(char *string, char *string_start, int length) { + + strncpy(string, string_start, length); + string[length] = '\0'; +} + +char *getMonthName(int month) { + + switch(month) { + + case 1: return "Jan"; break; + case 2: return "Feb"; break; + case 3: return "Mar"; break; + case 4: return "Apr"; break; + case 5: return "May"; break; + case 6: return "Jun"; break; + case 7: return "Jul"; break; + case 8: return "Aug"; break; + case 9: return "Sep"; break; + case 10: return "Oct"; break; + case 11: return "Nov"; break; + case 12: return "Dec"; break; + + default: return "N/A"; break; + } +} + +int getMonthNumber(char* month) { + + if(!strcmp(month, "Jan")) return 1; + else if(!strcmp(month, "Feb")) return 2; + else if(!strcmp(month, "Mar")) return 3; + else if(!strcmp(month, "Apr")) return 4; + else if(!strcmp(month, "May")) return 5; + else if(!strcmp(month, "Jun")) return 6; + else if(!strcmp(month, "Jul")) return 7; + else if(!strcmp(month, "Aug")) return 8; + else if(!strcmp(month, "Sep")) return 9; + else if(!strcmp(month, "Oct")) return 10; + else if(!strcmp(month, "Nov")) return 11; + else if(!strcmp(month, "Dec")) return 12; +} + +// -------------------------------------------------------------------------------- // + +// Class game functions +void game_start(Game *game) { + + strcpy(game -> name, ""); + strcpy(game -> owners, ""); + strcpy(game -> website, ""); + strcpy(game -> developers, ""); + + for(int i = 0; i < MAX_STRING_ARRAY_SIZE; i++) { + + strcpy(game -> languages[i], ""); + strcpy(game -> genres[i], ""); + } + + game -> release_date.month = -1; + game -> release_date.year = -1; + game -> app_id = -1; + game -> age = -1; + game -> dlcs = -1; + game -> avg_playtime = -1; + game -> price = -1; + game -> upvotes = -1; + game -> windows_os = false; + game -> mac_os = false; + game -> linux_os = false; + + game -> count_languages = 0; + game -> count_genres = 0; +} + +void game_print(Game *game) { + + int hours = game -> avg_playtime / 60, + minutes = game -> avg_playtime % 60; + + printf("%i %s %s/%04i %s %i %.2f %i [", game -> app_id, game -> name, getMonthName(game -> release_date.month), game -> release_date.year, game -> owners, game -> age, game -> price, game -> dlcs); + + for(int i = 0; i < game -> count_languages; i++) { + + printf("%s%s", game -> languages[i], i < game -> count_languages - 1 ? ", " : ""); + } + + printf("] %s %s %s %s ", game -> website, game -> windows_os ? "true" : "false", game -> mac_os ? "true" : "false", game -> linux_os ? "true" : "false"); + + if(isnan(game -> upvotes)) printf("0.0%% "); + else printf("%.0f%% ", game -> upvotes); + + if(hours > 0) + { + printf("%ih ", hours); + + if(minutes > 0) printf("%im ", minutes); + } + else { + + if(minutes > 0) printf("%im ", minutes); + else printf("null "); + } + + printf("%s [", game -> developers); + + for(int i = 0; i < game -> count_genres; i++) { + + printf("%s%s", game -> genres[i], i < game -> count_genres - 1 ? ", " : ""); + } + + printf("]\n"); +} + +Game game_clone(Game *game) { + + Game cloned; + + strcpy(cloned.name, game -> name); + strcpy(cloned.owners, game -> owners); + strcpy(cloned.website, game -> website); + strcpy(cloned.developers, game -> developers); + + for(int i = 0; i < game -> count_languages; i++) strcpy(cloned.languages[i], game -> languages[i]); + for(int i = 0; i < game -> count_genres; i++) strcpy(cloned.genres[i], game -> genres[i]); + + cloned.release_date.month = game -> release_date.month; + cloned.release_date.year = game -> release_date.year; + cloned.app_id = game -> app_id; + cloned.age = game -> age; + cloned.dlcs = game -> dlcs; + cloned.avg_playtime = game -> avg_playtime; + cloned.price = game -> price; + cloned.upvotes = game -> upvotes; + cloned.windows_os = game -> windows_os; + cloned.mac_os = game -> mac_os; + cloned.linux_os = game -> linux_os; + return cloned; +} + +void game_read(Game *game, char *line) { + + char c_search, sub[MAX_FIELD_SIZE]; + int index = 0, atr_index = 0; + + // ------------------------------------------------------------ // + + // Find "AppID" + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + + game -> app_id = atoi(sub); + + atr_index = ++index; + break; + } + } + + // ------------------------------------------------------------ // + + // Find "Name" + if(line[atr_index] != ',') { + + if(line[atr_index] == '\"') { + + atr_index++; + c_search = '\"'; + } + else c_search = ','; + + while(true) { + + index++; + + if(line[index] == c_search) { + + substring(sub, &line[atr_index], index - atr_index); + strcpy(game -> name, sub); + + if(c_search == ',') index++; + else if(c_search == '\"') index += 2; + + atr_index = index; + break; + } + } + } + else { + + strcpy(game -> name, "null"); + + atr_index = ++index; + } + + // ------------------------------------------------------------ // + + // Find release date + if(line[atr_index] != ',') { + + if(line[atr_index] == '\"') { + + atr_index++; + c_search = '\"'; + } + else c_search = ','; + + while(true) { + + index++; + + if(line[index] == c_search) { + + substring(sub, &line[atr_index], index - atr_index); + + char subDate[10]; + + substring(subDate, &sub[0], 3); + + game -> release_date.month = getMonthNumber(subDate); + + if(c_search == ',') { + + substring(subDate, &sub[4], 4); + + game -> release_date.year = atoi(subDate); + + index++; + } + else if(c_search == '\"') { + + int nmbSpace = 0; + + for(int i = 0; ; i++) { + + if(sub[i] == ' ') nmbSpace++; + + if(nmbSpace == 2) { + + i++; + + substring(subDate, &sub[i], 4); + + game -> release_date.year = atoi(subDate); + break; + } + } + + index += 2; + } + + atr_index = index; + break; + } + } + } + else { + + game -> release_date.month = 0; + game -> release_date.year = 0; + + atr_index = ++index; + } + + // ------------------------------------------------------------ // + + // Find "Owners" + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + strcpy(game -> owners, sub); + + atr_index = ++index; + break; + } + } + + // ------------------------------------------------------------ // + + // Find "Age" + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + + game -> age = atoi(sub); + + atr_index = ++index; + break; + } + } + + // ------------------------------------------------------------ // + + // Find "Price" + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + + game -> price = atof(sub); + + atr_index = ++index; + break; + } + } + + // ------------------------------------------------------------ // + + // Find "DLCs" + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + + game -> dlcs = atoi(sub); + + atr_index = ++index; + break; + } + } + + // ------------------------------------------------------------ // + + // Find "Languages" + while(true) { + + index++; + + if(line[index] == ']') { + + index++; + + if(line[index] == ',') index++; + else if(line[index] == '\"') index += 2; + + atr_index = index; + break; + } + else if(line[index] == '\'') { + + int wordStart = index + 1; + + while(true) { + + index++; + + if(line[index] == '\'') { + + substring(sub, &line[wordStart], index - wordStart); + strcpy(game -> languages[game -> count_languages++], sub); + break; + } + } + } + } + + // ------------------------------------------------------------ // + + // Find "Website" + if(line[atr_index] != ',') { + + if(line[atr_index] == '\"') { + + atr_index++; + c_search = '\"'; + } + else c_search = ','; + + while(true) { + + index++; + + if(line[index] == c_search) { + + substring(sub, &line[atr_index], index - atr_index); + strcpy(game -> website, sub); + + atr_index = ++index; + break; + } + } + } + else { + + strcpy(game -> website, "null"); + + atr_index = ++index; + } + + // ------------------------------------------------------------ // + + // Find "Windows" + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + + if(!strcmp(sub, "True")) game -> windows_os = true; + + atr_index = ++index; + break; + } + } + + // Find "Mac" + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + + if(!strcmp(sub, "True")) game -> mac_os = true; + + atr_index = ++index; + break; + } + } + + // Find "Linux" + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + + if(!strcmp(sub, "True")) game -> linux_os = true; + + atr_index = ++index; + break; + } + } + + // ------------------------------------------------------------ // + + // Find "Upvotes" + int positives, negatives; + + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + + positives = atoi(sub); + atr_index = ++index; + break; + } + } + + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + + negatives = atoi(sub); + atr_index = ++index; + break; + } + } + + game -> upvotes = (float)(positives * 100) / (float)(positives + negatives); + + // ------------------------------------------------------------ // + + // Find "AVG Playtime" + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + + game -> avg_playtime = atoi(sub); + + atr_index = ++index; + break; + } + } + + // ------------------------------------------------------------ // + + // Find "Developers" + if(line[atr_index] != ',') { + + if(line[atr_index] == '\"') { + + atr_index++; + c_search = '\"'; + } + else c_search = ','; + + while(true) { + + index++; + + if(line[index] == c_search) { + + substring(sub, &line[atr_index], index - atr_index); + strcpy(game -> developers, sub); + + atr_index = ++index; + break; + } + } + } + else { + + strcpy(game -> developers, "null"); + + atr_index = ++index; + } + + // ------------------------------------------------------------ // + + // Find "Genres" + if(index < strlen(line) - 1) { + + if(line[index] == ',') atr_index = ++index; + + if(line[atr_index] == '\"') { + + atr_index++; + + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + strcpy(game -> genres[game -> count_genres++], sub); + + atr_index = ++index; + } + else if(line[index] == '\"') { + + substring(sub, &line[atr_index], strlen(line) - 1 - atr_index); + + if(sub[strlen(sub) - 2] == '\"') sub[strlen(sub) - 2] = '\0'; + + strcpy(game -> genres[game -> count_genres++], sub); + break; + } + } + } + else { + + substring(sub, &line[atr_index], strlen(line) - 1 - atr_index); + + sub[strlen(line) - 2 - atr_index] = '\0'; + + strcpy(game -> genres[game -> count_genres++], sub); + } + } +} + +// -------------------------------------------------------------------------------- // + +// Functions - List +void list_insertBegin(Game x) { + + if(n >= MAX_GAMES) { + + printf("Insert error: MAX_GAMES reached"); + exit(1); + } + + for(int i = n; i > 0; i--) games[i] = games[i - 1]; + + games[0] = x; + n++; +} + +void list_insertEnd(Game x) { + + if(n >= MAX_GAMES) { + + printf("Insert error: MAX_GAMES reached"); + exit(1); + } + + games[n++] = x; +} + +void list_insert(Game x, int pos) { + + if(n >= MAX_GAMES || (pos < 0 || pos > n)) { + + printf("Insert error: %s", n >= MAX_GAMES ? "MAX_GAMES reached" : "Invalid position"); + exit(1); + } + + for(int i = n; i > pos; i--) games[i] = games[i-1]; + + games[pos] = x; + n++; +} + +Game list_removeBegin() { + + Game resp; + + if(n == 0) { + + printf("Remove error: Empty list"); + exit(1); + } + + resp = games[0]; + n--; + + for(int i = 0; i < n; i++) games[i] = games[i + 1]; + return resp; +} + +Game list_removeEnd() { + + if(n == 0) { + + printf("Remove error: Empty list"); + exit(1); + } + return games[--n]; +} + +Game list_remove(int pos) { + + Game resp; + + if(n >= MAX_GAMES || (pos < 0 || pos > n)) { + + printf("Insert error: %s!", n == 0 ? "Empty list" : "Invalid position"); + exit(1); + } + + resp = games[pos]; + n--; + + for(int i = pos; i < n; i++) games[i] = games[i+1]; + return resp; +} + +void list_print() { + + for(int i = 0; i < n; i++) { + + printf("[%i] ", i); + game_print(&games[i]); + } +} + +Game game_search(int app_id) { + + for(int i = 0; i < x; i++) { + + if(gamesFull[i].app_id == app_id) return gamesFull[i]; + } + + Game game; + game.app_id = -1; + return game; +} + +// ---------------------------------------------------------------------------------------------------------- // + +int main() { + + // ---------------------------------------------------------------------------------------- // + + // Fill full games list + FILE *fp; + char *line = NULL; + size_t len = 0; + size_t read; + + fp = fopen("/tmp/games.csv", "r"); + + if(fp == NULL) exit(EXIT_FAILURE); + + // -------------------------------------- // + + while((read = getline(&line, &len, fp)) != -1) { + + Game game; + + game_start(&game); + game_read(&game, line); + + gamesFull[x++] = game; + } + + fclose(fp); + + if(line) free(line); + + // ---------------------------------------------------------------------------------------- // + + char line_in[100]; + + // Fill production games list + scanf(" %[^\n]", line_in); + + while(true) { + + if(isFim(line_in)) break; + + // -------------------------- // + + int app_id = atoi(line_in); + + Game found = game_search(app_id); + + if(found.app_id != -1) list_insertEnd(found); + + // -------------------------- // + + scanf(" %[^\n]", line_in); + } + + // ---------------------------------------------------------------------------------------- // + + // Execute operations + int n_ops; + scanf("%i", &n_ops); + + for(int i = 0; i < n_ops; i++) { + + scanf(" %[^\n]", line_in); + + Game game; + char params[10]; + + if(line_in[0] == 'I') { + + substring(params, &line_in[3], strlen(line_in) - 3); + + if(line_in[1] == 'I') list_insertBegin(game_search(atoi(params))); + else if(line_in[1] == 'F') list_insertEnd(game_search(atoi(params))); + else if(line_in[1] == '*') { + + char appId[10], pos[10]; + int i = 0; + + while(true) { + + if(params[i] == ' ') { + + substring(pos, ¶ms[0], i); + substring(appId, ¶ms[i + 1], strlen(params) - i - 1); + break; + } + else i++; + } + + list_insert(game_search(atoi(appId)), atoi(pos)); + } + } + else if(line_in[0] == 'R') { + + if(line_in[1] == 'I') printf("(R) %s\n", list_removeBegin().name); + else if(line_in[1] == 'F') printf("(R) %s\n", list_removeEnd().name); + else if(line_in[1] == '*') { + + substring(params, &line_in[3], strlen(line_in) - 3); + + printf("(R) %s\n", list_remove(atoi(params)).name); + } + } + } + + list_print(); + return EXIT_SUCCESS; +} \ No newline at end of file diff --git a/tps/gabaritos/tp02/TP02Q08 - Lista sequencial em C/WSL_Game b/tps/gabaritos/tp02/TP02Q08 - Lista sequencial em C/WSL_Game new file mode 100644 index 0000000..498668a Binary files /dev/null and b/tps/gabaritos/tp02/TP02Q08 - Lista sequencial em C/WSL_Game differ diff --git a/tps/gabaritos/tp02/TP02Q08 - Lista sequencial em C/WSL_Game.c b/tps/gabaritos/tp02/TP02Q08 - Lista sequencial em C/WSL_Game.c new file mode 100644 index 0000000..f16988e --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q08 - Lista sequencial em C/WSL_Game.c @@ -0,0 +1,868 @@ +/** + + * @file WSL_Game.c + * @author Pedro Lopes + * @version 1.0 + * @date 2022-10-17 + * @copyright Copyright (c) 2022 + +**/ + +// -------------------------------------------------------------------------------- // + +// Includes +#include +#include +#include +#include +#include + +// -------------------------------------------------------------------------------- // + +// Definitions +#define MAX_GAMES 500 +#define MAX_FIELD_SIZE 250 +#define MAX_STRING_ARRAY_SIZE 100 + +// -------------------------------------------------------------------------------- // + +// Structs +typedef struct { + + int year, + month; +} Date; + +typedef struct { + + char name[MAX_FIELD_SIZE], + owners[MAX_FIELD_SIZE], + website[MAX_FIELD_SIZE], + developers[MAX_FIELD_SIZE], + languages[MAX_STRING_ARRAY_SIZE][30], + genres[MAX_STRING_ARRAY_SIZE][30]; + + Date release_date; + int app_id, age, dlcs, avg_playtime, count_languages, count_genres; + float price, upvotes; + bool windows_os, mac_os, linux_os; + +} Game; + +// -------------------------------------------------------------------------------- // + +// Global variables +Game games[MAX_GAMES]; +int n = 0; + +Game gamesFull[5000]; +int x = 0; + +// -------------------------------------------------------------------------------- // + +// Functions +bool isFim(char* s) { return s[0] == 'F' && s[1] == 'I' && s[2] == 'M'; } + +void substring(char *string, char *string_start, int length) { + + strncpy(string, string_start, length); + string[length] = '\0'; +} + +char *getMonthName(int month) { + + switch(month) { + + case 1: return "Jan"; break; + case 2: return "Feb"; break; + case 3: return "Mar"; break; + case 4: return "Apr"; break; + case 5: return "May"; break; + case 6: return "Jun"; break; + case 7: return "Jul"; break; + case 8: return "Aug"; break; + case 9: return "Sep"; break; + case 10: return "Oct"; break; + case 11: return "Nov"; break; + case 12: return "Dec"; break; + + default: return "N/A"; break; + } +} + +int getMonthNumber(char* month) { + + if(!strcmp(month, "Jan")) return 1; + else if(!strcmp(month, "Feb")) return 2; + else if(!strcmp(month, "Mar")) return 3; + else if(!strcmp(month, "Apr")) return 4; + else if(!strcmp(month, "May")) return 5; + else if(!strcmp(month, "Jun")) return 6; + else if(!strcmp(month, "Jul")) return 7; + else if(!strcmp(month, "Aug")) return 8; + else if(!strcmp(month, "Sep")) return 9; + else if(!strcmp(month, "Oct")) return 10; + else if(!strcmp(month, "Nov")) return 11; + else if(!strcmp(month, "Dec")) return 12; +} + +// -------------------------------------------------------------------------------- // + +// Class game functions +void game_start(Game *game) { + + strcpy(game -> name, ""); + strcpy(game -> owners, ""); + strcpy(game -> website, ""); + strcpy(game -> developers, ""); + + for(int i = 0; i < MAX_STRING_ARRAY_SIZE; i++) { + + strcpy(game -> languages[i], ""); + strcpy(game -> genres[i], ""); + } + + game -> release_date.month = -1; + game -> release_date.year = -1; + game -> app_id = -1; + game -> age = -1; + game -> dlcs = -1; + game -> avg_playtime = -1; + game -> price = -1; + game -> upvotes = -1; + game -> windows_os = false; + game -> mac_os = false; + game -> linux_os = false; + + game -> count_languages = 0; + game -> count_genres = 0; +} + +void game_print(Game *game) { + + int hours = game -> avg_playtime / 60, + minutes = game -> avg_playtime % 60; + + printf("%i %s %s/%04i %s %i %.2f %i [", game -> app_id, game -> name, getMonthName(game -> release_date.month), game -> release_date.year, game -> owners, game -> age, game -> price, game -> dlcs); + + for(int i = 0; i < game -> count_languages; i++) { + + printf("%s%s", game -> languages[i], i < game -> count_languages - 1 ? ", " : ""); + } + + printf("] %s %s %s %s ", game -> website, game -> windows_os ? "true" : "false", game -> mac_os ? "true" : "false", game -> linux_os ? "true" : "false"); + + if(isnan(game -> upvotes)) printf("0.0%% "); + else printf("%.0f%% ", game -> upvotes); + + if(hours > 0) + { + printf("%ih ", hours); + + if(minutes > 0) printf("%im ", minutes); + } + else { + + if(minutes > 0) printf("%im ", minutes); + else printf("null "); + } + + printf("%s [", game -> developers); + + for(int i = 0; i < game -> count_genres; i++) { + + printf("%s%s", game -> genres[i], i < game -> count_genres - 1 ? ", " : ""); + } + + printf("]\n"); +} + +Game game_clone(Game *game) { + + Game cloned; + + strcpy(cloned.name, game -> name); + strcpy(cloned.owners, game -> owners); + strcpy(cloned.website, game -> website); + strcpy(cloned.developers, game -> developers); + + for(int i = 0; i < game -> count_languages; i++) strcpy(cloned.languages[i], game -> languages[i]); + for(int i = 0; i < game -> count_genres; i++) strcpy(cloned.genres[i], game -> genres[i]); + + cloned.release_date.month = game -> release_date.month; + cloned.release_date.year = game -> release_date.year; + cloned.app_id = game -> app_id; + cloned.age = game -> age; + cloned.dlcs = game -> dlcs; + cloned.avg_playtime = game -> avg_playtime; + cloned.price = game -> price; + cloned.upvotes = game -> upvotes; + cloned.windows_os = game -> windows_os; + cloned.mac_os = game -> mac_os; + cloned.linux_os = game -> linux_os; + return cloned; +} + +void game_read(Game *game, char *line) { + + char c_search, sub[MAX_FIELD_SIZE]; + int index = 0, atr_index = 0; + + // ------------------------------------------------------------ // + + // Find "AppID" + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + + game -> app_id = atoi(sub); + + atr_index = ++index; + break; + } + } + + // ------------------------------------------------------------ // + + // Find "Name" + if(line[atr_index] != ',') { + + if(line[atr_index] == '\"') { + + atr_index++; + c_search = '\"'; + } + else c_search = ','; + + while(true) { + + index++; + + if(line[index] == c_search) { + + substring(sub, &line[atr_index], index - atr_index); + strcpy(game -> name, sub); + + if(c_search == ',') index++; + else if(c_search == '\"') index += 2; + + atr_index = index; + break; + } + } + } + else { + + strcpy(game -> name, "null"); + + atr_index = ++index; + } + + // ------------------------------------------------------------ // + + // Find release date + if(line[atr_index] != ',') { + + if(line[atr_index] == '\"') { + + atr_index++; + c_search = '\"'; + } + else c_search = ','; + + while(true) { + + index++; + + if(line[index] == c_search) { + + substring(sub, &line[atr_index], index - atr_index); + + char subDate[10]; + + substring(subDate, &sub[0], 3); + + game -> release_date.month = getMonthNumber(subDate); + + if(c_search == ',') { + + substring(subDate, &sub[4], 4); + + game -> release_date.year = atoi(subDate); + + index++; + } + else if(c_search == '\"') { + + int nmbSpace = 0; + + for(int i = 0; ; i++) { + + if(sub[i] == ' ') nmbSpace++; + + if(nmbSpace == 2) { + + i++; + + substring(subDate, &sub[i], 4); + + game -> release_date.year = atoi(subDate); + break; + } + } + + index += 2; + } + + atr_index = index; + break; + } + } + } + else { + + game -> release_date.month = 0; + game -> release_date.year = 0; + + atr_index = ++index; + } + + // ------------------------------------------------------------ // + + // Find "Owners" + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + strcpy(game -> owners, sub); + + atr_index = ++index; + break; + } + } + + // ------------------------------------------------------------ // + + // Find "Age" + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + + game -> age = atoi(sub); + + atr_index = ++index; + break; + } + } + + // ------------------------------------------------------------ // + + // Find "Price" + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + + game -> price = atof(sub); + + atr_index = ++index; + break; + } + } + + // ------------------------------------------------------------ // + + // Find "DLCs" + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + + game -> dlcs = atoi(sub); + + atr_index = ++index; + break; + } + } + + // ------------------------------------------------------------ // + + // Find "Languages" + while(true) { + + index++; + + if(line[index] == ']') { + + index++; + + if(line[index] == ',') index++; + else if(line[index] == '\"') index += 2; + + atr_index = index; + break; + } + else if(line[index] == '\'') { + + int wordStart = index + 1; + + while(true) { + + index++; + + if(line[index] == '\'') { + + substring(sub, &line[wordStart], index - wordStart); + strcpy(game -> languages[game -> count_languages++], sub); + break; + } + } + } + } + + // ------------------------------------------------------------ // + + // Find "Website" + if(line[atr_index] != ',') { + + if(line[atr_index] == '\"') { + + atr_index++; + c_search = '\"'; + } + else c_search = ','; + + while(true) { + + index++; + + if(line[index] == c_search) { + + substring(sub, &line[atr_index], index - atr_index); + strcpy(game -> website, sub); + + atr_index = ++index; + break; + } + } + } + else { + + strcpy(game -> website, "null"); + + atr_index = ++index; + } + + // ------------------------------------------------------------ // + + // Find "Windows" + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + + if(!strcmp(sub, "True")) game -> windows_os = true; + + atr_index = ++index; + break; + } + } + + // Find "Mac" + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + + if(!strcmp(sub, "True")) game -> mac_os = true; + + atr_index = ++index; + break; + } + } + + // Find "Linux" + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + + if(!strcmp(sub, "True")) game -> linux_os = true; + + atr_index = ++index; + break; + } + } + + // ------------------------------------------------------------ // + + // Find "Upvotes" + int positives, negatives; + + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + + positives = atoi(sub); + atr_index = ++index; + break; + } + } + + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + + negatives = atoi(sub); + atr_index = ++index; + break; + } + } + + game -> upvotes = (float)(positives * 100) / (float)(positives + negatives); + + // ------------------------------------------------------------ // + + // Find "AVG Playtime" + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + + game -> avg_playtime = atoi(sub); + + atr_index = ++index; + break; + } + } + + // ------------------------------------------------------------ // + + // Find "Developers" + if(line[atr_index] != ',') { + + if(line[atr_index] == '\"') { + + atr_index++; + c_search = '\"'; + } + else c_search = ','; + + while(true) { + + index++; + + if(line[index] == c_search) { + + substring(sub, &line[atr_index], index - atr_index); + strcpy(game -> developers, sub); + + atr_index = ++index; + break; + } + } + } + else { + + strcpy(game -> developers, "null"); + + atr_index = ++index; + } + + // ------------------------------------------------------------ // + + // Find "Genres" + if(index < strlen(line) - 1) { + + if(line[index] == ',') atr_index = ++index; + + if(line[atr_index] == '\"') { + + atr_index++; + + while(true) { + + index++; + + if(line[index] == ',') { + + substring(sub, &line[atr_index], index - atr_index); + strcpy(game -> genres[game -> count_genres++], sub); + + atr_index = ++index; + } + else if(line[index] == '\"') { + + substring(sub, &line[atr_index], strlen(line) - 1 - atr_index); + + if(sub[strlen(sub) - 1] == '\"') sub[strlen(sub) - 1] = '\0'; + else if(sub[strlen(sub) - 2] == '\"') sub[strlen(sub) - 2] = '\0'; + + strcpy(game -> genres[game -> count_genres++], sub); + break; + } + } + } + else { + + substring(sub, &line[atr_index], strlen(line) - 1 - atr_index); + + strcpy(game -> genres[game -> count_genres++], sub); + } + } +} + +// -------------------------------------------------------------------------------- // + +// Functions - List +void list_insertBegin(Game x) { + + if(n >= MAX_GAMES) { + + printf("Insert error: MAX_GAMES reached"); + exit(1); + } + + for(int i = n; i > 0; i--) games[i] = games[i - 1]; + + games[0] = x; + n++; +} + +void list_insertEnd(Game x) { + + if(n >= MAX_GAMES) { + + printf("Insert error: MAX_GAMES reached"); + exit(1); + } + + games[n++] = x; +} + +void list_insert(Game x, int pos) { + + if(n >= MAX_GAMES || (pos < 0 || pos > n)) { + + printf("Insert error: %s", n >= MAX_GAMES ? "MAX_GAMES reached" : "Invalid position"); + exit(1); + } + + for(int i = n; i > pos; i--) games[i] = games[i-1]; + + games[pos] = x; + n++; +} + +Game list_removeBegin() { + + Game resp; + + if(n == 0) { + + printf("Remove error: Empty list"); + exit(1); + } + + resp = games[0]; + n--; + + for(int i = 0; i < n; i++) games[i] = games[i + 1]; + return resp; +} + +Game list_removeEnd() { + + if(n == 0) { + + printf("Remove error: Empty list"); + exit(1); + } + return games[--n]; +} + +Game list_remove(int pos) { + + Game resp; + + if(n >= MAX_GAMES || (pos < 0 || pos > n)) { + + printf("Insert error: %s!", n == 0 ? "Empty list" : "Invalid position"); + exit(1); + } + + resp = games[pos]; + n--; + + for(int i = pos; i < n; i++) games[i] = games[i+1]; + return resp; +} + +void list_print() { + + for(int i = 0; i < n; i++) { + + printf("[%i] ", i); + game_print(&games[i]); + } +} + +Game game_search(int app_id) { + + for(int i = 0; i < x; i++) { + + if(gamesFull[i].app_id == app_id) return gamesFull[i]; + } + + Game game; + game.app_id = -1; + return game; +} + +// ---------------------------------------------------------------------------------------------------------- // + +int main() { + + // ---------------------------------------------------------------------------------------- // + + // Fill full games list + FILE *fp; + char *line = NULL; + size_t len = 0; + size_t read; + + fp = fopen("/tmp/games.csv", "r"); + + if(fp == NULL) exit(EXIT_FAILURE); + + // -------------------------------------- // + + while((read = getline(&line, &len, fp)) != -1) { + + Game game; + + game_start(&game); + game_read(&game, line); + + gamesFull[x++] = game; + } + + fclose(fp); + + if(line) free(line); + + // ---------------------------------------------------------------------------------------- // + + char line_in[100]; + + // Fill production games list + scanf(" %[^\n]", line_in); + + while(true) { + + if(isFim(line_in)) break; + + // -------------------------- // + + int app_id = atoi(line_in); + + Game found = game_search(app_id); + + if(found.app_id != -1) list_insertEnd(found); + + // -------------------------- // + + scanf(" %[^\n]", line_in); + } + + // ---------------------------------------------------------------------------------------- // + + // Execute operations + int n_ops; + scanf("%i", &n_ops); + + for(int i = 0; i < n_ops; i++) { + + scanf(" %[^\n]", line_in); + + Game game; + char params[10]; + + if(line_in[0] == 'I') { + + substring(params, &line_in[3], strlen(line_in) - 3); + + if(line_in[1] == 'I') list_insertBegin(game_search(atoi(params))); + else if(line_in[1] == 'F') list_insertEnd(game_search(atoi(params))); + else if(line_in[1] == '*') { + + char appId[10], pos[10]; + int i = 0; + + while(true) { + + if(params[i] == ' ') { + + substring(pos, ¶ms[0], i); + substring(appId, ¶ms[i + 1], strlen(params) - i - 1); + break; + } + else i++; + } + + list_insert(game_search(atoi(appId)), atoi(pos)); + } + } + else if(line_in[0] == 'R') { + + if(line_in[1] == 'I') printf("(R) %s\n", list_removeBegin().name); + else if(line_in[1] == 'F') printf("(R) %s\n", list_removeEnd().name); + else if(line_in[1] == '*') { + + substring(params, &line_in[3], strlen(line_in) - 3); + + printf("(R) %s\n", list_remove(atoi(params)).name); + } + } + } + + list_print(); + return EXIT_SUCCESS; +} \ No newline at end of file diff --git a/tps/gabaritos/tp02/TP02Q08 - Lista sequencial em C/pub.in b/tps/gabaritos/tp02/TP02Q08 - Lista sequencial em C/pub.in new file mode 100644 index 0000000..90b8669 --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q08 - Lista sequencial em C/pub.in @@ -0,0 +1,72 @@ +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 +20 +II 1487390 +II 258520 +II 1165270 +II 298140 +II 213610 +IF 50510 +IF 998660 +IF 1740720 +I* 10 24720 +I* 15 439550 +I* 20 1507410 +RF +RF +RF +RI +RI +R* 10 +RF +RF +RI \ No newline at end of file diff --git a/tps/gabaritos/tp02/TP02Q08 - Lista sequencial em C/pub.out b/tps/gabaritos/tp02/TP02Q08 - Lista sequencial em C/pub.out new file mode 100644 index 0000000..e8bb1a6 --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q08 - Lista sequencial em C/pub.out @@ -0,0 +1,61 @@ +(R) Have a Nice Death +(R) Sopwith VR +(R) Burn Zombie Burn! +(R) Sonic Adventure 2 +(R) Rhiannon: Curse of the Four Branches +(R) Faefever +(R) NOBUNAGA'S AMBITION: Tendou with Power Up Kit +(R) Higurashi When They Cry Hou - Ch.2 Watanagashi +(R) Synthesis Universe -Episode 00- +[0] 258520 The Vanishing of Ethan Carter Sep/2014 500000 - 1000000 0 19.99 2 [English, French, Italian, German, Spanish - Spain, Polish, Czech] http://EthanCarterGame.com true false false 89% 3h 13m The Astronauts [Adventure, Indie] +[1] 1487390 ANVIL Dec/2021 50000 - 100000 0 24.99 0 [English, Korean, German, Russian, Japanese, Simplified Chinese, Traditional Chinese, French, Polish, Portuguese - Brazil, Spanish - Latin America, Italian, Thai, Vietnamese] https://www.anvil.world/ true false false 63% 9h 51m Action Square [Action, Early Access] +[2] 1189490 觅长生 Nov/2019 500000 - 1000000 0 11.99 0 [Simplified Chinese] null true false false 91% 33h 39m Chalcedony Network [Indie, RPG, Strategy, Early Access] +[3] 300550 Shadowrun: Dragonfall - Director's Cut Sep/2014 500000 - 1000000 0 14.99 0 [English] http://harebrained-schemes.com/shadowrun/dragonfall/ true true true 89% 15h 1m Harebrained Schemes [Adventure, Indie, RPG, Strategy] +[4] 49800 Flight of the Icarus May/2010 50000 - 100000 0 4.99 0 [English] http://musegames.com/games/flight-of-the-icarus/ true true false 39% 15m Muse Games [Action, Indie] +[5] 1851280 Samurai Bringer Apr/2022 50000 - 100000 0 9.99 0 [English, Japanese, Simplified Chinese, Traditional Chinese] https://playism.com/game/samurai-bringer/ true false false 88% 5h 2m ALPHAWING Inc. [Action, Indie] +[6] 1112930 Dredgers Oct/2019 50000 - 100000 0 11.99 0 [English, Simplified Chinese] null true false false 92% null Pirate-Rob [Indie, RPG] +[7] 24720 SPORE™ Galactic Adventures Jun/2009 500000 - 1000000 0 19.99 0 [English, French, German, Italian, Spanish - Spain, Dutch, Russian, Polish, Czech, Hungarian, Finnish, Norwegian, Swedish, Danish] http://www.spore.com/what/ga true false false 88% 15h 32m EA - Maxis [Action, Simulation] +[8] 275570 Summoner Mar/2014 50000 - 100000 0 4.99 0 [English, German] null true false false 83% 3h 24m Volition [Action, RPG] +[9] 1096530 Solasta: Crown of the Magister May/2021 500000 - 1000000 0 15.99 4 [English, French, German, Simplified Chinese, Portuguese - Brazil, Russian] https://www.solasta-game.com/ true true false 89% 37h 56m Tactical Adventures [Adventure, RPG, Strategy] +[10] 690510 Immortal Soul: Black Survival Mar/2019 500000 - 1000000 0 0.00 0 [English, Japanese, Korean, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Traditional Chinese, Thai, Portuguese, Portuguese - Brazil] null true false false 79% 28h 5m Nimble Neuron [Free to Play, Indie, Strategy] +[11] 439550 'n Verlore Verstand Apr/2016 50000 - 100000 0 14.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Bulgarian, Czech, Danish, Dutch, Finnish, Greek, Hungarian, Japanese, Korean, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Swedish, Thai, Traditional Chinese, Turkish, Ukrainian] http://www.skobbejakgames.com true true true 39% 2h 20m Skobbejak Games,Skermunkel [Adventure, Casual, Indie] +[12] 1504570 Cultivation Tales Apr/2022 500000 - 1000000 0 19.99 0 [English, Simplified Chinese] null true false false 38% 27h 42m Ac Games [Action, Adventure, Indie, RPG, Strategy, Early Access] +[13] 1369470 Pincremental Aug/2020 50000 - 100000 0 0.00 0 [English] null true true false 80% null Makopaz [Casual, Free to Play, Indie, Simulation, Strategy] +[14] 270130 The Gallery - Episode 1: Call of the Starseed Apr/2016 50000 - 100000 0 14.99 1 [English] http://www.cloudheadgames.com true false false 84% 36m Cloudhead Games ltd. [Adventure, Casual, Indie] +[15] 336150 Virtual Pool 4 May/2015 50000 - 100000 0 24.99 0 [English] http://vponline.celeris.com true false false 83% null Celeris [Sports] +[16] 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] +[17] 573210 Mistwood Heroes Dec/2016 50000 - 100000 0 3.99 0 [English] null true false false 56% 4h Meepower [Action, Adventure, Casual, Indie, RPG] +[18] 886470 Another Otter Jul/2018 50000 - 100000 0 0.99 0 [English] null true false false 63% null PepoLab [Casual, Indie] +[19] 1368820 RollerCoaster Tycoon® 3: Complete Edition Sep/2020 50000 - 100000 0 7.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Dutch, Finnish, Norwegian, Swedish] null true true false 83% 1h 15m Frontier Developments,Aspyr (Mac) [Simulation, Strategy] +[20] 951530 Alien Shooter - Last Hope Nov/2020 50000 - 100000 0 4.99 0 [English, Russian] http://www.sigma-team.net true false false 81% null Sigma Team Inc. [Action, Indie, RPG] +[21] 247370 Mutant Mudds Deluxe Nov/2013 50000 - 100000 0 9.99 0 [English] http://www.mutantmuddsdeluxe.com true false false 74% 3h 21m Renegade Kid [Action, Indie] +[22] 1879330 WARRIORS OROCHI 3 Ultimate Definitive Edition Jul/2022 50000 - 100000 0 39.99 0 [English, Simplified Chinese, Traditional Chinese, Japanese] https://www.gamecity.ne.jp/orochi2/ultimate/index.html true false false 88% null KOEI TECMO GAMES CO., LTD. [Action, Strategy] +[23] 1634290 Chuhou Joutai 2: Paraided! Jul/2021 50000 - 100000 0 4.99 0 [English, Japanese] https://drillimation.com/chuhou-joutai-2-paraided/ true false false 100% null Drillimation Systems [Action, Indie] +[24] 259570 EDEN STAR Jan/2015 50000 - 100000 0 19.99 0 [English] http://www.edenstargame.com true false false 61% 4h 31m Flix Interactive [Action, Adventure, Indie, Strategy, Early Access] +[25] 941650 The Island: Into The Mist Jan/2019 50000 - 100000 0 9.99 0 [Korean, English] https://imbada.itch.io/the-island true false false 69% 3h 14m SUPER WAVE Studio [Adventure, Indie] +[26] 768450 NUTS Feb/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Dutch, Japanese, Korean, Portuguese - Brazil, Russian, Simplified Chinese, Traditional Chinese] http://nuts.game true true false 88% null Joon, Pol, Muutsch, Char & Torfi [Adventure, Simulation] +[27] 1347140 NEAR DEADline Aug/2020 50000 - 100000 0 0.00 1 [English] https://www.newgrounds.com/portal/view/736443 true true true 90% null Dumb ****ing Horse [Action, Casual, Free to Play, Indie] +[28] 722670 Chinese Chess/ Elephant Game: 象棋/ 中国象棋/ 中國象棋 Oct/2017 50000 - 100000 0 9.99 0 [Simplified Chinese, Traditional Chinese, English, Russian] null true false false 78% 1h 45m Wang Wenxi [Indie, Simulation, Strategy, Early Access] +[29] 711540 Lonely Mountains: Downhill Oct/2019 50000 - 100000 0 9.99 4 [English, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Japanese, Korean, Portuguese - Brazil, Polish, Turkish] http://lonelymountains.com true true false 92% 1h 15m Megagon Industries [Action, Indie, Racing, Simulation, Sports] +[30] 450170 BOOR Feb/2017 50000 - 100000 0 0.99 0 [English, Spanish - Spain, French, German] http://www.dazlog.com/boor true true true 83% 4h 30m DazlogStudio [Adventure, Casual, Indie] +[31] 730 Counter-Strike: Global Offensive Aug/2012 50000000 - 100000000 0 0.00 1 [Czech, Danish, Dutch, English, Finnish, French, German, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Spanish - Spain, Swedish, Thai, Traditional Chinese, Turkish, Bulgarian, Ukrainian, Greek, Spanish - Latin America, Vietnamese] http://blog.counter-strike.net/ true true true 88% 508h 4m Valve,Hidden Path Entertainment [Action, Free to Play] +[32] 598550 HUNTDOWN May/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Japanese, Simplified Chinese] http://huntdown.com/ true true true 95% 11h 26m Easy Trigger Games [Action, Indie] +[33] 614090 Deadbeat Heroes Oct/2017 50000 - 100000 0 14.99 0 [English] https://www.upstreamarcade.com/deadbeat-heroes/ true false false 66% 4h 36m Deadbeat Productions [Action] +[34] 809440 Protolife Jun/2018 50000 - 100000 0 11.99 0 [English, Russian] null true true false 87% 15m Volcanic Giraffe [Indie, Strategy] +[35] 1923860 Neon Outlast Mar/2022 50000 - 100000 0 4.99 0 [English] null true false false 0% null Keep Spinning [Action, Indie] +[36] 559010 Cosmic Sugar VR Nov/2016 50000 - 100000 0 0.00 1 [English] http://cosmicsugarvr.com true false false 95% 5m David Lobser [Free to Play, Simulation] +[37] 1547380 KINGDOM of the DEAD Feb/2022 50000 - 100000 0 14.99 0 [English, French, Italian, German, Spanish - Spain, Simplified Chinese, Traditional Chinese, Korean, Japanese, Polish, Portuguese - Brazil, Russian] null true false false 83% null DIRIGO GAMES [Action, Adventure, Indie] +[38] 554310 Rage Wars Nov/2016 50000 - 100000 0 0.99 0 [English] http://www.lemondo.com/ true true true 89% 4h 24m Lemondo Games [Violent, Gore, Adventure, Casual, Indie] +[39] 1124090 告死天使之言-Death angel Aug/2019 50000 - 100000 0 0.99 1 [Simplified Chinese] https://space.bilibili.com/11591868/article true false false 81% null 我妻寒十 [Adventure, Indie] +[40] 292120 FINAL FANTASY® XIII Oct/2014 500000 - 1000000 13 15.99 0 [English, French, Italian, German, Spanish - Spain] http://www.square-enix.com/ true false false 74% 28h 58m Square Enix [RPG] +[41] 691930 MSI Electric City: Core Assault Sep/2017 50000 - 100000 0 0.00 0 [English] http://msi.com/to/e-city true false false 90% 32m HyperBot Studio [Action, Adventure, Casual, Free to Play, Indie] +[42] 325420 Homebrew - Patent Unknown Nov/2014 50000 - 100000 0 14.99 0 [English] http://www.homebrewgame.com true false false 76% 5h 48m Copybugpaste [Action, Indie, Racing, Simulation, Early Access] +[43] 663670 Killer Queen Black Oct/2019 50000 - 100000 0 9.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean] http://www.killerqueenblack.com true true false 93% 2h 11m Liquid Bit, LLC,BumbleBear Games, LLC [Action, Casual, Sports, Strategy] +[44] 503820 A Detective's Novel Jul/2016 500000 - 1000000 0 0.99 0 [English] http://amaterasusoftware.blogspot.hr/ true false false 68% 4h 24m Amaterasu Software [Adventure, Indie] +[45] 49600 Beat Hazard Apr/2010 500000 - 1000000 0 9.99 2 [English, French, German, Italian, Spanish - Spain, Dutch] http://www.coldbeamgames.com true true true 95% 7h 36m Cold Beam Games [Action, Casual, Indie] +[46] 49300 Commander: Conquest of the Americas Jul/2010 50000 - 100000 0 9.99 2 [English, French, German, Spanish - Spain] http://www.cota-game.com/ true false false 48% 11h 48m Nitro Games [Strategy] +[47] 1631930 The Insignia Project Jul/2021 50000 - 100000 0 1.99 0 [English] https://darkendstu.com/ true false false 75% null Dark End Studios [Indie, Early Access] +[48] 1038740 Fluffy Store Aug/2019 50000 - 100000 0 1.99 1 [English, Simplified Chinese, Traditional Chinese, Japanese] null true true false 97% 3h 9m AsicxArt [Adventure, Casual, Indie, RPG] +[49] 336760 Pilot Brothers Dec/2014 50000 - 100000 0 4.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean, Portuguese - Brazil, Russian, Traditional Chinese, Portuguese] null true false false 87% null 1C Wireless [Adventure, Casual] +[50] 64000 Men of War: Assault Squad Feb/2011 500000 - 1000000 0 9.99 5 [English, Russian, Italian, Spanish - Spain, French, German, Polish] http://www.menofwargame.com/assault/ true false false 88% 10h 5m Digitalmindsoft [Strategy] +[51] 487580 Ludo Supremo Jun/2016 50000 - 100000 0 1.99 0 [English] http://www.ensenasoft.com true false false 57% 3h 19m EnsenaSoft [Casual] \ No newline at end of file diff --git a/tps/gabaritos/tp02/TP02Q08 - Lista sequencial em C/saida.out b/tps/gabaritos/tp02/TP02Q08 - Lista sequencial em C/saida.out new file mode 100644 index 0000000..6a85875 --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q08 - Lista sequencial em C/saida.out @@ -0,0 +1,61 @@ +(R) Have a Nice Death +(R) Sopwith VR +(R) Burn Zombie Burn! +(R) Sonic Adventure 2 +(R) Rhiannon: Curse of the Four Branches +(R) Faefever +(R) NOBUNAGA'S AMBITION: Tendou with Power Up Kit +(R) Higurashi When They Cry Hou - Ch.2 Watanagashi +(R) Synthesis Universe -Episode 00- +[0] 258520 The Vanishing of Ethan Carter Sep/2014 500000 - 1000000 0 19.99 2 [English, French, Italian, German, Spanish - Spain, Polish, Czech] http://EthanCarterGame.com true false false 89% 3h 13m The Astronauts [Adventure, Indie] +[1] 1487390 ANVIL Dec/2021 50000 - 100000 0 24.99 0 [English, Korean, German, Russian, Japanese, Simplified Chinese, Traditional Chinese, French, Polish, Portuguese - Brazil, Spanish - Latin America, Italian, Thai, Vietnamese] https://www.anvil.world/ true false false 63% 9h 51m Action Square [Action, Early Access] +[2] 1189490 觅长生 Nov/2019 500000 - 1000000 0 11.99 0 [Simplified Chinese] null true false false 91% 33h 39m Chalcedony Network [Indie, RPG, Strategy, Early Access] +[3] 300550 Shadowrun: Dragonfall - Director's Cut Sep/2014 500000 - 1000000 0 14.99 0 [English] http://harebrained-schemes.com/shadowrun/dragonfall/ true true true 89% 15h 1m Harebrained Schemes [Adventure, Indie, RPG, Strategy] +[4] 49800 Flight of the Icarus May/2010 50000 - 100000 0 4.99 0 [English] http://musegames.com/games/flight-of-the-icarus/ true true false 39% 15m Muse Games [Action, Indie] +[5] 1851280 Samurai Bringer Apr/2022 50000 - 100000 0 9.99 0 [English, Japanese, Simplified Chinese, Traditional Chinese] https://playism.com/game/samurai-bringer/ true false false 88% 5h 2m ALPHAWING Inc. [Action, Indie] +[6] 1112930 Dredgers Oct/2019 50000 - 100000 0 11.99 0 [English, Simplified Chinese] null true false false 92% null Pirate-Rob [Indie, RPG] +[7] 24720 SPORE™ Galactic Adventures Jun/2009 500000 - 1000000 0 19.99 0 [English, French, German, Italian, Spanish - Spain, Dutch, Russian, Polish, Czech, Hungarian, Finnish, Norwegian, Swedish, Danish] http://www.spore.com/what/ga true false false 88% 15h 32m EA - Maxis [Action, Simulation] +[8] 275570 Summoner Mar/2014 50000 - 100000 0 4.99 0 [English, German] null true false false 83% 3h 24m Volition [Action, RPG] +[9] 1096530 Solasta: Crown of the Magister May/2021 500000 - 1000000 0 15.99 4 [English, French, German, Simplified Chinese, Portuguese - Brazil, Russian] https://www.solasta-game.com/ true true false 89% 37h 56m Tactical Adventures [Adventure, RPG, Strategy] +[10] 690510 Immortal Soul: Black Survival Mar/2019 500000 - 1000000 0 0.00 0 [English, Japanese, Korean, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Traditional Chinese, Thai, Portuguese, Portuguese - Brazil] null true false false 79% 28h 5m Nimble Neuron [Free to Play, Indie, Strategy] +[11] 439550 'n Verlore Verstand Apr/2016 50000 - 100000 0 14.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Bulgarian, Czech, Danish, Dutch, Finnish, Greek, Hungarian, Japanese, Korean, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Swedish, Thai, Traditional Chinese, Turkish, Ukrainian] http://www.skobbejakgames.com true true true 39% 2h 20m Skobbejak Games,Skermunkel [Adventure, Casual, Indie] +[12] 1504570 Cultivation Tales Apr/2022 500000 - 1000000 0 19.99 0 [English, Simplified Chinese] null true false false 38% 27h 42m Ac Games [Action, Adventure, Indie, RPG, Strategy, Early Access] +[13] 1369470 Pincremental Aug/2020 50000 - 100000 0 0.00 0 [English] null true true false 80% null Makopaz [Casual, Free to Play, Indie, Simulation, Strategy] +[14] 270130 The Gallery - Episode 1: Call of the Starseed Apr/2016 50000 - 100000 0 14.99 1 [English] http://www.cloudheadgames.com true false false 84% 36m Cloudhead Games ltd. [Adventure, Casual, Indie] +[15] 336150 Virtual Pool 4 May/2015 50000 - 100000 0 24.99 0 [English] http://vponline.celeris.com true false false 83% null Celeris [Sports] +[16] 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] +[17] 573210 Mistwood Heroes Dec/2016 50000 - 100000 0 3.99 0 [English] null true false false 56% 4h Meepower [Action, Adventure, Casual, Indie, RPG] +[18] 886470 Another Otter Jul/2018 50000 - 100000 0 0.99 0 [English] null true false false 63% null PepoLab [Casual, Indie] +[19] 1368820 RollerCoaster Tycoon® 3: Complete Edition Sep/2020 50000 - 100000 0 7.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Dutch, Finnish, Norwegian, Swedish] null true true false 83% 1h 15m Frontier Developments,Aspyr (Mac) [Simulation, Strategy] +[20] 951530 Alien Shooter - Last Hope Nov/2020 50000 - 100000 0 4.99 0 [English, Russian] http://www.sigma-team.net true false false 81% null Sigma Team Inc. [Action, Indie, RPG] +[21] 247370 Mutant Mudds Deluxe Nov/2013 50000 - 100000 0 9.99 0 [English] http://www.mutantmuddsdeluxe.com true false false 74% 3h 21m Renegade Kid [Action, Indie] +[22] 1879330 WARRIORS OROCHI 3 Ultimate Definitive Edition Jul/2022 50000 - 100000 0 39.99 0 [English, Simplified Chinese, Traditional Chinese, Japanese] https://www.gamecity.ne.jp/orochi2/ultimate/index.html true false false 88% null KOEI TECMO GAMES CO., LTD. [Action, Strategy] +[23] 1634290 Chuhou Joutai 2: Paraided! Jul/2021 50000 - 100000 0 4.99 0 [English, Japanese] https://drillimation.com/chuhou-joutai-2-paraided/ true false false 100% null Drillimation Systems [Action, Indie] +[24] 259570 EDEN STAR Jan/2015 50000 - 100000 0 19.99 0 [English] http://www.edenstargame.com true false false 61% 4h 31m Flix Interactive [Action, Adventure, Indie, Strategy, Early Access] +[25] 941650 The Island: Into The Mist Jan/2019 50000 - 100000 0 9.99 0 [Korean, English] https://imbada.itch.io/the-island true false false 69% 3h 14m SUPER WAVE Studio [Adventure, Indie] +[26] 768450 NUTS Feb/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Dutch, Japanese, Korean, Portuguese - Brazil, Russian, Simplified Chinese, Traditional Chinese] http://nuts.game true true false 88% null Joon, Pol, Muutsch, Char & Torfi [Adventure, Simulation] +[27] 1347140 NEAR DEADline Aug/2020 50000 - 100000 0 0.00 1 [English] https://www.newgrounds.com/portal/view/736443 true true true 90% null Dumb ****ing Horse [Action, Casual, Free to Play, Indie] +[28] 722670 Chinese Chess/ Elephant Game: 象棋/ 中国象棋/ 中國象棋 Oct/2017 50000 - 100000 0 9.99 0 [Simplified Chinese, Traditional Chinese, English, Russian] null true false false 78% 1h 45m Wang Wenxi [Indie, Simulation, Strategy, Early Access] +[29] 711540 Lonely Mountains: Downhill Oct/2019 50000 - 100000 0 9.99 4 [English, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Japanese, Korean, Portuguese - Brazil, Polish, Turkish] http://lonelymountains.com true true false 92% 1h 15m Megagon Industries [Action, Indie, Racing, Simulation, Sports] +[30] 450170 BOOR Feb/2017 50000 - 100000 0 0.99 0 [English, Spanish - Spain, French, German] http://www.dazlog.com/boor true true true 83% 4h 30m DazlogStudio [Adventure, Casual, Indie] +[31] 730 Counter-Strike: Global Offensive Aug/2012 50000000 - 100000000 0 0.00 1 [Czech, Danish, Dutch, English, Finnish, French, German, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Spanish - Spain, Swedish, Thai, Traditional Chinese, Turkish, Bulgarian, Ukrainian, Greek, Spanish - Latin America, Vietnamese] http://blog.counter-strike.net/ true true true 88% 508h 4m Valve,Hidden Path Entertainment [Action, Free to Play] +[32] 598550 HUNTDOWN May/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Japanese, Simplified Chinese] http://huntdown.com/ true true true 95% 11h 26m Easy Trigger Games [Action, Indie] +[33] 614090 Deadbeat Heroes Oct/2017 50000 - 100000 0 14.99 0 [English] https://www.upstreamarcade.com/deadbeat-heroes/ true false false 66% 4h 36m Deadbeat Productions [Action] +[34] 809440 Protolife Jun/2018 50000 - 100000 0 11.99 0 [English, Russian] null true true false 87% 15m Volcanic Giraffe [Indie, Strategy] +[35] 1923860 Neon Outlast Mar/2022 50000 - 100000 0 4.99 0 [English] null true false false 0% null Keep Spinning [Action, Indie] +[36] 559010 Cosmic Sugar VR Nov/2016 50000 - 100000 0 0.00 1 [English] http://cosmicsugarvr.com true false false 95% 5m David Lobser [Free to Play, Simulation] +[37] 1547380 KINGDOM of the DEAD Feb/2022 50000 - 100000 0 14.99 0 [English, French, Italian, German, Spanish - Spain, Simplified Chinese, Traditional Chinese, Korean, Japanese, Polish, Portuguese - Brazil, Russian] null true false false 83% null DIRIGO GAMES [Action, Adventure, Indie] +[38] 554310 Rage Wars Nov/2016 50000 - 100000 0 0.99 0 [English] http://www.lemondo.com/ true true true 89% 4h 24m Lemondo Games [Violent, Gore, Adventure, Casual, Indie] +[39] 1124090 告死天使之言-Death angel Aug/2019 50000 - 100000 0 0.99 1 [Simplified Chinese] https://space.bilibili.com/11591868/article true false false 81% null 我妻寒十 [Adventure, Indie] +[40] 292120 FINAL FANTASY® XIII Oct/2014 500000 - 1000000 13 15.99 0 [English, French, Italian, German, Spanish - Spain] http://www.square-enix.com/ true false false 74% 28h 58m Square Enix [RPG] +[41] 691930 MSI Electric City: Core Assault Sep/2017 50000 - 100000 0 0.00 0 [English] http://msi.com/to/e-city true false false 90% 32m HyperBot Studio [Action, Adventure, Casual, Free to Play, Indie] +[42] 325420 Homebrew - Patent Unknown Nov/2014 50000 - 100000 0 14.99 0 [English] http://www.homebrewgame.com true false false 76% 5h 48m Copybugpaste [Action, Indie, Racing, Simulation, Early Access] +[43] 663670 Killer Queen Black Oct/2019 50000 - 100000 0 9.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean] http://www.killerqueenblack.com true true false 93% 2h 11m Liquid Bit, LLC,BumbleBear Games, LLC [Action, Casual, Sports, Strategy] +[44] 503820 A Detective's Novel Jul/2016 500000 - 1000000 0 0.99 0 [English] http://amaterasusoftware.blogspot.hr/ true false false 68% 4h 24m Amaterasu Software [Adventure, Indie] +[45] 49600 Beat Hazard Apr/2010 500000 - 1000000 0 9.99 2 [English, French, German, Italian, Spanish - Spain, Dutch] http://www.coldbeamgames.com true true true 95% 7h 36m Cold Beam Games [Action, Casual, Indie] +[46] 49300 Commander: Conquest of the Americas Jul/2010 50000 - 100000 0 9.99 2 [English, French, German, Spanish - Spain] http://www.cota-game.com/ true false false 48% 11h 48m Nitro Games [Strategy] +[47] 1631930 The Insignia Project Jul/2021 50000 - 100000 0 1.99 0 [English] https://darkendstu.com/ true false false 75% null Dark End Studios [Indie, Early Access] +[48] 1038740 Fluffy Store Aug/2019 50000 - 100000 0 1.99 1 [English, Simplified Chinese, Traditional Chinese, Japanese] null true true false 97% 3h 9m AsicxArt [Adventure, Casual, Indie, RPG] +[49] 336760 Pilot Brothers Dec/2014 50000 - 100000 0 4.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean, Portuguese - Brazil, Russian, Traditional Chinese, Portuguese] null true false false 87% null 1C Wireless [Adventure, Casual] +[50] 64000 Men of War: Assault Squad Feb/2011 500000 - 1000000 0 9.99 5 [English, Russian, Italian, Spanish - Spain, French, German, Polish] http://www.menofwargame.com/assault/ true false false 88% 10h 5m Digitalmindsoft [Strategy] +[51] 487580 Ludo Supremo Jun/2016 50000 - 100000 0 1.99 0 [English] http://www.ensenasoft.com true false false 57% 3h 19m EnsenaSoft [Casual]