#!/usr/bin/env python3 """ Comprehensive Basic Arithmetic & BODMAS Shard Generator Generates: 1. Complete Multiplication Tables 1 to 100 (English & Hindi pahade) 2. Direct 1 to 4 digit Addition, Subtraction, Multiplication, Division (+ - * /) 3. Step-by-Step BODMAS Multi-operator Solutions 4. Percentage, Discount, GST, Fractions, Square roots, Cubes """ import random import pandas as pd random.seed(42) def generate_tables(): entries = [] hindi_ordinals = ["ekam", "duni", "tiya", "chauke", "panche", "chhakke", "satte", "atthe", "namme", "daham"] for num in range(1, 101): lines = [f"### Multiplication Table of {num}:"] for m in range(1, 11): lines.append(f"{num} x {m} = {num * m}") full_text_en = "\n".join(lines) entries.append({"text": full_text_en, "category": "table_english", "num": num}) # Hindi Pahada if num <= 30: lines_hi = [f"### {num} का पहाड़ा (Multiplication Table in Hindi):"] for m in range(1, 11): ans = num * m ord_name = hindi_ordinals[m - 1] lines_hi.append(f"{num} {ord_name} {ans} ({num} x {m} = {ans})") full_text_hi = "\n".join(lines_hi) entries.append({"text": full_text_hi, "category": "table_hindi", "num": num}) return entries def generate_direct_arithmetic(count=15000): entries = [] for _ in range(count): op = random.choice(["+", "-", "*", "/"]) if op == "+": digits = random.choice([1, 2, 3, 4]) a = random.randint(10**(digits-1), 10**digits - 1) b = random.randint(10**(digits-1), 10**digits - 1) res = a + b text = ( f"Question: Calculate {a} + {b}.\n" f"\nJod (Addition):\n {a}\n+ {b}\n------\n {res}\n\n" f"Answer: {a} + {b} = {res}." ) entries.append({"text": text, "category": "addition"}) elif op == "-": digits = random.choice([1, 2, 3, 4]) a = random.randint(10**(digits-1), 10**digits - 1) b = random.randint(10**(digits-1), 10**digits - 1) res = a - b text = ( f"Question: Calculate {a} - {b}.\n" f"\nGhatana (Subtraction):\n {a}\n- {b}\n------\n {res}\n\n" f"Answer: {a} - {b} = {res}." ) entries.append({"text": text, "category": "subtraction"}) elif op == "*": a = random.randint(2, 999) b = random.randint(2, 99) res = a * b text = ( f"Question: Calculate {a} * {b} (Multiplication / Guna).\n" f"\nStep-by-step multiplication:\n{a} multiplied by {b} is calculated as:\n" f"{a} * {b} = {res}\n\n" f"Answer: {a} * {b} = {res}." ) entries.append({"text": text, "category": "multiplication"}) elif op == "/": b = random.randint(2, 50) q = random.randint(2, 200) r = random.choice([0, random.randint(1, b - 1)]) a = b * q + r if r == 0: text = ( f"Question: Calculate {a} / {b} (Division / Bhag).\n" f"\n{a} divided by {b}:\nQuotient = {q}, Remainder = 0.\nExact division: {a} / {b} = {q}\n\n" f"Answer: {a} / {b} = {q}." ) else: dec = round(a / b, 4) text = ( f"Question: Calculate {a} / {b} (Division / Bhag).\n" f"\n{a} divided by {b}:\nQuotient (Bhagphal) = {q}, Remainder (Sheshphal) = {r}.\nIn decimals: {a} / {b} = {dec}\n\n" f"Answer: {a} / {b} = {q} remainder {r} (approx {dec})." ) entries.append({"text": text, "category": "division"}) return entries def generate_bodmas(count=5000): entries = [] for _ in range(count): a = random.randint(5, 50) b = random.randint(2, 12) c = random.randint(2, 8) d = random.randint(1, 10) e = random.randint(2, 6) pattern = random.choice([1, 2, 3]) if pattern == 1: # a + b * (c + d) bracket = c + d mult = b * bracket ans = a + mult expr = f"{a} + {b} * ({c} + {d})" text = ( f"Question: Solve the expression using BODMAS: {expr}\n" f"\nBODMAS Rule (Brackets, Orders, Division/Multiplication, Addition/Subtraction):\n" f"Step 1: Solve inside Bracket: ({c} + {d}) = {bracket}\n" f"Expression becomes: {a} + {b} * {bracket}\n" f"Step 2: Multiply: {b} * {bracket} = {mult}\n" f"Expression becomes: {a} + {mult}\n" f"Step 3: Add: {a} + {mult} = {ans}\n" f"\n" f"Answer: {expr} = {ans}." ) elif pattern == 2: # (a * b) - (c * d) part1 = a * b part2 = c * d ans = part1 - part2 expr = f"({a} * {b}) - ({c} * {d})" text = ( f"Question: Solve the expression using BODMAS: {expr}\n" f"\nStep 1: Solve first bracket: {a} * {b} = {part1}\n" f"Step 2: Solve second bracket: {c} * {d} = {part2}\n" f"Step 3: Subtract: {part1} - {part2} = {ans}\n" f"\n" f"Answer: {expr} = {ans}." ) else: # a * e + b - d mult = a * e ans = mult + b - d expr = f"{a} * {e} + {b} - {d}" text = ( f"Question: Solve the expression: {expr}\n" f"\nBODMAS:\nStep 1: Multiply: {a} * {e} = {mult}\n" f"Step 2: Add: {mult} + {b} = {mult + b}\n" f"Step 3: Subtract: {mult + b} - {d} = {ans}\n" f"\n" f"Answer: {expr} = {ans}." ) entries.append({"text": text, "category": "bodmas"}) return entries def generate_percentage_and_everyday(count=5000): entries = [] gst_slabs = [5, 12, 18, 28] for _ in range(count): choice = random.choice(["gst", "discount", "simple_interest", "fraction", "powers"]) if choice == "gst": amount = random.randint(10, 500) * 100 rate = random.choice(gst_slabs) gst_val = int(amount * (rate / 100)) total = amount + gst_val text = ( f"Question: {amount} rupaye par {rate}% GST kitna hoga aur kul rashi (total amount) kitni hogi?\n" f"\nGST calculation:\n" f"GST Amount = Amount * (Rate / 100) = {amount} * ({rate} / 100) = {gst_val} rupaye.\n" f"Kul Rashi = Mool Rashi + GST = {amount} + {gst_val} = {total} rupaye.\n" f"\n" f"Answer: {amount} rupaye par {rate}% GST = {gst_val} rupaye hoga, aur kul rashi {total} rupaye hogi." ) entries.append({"text": text, "category": "gst"}) elif choice == "discount": mrp = random.randint(20, 200) * 50 disc_rate = random.choice([10, 15, 20, 25, 30, 40, 50]) disc_val = int(mrp * (disc_rate / 100)) selling_price = mrp - disc_val text = ( f"Question: MRP Rs. {mrp} par {disc_rate}% discount ke baad bikri muly (Selling Price) kya hoga?\n" f"\nDiscount = {mrp} * ({disc_rate} / 100) = {disc_val} rupaye.\n" f"Selling Price = MRP - Discount = {mrp} - {disc_val} = {selling_price} rupaye.\n" f"\n" f"Answer: {disc_rate}% discount ke baad selling price Rs. {selling_price} hoga (bachat: Rs. {disc_val})." ) entries.append({"text": text, "category": "discount"}) elif choice == "powers": base = random.randint(2, 25) exp = 2 if base > 15 else random.randint(2, 4) val = base ** exp text = ( f"Question: What is {base}^{exp} (Square / Cube)?\n" f"\n{base} raised to the power {exp} = {val}\n\n" f"Answer: {base}^{exp} = {val}." ) entries.append({"text": text, "category": "powers"}) elif choice == "fraction": n1 = random.randint(1, 4) d1 = random.choice([2, 4, 8]) n2 = random.randint(1, 4) d2 = d1 ans_n = n1 + n2 text = ( f"Question: Solve fraction addition: {n1}/{d1} + {n2}/{d2}\n" f"\nDenominators are same ({d1}):\n({n1} + {n2}) / {d1} = {ans_n} / {d1}\n\n" f"Answer: {n1}/{d1} + {n2}/{d2} = {ans_n}/{d1}." ) entries.append({"text": text, "category": "fraction"}) return entries def main(): print("[*] Generating Basic Arithmetic, Tables, BODMAS, and Everyday Math...") all_data = [] all_data.extend(generate_tables()) all_data.extend(generate_direct_arithmetic(15000)) all_data.extend(generate_bodmas(5000)) all_data.extend(generate_percentage_and_everyday(5000)) random.shuffle(all_data) df = pd.DataFrame(all_data) out_file = "basic_arithmetic_bodmas_tables.parquet" df.to_parquet(out_file, compression="zstd") print(f"[OK] Generated {out_file}: {len(df)} rows, {df.memory_usage().sum() / (1024**2):.2f} MB") if __name__ == "__main__": main()