当前位置: 首页 > news >正文

DeepSeek辅助编写的计算数独可选数的python程序第3部分

就是增加了批处理

在第2个程序的基础上,增加功能函数,读入换行分隔的文本文件,输出行号、原文本、迭代后文本、原已知数、现已知数的csv文件,只给出新增的代码,以及调用的命令行,例如 sudofill.py input.txt ouput.csv
新增代码如下

importcsvimportsysdefprocess_sudoku_line(board_str,line_num):"""处理单个数独字符串,返回结果信息"""iflen(board_str)!=81:return{'line_num':line_num,'original':board_str,'final':'ERROR: 长度不是81字符','initial_known':0,'final_known':0,'filled_count':0}ifnotset(board_str).issubset(set('0123456789')):return{'line_num':line_num,'original':board_str,'final':'ERROR: 包含非数字字符','initial_known':0,'final_known':0,'filled_count':0}# 计算初始已知数initial_known=81-board_str.count('0')# 迭代求解final_board,all_iterations=solve_iteratively_silent(board_str)# 计算最终已知数final_known=81-final_board.count('0')return{'line_num':line_num,'original':board_str,'final':final_board,'initial_known':initial_known,'final_known':final_known,'filled_count':final_known-initial_known}defsolve_iteratively_silent(initial_board):"""静默版本的迭代求解,不打印过程,只返回结果"""current_board=initial_boardwhileTrue:# 计算候选数candidates=find_candidates(current_board)# 检查是否有唯一候选数可以填充has_single_candidates=Falseforrinrange(9):forcinrange(9):pos=r*9+cifcurrent_board[pos]=='0'andlen(candidates[r][c])==1:has_single_candidates=Truebreakifhas_single_candidates:breakifnothas_single_candidates:break# 填充唯一候选数board_list=list(current_board)changed=Falseforrinrange(9):forcinrange(9):pos=r*9+cifboard_list[pos]=='0'andlen(candidates[r][c])==1:num=next(iter(candidates[r][c]))board_list[pos]=str(num)changed=Trueifnotchanged:breaknew_board="".join(board_list)# 检查是否已经解决ifnew_board.count('0')==0:current_board=new_boardbreak# 更新当前数独current_board=new_board# 安全检查:最多迭代100次# 这个值可以调整,但对于正常数独,100次足够了returncurrent_board,[]# 返回空迭代历史defbatch_process_file(input_file,output_file):"""批量处理文件中的所有数独"""print(f"处理文件:{input_file}")print(f"输出到:{output_file}")results=[]try:withopen(input_file,'r',encoding='utf-8')asf:lines=f.readlines()total_lines=len(lines)print(f"读取到{total_lines}行")fori,lineinenumerate(lines,1):# 清理行:去除空白字符board_str=line.strip()ifnotboard_str:# 跳过空行continueprint(f"处理第{i}行:{board_str[:20]}...")# 处理数独result=process_sudoku_line(board_str,i)results.append(result)# 显示进度print(f" 初始已知数:{result['initial_known']}, 最终已知数:{result['final_known']}, 填充数:{result['filled_count']}")exceptFileNotFoundError:print(f"错误: 找不到文件{input_file}")returnexceptExceptionase:print(f"读取文件时出错:{e}")return# 写入CSV文件try:withopen(output_file,'w',newline='',encoding='utf-8')ascsvfile:fieldnames=['line_num','original','final','initial_known','final_known','filled_count']writer=csv.DictWriter(csvfile,fieldnames=fieldnames)writer.writeheader()forresultinresults:writer.writerow(result)print(f"\n成功处理{len(results)}个数独")print(f"结果已保存到{output_file}")# 显示统计信息ifresults:total_filled=sum(r['filled_count']forrinresults)avg_filled=total_filled/len(results)iflen(results)>0else0print(f"\n统计信息:")print(f" 总填充数:{total_filled}")print(f" 平均每个数独填充数:{avg_filled:.2f}")# 按填充数分组统计fill_groups={0:0,1:0,2:0,3:0,4:0,5:0,'6+':0}forrinresults:filled=r['filled_count']iffilled<0:filled=0# 错误情况的处理iffilled<=5:fill_groups[filled]+=1else:fill_groups['6+']+=1print(f"\n填充数分布:")forkeyinsorted(fill_groups.keys()):count=fill_groups[key]ifcount>0:print(f" 填充{key}个数字:{count}个数独")exceptExceptionase:print(f"写入CSV文件时出错:{e}")defbatch_main():"""批量处理模式的主函数"""print("数独批量处理工具")print("="*50)iflen(sys.argv)!=3:print("用法: python sudofill.py input.txt output.csv")print("\n参数说明:")print(" input.txt - 包含数独字符串的文本文件(每行一个81字符的数独)")print(" output.csv - 输出CSV文件路径")print("\n示例: python sudofill.py puzzles.txt results.csv")sys.exit(1)input_file=sys.argv[1]output_file=sys.argv[2]batch_process_file(input_file,output_file)# 在main()函数中添加批量处理选项defenhanced_main():"""增强版主函数,支持命令行参数和交互模式"""iflen(sys.argv)==3:# 命令行参数模式batch_main()else:# 交互模式(原main函数的内容)print("数独唯一候选数迭代求解器")print("="*50)# ... 原main函数的其余代码保持不变 ...# 这里需要将原main函数的内容复制过来# 由于原main函数较长,这里只显示关键修改print("\n提示:要批量处理文件,请使用命令行:")print(" python sudofill.py input.txt output.csv")# 调用原main函数逻辑(这里需要整合)# 由于代码较长,建议将原main函数改名为interactive_main()# 然后在这里调用interactive_main()definteractive_main():"""交互模式主函数(原main函数重命名)"""main()# 修改if __name__ == "__main__": 部分if__name__=="__main__":# 检查命令行参数iflen(sys.argv)==3:# 批量处理模式batch_main()eliflen(sys.argv)==1:# 交互模式interactive_main()else:print("用法:")print(" 交互模式: python sudofill.py")print(" 批量处理: python sudofill.py input.txt output.csv")sys.exit(1)

