import json import ast import re def normalize_code(code, function_name): # 1. Separate imports from the rest lines = code.split('\n') imports = [] others = [] for line in lines: if line.strip().startswith(("import ", "from ")): if line.strip() not in imports: imports.append(line.strip()) elif line.strip() == "class Solution:": continue else: if line.strip() or others: # ignore leading empty lines in body others.append(line) # 2. Clean up the body lines # We need to find the minimum indentation of the non-empty lines in 'others' # and strip it, then re-indent by 4. # However, since we might have double-nested or messed up indentation, # let's find the 'def' line and use it as a reference. def_index = -1 for i, line in enumerate(others): if f"def {function_name}" in line: def_index = i break if def_index == -1: # If we can't find it, just strip and indent everything clean_body = [line.strip() for line in others] else: # Strip common leading whitespace from def_index onwards def_line = others[def_index] leading_ws = len(def_line) - len(def_line.lstrip()) clean_body = [] for line in others: if line.strip(): # Remove the leading whitespace found at def_line curr_ws = len(line) - len(line.lstrip()) to_remove = min(curr_ws, leading_ws) clean_body.append(line[to_remove:]) else: clean_body.append("") # 3. Final assembly # Ensure imports are unique and separated final_imports = "\n".join(imports) # Re-indent exactly 4 spaces indented_body = [] for line in clean_body: if line.strip(): indented_body.append(" " + line) else: indented_body.append("") return final_imports + "\n\nclass Solution:\n" + "\n".join(indented_body) def main(): with open("problems.json", "r") as f: problems = json.load(f) for p in problems: func_name = p.get("function_name", "unknown") p["starter_code"] = normalize_code(p["starter_code"], func_name) p["solution_code"] = normalize_code(p["solution_code"], func_name) with open("problems.json", "w") as f: json.dump(problems, f, indent=2) if __name__ == "__main__": main()