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

DeepSeek解读用TypeScript的类型求解数独的代码

在网上看到一个用TypeScript的类型求解数独的代码。
但是我按照TypeScript的编译执行过程,没有任何输出。而执行app.ts编译后的js文件是有输出的。

export PATH=$PATH:/mnt/c/d/node-v24.4.1-linux-x64/bin npm config set registry https://registry.npmmirror.com npm install -g typescript added 1 package in 17s tsc -v Version 5.9.3 cd ../.. tsc app.ts node app.js Hello World tsc sudoku2.ts

于是询问DeepSeek:

怎么执行typescript程序,我对附件执行tsc sudoku2.ts得到一个sudoku2.js,但里面只有一行注释//type Answer3 = Solve;

他的解答如下:

这是因为你的 TypeScript 代码完全是在类型层面(type level)运行的,而不是在值层面。你使用的是 TypeScript 的类型系统本身来“计算”数独的解,而不是编写运行时的 JavaScript 代码。

让我们来解释一下:

你的代码做了以下事情:

  1. 定义了DigitProblem等类型
  2. 使用ToRowToColumnToSquare等类型将数独问题转换为类型约束
  3. 通过Solve类型进行递归类型计算来求解数独
  4. 最后定义了Answer1Answer2Answer3类型(不是值)

如何看到结果?

由于这是类型计算,你需要通过 TypeScript 编译器来查看类型推断的结果。有几种方法:

方法1:使用编辑器/IDE

在 VSCode 或其他支持 TypeScript 的编辑器中,将鼠标悬停在Answer1Answer2上,你会看到类型推导的结果。

方法2:创建类型检查文件

创建一个测试文件来查看结果:

// test.tsimporttype{Answer1,Answer2}from'./sudoku2';// 创建一个错误来查看类型typeShowAnswer1=Answer1;// 将鼠标悬停在这里看结果typeShowAnswer2=Answer2;// 或者故意制造类型错误来查看consta1:Answer1=[];// 错误信息会显示 Answer1 的实际类型

方法3:使用tsc --showConfig或创建接口

// 在你的 sudoku2.ts 文件末尾添加interfaceAnswers{answer1:Answer1;answer2:Answer2;// answer3: Answer3; // 取消注释这个试试}

方法4:使用 TypeScript Playground

将你的代码复制到 TypeScript Playground 中,然后将鼠标悬停在类型上查看。

注意:

  • 这种类型层面的计算在编译时完成,不会生成任何 JavaScript 代码
  • Answer3被注释掉可能是因为这个数独太难,类型递归深度超过了 TypeScript 的限制(默认约 1000 层)
  • 如果你想要一个运行时求解器,你需要编写真正的 JavaScript/TypeScript 函数,而不是使用类型系统

创建运行时求解器:

如果你想要一个实际的数独求解器程序,你需要编写类似这样的代码:

// runtime-solver.tsfunctionsolveSudoku(board:number[][]):boolean{// 实际的回溯算法实现// ...}constproblem1=[[0,2,4,0,8,7,5,0,9],// ... 其他行];solveSudoku(problem1);console.log(problem1);

你当前的代码是一个类型体操(type gymnastics)的练习,展示了 TypeScript 类型系统的强大,但不是用来实际运行的。

我将代码复制到 TypeScript Playground,果真点击执行后,把鼠标移动到相应类型上,它就显示了求出的数独解。如下所示

