From d8266afda2e0345c6df87895b41bff082bde8f2f Mon Sep 17 00:00:00 2001 From: Souka21 Date: Sun, 25 Feb 2024 21:07:54 +0100 Subject: [PATCH 1/4] BlablaChallenge --- submissions/Souka21/solution.py | 60 +++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 submissions/Souka21/solution.py diff --git a/submissions/Souka21/solution.py b/submissions/Souka21/solution.py new file mode 100644 index 00000000..9221194c --- /dev/null +++ b/submissions/Souka21/solution.py @@ -0,0 +1,60 @@ +import pandas as pd + +MAX_PRICE = 100.00 +NUM_CHEAPEST_PRODUCTS = 5 + +def process_city_data(filename): + """Process the input CSV file to extract city data. + Args: + filename (str): The name of the input CSV file. + Returns: + pd.DataFrame: A DataFrame containing city data. + """ + df = pd.read_csv(filename, header=None, names=['City', 'Product', 'Price']) + df['Price'] = df['Price'].astype(float) + return df + +def find_cheapest_city(df): + """Find the city with the lowest total price. + Args: + df (pd.DataFrame): DataFrame containing city data. + Returns: + pd.Series: Series representing the City object with the lowest total price. + """ + return df.groupby('City')['Price'].sum().idxmin() + +def find_cheapest_products(df, min_city): + """Find the cheapest products in a given city. + Args: + df (pd.DataFrame): DataFrame containing city data. + min_city (str): Name of the city. + Returns: + pd.DataFrame: DataFrame containing the cheapest products in the given city. + """ + city_df = df[df['City'] == min_city] + return city_df.nsmallest(NUM_CHEAPEST_PRODUCTS, 'Price')[['Product', 'Price']] + +def write_output(filename, min_city, min_products): + """Write the output to a file. + Args: + filename (str): The name of the output file. + min_city (str): Name of the city with the lowest total price. + min_products (pd.DataFrame): DataFrame containing the cheapest products. + """ + with open(filename, 'w') as file: + file.write(f"{min_city} {min_products['Price'].sum():.2f}\n") + for _, row in min_products.iterrows(): + file.write(f"{row['Product']} {row['Price']:.2f}\n") + +def main(): + """Main function to execute the program.""" + input_filename = 'input.txt' + output_filename = 'output.txt' + + df = process_city_data(input_filename) + min_city = find_cheapest_city(df) + min_products = find_cheapest_products(df, min_city) + write_output(output_filename, min_city, min_products) + +if __name__ == "__main__": + main() From a506089ddbab74f8d6baf486c332bf70301b18ed Mon Sep 17 00:00:00 2001 From: Souka21 Date: Sun, 25 Feb 2024 21:25:01 +0100 Subject: [PATCH 2/4] version2 --- submissions/Souka21/solution.py | 70 ++++++++++++++++++++++----------- 1 file changed, 46 insertions(+), 24 deletions(-) diff --git a/submissions/Souka21/solution.py b/submissions/Souka21/solution.py index 9221194c..328cd658 100644 --- a/submissions/Souka21/solution.py +++ b/submissions/Souka21/solution.py @@ -1,59 +1,81 @@ -import pandas as pd +import csv MAX_PRICE = 100.00 NUM_CHEAPEST_PRODUCTS = 5 def process_city_data(filename): - """Process the input CSV file to extract city data. + """Process input CSV file to extract city data. + Args: filename (str): The name of the input CSV file. + Returns: - pd.DataFrame: A DataFrame containing city data. + dict: A dictionary containing city data indexed by city names. + Each city entry contains: + 'total_price': Total price of all products in the city. + 'cheapest_products': List of tuples containing the names and prices of the cheapest products. """ - df = pd.read_csv(filename, header=None, names=['City', 'Product', 'Price']) - df['Price'] = df['Price'].astype(float) - return df + cities = {} + + with open(filename, 'r') as file: + reader = csv.reader(file) + next(reader) # Skip header row + for row in reader: + city, product, price = row[0], row[1], float(row[2]) + if city not in cities: + cities[city] = {'total_price': 0, 'cheapest_products': []} + cities[city]['total_price'] += price + cities[city]['cheapest_products'].append((product, price)) -def find_cheapest_city(df): + return cities + +def find_cheapest_city(cities): """Find the city with the lowest total price. + Args: - df (pd.DataFrame): DataFrame containing city data. + cities (dict): A dictionary containing city data indexed by city names. + Returns: - pd.Series: Series representing the City object with the lowest total price. + str: The name of the city with the lowest total price. """ - return df.groupby('City')['Price'].sum().idxmin() + min_city = min(cities, key=lambda city: cities[city]['total_price']) + return min_city -def find_cheapest_products(df, min_city): +def find_cheapest_products(cities, min_city): """Find the cheapest products in a given city. + Args: - df (pd.DataFrame): DataFrame containing city data. - min_city (str): Name of the city. + cities (dict): A dictionary containing city data indexed by city names. + min_city (str): The name of the city for which to find the cheapest products. + Returns: - pd.DataFrame: DataFrame containing the cheapest products in the given city. + list: A list of tuples containing the names and prices of the cheapest products. """ - city_df = df[df['City'] == min_city] - return city_df.nsmallest(NUM_CHEAPEST_PRODUCTS, 'Price')[['Product', 'Price']] + min_products = cities[min_city]['cheapest_products'] + min_products.sort(key=lambda x: x[1]) # Sort cheapest products by price + return min_products[:NUM_CHEAPEST_PRODUCTS] def write_output(filename, min_city, min_products): """Write the output to a file. + Args: filename (str): The name of the output file. - min_city (str): Name of the city with the lowest total price. - min_products (pd.DataFrame): DataFrame containing the cheapest products. + min_city (str): The name of the city with the lowest total price. + min_products (list): A list of tuples containing the names and prices of the cheapest products. """ with open(filename, 'w') as file: - file.write(f"{min_city} {min_products['Price'].sum():.2f}\n") - for _, row in min_products.iterrows(): - file.write(f"{row['Product']} {row['Price']:.2f}\n") + file.write(f"{min_city} {sum(product[1] for product in min_products):.2f}\n") + for product in min_products: + file.write(f"{product[0]} {product[1]:.2f}\n") def main(): """Main function to execute the program.""" input_filename = 'input.txt' output_filename = 'output.txt' - df = process_city_data(input_filename) - min_city = find_cheapest_city(df) - min_products = find_cheapest_products(df, min_city) + cities = process_city_data(input_filename) + min_city = find_cheapest_city(cities) + min_products = find_cheapest_products(cities, min_city) write_output(output_filename, min_city, min_products) if __name__ == "__main__": From 694f816661922bbca74ab3a76001531136270e8b Mon Sep 17 00:00:00 2001 From: Souka21 Date: Sun, 25 Feb 2024 21:30:10 +0100 Subject: [PATCH 3/4] version23 --- .vscode/c_cpp_properties.json | 18 +++++++++++ .vscode/launch.json | 24 ++++++++++++++ .vscode/settings.json | 59 +++++++++++++++++++++++++++++++++++ 3 files changed, 101 insertions(+) create mode 100644 .vscode/c_cpp_properties.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 00000000..cea4d3f4 --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,18 @@ +{ + "configurations": [ + { + "name": "windows-gcc-x64", + "includePath": [ + "${workspaceFolder}/**" + ], + "compilerPath": "gcc", + "cStandard": "${default}", + "cppStandard": "${default}", + "intelliSenseMode": "windows-gcc-x64", + "compilerArgs": [ + "" + ] + } + ], + "version": 4 +} \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..3ea3947a --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,24 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "C/C++ Runner: Debug Session", + "type": "cppdbg", + "request": "launch", + "args": [], + "stopAtEntry": false, + "externalConsole": true, + "cwd": "c:/Users/toshiba/Desktop/appGIT/blanat", + "program": "c:/Users/toshiba/Desktop/appGIT/blanat/build/Debug/outDebug", + "MIMode": "gdb", + "miDebuggerPath": "gdb", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ] + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..3e5eb956 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,59 @@ +{ + "C_Cpp_Runner.cCompilerPath": "gcc", + "C_Cpp_Runner.cppCompilerPath": "g++", + "C_Cpp_Runner.debuggerPath": "gdb", + "C_Cpp_Runner.cStandard": "", + "C_Cpp_Runner.cppStandard": "", + "C_Cpp_Runner.msvcBatchPath": "", + "C_Cpp_Runner.useMsvc": false, + "C_Cpp_Runner.warnings": [ + "-Wall", + "-Wextra", + "-Wpedantic", + "-Wshadow", + "-Wformat=2", + "-Wcast-align", + "-Wconversion", + "-Wsign-conversion", + "-Wnull-dereference" + ], + "C_Cpp_Runner.msvcWarnings": [ + "/W4", + "/permissive-", + "/w14242", + "/w14287", + "/w14296", + "/w14311", + "/w14826", + "/w44062", + "/w44242", + "/w14905", + "/w14906", + "/w14263", + "/w44265", + "/w14928" + ], + "C_Cpp_Runner.enableWarnings": true, + "C_Cpp_Runner.warningsAsError": false, + "C_Cpp_Runner.compilerArgs": [], + "C_Cpp_Runner.linkerArgs": [], + "C_Cpp_Runner.includePaths": [], + "C_Cpp_Runner.includeSearch": [ + "*", + "**/*" + ], + "C_Cpp_Runner.excludeSearch": [ + "**/build", + "**/build/**", + "**/.*", + "**/.*/**", + "**/.vscode", + "**/.vscode/**" + ], + "C_Cpp_Runner.useAddressSanitizer": false, + "C_Cpp_Runner.useUndefinedSanitizer": false, + "C_Cpp_Runner.useLeakSanitizer": false, + "C_Cpp_Runner.showCompilationTime": false, + "C_Cpp_Runner.useLinkTimeOptimization": false, + "C_Cpp_Runner.msvcSecureNoWarnings": false +} \ No newline at end of file From cefbd39d1655a3c710617477d8f387a1d89a5c02 Mon Sep 17 00:00:00 2001 From: Souka21 Date: Sun, 25 Feb 2024 21:35:48 +0100 Subject: [PATCH 4/4] version3 --- submissions/Souka21/solution.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/submissions/Souka21/solution.py b/submissions/Souka21/solution.py index 328cd658..cb219ae4 100644 --- a/submissions/Souka21/solution.py +++ b/submissions/Souka21/solution.py @@ -73,10 +73,24 @@ def main(): input_filename = 'input.txt' output_filename = 'output.txt' - cities = process_city_data(input_filename) - min_city = find_cheapest_city(cities) - min_products = find_cheapest_products(cities, min_city) + cities = {} + with open(input_filename, 'r') as file: + reader = csv.reader(file) + next(reader) # Skip header row + for row in reader: + city, product, price = row[0], row[1], float(row[2]) + if city not in cities: + cities[city] = {'total_price': 0, 'cheapest_products': []} + cities[city]['total_price'] += price + cities[city]['cheapest_products'].append((product, price)) + + min_city = min(cities, key=lambda city: cities[city]['total_price']) + min_products = cities[min_city]['cheapest_products'] + min_products.sort(key=lambda x: x[1]) # Sort cheapest products by price + min_products = min_products[:NUM_CHEAPEST_PRODUCTS] + write_output(output_filename, min_city, min_products) if __name__ == "__main__": main() +