使用说明:
将新增代码添加到原程序的末尾

确保原程序中的函数(如find_candidates、solve_iteratively、print_summary等)仍然可用

运行批量处理时,程序会显示处理进度和统计信息

CSV文件可以用Excel或其他电子表格软件打开查看
输出如下

C:\d\1230>python candnum3.py input10sudo.txt output10sudo.txt 数独批量处理工具 ================================================== 处理文件: input10sudo.txt 输出到: output10sudo.txt 读取到 10 行 处理第 1 行: 10200506768479015075... 初始已知数: 50, 最终已知数: 81, 填充数: 31 处理第 2 行: 06540809209000178028... 初始已知数: 43, 最终已知数: 81, 填充数: 38 ... 初始已知数: 44, 最终已知数: 81, 填充数: 37 处理第 10 行: 00013527007894035015... 初始已知数: 42, 最终已知数: 81, 填充数: 39 成功处理 10 个数独 结果已保存到 output10sudo.txt 统计信息: 总填充数: 348 平均每个数独填充数: 34.80 填充数分布: 写入CSV文件时出错: '<' not supported between instances of 'str' and 'int'
http://www.jsqmd.com/news/206285/

相关文章:

  • 收藏这份RAG指南,掌握大模型知识增强技术,解决AI知识盲区,打造专属智能问答系统!
  • ToDesk超强更新来了!V4.8.4版本全面进化,远程体验再突破!
  • 从淘汰到进化:Claude Code Skills 定义AI时代程序员的核心竞争力
  • Unity 一个简单的红点模块
  • 2024提示工程架构师认证指南:Agentic AI方向的3大权威证书与备考攻略
  • 虾皮店如何做爆款商品呢
  • SOLID原则在Python中的实践:写出可维护的优雅代码
  • 深度好文:自动化与智能化融合在AI应用架构中的ROI分析,架构师必看!
  • 学霸同款9个AI论文工具,专科生搞定毕业论文!
  • 揭秘提示工程架构师:Agentic AI在环境监测的成功应用
  • Java Agent 技术全解析:从基础框架到落地实践
  • 2026.1南昌经开区发展规划
  • 双喜临门!埃文科技荣获“河南省高成长性科技型领军企业”
  • 强烈安利8个AI论文网站,本科生毕业论文轻松搞定!
  • 标准落地!AI 大模型知识库建设迈入规范化新阶段
  • AI编程:程序员的职业新选择
  • 【收藏必备】EAG-RAG架构详解:打造闭环自优化的企业级知识问答系统,彻底解决大模型幻觉问题
  • 校平机:金属板材的“整形医生“
  • 吾爱原创出品,牛哇~
  • 【干货收藏】2026年AI智能体工程:10大维度详解,决定Agent能否规模化落地的生死线
  • 修改adb shell下$前的提示名称
  • 已授权给****,可永久使用!!
  • Agentic-KGR: 利用多智能体协同强化学习提升知识图谱动态演化
  • Dify 或 LangChain?高手用原生 API 重构 LLM 开发逻辑
  • 收费了23年的软件,如今已开源!
  • 收藏级干货!反思架构:让AI变身“自我审查专家“,代码质量堪比人类专家
  • 2024提示工程架构师行业趋势:零售领域的Prompt应用,提升用户体验
  • 基于Java的超市线上购物管理系统库存上下架应用和研究
  • springboot+vue开发的地方美食分享与推荐系统 论坛 爬虫可视化大屏应用和研究
  • springboot+vue开发的大学生就业服务平台四个角色sdae9ber应用和研究