type Answer1 = [3, 2, 4, 1, 8, 7, 5, 6, 9, 8, 9, 1, 4, 5, 6, 3, 7, 2, 5, 6, 7, 2, 9, 3, 8, 4, 1, 7, 8, 6, 5, 2, 9, 1, 3, 4, 2, 5, 9, 3, 1, 4, 7, 8, 6, 1, 4, 3, 6, 7, 8, 2, 9, 5, 4, 7, 2, 9, 3, 1, 6, 5, 8, 6, 3, 5, 8, 4, 2, 9, 1, 7, 9, 1, 8, 7, 6, 5, 4, 2, 3] type Answer2 = [6, 9, 4, 8, 5, 7, 1, 2, 3, 3, 8, 7, 1, 4, 2, 6, 5, 9, 1, 5, 2, 6, 3, 9, 7, 8, 4, 2, 3, 5, 4, 8, 1, 9, 6, 7, 4, 1, 8, 9, 7, 6, 5, 3, 2, 7, 6, 9, 3, 2, 5, 8, 4, 1, 8, 7, 6, 2, 9, 3, 4, 1, 5, 9, 2, 1, 5, 6, 4, 3, 7, 8, 5, 4, 3, 7, 1, 8, 2, 9, 6] | [6, 9, 7, 8, 4, 2, 1, 5, 3, 3, 8, 4, 1, 5, 7, 6, 2, 9, 1, 5, 2, 6, 3, 9, 7, 8, 4, 2, 3, 5, 4, 8, 1, 9, 6, 7, 4, 1, 8, 9, 7, 6, 5, 3, 2, 7, 6, 9, 3, 2, 5, 8, 4, 1, 8, 7, 6, 2, 9, 3, 4, 1, 5, 9, 2, 1, 5, 6, 4, 3, 7, 8, 5, 4, 3, 7, 1, 8, 2, 9, 6] type Answer3 = [4, 5, 8, 3, 2, 6, 7, 1, 9, 6, 7, 2, 9, 1, 4, 3, 8, 5, 9, 1, 3, 8, 5, 7, 4, 2, 6, 3, 4, 1, 5, 7, 9, 2, 6, 8, 8, 9, 6, 2, 3, 1, 5, 7, 4, 7, 2, 5, 4, 6, 8, 1, 9, 3, 1, 3, 7, 6, 8, 5, 9, 4, 2, 5, 8, 4, 7, 9, 2, 6, 3, 1, 2, 6, 9, 1, 4, 3, 8, 5, 7]

虽然没什么实用性,也算增长了typescript方面的见识。

翻译了注释的代码如下

// 可用的数字是从1到9typeDigit=1|2|3|4|5|6|7|8|9;// 空白格子用0表示typeEmpty=0;// 长度为9的元组类型typeTuple9<T>=[T,T,T,T,T,T,T,T,T];// 长度为81的元组类型typeTuple81<T>=[...Tuple9<T>,...Tuple9<T>,...Tuple9<T>,...Tuple9<T>,...Tuple9<T>,...Tuple9<T>,...Tuple9<T>,...Tuple9<T>,...Tuple9<T>];// 表示数独问题的类型typeProblem=Tuple81<Digit|Empty>;// 问题示例typeProblem1=[0,2,4,0,8,7,5,0,9,8,9,1,4,5,6,3,7,2,5,6,7,0,9,3,0,0,1,7,8,6,5,2,9,0,3,4,2,0,0,3,1,0,0,0,0,1,4,0,6,7,8,0,0,0,0,0,0,0,0,0,6,0,0,0,3,0,0,0,0,0,1,0,9,0,0,0,0,5,0,0,0,];// 将元组的索引转换为行号的类型typeToRow=[0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8];// 将元组的索引转换为列号的类型typeToColumn=[0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8];// 将元组的索引转换为3*3分组号的类型typeToSquare=[0,0,0,1,1,1,2,2,2,0,0,0,1,1,1,2,2,2,0,0,0,1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,3,3,3,4,4,4,5,5,5,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,8,8,8,6,6,6,7,7,7,8,8,8,6,6,6,7,7,7,8,8,8];typePopValue<TextendsDigit[],Kextendsnumber,VextendsDigit|Empty>={[keyinkeyofT]:keyextends`${K}`?Exclude<T[key],V>:T[key];};typeRowLimit<BoardextendsProblem,RetextendsTuple9<Digit>=Tuple9<Digit>,Iextendsunknown[]=[]>=I["length"]extends81?Ret:RowLimit<Board,PopValue<Ret,ToRow[I["length"]],Board[I["length"]]>,[...I,unknown]>;typeColumnLimit<BoardextendsProblem,RetextendsTuple9<Digit>=Tuple9<Digit>,Iextendsunknown[]=[]>=I["length"]extends81?Ret:ColumnLimit<Board,PopValue<Ret,ToColumn[I["length"]],Board[I["length"]]>,[...I,unknown]>;typeSquareLimit<BoardextendsProblem,RetextendsTuple9<Digit>=Tuple9<Digit>,Iextendsunknown[]=[]>=I["length"]extends81?Ret:SquareLimit<Board,PopValue<Ret,ToSquare[I["length"]],Board[I["length"]]>,[...I,unknown]>;typeSolve<BoardextendsProblem,RowextendsTuple9<Digit>=RowLimit<Board>,ColumnextendsTuple9<Digit>=ColumnLimit<Board>,SquareextendsTuple9<Digit>=SquareLimit<Board>,AnswerextendsDigit[]=[],Lextendsnumber=Answer["length"],T=Board[L]extendsEmpty?Row[ToRow[L]]&Column[ToColumn[L]]&Square[ToSquare[L]]:Board[L]>=Lextends81?Answer:TextendsDigit?Solve<Board,PopValue<Row,ToRow[L],T>,PopValue<Column,ToColumn[L],T>,PopValue<Square,ToSquare[L],T>,[...Answer,T]>:never;typeAnswer1=Solve<Problem1>;typeProblem2=[0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,6,0,9,1,5,2,0,0,0,0,0,0,2,3,0,4,8,0,0,0,0,4,1,8,0,0,6,5,0,0,7,0,9,3,2,5,0,0,0,8,0,6,0,9,3,4,1,0,9,2,1,5,0,0,3,0,0,5,0,0,0,1,8,2,9,6];typeAnswer2=Solve<Problem2>;typeProblem3=[0,0,0,3,0,0,0,1,9,6,7,0,0,0,4,0,0,0,0,0,0,8,0,0,0,2,0,3,4,0,0,7,0,2,0,0,0,0,6,0,3,1,5,0,0,0,0,0,0,6,0,0,9,0,1,3,0,6,0,0,0,0,2,0,0,4,7,0,0,6,0,0,2,0,9,0,4,0,0,0,0];//type Answer3 = Solve<Problem3>;
http://www.jsqmd.com/news/334079/

