news 2026/4/16 15:22:45

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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'
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 10:58:00

【Linux命令大全】003.文档编辑之nl命令(实操篇)

【Linux命令大全】003.文档编辑之nl命令&#xff08;实操篇&#xff09; ✨ 本文为Linux系统文档编辑与文本处理命令的全面汇总与深度优化&#xff0c;结合图标、结构化排版与实用技巧&#xff0c;专为高级用户和系统管理员打造。 (关注不迷路哈&#xff01;&#xff01;&#…

作者头像 李华
网站建设 2026/4/12 4:50:35

大模型后训练

什么场景需要后训练 1. 若仅需模型遵循少量指令&#xff08;如回避敏感话题或禁止公司间比较&#xff09;&#xff0c;通过提示工程即可实现&#xff0c;但该方法虽简单却不够稳定 2. 如需查询实时数据库&#xff0c;检索增强生成或基于搜索的方法可能更适用 3. 创建领域专用…

作者头像 李华
网站建设 2026/4/16 11:00:25

AI编程:程序员的职业新选择

AI编程:程序员的职业新选择 关键词:AI编程、程序员职业、人工智能、编程技术、职业发展 摘要:本文深入探讨了AI编程作为程序员职业新选择的相关内容。从背景介绍入手,阐述了目的、预期读者、文档结构和术语等。详细解析了AI编程的核心概念与联系,包括原理和架构的示意图及…

作者头像 李华
网站建设 2026/4/16 11:10:30

springboot+vue开发的Easy云盘网盘文件共享系统应用和研究

文章目录摘要关键词项目简介大数据系统开发流程主要运用技术介绍爬虫核心代码展示结论源码文档获取定制开发/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 Easy云盘是一款基于SpringBoot和Vue技术栈开发的网盘文件共享系统&#xff0c;旨在为…

作者头像 李华
网站建设 2026/4/10 22:14:56

4种方法解除ZIP压缩文件的密码保护

为了方便储存或者传输文件&#xff0c;我们经常会把文件转换成ZIP压缩文件&#xff0c;想保密性好的话&#xff0c;还会添加打开密码。 那如果后续不需要打开密码了&#xff0c;或者一个不小心忘记了密码&#xff0c;该怎么清除密码呢&#xff1f; 下面会根据不同情况说下具体如…

作者头像 李华
网站建设 2026/4/16 12:45:49

基于SpringBoot的农产品溯源系统

背景分析农产品溯源系统的需求源于消费者对食品安全问题的日益关注。近年来&#xff0c;农药残留、假冒伪劣产品等问题频发&#xff0c;传统农业供应链信息不透明&#xff0c;导致消费者难以追溯农产品源头。政府出台《食品安全法》《农产品质量安全追溯管理办法》等政策&#…

作者头像 李华