相关文章:

  • 题解:洛谷 P14242 [CCPC 2024 Shandong I] 分割序列
  • 一个用postgresql的自定义函数求解数独的程序
  • AlertDialog.show()中message的字体大小和颜色如何修改?
  • LP2178BY/LP2178B非隔离5V350mA语音小夜灯电源芯片解析
  • 2025-2026宣城本地生活团购运营服务商综合实力五强盘点 - 野榜数据排行
  • 2026年家用净水器怎么选?家用净水器十大品牌权威排行 - 水业策论
  • TikTok跨境电商:从“爆单逻辑”走向“合规与履约”时代的实战打法
  • <span class=“js_title_inner“>【AI时代生存指南】拒做时代的燃料:在算法迷雾中,夺回属于“人”的阵地</span>
  • 2026国内有实力的湖州花园设计施工公司排行 - 品牌排行榜
  • CH58X/CH59X的中断优先级配置机制
  • 2026年GEO源头厂家决策指南:深度解析摘星AI登顶之道与五大服务商全景测评 - 2026年企业推荐榜
  • <span class=“js_title_inner“>从数据供给到价值变现的闭环构建|大模型与数据要素论坛圆满落幕!</span>
  • 2026亚马逊自养号测评技术全解:五大核心维度构建安全运营体系
  • 2026全自动均质器实力厂家TOP5推荐:质量好、口碑出众、售后无忧 - 品牌推荐大师1
  • 2026四川盲道砖厂家权威榜单 全场景适配 品质与口碑双优全景指南 - 深度智识库
  • 2026年西安升学职高推荐榜单:聚焦艺术升学优势,优选优质教育平台 - 深度智识库
  • <span class=“js_title_inner“>VFP调用EXCEL的补充方法</span>
  • 2026年GEO源头厂家推荐 摘星AI登顶TOP1!服务商综合选购全指南 - 2026年企业推荐榜
  • 领航智联时代:阿里云 MQTT+Kafka 车/物联网实时数据分析解决方案
  • 大厂前端面试最新整理笔记(50万字经验总结)
  • 血珀戒指选购攻略:看图辨真假与品质
  • 上海开放大学电子商务导论作业答案
  • <span class=“js_title_inner“>聚辰半导体冲刺港股:9个月营收9.3亿 利润3.1亿 陈作涛控制24%股权</span>
  • CF2141B 学习笔记
  • Java awt包不存在错误解决:检查JDK安装与环境变量配置
  • 百考通「降重+降AI」双效合一,轻松通过查重与AI检测双重关卡
  • 2026扫码点单系统-亿坊-一套系统搞定门店经营管理全部所需!
  • <span class=“js_title_inner“>将Visual FoxPro的数据转给Excel</span>
  • 双向链表是什么?和单向链表区别详解
  • 收藏必学!AI Agent核心模块全解析:从“会聊天“到“能干活“的进化之路